FILES ----- player.config behaviors\monsters\modular\basemonster.behavior behaviors\monsters\modular\actions\aggrohop.behavior [NEW] behaviors\monsters\modular\actions\charge.behavior [NEW] behaviors\monsters\modular\movement\crawlapproach.behavior [NEW] behaviors\monsters\modular\movement\crawlidle.behavior behaviors\monsters\modular\movement\crawlwander.behavior [NEW] behaviors\monsters\modular\movement\flyapproach.behavior [NEW] behaviors\monsters\modular\movement\flywander.behavior behaviors\monsters\modular\movement\walkapproach.behavior behaviors\monsters\modular\movement\walkwander.behavior damage\ice.damage dialog\quest.config items\active\weapons\melee\altabilities\broadsword\bladecharge\bladecharge.altability items\active\weapons\melee\altabilities\broadsword\giantsword\giantsword.altability items\active\weapons\melee\altabilities\broadsword\parry\parry.altability items\active\weapons\melee\altabilities\broadsword\risingslash\risingslash.altability items\active\weapons\melee\altabilities\broadsword\spinslash\spinslash.altability items\active\weapons\melee\altabilities\broadsword\spinslash\superspinslash.altability items\active\weapons\melee\altabilities\broadsword\traildash\traildash.altability items\active\weapons\melee\altabilities\generic\blinkslash\blinkslash.altability items\active\weapons\melee\altabilities\hammer\elementalaura\elementalaura.altability items\active\weapons\melee\altabilities\hammer\elementalpillar\elementalpillar.altability items\active\weapons\melee\altabilities\hammer\shockwave\shockwave.altability items\active\weapons\melee\altabilities\hammer\uppercut\uppercut.altability items\active\weapons\melee\altabilities\spear\barrier\barrier.altability items\active\weapons\melee\altabilities\spear\charge\charge.altability items\active\weapons\melee\altabilities\spear\elementalspin\elementalspin.altability items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.altability items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.lua items\active\weapons\melee\altabilities\spear\spin\spin.altability items\active\weapons\melee\broadsword\broadsword.animation items\active\weapons\melee\broadsword\commonbroadsword.activeitem items\active\weapons\melee\hammer\hammer.animation items\active\weapons\melee\spear\commonspear.activeitem items\active\weapons\ranged\altabilities\bouncingshot\bouncingshot.altability items\active\weapons\ranged\altabilities\burstshot\burstshot.altability items\active\weapons\ranged\altabilities\deathbomb\deathbomb.altability items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability items\active\weapons\ranged\altabilities\explosiveshot\explosiveshot.altability items\active\weapons\ranged\altabilities\flashlight\flashlight.altability items\active\weapons\ranged\altabilities\grenadelauncher\grenadelauncher.altability items\active\weapons\ranged\altabilities\lance\default.frames items\active\weapons\ranged\altabilities\lance\electriclance.png items\active\weapons\ranged\altabilities\lance\firelance.png items\active\weapons\ranged\altabilities\lance\icelance.png items\active\weapons\ranged\altabilities\lance\lance.altability items\active\weapons\ranged\altabilities\lance\lance.lua items\active\weapons\ranged\altabilities\lance\poisonlance.png items\active\weapons\ranged\altabilities\markedshot\markedshot.altability items\active\weapons\ranged\altabilities\markedshot\markedshot.lua items\active\weapons\ranged\altabilities\piercingshot\piercingshot.altability [NEW] items\active\weapons\ranged\altabilities\vacuum\vacuum.altability [NEW] items\active\weapons\ranged\altabilities\vacuum\vacuum.frames [NEW] items\active\weapons\ranged\altabilities\vacuum\vacuum.lua [NEW] items\active\weapons\ranged\altabilities\vacuum\vacuum.png items\active\weapons\ranged\shotgun\rareshotgun.activeitem monsters\bmonster.lua monsters\crawlers\crustoise\crustoise.animation monsters\crawlers\crustoise\crustoise.frames monsters\crawlers\crustoise\crustoise.monstertype [NEW] monsters\flyers\batong\batong.animation [NEW] monsters\flyers\batong\batong.frames [NEW] monsters\flyers\batong\batong.monstertype [NEW] monsters\flyers\batong\batong.png [NEW] monsters\flyers\batong\body.monsterpart monsters\walkers\gleap\gleap.animation monsters\walkers\ophidaunt\ophidaunt.animation projectiles\guns\bullets\chainbullet\chainbullet.projectile [NEW] projectiles\guns\bullets\chainbullet\chainbullet2.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainelectricplasma.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainelectricplasma2.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainfireplasma.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainfireplasma2.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainiceplasma.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainiceplasma2.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainpoisonplasma.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\chainpoisonplasma2.projectile [NEW] projectiles\guns\plasmabullets\chainplasma\default.frames [NEW] projectiles\guns\plasmabullets\chainplasma\electricplasma.png [NEW] projectiles\guns\plasmabullets\chainplasma\fireplasma.png [NEW] projectiles\guns\plasmabullets\chainplasma\iceplasma.png [NEW] projectiles\guns\plasmabullets\chainplasma\icon.png [NEW] projectiles\guns\plasmabullets\chainplasma\poisonplasma.png projectiles\guns\unsorted\lightningthrower\lightningthrower.projectile quests\generated\protection.config quests\generated\subquests.config quests\generated\subquests\build_home.questtemplate [NEW] quests\generated\subquests\collect_fine.questtemplate quests\generated\subquests\collect_gift.questtemplate quests\generated\subquests\craft.questtemplate quests\generated\subquests\fetch.questtemplate quests\scripts\generated\build_home.lua quests\scripts\generated\collect_fine.lua quests\scripts\generated\secret_note.lua [NEW] quests\scripts\generated\text_generation.lua scripts\interp.lua scripts\pathing.lua scripts\actions\crawling.lua [NEW] scripts\actions\flying.lua scripts\actions\movement.lua scripts\actions\sensor.lua [NEW] scripts\projectiles\chainbullet.lua [NEW] sfx\gun\flamethrower_loop.ogg [NEW] sfx\gun\flamethrower_start.ogg [NEW] sfx\gun\flamethrower_stop.ogg [NEW] sfx\interface\sniper_mark_pitch1.ogg [NEW] sfx\interface\sniper_mark_pitch2.ogg [NEW] sfx\interface\sniper_mark_pitch3.ogg [NEW] sfx\interface\sniper_mark_pitch4.ogg [NEW] sfx\interface\sniper_mark_pitch5.ogg [NEW] sfx\interface\sniper_mark_start2.ogg [NEW] sfx\interface\sniper_mark_stop2.ogg [NEW] sfx\interface\sniper_mark_stop3.ogg sfx\melee\charge_traildash1.ogg sfx\melee\rocketspear_loop_fire.ogg [NEW] sfx\melee\rocketspear_loop_ice.ogg [NEW] sfx\melee\rocketspear_loop_poison.ogg [NEW] sfx\melee\rocketspear_stop_ice.ogg [NEW] sfx\melee\rocketspear_stop_poison.ogg tech\mech\humanmech\humanmechbackground.png tech\mech\humanmech\humanmechbody.png vehicles\hoverbike\hoverbike.lua vehicles\hoverbike\hoverbike.vehicle DIFFS ----- player.config 381c381 < "visibleRect" : [-5.0, -5.0, 5.0, 5.0], --- > "metaBoundBox" : [-32.0, -32.0, 32.0, 32.0], behaviors\monsters\modular\basemonster.behavior 3d2 < "description": "", 5a5,6 > "/scripts/actions/entities.lua", > "/scripts/actions/builders.lua", 9,11c10 < "/scripts/behavior.lua", < "/scripts/actions/builders.lua", < "/scripts/actions/entities.lua" --- > "/scripts/behavior.lua" 17c16,21 < "foundTargetActions": [] --- > "foundTargetActions": [], > "approachActions": [], > "wanderActions": [], > "concurrentActions": [], > "concurrentHostileActions": [], > "fleeActions": [] 53a58,117 > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "entityExists", > "type": "action", > "name": "entityExists", > "parameters": { > "entity": "target" > } > } > }, > { > "title": "concurrentActions", > "type": "action", > "name": "selectorActions", > "parameters": { > "actions": "" > } > } > ] > }, > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "entityExists", > "type": "action", > "name": "entityExists", > "parameters": { > "entity": "target" > } > }, > { > "title": "concurrentHostileActions", > "type": "action", > "name": "selectorActions", > "parameters": { > "actions": "" > } > } > ] > }, > { 364,372d427 < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "state": "idle", < "type": "body" < } behaviors\monsters\modular\actions\aggrohop.behavior 2a3 > "description": "", 4d4 < "/scripts/actions/movement.lua", 5a6 > "/scripts/actions/movement.lua", 23a25,33 > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "state": "idle", > "type": "body" > } > }, behaviors\monsters\modular\movement\crawlwander.behavior 2a3 > "description": "", 5,6d5 < "/scripts/actions/math.lua", < "/monsters/bmonster.lua", 7a7 > "/monsters/bmonster.lua", 14,17d13 < ], < "idleTime": [ < 3, < 9 36c32 < "title": "dynamic", --- > "title": "sequence", 38,39c34,40 < "name": "dynamic", < "parameters": {}, --- > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, 42,44c43,45 < "title": "failer", < "type": "decorator", < "name": "failer", --- > "title": "setDirection", > "type": "action", > "name": "setDirection", 46,178c47,65 < "child": { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": "", < "onFail": false, < "onSuccess": true < }, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "setDirection", < "type": "action", < "name": "setDirection", < "parameters": { < "direction": -1 < }, < "output": { < "direction": "crawlDirection" < } < }, < { < "title": "faceDirection", < "type": "action", < "name": "faceDirection", < "parameters": { < "direction": 1 < } < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "greaterThan", < "type": "action", < "name": "greaterThan", < "parameters": { < "first": "crawlDirection", < "second": 0 < } < } < }, < { < "title": "setGlobalTag", < "type": "action", < "name": "setGlobalTag", < "parameters": { < "type": "flipX", < "tag": "?flipx" < } < } < ] < }, < { < "title": "setGlobalTag", < "type": "action", < "name": "setGlobalTag", < "parameters": { < "type": "flipX" < } < } < ] < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "state": "walk", < "type": "body" < } < }, < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": 1 < }, < "children": [ < { < "title": "crawl", < "type": "action", < "name": "crawl", < "parameters": { < "direction": "crawlDirection" < }, < "output": { < "headingAngle": "heading" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": "" < } < } < ] < } < ] < } --- > "output": { > "direction": "crawlDirection" > } > }, > { > "title": "crawlFaceDirection", > "type": "action", > "name": "crawlFaceDirection", > "parameters": { > "direction": "crawlDirection" > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "state": "walk", > "type": "body" 182c69 < "title": "sequence", --- > "title": "parallel", 184c71 < "name": "sequence", --- > "name": "parallel", 186,189c73,74 < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "fail": 1, > "success": 1 193c78 < "title": "setAnimationState", --- > "title": "crawl", 195c80 < "name": "setAnimationState", --- > "name": "crawl", 197,198c82,85 < "state": "idle", < "type": "body" --- > "direction": "crawlDirection" > }, > "output": { > "headingAngle": "heading" 202c89 < "title": "wallSit", --- > "title": "timer", 204,207c91,93 < "name": "wallSit", < "parameters": {}, < "output": { < "forwardAngle": "heading" --- > "name": "timer", > "parameters": { > "time": "" 210a97,122 > }, > { > "title": "halt", > "type": "action", > "name": "halt", > "parameters": {} > }, > { > "title": "setVelocity", > "type": "action", > "name": "setVelocity", > "parameters": { > "velocity": [ > 0, > 0 > ] > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "state": "idle", > "type": "body" > } 247,263d158 < "title": "setGlobalTag", < "type": "action", < "name": "setGlobalTag", < "parameters": { < "type": "flipX" < } < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "state": "idle", < "type": "body" < } < }, < { 268c163 < "transformationGroup": "body" --- > "transformationGroup": "facing" behaviors\monsters\modular\movement\walkapproach.behavior 2a3 > "description": "", 46,48c47 < "direction": "direction", < "vector": "", < "yDirection": "" --- > "direction": "targetDirection" behaviors\monsters\modular\movement\walkwander.behavior 2a3 > "description": "", 12c13 < "title": "cleanup", --- > "title": "sequence", 14,15c15,21 < "name": "cleanup", < "parameters": {}, --- > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, 17a24,38 > "title": "setDirection", > "type": "action", > "name": "setDirection", > "parameters": {}, > "output": { > "direction": "wanderDirection" > } > }, > { > "title": "onGround", > "type": "action", > "name": "onGround", > "parameters": {} > }, > { 29c50 < "title": "setDirection", --- > "title": "setAnimationState", 31,34c52,55 < "name": "setDirection", < "parameters": {}, < "output": { < "direction": "wanderDirection" --- > "name": "setAnimationState", > "parameters": { > "state": "walk", > "type": "body" 38,44c59 < "title": "onGround", < "type": "action", < "name": "onGround", < "parameters": {} < }, < { < "title": "sequence", --- > "title": "parallel", 46c61 < "name": "sequence", --- > "name": "parallel", 48,51c63,64 < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "fail": 1, > "success": 1 55c68 < "title": "setAnimationState", --- > "title": "move", 57c70 < "name": "setAnimationState", --- > "name": "move", 59,60c72,73 < "state": "walk", < "type": "body" --- > "direction": "wanderDirection", > "run": false 64,66c77,79 < "title": "parallel", < "type": "composite", < "name": "parallel", --- > "title": "timer", > "type": "action", > "name": "timer", 68,89c81,82 < "fail": 1, < "success": 1 < }, < "children": [ < { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": "wanderDirection", < "run": false < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": "" < } < } < ] --- > "time": "" > } damage\ice.damage 65c65 < "sounds" : [ "/sfx/gun/impact_plasma.ogg" ], --- > "sounds" : [ "/sfx/projectiles/ice_barrier_kill.ogg" ], dialog\quest.config 241c241 < "A presssent for Floran! Give thanksss to !", --- > "A presssent for Floran! Give thanksss to !" items\active\weapons\melee\altabilities\broadsword\bladecharge\bladecharge.altability 36c36 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 83c83 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\giantsword\giantsword.altability 51c51 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 85c85 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 110c110 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 121c121 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 132c132 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 143c143 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 201c201 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\parry\parry.altability 26c26 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 62c62 < "shieldHealth" : 300, --- > "shieldHealth" : 2000, // make this high so that it doesn't deplete shield stamina as much 74c74 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\risingslash\risingslash.altability 26c26 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 98c98 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\spinslash\spinslash.altability 26c26 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 87c87 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\spinslash\superspinslash.altability 26c26 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 91c91 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\broadsword\traildash\traildash.altability 7c7 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 18c18 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 29c29 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 40c40 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 113c113 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\generic\blinkslash\blinkslash.altability 26c26 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 97c97 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\hammer\elementalaura\elementalaura.altability 7c7 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 21c21 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 32c32 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 46c46 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 97c97,98 < "knockback" : 0, --- > "knockbackMode" : "none", > "knockback" : 20, 132c133 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\hammer\elementalpillar\elementalpillar.altability 7c7 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 18c18 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 29c29 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 40c40 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 114c114 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\hammer\shockwave\shockwave.altability 7c7 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 18c18 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 29c29 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 40c40 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 115c115 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\hammer\uppercut\uppercut.altability 26c26 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 78c78 < "allowFlip" : false --- > "allowFlip" : true 92c92 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\spear\barrier\barrier.altability 29c29 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 59c59 < "transformationGroup" : "weapon", --- > "transformationGroups" : ["weapon"], 105c105 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\spear\charge\charge.altability 31c31 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 114c114 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\spear\elementalspin\elementalspin.altability 27c27 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 165c165 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.altability 31c31 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 60c60 < "fireStart" : [ "/sfx/melee/rocketspear_start_fire.ogg" ], --- > "fireStart" : [ ], 63,66c63,66 < "iceStart" : [ "/sfx/melee/rocketspear_start_fire.ogg" ], < "iceBlast" : [ "/sfx/melee/barrier_create_ice.ogg" ], < "iceEnd" : [ "/sfx/gun/plasma_mp2.ogg" ], < "electricStart" : [ "/sfx/melee/rocketspear_start_fire.ogg" ], --- > "iceStart" : [ ], > "iceBlast" : [ "/sfx/melee/rocketspear_loop_ice.ogg" ], > "iceEnd" : [ "/sfx/melee/rocketspear_stop_ice.ogg" ], > "electricStart" : [ ], 68,71c68,71 < "electricEnd" : [ "/sfx/gun/plasma_mp2.ogg" ], < "poisonStart" : [ "/sfx/melee/rocketspear_start_fire.ogg" ], < "poisonBlast" : [ "/sfx/melee/barrier_create_poison.ogg" ], < "poisonEnd" : [ "/sfx/gun/plasma_mp2.ogg" ] --- > "electricEnd" : [ ], > "poisonStart" : [ ], > "poisonBlast" : [ "/sfx/melee/rocketspear_loop_poison.ogg" ], > "poisonEnd" : [ "/sfx/melee/rocketspear_stop_poison.ogg" ] 119c119 < } \ No newline at end of file --- > } items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.lua 38a39 > animator.playSound("fire") items\active\weapons\melee\altabilities\spear\spin\spin.altability 27c27 < "transformationGroup" : "swoosh", --- > "transformationGroups" : ["swoosh"], 79c79 < } \ No newline at end of file --- > } items\active\weapons\melee\broadsword\broadsword.animation 135,179d134 < }, < "movement" : { < "active" : false, < "transformationGroups" : ["weapon"], < "emissionRate" : 30, < "particles" : [ < { < "particle" : { < "type" : "ember", < "size" : 6, < "color" : [200, 200, 230, 60], < "destructionAction" : "shrink", < "destructionTime" : 3, < "initialVelocity" : [0, 0.0], < "finalVelocity" : [0, 0.0], < "approach" : [0, 10], < "timeToLive" : 0, < "layer" : "back", < "variance" : { < "position" : [1.5, 1.5], < "size" : 3.0 < } < }, < "count" : 3 < }, < { < "particle" : { < "type" : "ember", < "size" : 6, < "color" : [170, 170, 200, 60], < "destructionAction" : "shrink", < "destructionTime" : 3, < "initialVelocity" : [0, 0.0], < "finalVelocity" : [0, 0.0], < "approach" : [0, 10], < "timeToLive" : 0, < "layer" : "back", < "variance" : { < "position" : [1.5, 1.5], < "size" : 3.0 < } < }, < "count" : 3 < } < ] items\active\weapons\melee\broadsword\commonbroadsword.activeitem 95,96d94 < "/items/active/weapons/melee/altabilities/broadsword/dashattack.altability", < "/items/active/weapons/melee/altabilities/broadsword/leapattack.altability", items\active\weapons\melee\hammer\hammer.animation 138c138 < { --- > { 154,198d153 < } < ] < }, < "movement" : { < "active" : false, < "transformationGroups" : ["weapon"], < "emissionRate" : 30, < "particles" : [ < { < "particle" : { < "type" : "ember", < "size" : 6, < "color" : [200, 200, 230, 60], < "destructionAction" : "shrink", < "destructionTime" : 3, < "initialVelocity" : [0, 0.0], < "finalVelocity" : [0, 0.0], < "approach" : [0, 10], < "timeToLive" : 0.25, < "layer" : "back", < "variance" : { < "position" : [1.5, 1.5], < "size" : 3.0 < } < }, < "count" : 3 < }, < { < "particle" : { < "type" : "ember", < "size" : 6, < "color" : [170, 170, 200, 60], < "destructionAction" : "shrink", < "destructionTime" : 3, < "initialVelocity" : [0, 0.0], < "finalVelocity" : [0, 0.0], < "approach" : [0, 10], < "timeToLive" : 0.25, < "layer" : "back", < "variance" : { < "position" : [1.5, 1.5], < "size" : 3.0 < } < }, < "count" : 3 items\active\weapons\melee\spear\commonspear.activeitem 105d104 < "/items/active/weapons/melee/altabilities/spear/charge/charge.altability", items\active\weapons\ranged\altabilities\bouncingshot\bouncingshot.altability 8c8 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 59c59 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\burstshot\burstshot.altability 23c23 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 42c42 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 79c79 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\deathbomb\deathbomb.altability 10c10 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 57c57 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\explosiveburst\explosiveburst.altability 9c9 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 62c62 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\explosiveshot\explosiveshot.altability 7c7 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 58c58 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\flashlight\flashlight.altability 9c9 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 18c18 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 24c24 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 40c40 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\grenadelauncher\grenadelauncher.altability 9c9 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 22c22 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 76c76 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\lance\default.frames 3,4c3,4 < "size" : [14, 5], < "dimensions" : [5, 1], --- > "size" : [40, 15], > "dimensions" : [3, 1], 7c7 < [ "charge.1", "charge.2", "full.1", "full.2", "full.3" ] --- > [ "1", "2", "3" ] items\active\weapons\ranged\altabilities\lance\lance.altability 11,22c11 < "charge" : { < "frames" : 2, < "cycle" : 0.1, < "mode" : "transition", < "transition" : "full" < /* < "properties" : { < "immediateSound" : "/sfx/gun/lance_charge.ogg" < } < */ < }, < "full" : { --- > "fire" : { 24,28c13,15 < "mode" : "loop", < "cycle" : 0.25, < "properties" : { < "persistentSound" : "/sfx/tech/tech_particlethrust.ogg" < } --- > "cycle" : 0.18, > "mode" : "transition", > "transition" : "idle" 39,40c26,28 < "offset" : [0.75, 0.0], < "transformationGroup" : "muzzle" --- > "offset" : [2.5, 0.0], > "transformationGroups" : ["muzzle"], > "damageArea" : [ [-3.0, 0], [-2.0, 0.5], [2.5, 0.0], [-2.0, -0.5] ] 49c37 < "charge" : { --- > "fire" : { 51,56c39 < "image" : "/items/active/weapons/ranged/altabilities/lance/lance.png:charge." < } < }, < "full" : { < "properties" : { < "image" : "/items/active/weapons/ranged/altabilities/lance/lance.png:full." --- > "image" : "/items/active/weapons/ranged/altabilities/lance/lance.png:" 64,113d46 < "particleEmitters" : { < "fireLanceCharge" : { < "active" : false, < "rotationGroup" : "weapon", < "emissionRate" : 8, < "transformationGroup" : "muzzle", < "offsetRegion" : [0.0, -0.25, 1.5, 0.25], < "particles" : [ < { "particle" : "fireswoosh1"}, < { "particle" : "fireswoosh2"}, < { "particle" : "fireswoosh3"} < ] < }, < "electricLanceCharge" : { < "active" : false, < "rotationGroup" : "weapon", < "emissionRate" : 8, < "transformationGroup" : "muzzle", < "offsetRegion" : [0.0, -0.25, 1.5, 0.25], < "particles" : [ < { "particle" : "electricswoosh1"}, < { "particle" : "electricswoosh2"}, < { "particle" : "electricswoosh2"} < ] < }, < "iceLanceCharge" : { < "active" : false, < "rotationGroup" : "weapon", < "emissionRate" : 8, < "transformationGroup" : "muzzle", < "offsetRegion" : [0.0, -0.25, 1.5, 0.25], < "particles" : [ < { "particle" : "iceswoosh1"}, < { "particle" : "iceswoosh2"}, < { "particle" : "iceswoosh3"} < ] < }, < "poisonLanceCharge" : { < "active" : false, < "rotationGroup" : "weapon", < "emissionRate" : 8, < "transformationGroup" : "muzzle", < "offsetRegion" : [0.0, -0.25, 1.5, 0.25], < "particles" : [ < { "particle" : "poisonswoosh1"}, < { "particle" : "poisonswoosh2"}, < { "particle" : "fireswoosh2"} < ] < } < }, 115c48,51 < "lanceFire" : [ "/sfx/gun/plasma_sniper4.ogg" ] --- > "firelancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], > "electriclancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], > "icelancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ], > "poisonlancefire" : [ "/sfx/gun/plasma_sniper4.ogg" ] 121a58 > "cooldownTime" : 1.0, 123,128c60,67 < "energyUsageMultiplier" : 1.5, < "elementalProjectiles" : { < "fire" : "firelance", < "ice" : "icelance", < "electric" : "electriclance", < "poison" : "poisonlance" --- > "energyUsageMultiplier" : 0.7, > > "damageConfig" : { > "damageSourceKind" : "spear", > "baseDamage" : 15, > "knockback" : 40, > "timeoutGroup" : "alt", > "timeout" : 0.5 130,132d68 < "projectileParameters" : {}, < "baseDps" : 4, < "fireTime" : 0.5, 134c70,80 < "chargeTime" : 0.1 --- > "stances" : { > "fire" : { > "duration" : 0.3, > "armRotation" : 0, > "weaponRotation" : 0, > "twoHanded" : true, > > "allowRotate" : false, > "allowFlip" : false > } > } 136c82 < } \ No newline at end of file --- > } items\active\weapons\ranged\altabilities\lance\lance.lua 6c6 < local lanceAttack = GunFire:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig), elementalType), altAbilityConfig.stances) --- > local lanceAttack = WeaponAbility:new(rangedAttackConfig(sb.jsonMerge(primary, altAbilityConfig), elementalType), altAbilityConfig.stances) 9,10d8 < self:reset() < 22d19 < and not world.lineTileCollision(mcontroller.position(), self:firePosition()) 24,26d20 < self:setState(self.charge) < end < end 28,40c22 < function lanceAttack:charge() < animator.setParticleEmitterActive(self.weapon.elementalType.."LanceCharge", true) < animator.setAnimationState("lance", "charge") < < local duration = self.chargeTime < while self.fireMode == "alt" or duration > 0 do < status.setResource("energyRegenBlock", 1.0) < duration = math.max(0, duration - self.dt) < < if world.lineTileCollision(mcontroller.position(), self:firePosition()) then < break < end < coroutine.yield() --- > self:setState(self.fire) 41a24 > end 42a26,34 > function lanceAttack:fire() > self.weapon:setStance(self.stances.fire) > animator.playSound(self.weapon.elementalType.."lancefire") > animator.setAnimationState("lance", "fire") > > util.wait(self.stances.fire.duration, function() > local damageArea = partDamageArea("lance") > self.weapon:setDamage(self.damageConfig, damageArea) > end) 44,48c36 < if not world.lineTileCollision(mcontroller.position(), self:firePosition()) then < self:fireProjectile() < self.cooldownTimer = self.fireTime < animator.playSound("lanceFire") < end --- > self.cooldownTimer = self.cooldownTime 52,53c40 < animator.setAnimationState("lance", "idle") < animator.setParticleEmitterActive(self.weapon.elementalType.."LanceCharge", false) --- > 57c44,53 < self:reset() --- > > end > > function lanceAttack:energyPerShot() > local energyUsageMultiplier = self.energyUsageMultiplier or 1.0 > return root.evalFunction("gunLevelEnergyCostPerDamage", item.instanceValue("level", 1)) * self:damagePerShot() * self.projectileCount * energyUsageMultiplier > end > > function lanceAttack:damagePerShot() > return self.damageConfig.baseDamage * root.evalFunction("swordDamageLevelMultiplier", item.instanceValue("level", 1)) * activeItem.ownerPowerMultiplier() items\active\weapons\ranged\altabilities\markedshot\markedshot.altability 5,9c5,11 < "enterAimMode" : [ "/sfx/interface/sniper_mark_start1.ogg" ], < "targetAcquired1" : [ "/sfx/interface/sniper_mark_target3.ogg" ], < "targetAcquired2" : [ "/sfx/interface/sniper_mark_target3.ogg" ], < "targetAcquired3" : [ "/sfx/interface/sniper_mark_target3.ogg" ], < "disengage" : [ "/sfx/interface/sniper_mark_stop1.ogg"] --- > "enterAimMode" : [ "/sfx/interface/sniper_mark_start2.ogg" ], > "targetAcquired1" : [ "/sfx/interface/sniper_mark_pitch1.ogg" ], > "targetAcquired2" : [ "/sfx/interface/sniper_mark_pitch2.ogg" ], > "targetAcquired3" : [ "/sfx/interface/sniper_mark_pitch3.ogg" ], > "targetAcquired4" : [ "/sfx/interface/sniper_mark_pitch4.ogg" ], > "targetAcquired5" : [ "/sfx/interface/sniper_mark_pitch5.ogg" ], > "disengage" : [ "/sfx/interface/sniper_mark_stop2.ogg"] 18,19c20,27 < "projectileType" : "chainbullet", < "projectileParameters" : {}, --- > "elementalProjectiles" : { > "physical" : "chainbullet", > "fire" : "chainfireplasma", > "electric" : "chainelectricplasma", > "ice" : "chainiceplasma", > "poison" : "chainpoisonplasma" > }, > "projectileParameters" : { }, 24c32 < "maxTargets" : 3, --- > "maxTargets" : 5, items\active\weapons\ranged\altabilities\markedshot\markedshot.lua 54,55c54 < local projectileId = self:fireProjectile() < world.callScriptedEntity(projectileId, "setTargets", self.targets) --- > local projectileId = self:fireProjectile(self.elementalProjectiles[self.weapon.elementalType], {targets = self.targets}) items\active\weapons\ranged\altabilities\piercingshot\piercingshot.altability 8c8 < "transformationGroup" : "muzzle", --- > "transformationGroups" : ["muzzle"], 57c57 < } \ No newline at end of file --- > } items\active\weapons\ranged\shotgun\rareshotgun.activeitem 106c106 < "/items/active/weapons/ranged/altabilities/vacuumsphere/vacuumsphere.altability" --- > "/items/active/weapons/ranged/altabilities/vacuum/vacuum.altability" monsters\bmonster.lua 225c225 < if args.emitter == nil then return false end --- > if args.emitter == nil or args.emitter == "" then return false end monsters\crawlers\crustoise\crustoise.animation 25c25 < "cycle" : 0.35, --- > "cycle" : 0.25, 27a28,31 > "chargewinddown" : { > "frames" : 6, > "cycle" : 0.35 > }, 38c42 < "transformationGroup" : "body", --- > "transformationGroups" : [ "facing", "body" ], 45c49 < "image" : ":idle." --- > "image" : ":idle." 50c54 < "image" : ":walk." --- > "image" : ":walk." 53c57 < "jump" : { --- > "fall" : { 55c59 < "image" : ":jump." --- > "image" : ":fall." 58c62,67 < "fall" : { --- > "chargewindup" : { > "properties" : { > "image" : ":windup." > } > }, > "charge" : { 60c69 < "image" : ":fall." --- > "image" : ":charge." 63c72 < "fire" : { --- > "chargewinddown" : { 65c74 < "image" : ":fire." --- > "image" : ":winddown." 70c79 < "image" : ":hurt." --- > "image" : ":hurt." 80c89,90 < "body" : { "interpolated" : true } --- > "body" : { "interpolated" : true }, > "facing" : { "interpolated" : false } 117,118c127 < "deathPuff" : [ "/sfx/npc/enemydeathpuff.ogg" ], < "fire" : [ "/sfx/npc/smallbiped/arrowhead_small_attack1.ogg" ] --- > "deathPuff" : [ "/sfx/npc/enemydeathpuff.ogg" ] monsters\crawlers\crustoise\crustoise.frames 8c8 < [ "walk.8", "walk.9", "walk.10", "walk.11", "walk.12", null, "rear.1", "rear.2", "rear.3", "rear.4", "rear.5", "rear.6"], --- > [ "walk.8", "walk.9", "walk.10", "walk.11", "walk.12", null, "windup.1", "windup.2", "windup.3", "windup.4", "windup.5", "windup.6"], 10a11,18 > }, > "aliases" : { > "winddown.1" : "windup.6", > "winddown.2" : "windup.5", > "winddown.3" : "windup.4", > "winddown.4" : "windup.3", > "winddown.5" : "windup.2", > "winddown.6" : "windup.1" monsters\crawlers\crustoise\crustoise.monstertype 33c33,50 < "hostileActions" : [ ], --- > "hostileActions" : [ > { > "name" : "action-charge", > "parameters" : { > "minimumXRange" : 10, > > "chargeTime" : [0.75, 1.25], > "chargeSpeed" : 15, > "chargeControlForce" : 200, > > "windupTime" : 0.25, > "winddownTime" : 0.35, > > "wallCrashSound" : "", > "wallCrashEmitter" : "" > } > } > ], 37c54,62 < "approachActions" : [ ], --- > "approachActions" : [ > { > "name" : "approach-crawl", > "parameters" : { > "canJump" : false, > "minXRange" : 2 > } > } > ], 41a67 > "cooldown" : [3,6], 43,44c69 < "wanderTime" : 10, < "idleTime" : 1 --- > "wanderTime" : [2,4] 47c72,80 < ] --- > ], > > "concurrentActions" : [ > { > "name" : "idle-crawl" > } > ], > > "concurrentHostileActions" : [ ] monsters\walkers\gleap\gleap.animation 50c50 < "transformationGroups" : "body", --- > "transformationGroups" : [ "body" ], monsters\walkers\ophidaunt\ophidaunt.animation 40c40 < "transformationGroups" : "body", --- > "transformationGroups" : [ "body" ], projectiles\guns\bullets\chainbullet\chainbullet.projectile 19c19 < "timeToLive" : 1.5, --- > "timeToLive" : 10.0, 22c22 < "speed" : 150, --- > "speed" : 100, 25c25,26 < "script" : "chainbullet.lua" --- > "script" : "/scripts/projectiles/chainbullet.lua", > "chainProjectile" : "chainbullet2" projectiles\guns\unsorted\lightningthrower\lightningthrower.projectile 14c14 < "damageKind" : "electric", --- > "damageKind" : "electricbarrier", quests\generated\protection.config 3c3 < "collect_fine" : { --- > "collect_fine_furniture" : { 7a8,10 > }, > "item" : { > "type" : "item" 23a27,68 > "chance": 0.5, > > "preconditions" : [ > ["criminal", "target"], > ["owns", "player", "item", 0], > ["!=", "target", "questGiver"], > ["entityExists", "target"], > ["isFurniture", "item"] > ], > "postconditions" : [ > ["!criminal", "target"], > ["!likes", "target", "questGiver"], > ["owns", "player", "item", 1] > ] > }, > > "collect_fine_food" : { > "templateId" : "collect_fine.generated", > "parameters" : { > "target" : { > "type" : "entity" > }, > "item" : { > "type" : "item" > } > }, > "participants" : { > "target" : { > "behaviorOverrides" : [ > { > "type" : "notification", > "behavior" : { "name" : "quest-collect_fine-notification" } > }, > { "type" : "flee", "target" : "player" } > ], > "critical" : true > }, > "questGiver" : { "turnInQuest" : true } > }, > > "chance": 0.5, > 25a71 > ["owns", "player", "item", 0], 27c73,74 < ["entityExists", "target"] --- > ["entityExists", "target"], > ["isCookedFood", "item"] 31c78,79 < ["!likes", "target", "questGiver"] --- > ["!likes", "target", "questGiver"], > ["owns", "player", "item", 1] quests\generated\subquests.config 227,232d226 < "extraPiece1" : { < "type" : "item" < }, < "extraPiece2" : { < "type" : "item" < }, 241c235 < ["itemList", "extraRewards", "money", "rewardMoney"], --- > ["itemList", "extraRewards", "money", "furniturePrice"], 243,245c237 < ["price", "extraPiece1", "itemPrice1"], < ["price", "extraPiece2", "itemPrice2"], < ["+", "itemPrice1", "itemPrice2", "rewardMoney"], --- > ["price", "furnitureSet", "furniturePrice"], 246a239 > ["ownsItemList", "player", "furnitureSet", "magic"], 248,263c241,244 < ["isFurniture", "extraPiece1"], < ["isFurniture", "extraPiece2"], < ["owns", "player", "extraPiece1", "piece1Count"], < ["owns", "player", "extraPiece2", "piece2Count"], < ["unbornNpc", "newNpc"], < ["!=", "extraPiece1", "extraPiece2"], < [">=", "piece1Count", 1], < [">=", "piece2Count", 1], < ["+", "newPiece1Count", 1, "piece1Count"], < ["+", "newPiece2Count", 1, "piece2Count"] < ], < "postconditions" : [ < ["!owns", "player", "extraPiece1", "piece1Count"], < ["!owns", "player", "extraPiece2", "piece2Count"], < ["owns", "player", "extraPiece1", "newPiece1Count"], < ["owns", "player", "extraPiece2", "newPiece2Count"], --- > ["unbornNpc", "newNpc"] > ], > "postconditions" : [ > ["!ownsItemList", "player", "furnitureSet", "magic"], 373c354,355 < ["!likes", "target", "questGiver"] --- > ["!likes", "target", "questGiver"], > ["criminal", "questGiver"] 593a576,613 > ["owns", "player", "item", 1], > ["criminal", "questGiver"] > ] > }, > > "collect_fine" : { > "templateId" : "collect_fine.generated", > "parameters" : { > "target" : { > "type" : "entity" > }, > "item" : { > "type" : "item" > } > }, > "participants" : { > "target" : { > "behaviorOverrides" : [ > { > "type" : "notification", > "behavior" : { "name" : "quest-collect_fine-notification" } > }, > { "type" : "flee", "target" : "player" } > ], > "critical" : true > }, > "questGiver" : { "turnInQuest" : true } > }, > > "preconditions" : [ > ["criminal", "target"], > ["owns", "player", "item", 0], > ["!=", "target", "questGiver"], > ["entityExists", "target"] > ], > "postconditions" : [ > ["!criminal", "target"], > ["!likes", "target", "questGiver"], 682a703 > quests\generated\subquests\build_home.questtemplate 6,8c6,8 < "default" : "Use these ^green;^white; and your ^green;^white; and ^green;^white; to build a house. Take my ^green;Colony Deed^white; too, and put it in the house when you've done that.", < "last" : "Finally, use these ^green;^white; and your ^green;^white; and ^green;^white; to build a house. Take my ^green;Colony Deed^white; too and put it in the house when you've done that.", < "next" : "Next, use these ^green;^white; and your ^green;^white; and ^green;^white; to build a house. Take my ^green;Colony Deed^white; too and put it in the house when you've done that." --- > "default" : "Use these ^green;^white; to build a house. Take my ^green;Colony Deed^white; too, and put it in the house when you've done that.", > "last" : "Finally, use these ^green;^white; to build a house. Take my ^green;Colony Deed^white; too and put it in the house when you've done that.", > "next" : "Next, use these ^green;^white; to build a house. Take my ^green;Colony Deed^white; too and put it in the house when you've done that." quests\generated\subquests\collect_gift.questtemplate 31d30 < "portraitParameter" : "target", quests\generated\subquests\craft.questtemplate 5,8c5,6 < "default" : "Craft and bring me ^green;^white;.", < "first" : "Firstly, craft me ^green;^white;.", < "last" : "Finally, craft me ^green;^white;.", < "next" : "Next, use your to craft ^green;^white;." --- > "first" : "To start with, Floran needsss . Thisss can be crafted from . Can help?", > "next" : "Now has the crafting ingredientsss we need. Make Floran ." 11,13c9,10 < "default" : "Great, these are going to be useful.", < "first" : "Great, now let's use them. Talk to me again to continue.", < "next" : "Great, now let's use them. Talk to me again to continue." --- > "first" : " will be very ussseful. Floran thanksss you.", > "next" : "Ssskillfully crafted, ! Now Floran has another requessst." 15d11 < "failureText" : "I was unable to craft the ^green;^white;.", quests\generated\subquests\fetch.questtemplate 3c3 < "title" : "^orange;Find ^white;", --- > "title" : "^orange;Run errand for ^white;", 5,8c5,6 < "default" : "Bring me ^green;^white;.", < "first" : "To begin with, find ^green;^white;.", < "last" : "Finally, bring me ^green;^white;.", < "next" : "Next, bring me ^green;^white;." --- > "first" : "Firssst, Floran needs you to find . Be hasssty!", > "next" : "Time to find . It'sss very important we do that next." 11,13c9,10 < "default" : "Great, these are going to be useful.", < "first" : "Great, now let's use them. Talk to me again to continue.", < "next" : "Great, now let's use them. Talk to me again to continue." --- > "first" : "Successs! Let's get to work with our .", > "next" : "Perfect, time to put or to ussse." 15d11 < "failureText" : "I was unable to bring the ^green;^white;.", quests\scripts\generated\build_home.lua 9,11d8 < furnitureNeeded[#furnitureNeeded+1] = { name = quest.parameters().extraPiece1.item, count = 1 } < furnitureNeeded[#furnitureNeeded+1] = { name = quest.parameters().extraPiece2.item, count = 1 } < 22,24d18 < for _,itemDescriptor in ipairs(quest.parameters().furnitureSet.items) do < player.giveItem(itemDescriptor) < end quests\scripts\generated\collect_fine.lua 1a2 > require("/quests/scripts/generated/text_generation.lua") 6a8,11 > function onQuestStart() > player.giveItem(generateNoteItem("crime", quest.configParameter("crimeNotice"), "Crime Notice")) > end > 8c13 < if interactorEntityId == entity.id() then --- > if interactorEntityId == entity.id() and not storage.interacted and hasNotice() then 15c20 < if interactorEntityId == entity.id() then --- > if interactorEntityId == entity.id() and hasNotice() then 16a22,23 > player.consumeTaggedItem(noteTag("crime"), 1) > player.giveItem({name = quest.parameters().item.item, count = 1}) 19a27,35 > function hasItem() > local item = quest.parameters().item > return (player.inventory()[item.item] or 0) > 0 > end > > function hasNotice() > return (player.inventoryTags()[noteTag("crime")] or 0) > 0 > end > 21c37 < return storage.interacted --- > return storage.interacted and hasItem() quests\scripts\generated\secret_note.lua 1a2 > require("/quests/scripts/generated/text_generation.lua") 22,52d22 < end < < function generateNoteText(madlib) < local tags = {} < for paramName, paramValue in pairs(quest.parameters()) do < if paramValue.name then < tags[paramName] = paramValue.name < end < end < < for tag, words in pairs(madlib.words) do < tags[tag] = words[math.random(#words)] < end < < local template = madlib.templates[math.random(#madlib.templates)] < return sb.replaceTags(template, tags) < end < < function noteTag(tagSuffix) < return "secretnote-"..quest.questId().."-"..tagSuffix < end < < function generateNoteItem(tagSuffix, madlib) < return { < name = "secretnote", < count = 1, < parameters = { < questTags = {noteTag(tagSuffix)}, < description = "\""..generateNoteText(madlib).."\"" < } < } scripts\interp.lua 34a35,40 > end > > -- returns the shortest angle difference for interpolating between angles > -- angles are in radians > function interp.angleDiff(from, to) > return ((((to - from) % (2*math.pi)) + (3*math.pi)) % (2*math.pi)) - math.pi scripts\pathing.lua 22c22 < if not mcontroller.onGround() then --- > if not self:canPathfind() then 41a42,45 > function PathFinder:canPathfind() > return mcontroller.onGround() or not mcontroller.baseParameters().gravityEnabled > end > 44c48 < if result == true and mcontroller.onGround() then --- > if result == true and self:canPathfind() then 129c133 < mustEndOnGround = true, --- > mustEndOnGround = mcontroller.baseParameters().gravityEnabled, 236a241 > if self.edge == nil then return true end 261c266 < else --- > elseif self.action == "Walk" then 262a268,269 > elseif self.action == "Fly" then > return self:moveFly() 444a452,466 > end > return "running" > end > > function PathMover:moveFly() > while self.edge and self.edge.action == "Fly" do > if passedTarget(self.edge) then > self:advancePath() > else > break > end > end > > if self.edge and self.edge.action == "Fly" then > mcontroller.controlFly(vec2.mul(vec2.norm(self.delta), mcontroller.baseParameters().flySpeed), mcontroller.baseParameters().airForce) scripts\actions\crawling.lua 3a4 > require "/scripts/interp.lua" 20a22,25 > local groundDirection = findGroundDirection() > if not groundDirection then return false end > > 36,45c41,44 < local leftLine = poly.translate(poly.rotate({{bounds[1] - 0.1, bounds[4]}, {bounds[1] - 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) < local rightLine = poly.translate(poly.rotate({{bounds[3] + 0.1, bounds[4]}, {bounds[3] + 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) < < world.debugLine(leftLine[1], leftLine[2], "red") < world.debugLine(rightLine[1], rightLine[2], "red") < < local leftIntersect = world.lineCollision(leftLine[1], leftLine[2]) or leftLine[2] < local rightIntersect = world.lineCollision(rightLine[1], rightLine[2]) or rightLine[2] < if leftIntersect and rightIntersect then < headingDirection = vec2.norm(world.distance(rightIntersect, leftIntersect)) --- > -- Rotate to ground slope > local newDirection = groundSlopeDirection(headingAngle) > if newDirection then > headingDirection = newDirection 66a66 > -- param rotationRate 68c68,72 < args = parseArgs(args, {}) --- > args = parseArgs(args, { > rotationRate = 0.25, > rotationStepsPerUpdate = 5 > }) > 69a74,78 > local groundDirection = findGroundDirection() > if groundDirection == nil then return false end > > local ground, headingDirection, headingAngle = setGroundDirection(groundDirection) > 74c83,98 < mcontroller.setVelocity({0,0}) --- > -- Smoothly rotate to the ground slope > if output.forwardAngle then > for i = 1, args.rotationStepsPerUpdate do > local newDirection = groundSlopeDirection(headingAngle) > if newDirection then > headingDirection = newDirection > local angleDiff = interp.angleDiff(headingAngle, math.atan(headingDirection[2], headingDirection[1])) > headingAngle = interp.linear(args.rotationRate, headingAngle, headingAngle + angleDiff) > ground = vec2.rotate(headingDirection, -math.pi/2) > end > end > end > > BData:setVec2(output.groundDirection, ground) > BData:setNumber(output.forwardAngle, headingAngle) > 81a106,121 > function groundSlopeDirection(headingAngle) > local bounds = mcontroller.boundBox() > > local leftLine = poly.translate(poly.rotate({{bounds[1] - 0.1, bounds[4] - 0.5}, {bounds[1] - 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) > local rightLine = poly.translate(poly.rotate({{bounds[3] + 0.1, bounds[4] - 0.5}, {bounds[3] + 0.1, bounds[2] - 1}}, headingAngle), mcontroller.position()) > > world.debugLine(leftLine[1], leftLine[2], "red") > world.debugLine(rightLine[1], rightLine[2], "red") > > local leftIntersect = world.lineCollision(leftLine[1], leftLine[2]) or leftLine[2] > local rightIntersect = world.lineCollision(rightLine[1], rightLine[2]) or rightLine[2] > if leftIntersect and rightIntersect then > return vec2.norm(world.distance(rightIntersect, leftIntersect)) > end > end > 97a138,156 > end > > -- param direction > function crawlFaceDirection(args, output) > args = parseArgs(args, { > direction = "direction" > }) > local direction = BData:getNumber(args.direction) > if direction == nil then return false end > > mcontroller.controlFace(1) > entity.resetTransformationGroup("facing") > if direction > 0 then > entity.scaleTransformationGroup("facing", {1, 1}) > else > entity.scaleTransformationGroup("facing", {-1, 1}) > end > self.setFacingDirection = true > return true scripts\actions\movement.lua 181c181 < entity.resetLounging() --- > if entity.resetLounging then entity.resetLounging() end scripts\actions\sensor.lua 42,43d41 < world.logInfo("wallCollision") < 60a59,68 > > > function groundCollision(args, output) > args = parseArgs(args, {}) > > local bounds = rect.translate(mcontroller.boundBox(), mcontroller.position()) > local groundRect = {bounds[1], bounds[2] - 0.25, bounds[3], bounds[2]} > > return world.rectTileCollision(groundRect, {"Null","Block","Dynamic"}) > end \ No newline at end of file vehicles\hoverbike\hoverbike.lua 4a5 > self.angleApproachFactor = vehicle.configParameter("angleApproachFactor") 11a13,15 > self.minimumJumpGroundDistance = vehicle.configParameter("minimumJumpGroundDistance") > self.jumpVelocity = vehicle.configParameter("jumpVelocity") > self.jumpTimeout = vehicle.configParameter("jumpTimeout") 15c19 < self.hoverSpringPositions = vehicle.configParameter("hoverSpringPositions") --- > self.bodySpringPositions = vehicle.configParameter("bodySpringPositions") 18a23 > self.jumpTimer = 0 21a27,28 > local groundDistance = minimumSpringDistance(self.bodySpringPositions) > 23d29 < local groundDistance = minimumSpringDistance(self.hoverSpringPositions) 45,52d50 < movement.setRotation(self.angle) < animator.resetTransformationGroup("rotation") < animator.rotateTransformationGroup("rotation", self.angle) < vehicle.setLoungePosition("seat", vec2.rotate(self.seatPosition, self.angle)) < vehicle.setLoungeAngle("seat", self.angle) < < self.facingDirection = self.facingDirection < 55c53,56 < self.angle = self.angle + (targetAngle - self.angle) * 0.05 --- > self.angle = self.angle + (targetAngle - self.angle) * self.angleApproachFactor > elseif vehicle.controlHeld("down") then > local targetAngle = (self.facingDirection < 0) and self.maxAngle or -self.maxAngle > self.angle = self.angle + (targetAngle - self.angle) * self.angleApproachFactor 59,60c60,65 < self.angle = self.angle + math.atan((backSpringDistance - frontSpringDistance) * self.levelApproachFactor) < self.angle = math.min(math.max(self.angle, -self.maxAngle), self.maxAngle) --- > if frontSpringDistance == self.maxGroundSearchDistance and backSpringDistance == self.maxGroundSearchDistance then > self.angle = self.angle - self.angle * self.angleApproachFactor > else > self.angle = self.angle + math.atan((backSpringDistance - frontSpringDistance) * self.levelApproachFactor) > self.angle = math.min(math.max(self.angle, -self.maxAngle), self.maxAngle) > end 61a67,79 > > if self.jumpTimer <= 0 and vehicle.controlHeld("jump") and groundDistance < self.minimumJumpGroundDistance then > movement.setYVelocity(self.jumpVelocity) > self.jumpTimer = self.jumpTimeout > elseif self.jumpTimer > 0 then > self.jumpTimer = self.jumpTimer - script.updateDt() > end > > movement.setRotation(self.angle) > animator.resetTransformationGroup("rotation") > animator.rotateTransformationGroup("rotation", self.angle) > vehicle.setLoungePosition("seat", vec2.rotate(self.seatPosition, self.angle)) > vehicle.setLoungeAngle("seat", self.angle) vehicles\hoverbike\hoverbike.vehicle 21a22 > "angleApproachFactor" : 0.025, 29a31,34 > "minimumJumpGroundDistance" : 5, > "jumpVelocity" : 50, > "jumpTimeout" : 1, > 46c51 < "hoverSpringPositions" : [ --- > "bodySpringPositions" : [