FILES ----- default-configuration.config player.config universeflags.config [NEW] animations\cloudpuff\cloudpuff.animation [NEW] animations\cloudpuff\cloudpuff.frames [NEW] animations\cloudpuff\cloudpuff.png [NEW] animations\electriccloudpuff\electriccloudpuff.animation [NEW] animations\electriccloudpuff\electriccloudpuff.frames [NEW] animations\electriccloudpuff\electriccloudpuff.png [NEW] animations\flamepuff\flamepuff.animation [NEW] animations\flamepuff\flamepuff.frames [NEW] animations\flamepuff\flamepuff.png [NEW] animations\icecloudpuff\icecloudpuff.animation [NEW] animations\icecloudpuff\icecloudpuff.frames [NEW] animations\icecloudpuff\icecloudpuff.png [NEW] animations\lightningsparks\lightningsparks.animation [NEW] animations\lightningsparks\lightningsparks.frames [NEW] animations\lightningsparks\lightningsparks.png [NEW] animations\poisonball\poisonball.animation [NEW] animations\poisonball\poisonball.frames [NEW] animations\poisonball\poisonball.png [NEW] animations\poisoncloudpuff\poisoncloudpuff.animation [NEW] animations\poisoncloudpuff\poisoncloudpuff.frames [NEW] animations\poisoncloudpuff\poisoncloudpuff.png behaviors\monsters\boss\dragonboss\dragonboss.behavior behaviors\monsters\modular\targeting.behavior behaviors\monsters\modular\actions\charge.behavior behaviors\npc\chat.behavior behaviors\npc\combat.behavior behaviors\npc\reactionchat.behavior behaviors\npc\combat\melee.behavior behaviors\npc\combat\meleeleap.behavior behaviors\npc\combat\ranged.behavior behaviors\npc\crew\combat.behavior behaviors\npc\crew\fieldbenefits.behavior behaviors\npc\overrides\override-follow.behavior behaviors\npc\reactions\pianoparty.behavior behaviors\npc\reactions\playairhockey.behavior behaviors\npc\unique\castlearcher.behavior behaviors\npc\unique\cultistinvader.behavior behaviors\npc\unique\esther.behavior behaviors\sequences\floranmission\nuruendscene.behavior behaviors\sequences\hylotlmission\koichiend.behavior cinematics\story\opengate\opengate.cinematic dialog\combat.config dungeons\missions\apexmissions\apexmission1.json dungeons\missions\avianmissions\avianmission1.json dungeons\missions\floranmissions\floranmission1-objects.png dungeons\missions\floranmissions\floranmission1-wires1.png dungeons\missions\floranmissions\floranmission1.png dungeons\missions\lunarbase\lunarbase-objects.png dungeons\missions\lunarbase\lunarbase-wires1.png dungeons\missions\lunarbase\lunarbase.png dungeons\other\outpost\outpost.json [NEW] dungeons\other\outpost\outpost_penguinbay.dungeon [NEW] dungeons\other\outpost\outpost_penguinbay.json [NEW] dungeons\other\outpost\outpost_signstore.dungeon [NEW] dungeons\other\outpost\outpost_signstore.json [NEW] dungeons\other\outpost\outpost_treasuredtrophies.dungeon [NEW] dungeons\other\outpost\outpost_treasuredtrophies.json interface\playerbar-overportrait.png interface\playerbar.png interface\playerbarpress.png [NEW] interface\objectcrafting\fossilcrafting.png [NEW] interface\objectcrafting\fossilfooter.png [NEW] interface\objectcrafting\fossilheader.png [NEW] interface\objectcrafting\fossilshine.png interface\optionsmenu\body_blank.png interface\optionsmenu\optionsmenu.config [NEW] interface\scripted\techupgrade\body.png [NEW] interface\scripted\techupgrade\chips.png [NEW] interface\scripted\techupgrade\doupgrade.png [NEW] interface\scripted\techupgrade\doupgradedisabled.png [NEW] interface\scripted\techupgrade\footer.png [NEW] interface\scripted\techupgrade\header.png [NEW] interface\scripted\techupgrade\icon.png [NEW] interface\scripted\techupgrade\listitem.frames [NEW] interface\scripted\techupgrade\listitem.png [NEW] interface\scripted\techupgrade\slotselect.png [NEW] interface\scripted\techupgrade\tech.png [NEW] interface\scripted\techupgrade\techslot.frames [NEW] interface\scripted\techupgrade\techslot.png [NEW] interface\scripted\techupgrade\techupgradegui.config [NEW] interface\scripted\techupgrade\techupgradegui.lua [NEW] interface\scripted\techupgrade\suits\apex-female.png [NEW] interface\scripted\techupgrade\suits\apex-male.png [NEW] interface\scripted\techupgrade\suits\avian-female.png [NEW] interface\scripted\techupgrade\suits\avian-male.png [NEW] interface\scripted\techupgrade\suits\floran-female.png [NEW] interface\scripted\techupgrade\suits\floran-male.png [NEW] interface\scripted\techupgrade\suits\glitch-female.png [NEW] interface\scripted\techupgrade\suits\glitch-male.png [NEW] interface\scripted\techupgrade\suits\human-female.png [NEW] interface\scripted\techupgrade\suits\human-male.png [NEW] interface\scripted\techupgrade\suits\hylotl-female.png [NEW] interface\scripted\techupgrade\suits\hylotl-male.png [NEW] interface\scripted\techupgrade\suits\novakid-female.png [NEW] interface\scripted\techupgrade\suits\novakid-male.png interface\tooltips\codex.tooltip interface\windowconfig\teambar.config interface\windowconfig\teaminvitation.config interface\windowconfig\teammembermenu.config items\active\weapons\staff\abilities\controlprojectile\controlprojectile.lua items\active\weapons\staff\abilities\controlprojectile\elementportal.weaponability items\active\weapons\staff\abilities\controlprojectile\elementrain.weaponability items\active\weapons\staff\abilities\controlprojectile\elementswarm.weaponability items\active\weapons\staff\abilities\controlprojectile\plasmabarrage.weaponability [NEW] items\active\weapons\wand\generated\crown\1.png [NEW] items\active\weapons\wand\generated\crown\2.png [NEW] items\active\weapons\wand\generated\crown\3.png [NEW] items\active\weapons\wand\generated\crown\4.png [NEW] items\active\weapons\wand\generated\crown\5.png [NEW] items\active\weapons\wand\generated\crown\6.png [NEW] items\active\weapons\wand\generated\crown\7.png [NEW] items\active\weapons\wand\generated\crown\8.png [NEW] items\active\weapons\wand\generated\crown\9.png items\active\weapons\wand\generated\handle\1.png items\active\weapons\wand\generated\handle\2.png items\active\weapons\wand\generated\handle\3.png items\active\weapons\wand\generated\handle\4.png items\active\weapons\wand\generated\handle\5.png items\active\weapons\wand\generated\stone\electric.png items\active\weapons\wand\generated\stone\fire.png items\active\weapons\wand\generated\stone\ice.png items\active\weapons\wand\generated\stone\poison.png items\armors\other\bonusarmor\pants.png items\armors\other\neo\neo.back items\armors\other\neo\neo.chest items\armors\other\neo\neo.head items\armors\other\neo\neo.legs items\generic\crafting\matteritem.item items\generic\crafting\monsterplating.item items\generic\food\old\chilistew.consumable items\generic\food\old\curriedbeakseed.consumable items\generic\food\tier3\coconutmilk.consumable items\generic\food\tier5\eyebowls.consumable leveling\levelingmultipliers.functions monsters\monster.lua [NEW] monsters\ghosts\gosmet\gosmet.png npcs\bmain.lua objects\ancient\ancientconsole\ancientconsole.object objects\ancient\ancientconsole\returnconsole.object objects\biome\scorchedcity\metallictrapdoor\metallictrapdoor.object objects\farmables\cotton\cottonseed.object objects\farmables\cotton\wildcottonseed.object objects\fossils\displaystands\fossildisplay1\fossildisplay1.config objects\fossils\displaystands\fossildisplay1\fossildisplay1.object objects\fossils\displaystands\fossildisplay3\fossildisplay3.config objects\fossils\displaystands\fossildisplay3\fossildisplay3.object objects\fossils\displaystands\fossildisplay5\fossildisplay5.config objects\fossils\displaystands\fossildisplay5\fossildisplay5.object objects\hylotl\hylotlclassicbookcase\hylotlclassicbookcase.object objects\mission\caveart3\caveart3.object objects\mission\caveart4\caveart4.object objects\mission\caveart5\caveart5.object objects\mission\caveart5\caveart5.png objects\mission\templepressureplatform\templepressureplatform.object objects\outpost\frogfurnishing\frogfurnishing.object objects\outpost\infinityexpress\infinityexpress.object [NEW] objects\outpost\penguinbay\penguinbayclosed.frames [NEW] objects\outpost\penguinbay\penguinbayclosed.object objects\outpost\penguinbay\penguinbayclosed.png objects\outpost\shipyardcaptain\shipyardcaptain.object [NEW] objects\outpost\signstore\signstoreclosed.frames [NEW] objects\outpost\signstore\signstoreclosed.object [NEW] objects\outpost\signstore\signstoreclosed.png objects\outpost\teddybearplush\teddybearplush.object objects\outpost\terramart\terramart.object objects\outpost\ursaminer\ursaminer.object objects\outpost\ursaminer\ursaminerclosed.object [NEW] objects\upgrade\techupgradeconsole\icon.png [NEW] objects\upgrade\techupgradeconsole\techupgradeconsole.animation [NEW] objects\upgrade\techupgradeconsole\techupgradeconsole.frames [NEW] objects\upgrade\techupgradeconsole\techupgradeconsole.object [NEW] objects\upgrade\techupgradeconsole\techupgradeconsole.png [NEW] objects\upgrade\techupgradeconsole\techupgradeconsolelit.frames [NEW] objects\upgrade\techupgradeconsole\techupgradeconsolelit.png objects\wired\door\trapdoor.lua projectiles\activeitems\staff\staffprojectile.lua projectiles\activeitems\staff\elementcloud\cloud.png projectiles\activeitems\staff\elementcloud\default.frames projectiles\activeitems\staff\elementcloud\electriccloud.png projectiles\activeitems\staff\elementcloud\electricelementcloud.projectile projectiles\activeitems\staff\elementcloud\fireelementcloud.projectile projectiles\activeitems\staff\elementcloud\icecloud.png projectiles\activeitems\staff\elementcloud\iceelementcloud.projectile projectiles\activeitems\staff\elementcloud\poisoncloud.png projectiles\activeitems\staff\elementcloud\poisonelementcloud.projectile projectiles\activeitems\staff\elementorb\electricorb.projectile projectiles\activeitems\staff\elementorb\fireorb.png projectiles\activeitems\staff\elementorb\fireorb.projectile projectiles\activeitems\staff\elementorb\iceorb.projectile projectiles\activeitems\staff\elementorb\poisonorb.png projectiles\activeitems\staff\elementorb\poisonorb.projectile projectiles\activeitems\staff\elementportal\default.frames projectiles\activeitems\staff\elementportal\electricportal.png projectiles\activeitems\staff\elementportal\electricportal.projectile [NEW] projectiles\activeitems\staff\elementportal\fireportal.png [NEW] projectiles\activeitems\staff\elementportal\fireportal.projectile [NEW] projectiles\activeitems\staff\elementportal\iceportal.png [NEW] projectiles\activeitems\staff\elementportal\iceportal.projectile [NEW] projectiles\activeitems\staff\elementportal\poisonportal.png [NEW] projectiles\activeitems\staff\elementportal\poisonportal.projectile projectiles\activeitems\staff\elementrain\electricrain.png projectiles\activeitems\staff\elementrain\electricrain.projectile projectiles\activeitems\staff\elementstickyspikes\firespikes.frames projectiles\activeitems\staff\elementstickyspikes\firespikes.png projectiles\activeitems\staff\elementstickyspikes\firestickyspikes.projectile projectiles\activeitems\staff\elementstickyspikes\icestickyspikes.projectile [NEW] projectiles\activeitems\staff\elementstickyspikes\poisonspikes.frames projectiles\activeitems\staff\elementstickyspikes\poisonspikes.png projectiles\activeitems\staff\elementstickyspikes\poisonstickyspikes.projectile projectiles\activeitems\staff\elementswarmer\poisonswarmer.projectile [NEW] projectiles\activeitems\travelingswoosh\default.frames [NEW] projectiles\activeitems\travelingswoosh\electrictravelingswoosh.png [NEW] projectiles\activeitems\travelingswoosh\electrictravelingswoosh.projectile [NEW] projectiles\activeitems\travelingswoosh\firetravelingswoosh.png [NEW] projectiles\activeitems\travelingswoosh\firetravelingswoosh.projectile [NEW] projectiles\activeitems\travelingswoosh\icetravelingswoosh.png [NEW] projectiles\activeitems\travelingswoosh\icetravelingswoosh.projectile [NEW] projectiles\activeitems\travelingswoosh\poisontravelingswoosh.png [NEW] projectiles\activeitems\travelingswoosh\poisontravelingswoosh.projectile projectiles\guns\arrows\electricbolt\electricbolt.projectile projectiles\traps\trapflame\trapflame.projectile quests\generated\locations.config quests\story\apex_mission1.questtemplate quests\story\apex_mission2.questtemplate quests\story\avian_mission1.questtemplate quests\story\avian_mission2.questtemplate quests\story\bootship.questtemplate quests\story\floran_mission1.questtemplate quests\story\floran_mission2.questtemplate quests\story\gaterepair.questtemplate quests\story\glitch_mission1.questtemplate quests\story\glitch_mission2.questtemplate quests\story\human_mission1.questtemplate quests\story\hylotl_mission1.questtemplate quests\story\hylotl_mission2.questtemplate quests\story\protectorate.questtemplate radiomessages\missions.radiomessages radiomessages\quests.radiomessages [NEW] recipes\spinningwheel\objects\teddybearplush.recipe scripts\behavior.lua scripts\util.lua scripts\actions\builders.lua scripts\actions\movement.lua scripts\actions\overrides.lua scripts\actions\reaction.lua scripts\behavior\bgroup.lua [NEW] sfx\cinematics\opengate\artifacts_shimmer.ogg [NEW] sfx\cinematics\opengate\artifact_insert.ogg [NEW] sfx\cinematics\opengate\artifact_shine.ogg [NEW] sfx\cinematics\opengate\gate_debris.ogg [NEW] sfx\cinematics\opengate\opengate_blast.ogg [NEW] sfx\cinematics\opengate\opengate_music.ogg [NEW] sfx\cinematics\opengate\opengate_rumble.ogg [NEW] sfx\cinematics\opengate\portal_reveal.ogg stagehands\coordinator.lua tech\distortionsphere\aquasphere.techitem tech\distortionsphere\distortionsphere.techitem tech\distortionsphere\sonicsphere.techitem tech\distortionsphere\spikesphere.techitem tilesets\packed\huge-objects.json [NEW] tilesets\packed\objects-by-category\actionfigure.json tilesets\packed\objects-by-category\decorative.json tilesets\packed\objects-by-category\seed.json tilesets\packed\objects-by-category\storage.json tilesets\packed\objects-by-colonytag\nature.json tilesets\packed\objects-by-colonytag\outpost.json tilesets\packed\objects-by-colonytag\pretty.json tilesets\packed\objects-by-race\generic.json tilesets\packed\objects-by-type\farmable.json treasure\common.treasurepools treasure\largedungeons.treasurepools DIFFS ----- default-configuration.config 2c2 < "configurationVersion" : 424, --- > "configurationVersion" : 426, 32a33,34 > "clientJoinable" : false, > 61,62c63,65 < "connectionAddress" : "", < "connectionPort" : "" --- > "multiPlayerAddress" : "", > "multiPlayerPort" : "", > "multiPlayerAccount" : "" player.config 141a142 > { "item" : "teddybearplush" }, 336,345d336 < { "item" : "alloyfurnace" }, < // { "item" : "portable3dprinter" }, < < { "item" : "tier5switch" }, < { "item" : "tier6switch" }, < { "item" : "tier7switch" }, < { "item" : "tier8switch" }, < { "item" : "tier9switch" }, < { "item" : "tier10switch" }, < 351,366d341 < < // NOT CURRENTLY IN USE < // { "item" : "markerwallplaque1" }, < // { "item" : "bonusarmorhead" }, < // { "item" : "bonusarmorchest" }, < // { "item" : "bonusarmorpants" }, < // { "item" : "silverarmorhead" }, < // { "item" : "silverarmorchest" }, < // { "item" : "silverarmorpants" }, < // { "item" : "goldarmorhead" }, < // { "item" : "goldarmorchest" }, < // { "item" : "goldarmorpants" }, < // { "item" : "platinumarmorhead" }, < // { "item" : "platinumarmorchest" }, < // { "item" : "platinumarmorpants" }, < // { "item" : "brainextractor" }, universeflags.config 30a31,42 > }, > { > "type" : "placeDungeon", > "dungeonId" : "outpost_penguinbay", > "targetInstance" : "outpost", > "targetPosition" : [452, 627] > }, > { > "type" : "placeDungeon", > "dungeonId" : "outpost_signstore", > "targetInstance" : "outpost", > "targetPosition" : [308, 640] 40a53,58 > }, > { > "type" : "placeDungeon", > "dungeonId" : "outpost_treasuredtrophies", > "targetInstance" : "outpost", > "targetPosition" : [611, 645] behaviors\monsters\boss\dragonboss\dragonboss.behavior 1179,1181c1179,1181 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", --- > "title": "Reset", > "type": "composite", > "name": "sequence", 1183,1213c1183,1190 < "child": { < "title": "Reset", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "state": "beamOut", < "type": "teleport" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 0.4 < } < }, < { < "title": "setGlobalTag", < "type": "action", < "name": "setGlobalTag", < "parameters": { < "type": "stage", < "tag": "dead" < } --- > "children": [ > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "state": "beamOut", > "type": "teleport" 1215,1216c1192,1210 < ] < } --- > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 0.4 > } > }, > { > "title": "setGlobalTag", > "type": "action", > "name": "setGlobalTag", > "parameters": { > "type": "stage", > "tag": "dead" > } > } > ] behaviors\monsters\modular\targeting.behavior 169c169 < "success": -1 --- > "success": 1 behaviors\monsters\modular\actions\charge.behavior 2a3 > "description": "", 253,255c254,256 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", --- > "title": "dynamic", > "type": "composite", > "name": "dynamic", 257,266c258,269 < "child": { < "title": "dynamic", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "optional", < "type": "decorator", < "name": "optional", --- > "children": [ > { > "title": "optional", > "type": "decorator", > "name": "optional", > "parameters": { > "shouldRun": "" > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", 268c271,274 < "shouldRun": "" --- > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 270,295c276,298 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "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": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "gravityEnabled", > "type": "action", > "name": "gravityEnabled", > "parameters": {} 297,313c300,314 < "children": [ < { < "title": "gravityEnabled", < "type": "action", < "name": "gravityEnabled", < "parameters": {} < }, < { < "title": "wallCollision", < "type": "action", < "name": "wallCollision", < "parameters": { < "direction": "facingDirection" < } < }, < { < "title": "succeeder", --- > { > "title": "wallCollision", > "type": "action", > "name": "wallCollision", > "parameters": { > "direction": "facingDirection" > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "optional", 315,316c316,319 < "name": "succeeder", < "parameters": {}, --- > "name": "optional", > "parameters": { > "shouldRun": "" > }, 318,320c321,323 < "title": "optional", < "type": "decorator", < "name": "optional", --- > "title": "sequence", > "type": "composite", > "name": "sequence", 322c325,328 < "shouldRun": "" --- > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 324,362c330,340 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "vecMultiply", < "type": "action", < "name": "vecMultiply", < "parameters": { < "first": "", < "second": [ < "facingDirection", < 1 < ] < }, < "output": { < "vector": "wallCrashVelocity" < } < }, < { < "title": "setVelocity", < "type": "action", < "name": "setVelocity", < "parameters": { < "velocity": "wallCrashVelocity" < } < }, < { < "title": "clearControls", < "type": "action", < "name": "clearControls", < "parameters": {} --- > "children": [ > { > "title": "vecMultiply", > "type": "action", > "name": "vecMultiply", > "parameters": { > "first": "", > "second": [ > "facingDirection", > 1 > ] 364,371c342,343 < { < "title": "setResource", < "type": "action", < "name": "setResource", < "parameters": { < "resource": "stunned", < "amount": 0.25 < } --- > "output": { > "vector": "wallCrashVelocity" 373,374c345,369 < ] < } --- > }, > { > "title": "setVelocity", > "type": "action", > "name": "setVelocity", > "parameters": { > "velocity": "wallCrashVelocity" > } > }, > { > "title": "clearControls", > "type": "action", > "name": "clearControls", > "parameters": {} > }, > { > "title": "setResource", > "type": "action", > "name": "setResource", > "parameters": { > "resource": "stunned", > "amount": 0.25 > } > } > ] 377c372,383 < ] --- > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 379,403c385,392 < { < "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": "gravityEnabled", < "type": "action", < "name": "gravityEnabled", < "parameters": {} < } < }, < { < "title": "boundsCollision", --- > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "gravityEnabled", 405c394 < "name": "boundsCollision", --- > "name": "gravityEnabled", 408,423c397,404 < ] < } < ] < }, < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "playSound", < "type": "action", < "name": "playSound", < "parameters": { < "sound": "" < } --- > }, > { > "title": "boundsCollision", > "type": "action", > "name": "boundsCollision", > "parameters": {} > } > ] 425,437c406,418 < }, < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "burstParticleEmitter", < "type": "action", < "name": "burstParticleEmitter", < "parameters": { < "emitter": "" < } --- > ] > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "playSound", > "type": "action", > "name": "playSound", > "parameters": { > "sound": "" 440,449c421,436 < ] < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": "" < } --- > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "burstParticleEmitter", > "type": "action", > "name": "burstParticleEmitter", > "parameters": { > "emitter": "" > } > } > } > ] 451,452c438,447 < ] < } --- > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": "" > } > } > ] behaviors\npc\chat.behavior 4a5 > "/scripts/behavior/bgroup.lua", 24,26c25,27 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 28,33c29,30 < "groupId": "chat", < "goalType": "list", < "goal": "chatfriends", < "minMembers": 2, < "maxMembers": 2, < "position": "self" --- > "fail": 1, > "success": -1 35,43c32,44 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "chatfriends", > "goalType": "list", > "groupId": "chat", > "maxMembers": 2, > "minMembers": 2, > "position": "self" > } 45,80c46,69 < "children": [ < { < "title": "dynamic", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "chatfriend", < "xRange": 2, < "position": "self" < } < } < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "entityDirection", --- > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "entityInRange", 82c71 < "name": "entityDirection", --- > "name": "entityInRange", 84,88c73,75 < "entity": "self", < "target": "chatfriend" < }, < "output": { < "direction": "chatdirection" --- > "entity": "chatfriend", > "xRange": 2, > "position": "self" 89a77,87 > } > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 91,96c89,100 < { < "title": "reverseDirection", < "type": "action", < "name": "reverseDirection", < "parameters": { < "direction": "chatdirection" --- > "children": [ > { > "title": "entityDirection", > "type": "action", > "name": "entityDirection", > "parameters": { > "entity": "self", > "target": "chatfriend" > }, > "output": { > "direction": "chatdirection" > } 98,108c102,120 < "output": { < "direction": "chatdirection" < } < }, < { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": "chatdirection", < "run": false --- > { > "title": "reverseDirection", > "type": "action", > "name": "reverseDirection", > "parameters": { > "direction": "chatdirection" > }, > "output": { > "direction": "chatdirection" > } > }, > { > "title": "move", > "type": "action", > "name": "move", > "parameters": { > "direction": "chatdirection", > "run": false > } 110,111c122,131 < } < ] --- > ] > } > ] > }, > { > "title": "faceEntity", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "chatfriend" 113,140c133,155 < ] < }, < { < "title": "faceEntity", < "type": "action", < "name": "faceEntity", < "parameters": { < "entity": "chatfriend" < } < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "getPersonality", < "type": "action", < "name": "getPersonality", < "parameters": { < "target": "self" --- > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "getPersonality", > "type": "action", > "name": "getPersonality", > "parameters": { > "target": "self" > }, > "output": { > "influence": "influence" > } 142,151c157,166 < "output": { < "influence": "influence" < } < }, < { < "title": "getPersonality", < "type": "action", < "name": "getPersonality", < "parameters": { < "target": "chatfriend" --- > { > "title": "getPersonality", > "type": "action", > "name": "getPersonality", > "parameters": { > "target": "chatfriend" > }, > "output": { > "influence": "influence" > } 153,166c168,178 < "output": { < "influence": "influence" < } < }, < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "/behaviors/npc/reactionchat.behavior", < "type": "module", < "name": "reactionchat", < "parameters": {} --- > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "/behaviors/npc/reactionchat.behavior", > "type": "module", > "name": "reactionchat", > "parameters": {} > } 168,185c180,241 < } < ] < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "chat", < "taskId": "first", < "minMembers": 1, < "maxMembers": 1 --- > ] > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "chat", > "taskId": "first", > "minMembers": 1, > "maxMembers": 1 > } > }, > { > "title": "repeater", > "type": "decorator", > "name": "repeater", > "parameters": { > "maxLoops": 3, > "untilSuccess": false > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "emote", > "type": "action", > "name": "emote", > "parameters": { > "emote": "blabbering" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 4 > } > } > ] > } > } > ] 187c243 < "child": { --- > { 201a258,265 > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 2 > } > }, > { 214c278 < "time": 4 --- > "time": 2 220,262c284,293 < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": 3, < "untilSuccess": false < }, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 2 < } < }, < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "blabbering" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 2 < } < } < ] < } < } < ] --- > ] > } > ] > }, > { > "title": "succeedGroup", > "type": "action", > "name": "succeedGroup", > "parameters": { > "groupId": "chatfriends" 264,267c295,298 < ] < } < ] < } --- > } > ] > } > ] behaviors\npc\combat.behavior 5a6 > "/scripts/behavior/bgroup.lua", 93,95c94,96 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 97,103c98,99 < "behavior": "combatcoordinator", < "goal": "target", < "goalType": "entity", < "groupId": "combat", < "maxMembers": 8, < "minMembers": 1, < "parameters": "" --- > "fail": 1, > "success": -1 105,126c101,128 < "child": { < "title": "cleanup", < "type": "composite", < "name": "cleanup", < "parameters": {}, < "children": [ < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "isValidTarget", < "type": "action", < "name": "isValidTarget", < "parameters": { < "entity": "target" < } --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "behavior": "combatcoordinator", > "goal": "target", > "goalType": "entity", > "groupId": "combat", > "maxMembers": 8, > "minMembers": 1, > "parameters": "" > } > }, > { > "title": "cleanup", > "type": "composite", > "name": "cleanup", > "parameters": {}, > "children": [ > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 128,133c130,137 < { < "title": "setEntity", < "type": "action", < "name": "setEntity", < "parameters": { < "entity": "target" --- > "children": [ > { > "title": "isValidTarget", > "type": "action", > "name": "isValidTarget", > "parameters": { > "entity": "target" > } 135,153c139,148 < "output": { < "entity": "combatTarget" < } < }, < { < "title": "setAggressive", < "type": "action", < "name": "setAggressive", < "parameters": { < "aggressive": true < } < }, < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 --- > { > "title": "setEntity", > "type": "action", > "name": "setEntity", > "parameters": { > "entity": "target" > }, > "output": { > "entity": "combatTarget" > } 155,167c150,222 < "children": [ < { < "title": "cleanup", < "type": "composite", < "name": "cleanup", < "parameters": {}, < "children": [ < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { --- > { > "title": "setAggressive", > "type": "action", > "name": "setAggressive", > "parameters": { > "aggressive": true > } > }, > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 > }, > "children": [ > { > "title": "cleanup", > "type": "composite", > "name": "cleanup", > "parameters": {}, > "children": [ > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "hasShield", > "type": "action", > "name": "hasShield", > "parameters": {} > }, > { > "title": "beginAltFire", > "type": "action", > "name": "beginAltFire", > "parameters": {} > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] > } > }, > { > "title": "endAltFire", > "type": "action", > "name": "endAltFire", > "parameters": {} > } > ] > }, > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { 177,183c232 < "title": "hasShield", < "type": "action", < "name": "hasShield", < "parameters": {} < }, < { < "title": "beginAltFire", --- > "title": "hasMeleePrimary", 185c234 < "name": "beginAltFire", --- > "name": "hasMeleePrimary", 189,236c238 < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] < } < }, < { < "title": "endAltFire", < "type": "action", < "name": "endAltFire", < "parameters": {} < } < ] < }, < { < "title": "dynamic", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "hasMeleePrimary", < "type": "action", < "name": "hasMeleePrimary", < "parameters": {} < }, < { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 2, < "onFail": true, < "onSuccess": false < }, < "child": { < "title": "task", --- > "title": "cooldown", 238c240 < "name": "task", --- > "name": "cooldown", 240,243c242,244 < "groupId": "combat", < "taskId": "melee", < "minMembers": 1, < "maxMembers": 8 --- > "cooldown": 2, > "onFail": true, > "onSuccess": false 246c247 < "title": "sequence", --- > "title": "parallel", 248c249 < "name": "sequence", --- > "name": "parallel", 250,253c251,252 < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "fail": 1, > "success": -1 257c256,267 < "title": "dynamic", --- > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "combat", > "taskId": "melee", > "minMembers": 1, > "maxMembers": 8 > } > }, > { > "title": "sequence", 259,260c269,275 < "name": "dynamic", < "parameters": {}, --- > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, 263,277c278,280 < "title": "groupResource", < "type": "action", < "name": "groupResource", < "parameters": { < "groupId": "combat", < "name": "meleePosition" < }, < "output": { < "position": "movePosition" < } < }, < { < "title": "failer", < "type": "decorator", < "name": "failer", --- > "title": "dynamic", > "type": "composite", > "name": "dynamic", 279,284c282,307 < "child": { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 0.5 --- > "children": [ > { > "title": "groupResource", > "type": "action", > "name": "groupResource", > "parameters": { > "groupId": "combat", > "name": "meleePosition" > }, > "output": { > "position": "movePosition" > } > }, > { > "title": "failer", > "type": "decorator", > "name": "failer", > "parameters": {}, > "child": { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 0.5 > } > } 286c309,315 < } --- > ] > }, > { > "title": "NPC Melee", > "type": "module", > "name": "meleecombat", > "parameters": {} 289,294d317 < }, < { < "title": "NPC Melee", < "type": "module", < "name": "meleecombat", < "parameters": {} 299,341c322 < } < ] < }, < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "hasRangedPrimary", < "type": "action", < "name": "hasRangedPrimary", < "parameters": {} < }, < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "combat", < "taskId": "ranged", < "minMembers": 1, < "maxMembers": 8 < }, < "child": { < "title": "NPC Ranged", < "type": "module", < "name": "rangedcombat", < "parameters": {} < } < } < ] < }, < { < "title": "optional", < "type": "decorator", < "name": "optional", < "parameters": { < "shouldRun": "" --- > ] 343c324 < "child": { --- > { 353c334 < "title": "hasMeleePrimary", --- > "title": "hasRangedPrimary", 355c336 < "name": "hasMeleePrimary", --- > "name": "hasRangedPrimary", 360c341 < "type": "decorator", --- > "type": "action", 364c345 < "taskId": "meleeStandby", --- > "taskId": "ranged", 366a348,378 > } > }, > { > "title": "NPC Ranged", > "type": "module", > "name": "rangedcombat", > "parameters": {} > } > ] > }, > { > "title": "optional", > "type": "decorator", > "name": "optional", > "parameters": { > "shouldRun": "" > }, > "child": { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "hasMeleePrimary", > "type": "action", > "name": "hasMeleePrimary", > "parameters": {} 368c380,391 < "child": { --- > { > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "combat", > "taskId": "meleeStandby", > "minMembers": 1, > "maxMembers": 8 > } > }, > { 374,375c397,404 < } < ] --- > ] > } > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 377,386c406,421 < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] < } < ] --- > ] > } > ] > } > ] > }, > { > "title": "entityConfigParameter", > "type": "action", > "name": "entityConfigParameter", > "parameters": { > "default": false, > "path": "aggressive" > }, > "output": { > "bool": "aggressive" 388,396d422 < ] < }, < { < "title": "entityConfigParameter", < "type": "action", < "name": "entityConfigParameter", < "parameters": { < "default": false, < "path": "aggressive" 398,416c424,439 < "output": { < "bool": "aggressive" < } < }, < { < "title": "setAggressive", < "type": "action", < "name": "setAggressive", < "parameters": { < "aggressive": "aggressive" < } < }, < { < "title": "unset", < "type": "action", < "name": "unset", < "parameters": { < "type": "entity", < "key": "combatTarget" --- > { > "title": "setAggressive", > "type": "action", > "name": "setAggressive", > "parameters": { > "aggressive": "aggressive" > } > }, > { > "title": "unset", > "type": "action", > "name": "unset", > "parameters": { > "type": "entity", > "key": "combatTarget" > } 418,420c441,443 < } < ] < } --- > ] > } > ] behaviors\npc\reactionchat.behavior 7a8 > "/scripts/behavior/bgroup.lua", 146,148c147,149 < "title": "task", < "type": "decorator", < "name": "task", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 150,153c151,152 < "groupId": "chat", < "taskId": "react", < "minMembers": 1, < "maxMembers": 1 --- > "fail": 1, > "success": -1 155,167c154,182 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "chooseReaction", < "type": "action", < "name": "chooseReaction", < "parameters": { < "influence": "influence", < "target": "reactTarget" --- > "children": [ > { > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "chat", > "taskId": "react", > "minMembers": 1, > "maxMembers": 1 > } > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "chooseReaction", > "type": "action", > "name": "chooseReaction", > "parameters": { > "influence": "influence", > "target": "reactTarget" > }, > "output": { > "reaction": "reaction" > } 169,196c184,198 < "output": { < "reaction": "reaction" < } < }, < { < "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": "isFinalReaction", < "type": "action", < "name": "isFinalReaction", < "parameters": { < "reaction": "reaction" < } --- > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 198,204c200,216 < { < "title": "sendInfluenceNotification", < "type": "action", < "name": "sendInfluenceNotification", < "parameters": { < "reaction": "reaction", < "target": "chatfriend" --- > "children": [ > { > "title": "isFinalReaction", > "type": "action", > "name": "isFinalReaction", > "parameters": { > "reaction": "reaction" > } > }, > { > "title": "sendInfluenceNotification", > "type": "action", > "name": "sendInfluenceNotification", > "parameters": { > "reaction": "reaction", > "target": "chatfriend" > } 206,217c218 < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > ] 219,226c220,228 < "children": [ < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1 < } --- > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 228,236c230,242 < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "selector", < "type": "composite", < "name": "selector", --- > "children": [ > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 1 > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", 238,252c244,264 < "children": [ < { < "title": "playSimpleReaction", < "type": "action", < "name": "playSimpleReaction", < "parameters": { < "reaction": "reaction" < } < }, < { < "title": "playBehaviorReaction", < "type": "action", < "name": "playBehaviorReaction", < "parameters": { < "reaction": "reaction" --- > "child": { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "playSimpleReaction", > "type": "action", > "name": "playSimpleReaction", > "parameters": { > "reaction": "reaction" > } > }, > { > "title": "playBehaviorReaction", > "type": "action", > "name": "playBehaviorReaction", > "parameters": { > "reaction": "reaction" > } 254,273c266,270 < } < ] < } < }, < { < "title": "sendInfluenceNotification", < "type": "action", < "name": "sendInfluenceNotification", < "parameters": { < "reaction": "reaction", < "target": "chatfriend" < } < }, < { < "title": "failer", < "type": "decorator", < "name": "failer", < "parameters": {}, < "child": { < "title": "resetReaction", --- > ] > } > }, > { > "title": "sendInfluenceNotification", 275c272,281 < "name": "resetReaction", --- > "name": "sendInfluenceNotification", > "parameters": { > "reaction": "reaction", > "target": "chatfriend" > } > }, > { > "title": "failer", > "type": "decorator", > "name": "failer", 277,278c283,290 < "output": { < "reaction": "reaction" --- > "child": { > "title": "resetReaction", > "type": "action", > "name": "resetReaction", > "parameters": {}, > "output": { > "reaction": "reaction" > } 281,287c293,299 < } < ] < } < ] < } < ] < } --- > ] > } > ] > } > ] > } > ] behaviors\npc\combat\melee.behavior 2a3 > "description": "", 240c241 < "title": "coroutine", --- > "title": "succeeder", 242c243 < "name": "coroutine", --- > "name": "succeeder", 245,255c246,258 < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "onGround", > "type": "action", > "name": "onGround", > "parameters": {} 257,306c260,267 < "children": [ < { < "title": "onGround", < "type": "action", < "name": "onGround", < "parameters": {} < }, < { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "target", < "xRange": "maxRange", < "position": "self" < } < }, < { < "title": "meleecombat-aim", < "type": "module", < "name": "meleecombat-aim", < "parameters": {} < }, < { < "title": "cleanup", < "type": "composite", < "name": "cleanup", < "parameters": {}, < "children": [ < { < "title": "beginPrimaryFire", < "type": "action", < "name": "beginPrimaryFire", < "parameters": {} < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": "meleeWindup" < } < }, < { < "title": "endPrimaryFire", < "type": "action", < "name": "endPrimaryFire", < "parameters": {} < } < ] --- > { > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "target", > "xRange": "maxRange", > "position": "self" 308,309c269,304 < ] < } --- > }, > { > "title": "meleecombat-aim", > "type": "module", > "name": "meleecombat-aim", > "parameters": {} > }, > { > "title": "cleanup", > "type": "composite", > "name": "cleanup", > "parameters": {}, > "children": [ > { > "title": "beginPrimaryFire", > "type": "action", > "name": "beginPrimaryFire", > "parameters": {} > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": "meleeWindup" > } > }, > { > "title": "endPrimaryFire", > "type": "action", > "name": "endPrimaryFire", > "parameters": {} > } > ] > } > ] behaviors\npc\combat\meleeleap.behavior 129c129 < "success": 1 --- > "success": -1 133,168c133,145 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 < }, < "children": [ < { < "title": "projectileAimVector", < "type": "action", < "name": "projectileAimVector", < "parameters": { < "collisionCheck": true, < "fromPosition": "self", < "gravityMultiplier": 1.5, < "speed": 40, < "toPosition": "meleePosition", < "useHighArc": false < }, < "output": { < "aimVector": "jumpVector" < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] --- > "title": "projectileAimVector", > "type": "action", > "name": "projectileAimVector", > "parameters": { > "collisionCheck": true, > "fromPosition": "self", > "gravityMultiplier": 1.5, > "speed": 40, > "toPosition": "meleePosition", > "useHighArc": false > }, > "output": { > "aimVector": "jumpVector" behaviors\npc\combat\ranged.behavior 2a3 > "description": "", 228,238c229,243 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "target" > } 240,247c245,250 < "children": [ < { < "title": "entityInSight", < "type": "action", < "name": "entityInSight", < "parameters": { < "entity": "target" < } --- > { > "title": "entityPosition", > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "target" 249,252c252,264 < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", --- > "output": { > "position": "targetPosition" > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", 254c266,269 < "entity": "target" --- > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 256,273c271,286 < "output": { < "position": "targetPosition" < } < }, < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", < "parameters": {}, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "children": [ > { > "title": "projectileAimVector", > "type": "action", > "name": "projectileAimVector", > "parameters": { > "collisionCheck": false, > "fromPosition": "self", > "gravityMultiplier": "arrowGravity", > "speed": "", > "toPosition": "targetPosition", > "useHighArc": false > }, > "output": { > "aimVector": "aimVector" > } 275,290c288,297 < "children": [ < { < "title": "projectileAimVector", < "type": "action", < "name": "projectileAimVector", < "parameters": { < "collisionCheck": false, < "fromPosition": "self", < "gravityMultiplier": "arrowGravity", < "speed": "", < "toPosition": "targetPosition", < "useHighArc": false < }, < "output": { < "aimVector": "aimVector" < } --- > { > "title": "vecMultiply", > "type": "action", > "name": "vecMultiply", > "parameters": { > "first": "aimVector", > "second": [ > 10, > 10 > ] 292,305c299,300 < { < "title": "vecMultiply", < "type": "action", < "name": "vecMultiply", < "parameters": { < "first": "aimVector", < "second": [ < 10, < 10 < ] < }, < "output": { < "vector": "aimOffset" < } --- > "output": { > "vector": "aimOffset" 307,325c302,303 < ] < } < }, < { < "title": "setAimPosition", < "type": "action", < "name": "setAimPosition", < "parameters": { < "offset": "aimOffset", < "position": "self" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1 < } --- > } > ] 327,328c305,323 < ] < } --- > }, > { > "title": "setAimPosition", > "type": "action", > "name": "setAimPosition", > "parameters": { > "offset": "aimOffset", > "position": "self" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 1 > } > } > ] 367,377c362,376 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "entityInSight", > "type": "action", > "name": "entityInSight", > "parameters": { > "entity": "target" > } 379,420c378,391 < "children": [ < { < "title": "entityInSight", < "type": "action", < "name": "entityInSight", < "parameters": { < "entity": "target" < } < }, < { < "title": "faceEntity", < "type": "action", < "name": "faceEntity", < "parameters": { < "entity": "target" < } < }, < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", < "parameters": { < "entity": "target" < }, < "output": { < "position": "targetPosition" < } < }, < { < "title": "offsetPosition", < "type": "action", < "name": "offsetPosition", < "parameters": { < "offset": [ < 0, < 0 < ], < "position": "targetPosition" < }, < "output": { < "position": "aimPosition" < } --- > { > "title": "faceEntity", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "target" > } > }, > { > "title": "entityPosition", > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "target" 422,428c393,406 < { < "title": "setAimPosition", < "type": "action", < "name": "setAimPosition", < "parameters": { < "position": "aimPosition" < } --- > "output": { > "position": "targetPosition" > } > }, > { > "title": "offsetPosition", > "type": "action", > "name": "offsetPosition", > "parameters": { > "offset": [ > 0, > 0 > ], > "position": "targetPosition" 430,436c408,409 < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": "" < } --- > "output": { > "position": "aimPosition" 438,439c411,428 < ] < } --- > }, > { > "title": "setAimPosition", > "type": "action", > "name": "setAimPosition", > "parameters": { > "position": "aimPosition" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": "" > } > } > ] 703c692 < } --- > } \ No newline at end of file behaviors\npc\crew\combat.behavior 2a3 > "description": "", 6a8 > "/scripts/behavior/bgroup.lua", 135,137c137,139 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 139,144c141,142 < "goal": "player", < "goalType": "entity", < "groupId": "combatBenefits", < "maxMembers": 5, < "minMembers": 1, < "position": "self" --- > "fail": 1, > "success": -1 146,154c144,167 < "child": { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "combatBenefits", < "taskId": "benefitGiver", < "minMembers": 1, < "maxMembers": 1 --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "player", > "goalType": "entity", > "groupId": "combatBenefits", > "maxMembers": 5, > "minMembers": 1, > "position": "self" > } > }, > { > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "combatBenefits", > "taskId": "benefitGiver", > "minMembers": 1, > "maxMembers": 1 > } 156c169 < "child": { --- > { 336c349 < } --- > ] behaviors\npc\crew\fieldbenefits.behavior 2a3 > "description": "", 6a8 > "/scripts/behavior/bgroup.lua", 72,74c74,76 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 76,81c78,79 < "goal": "player", < "goalType": "entity", < "groupId": "fieldBenefits", < "maxMembers": 5, < "minMembers": 1, < "position": "self" --- > "fail": 1, > "success": -1 83,91c81,104 < "child": { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "fieldBenefits", < "taskId": "benefitGiver", < "minMembers": 1, < "maxMembers": 1 --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "player", > "goalType": "entity", > "groupId": "fieldBenefits", > "maxMembers": 5, > "minMembers": 1, > "position": "self" > } > }, > { > "title": "task", > "type": "action", > "name": "task", > "parameters": { > "groupId": "fieldBenefits", > "taskId": "benefitGiver", > "minMembers": 1, > "maxMembers": 1 > } 93c106 < "child": { --- > { 273c286 < } --- > ] behaviors\npc\overrides\override-follow.behavior 2a3 > "description": "", 348,373c349,362 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "controlParameters", < "type": "action", < "name": "controlParameters", < "parameters": { < "parameters": "" < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "controlParameters", > "type": "action", > "name": "controlParameters", > "parameters": { > "parameters": "" 375,376c364,371 < ] < } --- > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] behaviors\npc\reactions\pianoparty.behavior 2a3 > "description": "", 3a5 > "/scripts/behavior/bgroup.lua", 11,13c13,15 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 15,20c17,18 < "goal": "reactTarget", < "goalType": "entity", < "groupId": "pianoparty", < "maxMembers": 99, < "minMembers": 1, < "position": "self" --- > "fail": 1, > "success": -1 22,39c20,41 < "child": { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "pianoparty", < "taskId": "pianist", < "minMembers": 1, < "maxMembers": 1 < }, < "child": { < "title": "sequence", --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "reactTarget", > "goalType": "entity", > "groupId": "pianoparty", > "maxMembers": 99, > "minMembers": 1, > "position": "self" > } > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "parallel", 41,42c43,47 < "name": "sequence", < "parameters": {}, --- > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, 45c50 < "title": "entityPosition", --- > "title": "task", 47c52 < "name": "entityPosition", --- > "name": "task", 49,52c54,57 < "entity": "reactTarget" < }, < "output": { < "position": "reactTargetPos" --- > "groupId": "pianoparty", > "taskId": "pianist", > "minMembers": 1, > "maxMembers": 1 56,83c61,63 < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "position": "reactTargetPos", < "run": false < }, < "output": { < "direction": "direction", < "pathfinding": "isPathfinding" < } < }, < { < "title": "faceEntity", < "type": "action", < "name": "faceEntity", < "parameters": { < "entity": "reactTarget" < } < }, < { < "title": "succeeder", < "type": "decorator", < "name": "succeeder", --- > "title": "sequence", > "type": "composite", > "name": "sequence", 85,122c65,71 < "child": { < "title": "setLounging", < "type": "action", < "name": "setLounging", < "parameters": { < "entity": "reactTarget" < } < } < }, < { < "title": "interactObject", < "type": "action", < "name": "interactObject", < "parameters": { < "entity": "reactTarget" < } < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": 15, < "untilSuccess": false < }, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "blabbering" < } --- > "children": [ > { > "title": "entityPosition", > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "reactTarget" 124,130c73,87 < { < "title": "dance", < "type": "action", < "name": "dance", < "parameters": { < "dance": "typing" < } --- > "output": { > "position": "reactTargetPos" > } > }, > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": true, > "maxGround": 5, > "minGround": -5, > "position": "reactTargetPos", > "run": false 132,133c89,108 < { < "title": "timer", --- > "output": { > "direction": "direction", > "pathfinding": "isPathfinding" > } > }, > { > "title": "faceEntity", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "reactTarget" > } > }, > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "setLounging", 135c110 < "name": "timer", --- > "name": "setLounging", 137c112 < "time": 2 --- > "entity": "reactTarget" 140,201c115,130 < ] < } < } < ] < } < }, < { < "title": "failer", < "type": "decorator", < "name": "failer", < "parameters": {}, < "child": { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": 5, < "untilSuccess": false < }, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "happy" < } < }, < { < "title": "randomize", < "type": "composite", < "name": "randomize", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "dance", < "type": "action", < "name": "dance", < "parameters": { < "dance": "posedance" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 2 < } < } < ] --- > }, > { > "title": "interactObject", > "type": "action", > "name": "interactObject", > "parameters": { > "entity": "reactTarget" > } > }, > { > "title": "repeater", > "type": "decorator", > "name": "repeater", > "parameters": { > "maxLoops": 15, > "untilSuccess": false 203c132 < { --- > "child": { 210c139 < "title": "dance", --- > "title": "emote", 212c141 < "name": "dance", --- > "name": "emote", 214c143 < "dance": "wiggledance" --- > "emote": "blabbering" 218,233d146 < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 2 < } < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { 238c151 < "dance": "armswingdance" --- > "dance": "typing" 251,253c164,277 < ] < } < ] --- > } > ] > } > ] > }, > { > "title": "failer", > "type": "decorator", > "name": "failer", > "parameters": {}, > "child": { > "title": "repeater", > "type": "decorator", > "name": "repeater", > "parameters": { > "maxLoops": 5, > "untilSuccess": false > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "emote", > "type": "action", > "name": "emote", > "parameters": { > "emote": "happy" > } > }, > { > "title": "randomize", > "type": "composite", > "name": "randomize", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "dance", > "type": "action", > "name": "dance", > "parameters": { > "dance": "posedance" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 2 > } > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "dance", > "type": "action", > "name": "dance", > "parameters": { > "dance": "wiggledance" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 2 > } > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "dance", > "type": "action", > "name": "dance", > "parameters": { > "dance": "armswingdance" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 2 > } > } > ] > } > ] > } > ] > } 256,258c280,282 < } < ] < } --- > ] > } > ] behaviors\npc\reactions\playairhockey.behavior 2a3 > "description": "", 4a6 > "/scripts/behavior/bgroup.lua", 36,38c38,40 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 40,45c42,43 < "goal": "reactTarget", < "goalType": "entity", < "groupId": "playairhockey", < "maxMembers": 2, < "minMembers": 2, < "position": "self" --- > "fail": 1, > "success": -1 47,66c45,71 < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "setFlag", < "type": "action", < "name": "setFlag", < "parameters": { < "name": "startedAirHockey" < } < }, < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", < "parameters": { < "entity": "reactTarget" --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "reactTarget", > "goalType": "entity", > "groupId": "playairhockey", > "maxMembers": 2, > "minMembers": 2, > "position": "self" > } > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "setFlag", > "type": "action", > "name": "setFlag", > "parameters": { > "name": "startedAirHockey" > } 68,89c73,91 < "output": { < "position": "reactTargetPos" < } < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "playairhockey", < "taskId": "player1", < "minMembers": 1, < "maxMembers": 1 < }, < "child": { < "title": "sequence", --- > { > "title": "entityPosition", > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "reactTarget" > }, > "output": { > "position": "reactTargetPos" > } > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "parallel", 91,92c93,97 < "name": "sequence", < "parameters": {}, --- > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, 95c100 < "title": "offsetPosition", --- > "title": "task", 97c102 < "name": "offsetPosition", --- > "name": "task", 99,106c104,107 < "offset": [ < -1.5, < 0 < ], < "position": "reactTargetPos" < }, < "output": { < "position": "standPos" --- > "groupId": "playairhockey", > "taskId": "player1", > "minMembers": 1, > "maxMembers": 1 110,115c111,139 < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1 < } --- > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "offsetPosition", > "type": "action", > "name": "offsetPosition", > "parameters": { > "offset": [ > -1.5, > 0 > ], > "position": "reactTargetPos" > }, > "output": { > "position": "standPos" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 1 > } > } > ] 118,128d141 < } < }, < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "playairhockey", < "taskId": "player2", < "minMembers": 1, < "maxMembers": 1 130,131c143,144 < "child": { < "title": "sequence", --- > { > "title": "parallel", 133,134c146,150 < "name": "sequence", < "parameters": {}, --- > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, 137c153 < "title": "offsetPosition", --- > "title": "task", 139c155 < "name": "offsetPosition", --- > "name": "task", 141,148c157,160 < "offset": [ < 3, < 0 < ], < "position": "reactTargetPos" < }, < "output": { < "position": "standPos" --- > "groupId": "playairhockey", > "taskId": "player2", > "minMembers": 1, > "maxMembers": 1 152,157c164,192 < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1 < } --- > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "offsetPosition", > "type": "action", > "name": "offsetPosition", > "parameters": { > "offset": [ > 3, > 0 > ], > "position": "reactTargetPos" > }, > "output": { > "position": "standPos" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 1 > } > } > ] 160a196,213 > ] > }, > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "groundPosition": true, > "maxGround": 5, > "minGround": -5, > "position": "standPos", > "run": false, > "failFast": false > }, > "output": { > "direction": "direction", > "pathfinding": "isPathfinding" 162,175d214 < ] < }, < { < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "position": "standPos", < "run": false, < "failFast": false 177,187c216,225 < "output": { < "direction": "direction", < "pathfinding": "isPathfinding" < } < }, < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", < "parameters": { < "entity": "self" --- > { > "title": "entityPosition", > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "self" > }, > "output": { > "y": "selfY" > } 189,218c227,243 < "output": { < "y": "selfY" < } < }, < { < "title": "setPosition", < "type": "action", < "name": "setPosition", < "parameters": { < "footPosition": false, < "position": "standPos", < "x": null, < "y": "selfY" < } < }, < { < "title": "faceEntity", < "type": "action", < "name": "faceEntity", < "parameters": { < "entity": "reactTarget" < } < }, < { < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "maxLoops": 6, < "untilSuccess": false --- > { > "title": "setPosition", > "type": "action", > "name": "setPosition", > "parameters": { > "footPosition": false, > "position": "standPos", > "y": "selfY" > } > }, > { > "title": "faceEntity", > "type": "action", > "name": "faceEntity", > "parameters": { > "entity": "reactTarget" > } 220,221c245,279 < "child": { < "title": "sequence", --- > { > "title": "repeater", > "type": "decorator", > "name": "repeater", > "parameters": { > "maxLoops": 6, > "untilSuccess": false > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "dance", > "type": "action", > "name": "dance", > "parameters": { > "dance": "typing" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 2 > } > } > ] > } > }, > { > "title": "selector", 223c281 < "name": "sequence", --- > "name": "selector", 227c285 < "title": "dance", --- > "title": "task", 229c287 < "name": "dance", --- > "name": "task", 231c289,292 < "dance": "typing" --- > "groupId": "playairhockey", > "taskId": "winner", > "minMembers": 1, > "maxMembers": 1 235c296 < "title": "timer", --- > "title": "task", 237c298 < "name": "timer", --- > "name": "task", 239c300,303 < "time": 2 --- > "groupId": "playairhockey", > "taskId": "loser", > "minMembers": 1, > "maxMembers": 1 244,322c308,310 < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "playairhockey", < "taskId": "winner", < "minMembers": 1, < "maxMembers": 1 < }, < "child": { < "title": "reaction-jumpforjoy", < "type": "module", < "name": "reaction-jumpforjoy", < "parameters": {} < } < }, < { < "title": "task", < "type": "decorator", < "name": "task", < "parameters": { < "groupId": "playairhockey", < "taskId": "loser", < "minMembers": 1, < "maxMembers": 1 < }, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "randomize", < "type": "composite", < "name": "randomize", < "parameters": {}, < "children": [ < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "sad" < } < }, < { < "title": "emote", < "type": "action", < "name": "emote", < "parameters": { < "emote": "annoyed" < } < } < ] < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 2 < } < } < ] < } < } < ] < } < ] < } --- > ] > } > ] behaviors\npc\unique\castlearcher.behavior 2a3 > "description": "", 177,189c178,192 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" --- > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "beginPrimaryFire", > "type": "action", > "name": "beginPrimaryFire", > "parameters": {} 191,210c194,199 < "children": [ < { < "title": "beginPrimaryFire", < "type": "action", < "name": "beginPrimaryFire", < "parameters": {} < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1.1 < } < }, < { < "title": "endPrimaryFire", < "type": "action", < "name": "endPrimaryFire", < "parameters": {} --- > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": 1.1 212,213c201,208 < ] < } --- > }, > { > "title": "endPrimaryFire", > "type": "action", > "name": "endPrimaryFire", > "parameters": {} > } > ] behaviors\npc\unique\cultistinvader.behavior 10a11 > "/scripts/behavior/bgroup.lua", 138,140c139,141 < "title": "group", < "type": "decorator", < "name": "group", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 142,148c143,144 < "goal": "ballista", < "goalType": "entity", < "groupId": "followBallista", < "maxMembers": 1, < "minMembers": 1, < "parameters": {}, < "unique": true --- > "fail": 1, > "success": -1 150,159c146,156 < "child": { < "title": "Villager", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "selector", < "type": "composite", < "name": "selector", --- > "children": [ > { > "title": "group", > "type": "action", > "name": "group", > "parameters": { > "goal": "ballista", > "goalType": "entity", > "groupId": "followBallista", > "maxMembers": 1, > "minMembers": 1, 161,179c158,201 < "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": "entityInRange", --- > "unique": true > } > }, > { > "title": "Villager", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "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": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "ballista", > "range": 8, > "position": "self" > } > } > }, > { > "title": "entityPosition", 181c203 < "name": "entityInRange", --- > "name": "entityPosition", 183,185c205,208 < "entity": "ballista", < "range": 8, < "position": "self" --- > "entity": "ballista" > }, > "output": { > "position": "ballistaPosition" 187,194d209 < } < }, < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", < "parameters": { < "entity": "ballista" 196,197c211,230 < "output": { < "position": "ballistaPosition" --- > { > "title": "failer", > "type": "decorator", > "name": "failer", > "parameters": {}, > "child": { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "failFast": false, > "groundPosition": true, > "maxGround": 5, > "minGround": -5, > "pathOptions": {}, > "position": "ballistaPosition", > "run": true > } > } 198a232,242 > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" 200,206c244,246 < { < "title": "failer", < "type": "decorator", < "name": "failer", < "parameters": {}, < "child": { < "title": "moveToPosition", --- > "children": [ > { > "title": "loadUniqueEntity", 208c248 < "name": "moveToPosition", --- > "name": "loadUniqueEntity", 210,217c250,253 < "avoidLiquid": true, < "failFast": false, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "pathOptions": {}, < "position": "ballistaPosition", < "run": true --- > "uniqueId": "fireposition" > }, > "output": { > "entity": "fireStagehand" 219,239d254 < } < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "loadUniqueEntity", < "type": "action", < "name": "loadUniqueEntity", < "parameters": { < "uniqueId": "fireposition" 241,242c256,281 < "output": { < "entity": "fireStagehand" --- > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "fireStagehand", > "xRange": 2, > "position": "self" > } > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] 243a283,303 > ] > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": { > "type": "sliding", > "state": "off", > "fromEntity": "attackTarget", > "toEntity": "fleeTarget" > }, > "children": [ > { > "title": "loadUniqueEntity", > "type": "action", > "name": "loadUniqueEntity", > "parameters": { > "uniqueId": "ballistafireposition" 245,270c305,306 < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1, < "success": -1 < }, < "children": [ < { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "fireStagehand", < "xRange": 2, < "position": "self" < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] --- > "output": { > "entity": "firePosition" 272,292d307 < ] < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "loadUniqueEntity", < "type": "action", < "name": "loadUniqueEntity", < "parameters": { < "uniqueId": "ballistafireposition" 294,305c309,323 < "output": { < "entity": "firePosition" < } < }, < { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "firePosition", < "xRange": 2, < "position": "self" --- > { > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "firePosition", > "xRange": 2, > "position": "self" > } > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 307,322c325 < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} < } < ] < }, < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 --- > ] 324,331c327,333 < "children": [ < { < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "ballistapusher" < } --- > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 333,339c335,351 < { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": -1, < "run": false --- > "children": [ > { > "title": "addEphemeralEffect", > "type": "action", > "name": "addEphemeralEffect", > "parameters": { > "name": "ballistapusher" > } > }, > { > "title": "move", > "type": "action", > "name": "move", > "parameters": { > "direction": -1, > "run": false > } 341,345c353,357 < } < ] < } < ] < } --- > ] > } > ] > } > ] behaviors\npc\unique\esther.behavior 91,116c91,104 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 < }, < "children": [ < { < "title": "dance", < "type": "action", < "name": "dance", < "parameters": { < "dance": "estherhover" < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 > }, > "children": [ > { > "title": "dance", > "type": "action", > "name": "dance", > "parameters": { > "dance": "estherhover" 118,119c106,113 < ] < } --- > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] behaviors\sequences\floranmission\nuruendscene.behavior 69c69 < "success": 3 --- > "success": -1 behaviors\sequences\hylotlmission\koichiend.behavior 319,329c319,334 < "title": "coroutine", < "type": "decorator", < "name": "coroutine", < "parameters": {}, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": -1, < "success": -1 --- > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 > }, > "children": [ > { > "title": "move", > "type": "action", > "name": "move", > "parameters": { > "direction": 1, > "run": false > } 331,354c336,342 < "children": [ < { < "title": "move", < "type": "action", < "name": "move", < "parameters": { < "direction": 1, < "run": false < } < }, < { < "title": "openDoors", < "type": "action", < "name": "openDoors", < "parameters": { < "direction": "facingDirection", < "distance": 1.5 < } < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} --- > { > "title": "openDoors", > "type": "action", > "name": "openDoors", > "parameters": { > "direction": "facingDirection", > "distance": 1.5 356,357c344,351 < ] < } --- > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] cinematics\story\opengate\opengate.cinematic 1767c1767 < "resource" : "/sfx/cinematics/finale/tentacle_destruction.ogg" --- > "resource" : "/sfx/cinematics/opengate/opengate_music.ogg" 1771,1772c1771,1774 < "timecode" : 3.0, < "resource" : "/sfx/cinematics/finale/finale_music.ogg" --- > "timecode" : 9.8, > "endTimecode" : 11, > "loops" : -1, > "resource" : "/sfx/interface/aichatter1_loop.ogg" 1776,1777c1778,1779 < "timecode" : 16.3, < "endTimecode" : 18.5, --- > "timecode" : 15.81, > "endTimecode" : 17.01, 1779c1781 < "resource" : "/sfx/interface/aichatter1_slow_loop.ogg" --- > "resource" : "/sfx/interface/aichatter1_loop.ogg" 1783,1784c1785,1786 < "timecode" : 34.3, < "endTimecode" : 36.5, --- > "timecode" : 20.3, > "endTimecode" : 22.5, 1787a1790 > 1789,1790c1792,1793 < "timecode" : 46.3, < "endTimecode" : 48.5, --- > "timecode" : 28.81, > "endTimecode" : 31.01, 1793a1797 > 1795,1796c1799,1800 < "timecode" : 60.3, < "endTimecode" : 63.3, --- > "timecode" : 36.3, > "endTimecode" : 38.5, 1799a1804 > 1801,1802c1806,1807 < "timecode" : 79.8, < "endTimecode" : 82, --- > "timecode" : 43.8, > "endTimecode" : 46, 1805a1811 > 1807,1810c1813,1814 < "timecode" : 89.8, < "endTimecode" : 92, < "loops" : -1, < "resource" : "/sfx/interface/aichatter1_loop.ogg" --- > "timecode" : 53, > "resource" : "/sfx/cinematics/opengate/artifact_insert.ogg" 1811a1816 > 1813,1816c1818,1819 < "timecode" : 99.8, < "endTimecode" : 102, < "loops" : -1, < "resource" : "/sfx/interface/aichatter1_loop.ogg" --- > "timecode" : 54.5, > "resource" : "/sfx/cinematics/opengate/artifact_shine.ogg" 1817a1821 > 1819,1822c1823,1844 < "timecode" : 109.3, < "endTimecode" : 111.5, < "loops" : -1, < "resource" : "/sfx/interface/aichatter1_loop.ogg" --- > "timecode" : 58.0, > "resource" : "/sfx/cinematics/opengate/opengate_rumble.ogg" > }, > > { > "timecode" : 61.9, > "resource" : "/sfx/cinematics/opengate/opengate_blast.ogg" > }, > > { > "timecode" : 63, > "resource" : "/sfx/cinematics/opengate/artifacts_shimmer.ogg" > }, > > { > "timecode" : 64.89, > "resource" : "/sfx/cinematics/opengate/gate_debris.ogg" > }, > > { > "timecode" : 64.89, > "resource" : "/sfx/cinematics/opengate/portal_reveal.ogg" dialog\combat.config 173c173 < "Exhausted. I need to get more exercise.", --- > "Exhausted. I need to get more exercise.", 287c287 < "Come one!" --- > "Come on!" 309c309 < } \ No newline at end of file --- > } dungeons\missions\apexmissions\apexmission1.json [TMX file differences are left out for huge size.] dungeons\missions\avianmissions\avianmission1.json [TMX file differences are left out for huge size.] dungeons\other\outpost\outpost.json [TMX file differences are left out for huge size.] interface\optionsmenu\optionsmenu.config 154a155,168 > "clientJoinableLabel" : { > "type" : "label", > "position" : [62, 51], > "hAnchor" : "mid", > "value" : "PUBLIC GAME" > }, > "clientJoinableCheckbox" : { > "type" : "button", > "pressedOffset" : [0, 0], > "position" : [107, 54], > "base" : "/interface/optionsmenu/checkboxnocheck.png", > "baseImageChecked" : "/interface/optionsmenu/checkboxcheck.png", > "checkable" : true > }, interface\tooltips\codex.tooltip 24c24 < "wrapWidth" : 142 --- > "wrapWidth" : 138 interface\windowconfig\teambar.config 14,19d13 < "background" : { < "type" : "background", < "fileHeader" : "", < "fileBody" : "", < "fileFooter" : "" < }, 135c129 < "click" : { --- > "showMemberMenu" : { interface\windowconfig\teaminvitation.config 39c39 < "teamLeader" : { --- > "inviterName" : { interface\windowconfig\teammembermenu.config 14,20d13 < "windowtitle" : { < "type" : "title", < "title" : " - ATTENTION - ", < "subtitle" : "", < "size" : 12, < "position" : [0, 254] < }, 26c19 < "caption" : "" --- > "caption" : "BEAM TO SHIP" 44,50d36 < }, < "windowtitle" : { < "type" : "title", < "title" : " - ATTENTION - ", < "subtitle" : "", < "size" : 12, < "position" : [0, 254] items\active\weapons\staff\abilities\controlprojectile\controlprojectile.lua 100a101,105 > if self.fireMode == (self.activatingFireMode or self.abilitySlot) and self.lastFireMode ~= self.fireMode then > self:killProjectiles() > end > self.lastFireMode = self.fireMode > items\active\weapons\staff\abilities\controlprojectile\elementportal.weaponability 4c4 < "name" : "Element Portal", --- > "name" : " Portal", 12c12 < "projectileType" : "electricportal", --- > "projectileType" : "portal", items\active\weapons\staff\abilities\controlprojectile\elementrain.weaponability 12c12 < "projectileType" : "elementcloudspawner", --- > "projectileType" : "elementcloud", 14,15c14 < "baseDamage" : 10, < "spawnProjectile" : "elementcloud" --- > "baseDamage" : 10 items\active\weapons\staff\abilities\controlprojectile\elementswarm.weaponability 4c4 < "name" : "Element Swarm", --- > "name" : " Swarm", 14c14 < "projectileType" : "iceswarmer", --- > "projectileType" : "swarmer", items\active\weapons\staff\abilities\controlprojectile\plasmabarrage.weaponability 18c18 < "triggerSound" : ["/sfx/projectiles/plasma1.ogg"], --- > "triggerSound" : ["/sfx/gun/plasma_mp2.ogg"], items\armors\other\neo\neo.back 15,16c15,16 < /* GREEN */ < { "ffca8a" : "b2e89d", "e0975c" : "51bd3b", "a85636" : "247824", "6f2919" : "144216" }, --- > /* BLUE */ > { "ffca8a" : "96cbe7", "e0975c" : "5588d4", "a85636" : "344495", "6f2919" : "1a1c51" }, items\armors\other\neo\neo.chest 32,33c32,33 < /* GREEN */ < { "ffca8a" : "b2e89d", "e0975c" : "51bd3b", "a85636" : "247824", "6f2919" : "144216" }, --- > /* BLUE */ > { "ffca8a" : "96cbe7", "e0975c" : "5588d4", "a85636" : "344495", "6f2919" : "1a1c51" }, items\armors\other\neo\neo.head 17,20d16 < { < "stat" : "protection", < "amount" : 0.2 < } 25,26c21,22 < /* GREEN */ < { "ffca8a" : "b2e89d", "e0975c" : "51bd3b", "a85636" : "247824", "6f2919" : "144216" }, --- > /* BLUE */ > { "ffca8a" : "96cbe7", "e0975c" : "5588d4", "a85636" : "344495", "6f2919" : "1a1c51" }, items\armors\other\neo\neo.legs 23,24c23,24 < /* GREEN */ < { "ffca8a" : "b2e89d", "e0975c" : "51bd3b", "a85636" : "247824", "6f2919" : "144216" }, --- > /* BLUE */ > { "ffca8a" : "96cbe7", "e0975c" : "5588d4", "a85636" : "344495", "6f2919" : "1a1c51" }, items\generic\crafting\matteritem.item 9,12c9 < "itemTags" : [ "reagent" ], < "learnBlueprintsOnPickup" : [ < "bonusarmorhead", "bonusarmorpants", "bonusarmorchest" < ] --- > "itemTags" : [ "reagent" ] items\generic\crafting\monsterplating.item 9,15c9 < "itemTags" : [ "reagent" ], < < "learnBlueprintsOnPickup" : [ < "t2helm1", "t2helm2" < ] < < --- > "itemTags" : [ "reagent" ] items\generic\food\old\chilistew.consumable 9c9 < "shortdescription" : "Chilli", --- > "shortdescription" : "Chilli Stew", items\generic\food\old\curriedbeakseed.consumable 8c8 < "description" : "Curried, crunchy beakseeds with hot chili peppers. Mmm.", --- > "description" : "Curried, crunchy beakseeds with hot chilli peppers. Mmm.", items\generic\food\tier3\coconutmilk.consumable 8c8 < "shortdescription" : "Coconut Milk", --- > "shortdescription" : "Coconut Drink", items\generic\food\tier5\eyebowls.consumable 8c8 < "shortdescription" : "eyebowls", --- > "shortdescription" : "Eyebowls", leveling\levelingmultipliers.functions 82,92c82,92 < [0, 0], < [1, 10], < [2, 25], < [3, 40], < [4, 60], < [5, 70], < [6, 77], < [7, 81], < [8, 85], < [9, 87], < [10, 89] --- > [0, 0], > [1, 25], > [2, 45], > [3, 60], > [4, 70], > [5, 75], > [6, 79], > [7, 82], > [8, 84], > [9, 85], > [10, 86] 115,123c115,123 < [2, 1.5], < [3, 2.0], < [4, 2.5], < [5, 3.0], < [6, 3.5], < [7, 4.0], < [8, 4.5], < [9, 5.0], < [10,5.5] --- > [2, 2.25], > [3, 4.0], > [4, 6.25], > [5, 9.0], > [6, 12.25], > [7, 16.0], > [8, 20.25], > [9, 25.0], > [10,30.25] 131,139c131,139 < [2, 1.5], < [3, 2.0], < [4, 2.5], < [5, 3.0], < [6, 3.5], < [7, 4.0], < [8, 4.5], < [9, 5.0], < [10,5.5] --- > [2, 2.25], > [3, 4.0], > [4, 6.25], > [5, 9.0], > [6, 12.25], > [7, 16.0], > [8, 20.25], > [9, 25.0], > [10,30.25] 155a156,215 > ], > > // Scales the powerMultiplier stat amount bonus on leveled armors > "armorLevelPowerMultiplierMultiplier" : [ "linear", "clamp", > [0, 0.0], > [1, 1.0], > [2, 2.0], > [3, 3.0], > [4, 4.0], > [5, 5.0], > [6, 6.0], > [7, 7.0], > [8, 8.0], > [9, 9.0], > [10, 10.0] > ], > > // Scales the protection stat amount bonus on leveled armors > "armorLevelProtectionMultiplier" : [ "linear", "clamp", > [0, 0], > [1, 25], > [2, 45], > [3, 60], > [4, 70], > [5, 75], > [6, 79], > [7, 82], > [8, 84], > [9, 85], > [10, 86] > ], > > // Scales the maxHealth stat amount bonus on leveled armors > "armorLevelMaxHealthMultiplier" : [ "linear", "clamp", > [0, 0.0], > [1, 1.0], > [2, 2.0], > [3, 3.0], > [4, 4.0], > [5, 5.0], > [6, 6.0], > [7, 7.0], > [8, 8.0], > [9, 9.0], > [10, 10] > ], > > // Scales the maxEnergy stat amount bonus on leveled armors > "armorLevelMaxEnergyMultiplier" : [ "linear", "clamp", > [0, 0.0], > [1, 1.0], > [2, 2.0], > [3, 3.0], > [4, 4.0], > [5, 5.0], > [6, 6.0], > [7, 7.0], > [8, 8.0], > [9, 9.0], > [10, 10] monsters\monster.lua 27c27,29 < monster.setUniqueId(config.getParameter("uniqueId")) --- > if config.getParameter("uniqueId") then > monster.setUniqueId(config.getParameter("uniqueId")) > end 131,132c133,134 < if self.behavior and self.behavior:run(dt * self.behaviorTickRate) ~= "running" then < self.behavior:reset() --- > if self.behavior then > self.behavior:run(dt * self.behaviorTickRate) 159d160 < self.behavior:uninit() 568c569 < end \ No newline at end of file --- > end npcs\bmain.lua 135,136c135,136 < if self.behavior and self.behavior:run(dt * self.behaviorTickRate) ~= "running" then < self.behavior:reset() --- > if self.behavior then > self.behavior:run(dt * self.behaviorTickRate) 137a138 > BGroup:updateGroups() 195c196 < self.behavior:uninit() --- > BGroup:uninit() objects\ancient\ancientconsole\ancientconsole.object 33c33 < "animationPosition" : [0, 14], --- > "animationPosition" : [1, 14], 50c50 < "animationPosition" : [13, 14], --- > "animationPosition" : [14, 14], objects\ancient\ancientconsole\returnconsole.object 31c31 < "animationPosition" : [-46, 0], --- > "animationPosition" : [1, 14], 48c48 < "animationPosition" : [-33, 0], --- > "animationPosition" : [14, 14], objects\biome\scorchedcity\metallictrapdoor\metallictrapdoor.object 12d11 < 21d19 < 38c36 < --- > 49,51d46 < < "inboundNodes" : [ [-2, 0] ], < "outboundNodes" : [ [2, 0] ], objects\farmables\cotton\cottonseed.object 24,26c24 < "imagePosition" : [0, 0], < "frames" : 1, < "animationCycle" : 0.5, --- > "imagePosition" : [-8, 0], objects\farmables\cotton\wildcottonseed.object 25,27c25 < "imagePosition" : [0, 0], < "frames" : 1, < "animationCycle" : 0.5, --- > "imagePosition" : [-8, 0], objects\fossils\displaystands\fossildisplay1\fossildisplay1.config 5,7c5,7 < "fileHeader" : "/interface/chests/chestheader.png", < "fileBody" : "/interface/chests/slots1to16.png", < "fileFooter" : "/interface/chests/chestfooter.png" --- > "fileHeader" : "/interface/objectcrafting/fossilheader.png", > "fileBody" : "/interface/objectcrafting/fossilcrafting.png", > "fileFooter" : "/interface/objectcrafting/fossilfooter.png" 9,15c9,14 < "objectImage" : { < "type" : "image", < "position" : [39, 79], < "file" : "", < "centered" : true, < "maxSize" : [40, 40], < "minSize" : [40, 40] --- > "close" : { > "type" : "button", > "base" : "/interface/inventory/x.png", > "hover" : "/interface/inventory/xhover.png", > "press" : "/interface/inventory/xpress.png", > "position" : [124, 84] 19c18 < "position" : [110, 60], --- > "position" : [61, 44], 26,32c25 < "value" : "Drag & Drop", < "hAnchor" : "mid", < "position" : [40, 37] < }, < "count" : { < "type" : "label", < "value" : "1 FOSSIL", --- > "value" : "Insert Fossil", 34c27 < "position" : [120, 109] --- > "position" : [70, 66] 38,39c31,32 < "file" : "/interface/chests/shine1to16.png", < "position" : [0, 2] --- > "file" : "/interface/objectcrafting/fossilshine.png", > "position" : [1, 20] objects\fossils\displaystands\fossildisplay1\fossildisplay1.object 15c15,16 < "subtitle" : "Fossil display, for fossils only", --- > "subtitle" : "Display fossils", > 16a18 > objects\fossils\displaystands\fossildisplay3\fossildisplay3.config 5,7c5,7 < "fileHeader" : "/interface/chests/chestheader.png", < "fileBody" : "/interface/chests/slots1to16.png", < "fileFooter" : "/interface/chests/chestfooter.png" --- > "fileHeader" : "/interface/objectcrafting/fossilheader.png", > "fileBody" : "/interface/objectcrafting/fossilcrafting.png", > "fileFooter" : "/interface/objectcrafting/fossilfooter.png" 9,15c9,14 < "objectImage" : { < "type" : "image", < "position" : [39, 79], < "file" : "", < "centered" : true, < "maxSize" : [40, 40], < "minSize" : [40, 40] --- > "close" : { > "type" : "button", > "base" : "/interface/inventory/x.png", > "hover" : "/interface/inventory/xhover.png", > "press" : "/interface/inventory/xpress.png", > "position" : [124, 84] 19,21c18,20 < "position" : [110, 40], < "dimensions" : [1, 3], < "spacing" : [19, 19], --- > "position" : [40, 44], > "dimensions" : [3, 1], > "spacing" : [22, 19], 26,32c25 < "value" : "Drag & Drop", < "hAnchor" : "mid", < "position" : [40, 37] < }, < "count" : { < "type" : "label", < "value" : "3 FOSSILS", --- > "value" : "Insert Fossil", 34c27 < "position" : [120, 109] --- > "position" : [70, 66] 38,39c31,32 < "file" : "/interface/chests/shine1to16.png", < "position" : [0, 2] --- > "file" : "/interface/objectcrafting/fossilshine.png", > "position" : [1, 20] objects\fossils\displaystands\fossildisplay3\fossildisplay3.object 15c15,16 < "subtitle" : "Fossil display, for fossils only", --- > "subtitle" : "Display fossils", > 16a18 > objects\fossils\displaystands\fossildisplay5\fossildisplay5.config 5,7c5,7 < "fileHeader" : "/interface/chests/chestheader.png", < "fileBody" : "/interface/chests/slots1to16.png", < "fileFooter" : "/interface/chests/chestfooter.png" --- > "fileHeader" : "/interface/objectcrafting/fossilheader.png", > "fileBody" : "/interface/objectcrafting/fossilcrafting.png", > "fileFooter" : "/interface/objectcrafting/fossilfooter.png" 9,15c9,14 < "objectImage" : { < "type" : "image", < "position" : [39, 79], < "file" : "", < "centered" : true, < "maxSize" : [40, 40], < "minSize" : [40, 40] --- > "close" : { > "type" : "button", > "base" : "/interface/inventory/x.png", > "hover" : "/interface/inventory/xhover.png", > "press" : "/interface/inventory/xpress.png", > "position" : [124, 84] 19,21c18,20 < "position" : [110, 20], < "dimensions" : [1, 5], < "spacing" : [19, 19], --- > "position" : [16, 44], > "dimensions" : [5, 1], > "spacing" : [22, 19], 26,32c25 < "value" : "Drag & Drop", < "hAnchor" : "mid", < "position" : [40, 37] < }, < "count" : { < "type" : "label", < "value" : "5 FOSSILS", --- > "value" : "Insert Fossil", 34c27 < "position" : [120, 109] --- > "position" : [70, 66] 38,39c31,32 < "file" : "/interface/chests/shine1to16.png", < "position" : [0, 2] --- > "file" : "/interface/objectcrafting/fossilshine.png", > "position" : [1, 20] objects\fossils\displaystands\fossildisplay5\fossildisplay5.object 15c15,16 < "subtitle" : "Fossil display, for fossils only", --- > "subtitle" : "Display fossils", > 16a18 > objects\hylotl\hylotlclassicbookcase\hylotlclassicbookcase.object 5c5 < "category" : "decorative", --- > "category" : "storage", objects\mission\caveart3\caveart3.object 5,6c5,6 < "description" : "Cave art depicting a ceremony.", < "shortdescription" : "Ceremonial Cave Art", --- > "description" : "Cave art depicting some large figure.", > "shortdescription" : "Figure Cave Art", 12c12 < "avianDescription" : "Do the Floran worship a sun?", --- > "avianDescription" : "Who is this giant figure? They shine like the sun itself.", 14,15c14,15 < "glitchDescription" : "Fearful. Something about this drawing unsettles me.", < "humanDescription" : "More vague drawings. What is it meant to be?", --- > "glitchDescription" : "Fearful. Something about this drawing feels impossibly ancient.", > "humanDescription" : "This painting looks like a giant person, shining like the sun.", objects\mission\caveart4\caveart4.object 5c5 < "description" : "Cave art depicting an unidentified subject.", --- > "description" : "Cave art depicting a tentacled being.", 16c16 < "hylotlDescription" : "What is the meaning of this and why does it scare me so?", --- > "hylotlDescription" : "This brings back bad memories.", objects\mission\caveart5\caveart5.object 11,17c11,17 < "apexDescription" : "Is this some fable of Floran origin?", < "avianDescription" : "Perhaps the Floran have their own dieties too?", < "floranDescription" : "Picture confusse Floran.", < "glitchDescription" : "Worried. I do not understand what this is a depiction of.", < "humanDescription" : "Who is the being represented here?", < "hylotlDescription" : "This painting could mean many things.", < "novakidDescription" : "Who's that meant to be?", --- > "apexDescription" : "Is this an ancient being giving the Floran something?", > "avianDescription" : "This appears to show a large being giving something to some happy figures.", > "floranDescription" : "Thisss picture isss of big thing giving gift to Floran.", > "glitchDescription" : "Intrigued. This appears to be a crude replication of an event that happened long ago.", > "humanDescription" : "I wonder just how old this painting is?", > "hylotlDescription" : "This painting seems to show a great being giving a gift of great importance to people beneath him.", > "novakidDescription" : "This here paintin' shows someone big handin' over a gift. Seems familiar.", objects\mission\templepressureplatform\templepressureplatform.object 12d11 < 21d19 < 37c35 < --- > 49,52c47 < "inboundNodes" : [ [-2, 0] ], < "outboundNodes" : [ [2, 0] ], < < "detectArea" : [ [-1.95, 0], [2.95, 1.25] ], --- > "detectArea" : [ [-1.95, 0.5], [2.95, 1.25] ], 54c49 < "stayClosedTime" : 0.18, // before the platform disappears --- > "stayClosedTime" : 0.4, // before the platform disappears objects\outpost\frogfurnishing\frogfurnishing.object 32a33,40 > "interactiveSpaces": [ > [-5, 1], [-4, 1], [-3, 1], [-2, 1], [-1, 1], [0, 1], > [-5, 2], [-4, 2], [-3, 2], [-2, 2], > [-4, 3], [-3, 3], [-2, 3], > [-4, 4], [-3, 4], [-2, 4], > [-5, 5], [-4, 5], [-3, 5], [-2, 5], [-1, 5], [0, 5], > [-4, 6], [-3, 6], [-2, 6], [-1, 6], [0, 6] > ], 45a54,61 > "interactiveSpaces": [ > [4, 1], [3, 1], [2, 1], [1, 1], [0, 1], [-1, 1], > [4, 2], [3, 2], [2, 2], [1, 2], > [3, 3], [2, 3], [1, 3], > [3, 4], [2, 4], [1, 4], > [4, 5], [3, 5], [2, 5], [1, 5], [0, 5], [-1, 5], > [3, 6], [2, 6], [1, 6], [0, 6], [-1, 6] > ], objects\outpost\infinityexpress\infinityexpress.object 61a62,68 > "interactiveSpaces": [ > [0, 0], [1, 0], [2, 0], > [0, 1], [1, 1], [2, 1], > [0, 2], [1, 2], [2, 2], > [0, 3], [1, 3], [2, 3], > [0, 4], [1, 4], [2, 4] > ], 74a82,88 > "interactiveSpaces": [ > [-3, 0], [-2, 0], [-1, 0], > [-3, 1], [-2, 1], [-1, 1], > [-3, 2], [-2, 2], [-1, 2], > [-3, 3], [-2, 3], [-1, 3], > [-3, 4], [-2, 4], [-1, 4] > ], objects\outpost\shipyardcaptain\shipyardcaptain.object 75,76c75,76 < "startErchiusMission" : "I can fix your FTL with ^orange;Erchius Crystals^reset;. I'll show you where to get some.", < "turnInErchius" : "Perfect! These'll do the job. I'll go ahead and fix up your ship now." --- > "startErchiusMission" : "I can repair that ship, but it's gonna take 20 ^orange;Erchius Crystals^reset;... You better ^green;get yerself to the Erchius Mining Facility^reset;.", > "turnInErchius" : "Perfect! These'll do the job. I'll go ahead and fix up yer ship now." objects\outpost\teddybearplush\teddybearplush.object 3c3 < "colonyTags" : ["outpost","pretty"], --- > "colonyTags" : ["pretty"], 23c23 < "dualImage" : "teddybearplush.png:", --- > "image" : "teddybearplush.png:", 25,26c25,27 < "frames" : 1, < "animationCycle" : 0.4, --- > > "direction" : "left", > "flipImages" : true, 29a31,34 > }, > { > "image" : "teddybearplush.png:", > "imagePosition" : [-8, 0], 30a36,39 > "direction" : "right", > > "spaceScan" : 0.1, > "anchors" : [ "bottom" ] objects\outpost\terramart\terramart.object 60a61,68 > "interactiveSpaces": [ > [-5, 1], [-4, 1], [-3, 1], [-2, 1], [-1, 1], [0, 1], > [-5, 2], [-4, 2], [-3, 2], [-2, 2], [-1, 2], > [-4, 3], [-3, 3], [-2, 3], > [-4, 4], [-3, 4], [-2, 4], > [-6, 5], [-5, 5], [-4, 5], [-3, 5], [-2, 5], [-1, 5], [0, 5], > [-6, 6], [-5, 6], [-4, 6], [-3, 6], [-2, 6], [-1, 6], [0, 6] > ], 73a82,89 > "interactiveSpaces": [ > [6, 1], [5, 1], [4, 1], [3, 1], [2, 1], [1, 1], [0, 1], [-1, 1], > [4, 2], [3, 2], [2, 2], [1, 2], [0, 2], > [3, 3], [2, 3], [1, 3], > [3, 4], [2, 4], [1, 4], > [5, 5], [4, 5], [3, 5], [2, 5], [1, 5], [0, 5], [-1, 5], > [5, 6], [4, 6], [3, 6], [2, 6], [1, 6], [0, 6], [-1, 6] > ], objects\outpost\ursaminer\ursaminer.object 72a73,79 > "interactiveSpaces": [ > [-9, 1], [-8, 1], [-7, 1], [-6, 1], [-5, 1], > [-8, 2], [-7, 2], [-6, 2], [-5, 2], > [-8, 3], [-7, 3], [-6, 3], [-5, 3], > [-9, 4], [-8, 4], [-7, 4], [-6, 4], [-5, 4], [-4, 4], > [-9, 5], [-8, 5], [-7, 5], [-6, 5], [-5, 5], [-4, 5] > ], objects\outpost\ursaminer\ursaminerclosed.object 40a41,47 > "interactiveSpaces": [ > [-6, 0], [-5, 0], [-4, 0], [-3, 0], [-2, 0], [-1, 0], > [-6, 1], [-5, 1], [-4, 1], [-3, 1], [-2, 1], [-1, 1], > [-6, 2], [-5, 2], [-4, 2], [-3, 2], [-2, 2], [-1, 2], > [-6, 3], [-5, 3], [-4, 3], [-3, 3], [-2, 3], [-1, 3], > [-6, 4], [-5, 4], [-4, 4], [-3, 4], [-2, 4], [-1, 4] > ], objects\wired\door\trapdoor.lua 1,5d0 < require "/objects/wired/door/door.lua" < < -- Caveat: You must NEVER load this script before door.lua, so be careful! < local doorInit = init < 7c2,3 < doorInit() --- > setupMaterialSpaces() > object.setMaterialSpaces(self.closedMaterialSpaces) 35a32,34 > self.state = false > self.triggered = false > 43,54c42,45 < if not object.isInboundNodeConnected(0) then < if animator.animationState("doorState") == "closed" then < if entityInArea() then < self.openTimer = math.max(0, self.openTimer - dt) < if self.openTimer == 0 then < openDoor() < self.closeTimer = self.stayOpenTime < end < else < self.openTimer = math.min(self.stayClosedTime, self.openTimer + dt) < end < elseif animator.animationState("doorState") == "open" then --- > if self.state then > if entityInArea() then > self.closeTimer = self.stayOpenTime > else 56,58c47,60 < if self.closeTimer == 0 and not entityInArea() then < closeDoor() < self.openTimer = self.stayOpenTime --- > end > > if self.closeTimer == 0 then > closeDoor() > end > else > if not self.triggered and entityInArea() then > self.triggered = true > end > > if self.triggered then > self.openTimer = math.max(0, self.openTimer - dt) > if self.openTimer == 0 then > openDoor() 63a66,86 > function closeDoor() > if self.state ~= false then > self.state = false > self.triggered = false > self.openTimer = self.stayClosedTime > animator.playSound("close") > animator.setAnimationState("doorState", "closing") > object.setMaterialSpaces(self.closedMaterialSpaces) > end > end > > function openDoor() > if not self.state then > self.state = true > self.closeTimer = self.stayOpenTime > animator.playSound("open") > animator.setAnimationState("doorState", "open") > object.setMaterialSpaces(self.openMaterialSpaces) > end > end > 71c94,105 < end \ No newline at end of file --- > end > > function setupMaterialSpaces() > self.closedMaterialSpaces = config.getParameter("closedMaterialSpaces") > if not self.closedMaterialSpaces then > self.closedMaterialSpaces = {} > for i, space in ipairs(object.spaces()) do > table.insert(self.closedMaterialSpaces, {space, "metamaterial:door"}) > end > end > self.openMaterialSpaces = config.getParameter("openMaterialSpaces", {}) > end projectiles\activeitems\staff\staffprojectile.lua 7a8 > self.timedActions = config.getParameter("timedActions", {}) 29a31,34 > > for _, action in pairs(self.timedActions) do > processTimedAction(action, dt) > end 57a63,86 > end > end > > function processTimedAction(action, dt) > if action.complete then > return > elseif action.delayTime then > action.delayTime = action.delayTime - dt > if action.delayTime <= 0 then > action.delayTime = nil > end > elseif action.loopTime then > action.loopTimer = action.loopTimer or 0 > action.loopTimer = math.max(0, action.loopTimer - dt) > if action.loopTimer == 0 then > projectile.processAction(action) > action.loopTimer = action.loopTime > if action.loopTimeVariance then > action.loopTimer = action.loopTimer + (2 * math.random() - 1) * action.loopTimeVariance > end > end > else > projectile.processAction(action) > action.complete = true projectiles\activeitems\staff\elementcloud\default.frames 4c4 < "dimensions" : [5, 1] --- > "dimensions" : [12, 1] projectiles\activeitems\staff\elementcloud\electricelementcloud.projectile 4,5c4,5 < "timeToLive" : 5, < "image" : "cloud.png", --- > "timeToLive" : 6, > "image" : "electriccloud.png", 7c7 < "lightColor" : [60, 90, 110], --- > "lightColor" : [90, 60, 110], 8a9 > "windupFrames" : 7, 11,19d11 < "time" : 0.15, < "action" : "projectile", < "type" : "electricrain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] < }, < { 21,26c13,58 < "action" : "projectile", < "type" : "electricrain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] --- > "action" : "loop", > "count" : 5, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/electriccloudpuff/electriccloudpuff.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [3.5, 3.5], > "destructionAction" : "fade", > "destructionTime" : 0.85, > "fade" : 1, > "size" : 0.8, > "layer" : "middle", > "timeToLive" : 0.45, > "variance" : { > "size" : 0.3, > "position" : [2.3, 1.0], > "initialVelocity" : [2.0, 2.0] > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/lightningsparks/lightningsparks.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [1.5, 1.5], > "destructionAction" : "fade", > "destructionTime" : 0.85, > "fade" : 1, > "size" : 0.3, > "layer" : "front", > "timeToLive" : 0.45, > "variance" : { > "size" : 0.2, > "position" : [2.3, 1.0], > "initialVelocity" : [2.0, 2.0] > } > } > } > ] 33c65 < "emitters" : [ ], --- > "emitters" : [ "electricplasma" ], 41a74 > "scriptDelta" : 1, 46c79,104 < } --- > }, > > "timedActions" : [ > { > "delayTime" : 0.5, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "electricrain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > }, > { > "delayTime" : 0.6, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "electricrain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > } > ] projectiles\activeitems\staff\elementcloud\fireelementcloud.projectile 4c4 < "timeToLive" : 5, --- > "timeToLive" : 6, 7c7 < "lightColor" : [60, 90, 110], --- > "lightColor" : [110, 70, 30], 8a9 > "windupFrames" : 7, 11,19d11 < "time" : 0.15, < "action" : "projectile", < "type" : "firerain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] < }, < { 21,26c13,78 < "action" : "projectile", < "type" : "firerain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] --- > "action" : "loop", > "count" : 5, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/cloudpuff/cloudpuff.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [3.5, 3.5], > "destructionAction" : "fade", > "destructionTime" : 0.85, > "fade" : 1, > "size" : 0.8, > "layer" : "middle", > "timeToLive" : 0.45, > "variance" : { > "size" : 0.3, > "position" : [2.3, 1.0], > "initialVelocity" : [2.0, 2.0] > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/sparkles/sparkle2.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [1.0, 1.0], > "destructionAction" : "fade", > "destructionTime" : 0.35, > "fade" : 1, > "size" : 0.3, > "layer" : "front", > "timeToLive" : 0.35, > "variance" : { > "position" : [3.0, 1.0], > "initialVelocity" : [2.5, 2.5] > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [1.0, 1.0], > "destructionAction" : "fade", > "destructionTime" : 0.65, > "fade" : 1, > "size" : 0.5, > "layer" : "back", > "timeToLive" : 0.35, > "variance" : { > "size" : 0.2, > "position" : [3.0, 1.0], > "initialVelocity" : [2.5, 2.5] > } > } > } > ] 41a94 > "scriptDelta" : 1, 46c99,124 < } --- > }, > > "timedActions" : [ > { > "delayTime" : 0.5, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "firerain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > }, > { > "delayTime" : 0.6, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "firerain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > } > ] projectiles\activeitems\staff\elementcloud\iceelementcloud.projectile 4,6c4,6 < "timeToLive" : 5, < "image" : "cloud.png", < "animationCycle" : 0.5, --- > "timeToLive" : 6, > "image" : "icecloud.png", > "animationCycle" : 0.4, 8a9 > "windupFrames" : 7, 11,19d11 < "time" : 0.15, < "action" : "projectile", < "type" : "icerain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] < }, < { 21,26c13,57 < "action" : "projectile", < "type" : "icerain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] --- > "action" : "loop", > "count" : 5, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/icecloudpuff/icecloudpuff.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [3.5, 3.5], > "destructionAction" : "fade", > "destructionTime" : 0.85, > "fade" : 1, > "size" : 0.8, > "layer" : "middle", > "timeToLive" : 0.45, > "variance" : { > "size" : 0.3, > "position" : [2.3, 1.0], > "initialVelocity" : [2.0, 2.0] > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/sparkles/sparkle5.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [1.0, 1.0], > "destructionAction" : "fade", > "destructionTime" : 0.35, > "fade" : 1, > "size" : 0.4, > "layer" : "back", > "timeToLive" : 0.35, > "variance" : { > "position" : [3.0, 1.0], > "initialVelocity" : [2.5, 2.5] > } > } > } > ] 41a73 > "scriptDelta" : 1, 46c78,103 < } --- > }, > > "timedActions" : [ > { > "delayTime" : 0.5, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "icerain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > }, > { > "delayTime" : 0.6, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "icerain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > } > ] projectiles\activeitems\staff\elementcloud\poisonelementcloud.projectile 4,5c4,5 < "timeToLive" : 5, < "image" : "cloud.png", --- > "timeToLive" : 6, > "image" : "poisoncloud.png", 7c7 < "lightColor" : [60, 90, 110], --- > "lightColor" : [80, 110, 50], 8a9 > "windupFrames" : 7, 11,19d11 < "time" : 0.15, < "action" : "projectile", < "type" : "poisonrain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] < }, < { 21,26c13,57 < "action" : "projectile", < "type" : "poisonrain", < "config" : {}, < "inheritDamageFactor" : 0.15, < "direction" : [0, -1], < "offsetRange" : [-1.75, -0.5, 1.75, -0.5] --- > "action" : "loop", > "count" : 5, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/poisoncloudpuff/poisoncloudpuff.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [3.5, 3.5], > "destructionAction" : "fade", > "destructionTime" : 0.85, > "fade" : 1, > "size" : 0.8, > "layer" : "middle", > "timeToLive" : 0.45, > "variance" : { > "size" : 0.3, > "position" : [2.3, 1.0], > "initialVelocity" : [2.0, 2.0] > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/statuseffects/poison2/poison2.animation", > "position" : [0, 0], > "finalVelocity" : [0, 0], > "approach" : [1.0, 1.0], > "destructionAction" : "fade", > "destructionTime" : 0.35, > "fade" : 1, > "size" : 0.6, > "layer" : "back", > "timeToLive" : 0.35, > "variance" : { > "position" : [3.0, 1.0], > "initialVelocity" : [2.5, 2.5] > } > } > } > ] 41a73 > "scriptDelta" : 1, 46c78,103 < } --- > }, > > "timedActions" : [ > { > "delayTime" : 0.5, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "poisonrain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > }, > { > "delayTime" : 0.6, > "loopTime" : 0.2, > "loopTimeVariance" : 0.05, > "action" : "projectile", > "type" : "poisonrain", > "config" : {}, > "inheritDamageFactor" : 0.15, > "direction" : [0, -1], > "offsetRange" : [-1.75, -0.5, 1.75, -0.5] > } > ] projectiles\activeitems\staff\elementorb\electricorb.projectile 8c8 < "frameNumber" : 8, --- > "frameNumber" : 6, projectiles\activeitems\staff\elementorb\fireorb.projectile 8,10c8,73 < "frameNumber" : 8, < "periodicActions" : [], < "actionOnReap" : [], --- > "frameNumber" : 6, > "periodicActions" : [ > { > "time" : 0.2, > "action" : "loop", > "count" : 6, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.9, > "layer" : "front", > "size" : 0.8, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/flamepuff/flamepuff.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 4.0], > "approach" : [0.3, 60], > "timeToLive" : 0.8, > "layer" : "middle", > "size" : 0.7, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 170, > "angularVelocity" : 180 > } > } > } > ] > } > ], > "actionOnReap" : [ > { > "action" : "loop", > "count" : 4, > "body" : [ > { > "action" : "particle", > "specification" : "fireshard" > } > ] > } > ], projectiles\activeitems\staff\elementorb\iceorb.projectile 8c8 < "frameNumber" : 8, --- > "frameNumber" : 6, projectiles\activeitems\staff\elementorb\poisonorb.projectile 6c6 < "animationCycle" : 0.5, --- > "animationCycle" : 0.6, 9,10c9,82 < "periodicActions" : [], < "actionOnReap" : [], --- > "periodicActions" : [ > { > "time" : 0.4, > "action" : "loop", > "count" : 5, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/poisondust/poisondust.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.8, > "layer" : "front", > "size" : 1.0, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/statuseffects/poison2/poison2.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.7, > "layer" : "back", > "size" : 0.7, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/poisonball/poisonball.animation", > "position" : [0, 0], > "initialVelocity" : [0.2, -10], > "finalVelocity" : [0.1, -50], > "approach" : [0, 10], > "fade" : 0.5, > "destructionAction" : "shrink", > "destructionTime" : 2, > "layer" : "middle", > "size" : 0.3, > "timeToLive" : 1, > "variance" : { > "position" : [1, 1], > "size" : 0.2, > "initialVelocity" : [0, 4] > } > } > } > ] > } > ], projectiles\activeitems\staff\elementportal\default.frames 4c4 < "dimensions" : [6, 1], --- > "dimensions" : [7, 1], 7c7 < [ "0", "1", "2", "3", "4", "5" ] --- > [ "0", "1", "2", "3", "4", "5", "6" ] 8a9,13 > }, > "aliases" : { > "7" : "2", > "8" : "1", > "9" : "0" projectiles\activeitems\staff\elementportal\electricportal.projectile 6c6 < "animationCycle" : 0.6, --- > "animationCycle" : 0.35, 8c8,10 < "frameNumber" : 6, --- > "frameNumber" : 4, > "windupFrames" : 3, > "winddownFrames" : 3, 9a12,17 > "actionOnReap" : [ > { > "action" : "config", > "file" : "/projectiles/explosions/elementimpact/electricimpact.config" > } > ], 11,13c19,20 < "power" : 30, < "damageKind" : "electric", < "damagePoly" : [ ], --- > "power" : 0, > "damagePoly" : [], 16c23 < "emitters" : [ "electricplasma" ], --- > "emitters" : [], 18c25 < "renderLayer" : "Projectile+1", --- > "renderLayer" : "Projectile-1", 26c33 < "projectileType" : "electricwisp", --- > "projectileType" : "electricswarmer", 28c35 < "spawnRate" : 0.2 --- > "spawnRate" : 0.3 projectiles\activeitems\staff\elementrain\electricrain.projectile 7d6 < "lightColor" : [90, 60, 110], 9a9 > "lightColor" : [114, 0, 154], 16c16 < "emitters" : [ "electricplasma" ] --- > "emitters" : [ "electricplasmapurple" ] projectiles\activeitems\staff\elementstickyspikes\firespikes.frames 4c4 < "dimensions" : [4, 2], --- > "dimensions" : [6, 2], 7,8c7,8 < ["0", "1", "2", "3"], < ["4", "5", "6", "7"] --- > ["0", "1", "2", "3", "4", "5"], > ["6", "7", "8", "9"] projectiles\activeitems\staff\elementstickyspikes\firestickyspikes.projectile 6c6 < "animationCycle" : 0.35, --- > "animationCycle" : 0.30, 9,11c9,74 < "windupFrames" : 4, < "periodicActions" : [], < "actionOnReap" : [], --- > "windupFrames" : 6, > "periodicActions" : [ > { > "time" : 0.3, > "action" : "loop", > "count" : 2, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.7, > "layer" : "back", > "size" : 0.8, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/flamepuff/flamepuff.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.5, > "layer" : "middle", > "size" : 0.8, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > } > ] > } > ], > "actionOnReap" : [ > { > "action" : "loop", > "count" : 4, > "body" : [ > { > "action" : "particle", > "specification" : "fireshard" > } > ] > } > ], projectiles\activeitems\staff\elementstickyspikes\icestickyspikes.projectile 10c10,40 < "periodicActions" : [ ], --- > "periodicActions" : [ > { > "time" : 0.4, > "action" : "loop", > "count" : 2, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/statuseffects/frozen/frozen.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.7, > "layer" : "back", > "size" : 0.4, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.1, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > } > ] > } > ], projectiles\activeitems\staff\elementstickyspikes\poisonstickyspikes.projectile 6c6 < "animationCycle" : 0.5, --- > "animationCycle" : 0.6, 9,10c9,74 < "frameNumber" : 5, < "actionOnReap" : [], --- > "frameNumber" : 6, > "actionOnReap" : [ > { > "action" : "loop", > "count" : 4, > "body" : [ > { > "action" : "particle", > "specification" : "slimeshard" > } > ] > } > ], > "periodicActions" : [ > { > "time" : 0.3, > "action" : "loop", > "count" : 2, > "body" : [ > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/poisondust/poisondust.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.7, > "layer" : "back", > "size" : 0.7, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > }, > { > "action" : "particle", > "specification" : { > "type" : "animated", > "animation" : "/animations/statuseffects/poison2/poison2.animation", > "initialVelocity" : [0.0, 7.0], > "finalVelocity" : [0.0, 3.0], > "approach" : [0.3, 60], > "timeToLive" : 0.7, > "layer" : "back", > "size" : 0.7, > "collidesForeground" : true, > "variance" : { > "position" : [0.5, 0.5], > "size" : 0.2, > "initialVelocity" : [5, 3], > "finalVelocity" : [0, 0], > "rotation" : 180, > "angularVelocity" : 180 > } > } > } > ] > } > ], projectiles\activeitems\staff\elementswarmer\poisonswarmer.projectile 5c5 < "frames" : "poisonswarmer.png", --- > "image" : "poisonswarmer.png", 6a7 > "lightColor" : [50, 70, 30], projectiles\guns\arrows\electricbolt\electricbolt.projectile 7d6 < "emitters" : [ "electricswoosh" ], projectiles\traps\trapflame\trapflame.projectile 4c4 < "physics" : "flame", --- > "physics" : "laser", quests\generated\locations.config 2608c2608 < "entrance" : { --- > "entrance1" : { quests\story\apex_mission1.questtemplate 5,7c5,7 < "title" : "^orange;Hunt for the Apex Artifact", < "text" : "Can you ^green;go out and find clues to the location of the ^orange;Apex Artifact^white;, dear?", < "completionText" : "I have reason to believe the Artifact is at a ^orange;Miniknog Stronghold^white; - It might be dangerous, too! Be careful out there, dear!", --- > "title" : "Find Clues to Locate the Apex Artifact", > "text" : "I think we should begin our hunt for the ^orange;Apex artifact^reset. The Apex are generally found on ^orange;frozen planets^reset, so those are ^green;the best places to search for the ^orange;clues^green; we need^reset;. Wrap up warm dear, and remember: Apex society is in upheaval at the moment, so be on your guard.", > "completionText" : "You've found all the clues we need to locate the Apex artifact! This is brilliant, dear - we've come so far.", quests\story\apex_mission2.questtemplate 6,7c6,7 < "text" : "I'm afraid the ^orange;Apex artifact^reset; is being held in a ^orange;Miniknog stronghold^reset;. It may be hard to get access, dear. Please ^green;be careful down there^reset;, the ^orange;Miniknog^reset; can be vicious.", < "completionText" : "I'm so pleased our band is growing; that we're gathering ^orange;allies along with the ^orange;artifacts^reset;. It's almost like starting a ^orange;new Protectorate...^reset;", --- > "text" : "I'm afraid the ^orange;Apex artifact^reset; is being held in a ^orange;Miniknog stronghold^reset;. It may be hard to get access, dear. Please ^green;be careful down there^reset;, the Miniknog can be vicious.", > "completionText" : "I'm so pleased our band is growing; that we're gathering allies along with the artifacts. It's almost like starting a new Protectorate...", 26c26 < "text" : "-placeholder- I have received coordinates for a ^orange;Miniknog Stronghold^reset;. ^orange;Use the ship computer^reset; to access the location." --- > "text" : "I have received coordinates for the ^orange;Miniknog Stronghold^reset;. ^green;Use the ship computer^reset; to access the location." quests\story\avian_mission1.questtemplate 5,7c5,7 < "title" : "Hunt for the Avian Artifact", < "text" : "Can you ^green;go out and find clues to the location of the ^orange;Avian Artifact^white;, dear?", < "completionText" : "^orange;The Temple of Kluex^white;, once a place of reverence, is now an old Avian Museum. I have reason to believe the Artifact is kept there!", --- > "title" : "Find Clues to Locate the Avian Artifact", > "text" : "^orange;Avians^reset; next I think! Probably best to ^green;go to planets where ^orange;jungle^white; terrain is in abundance - Avians like to inhabit such places. See you soon, dear. Be careful, and happy hunting!", > "completionText" : "With that last clue we've got all we need to find the Avian artifact! Thank you for all that hard work.", quests\story\avian_mission2.questtemplate 5,7c5,7 < "title" : "The Temple of Kluex", < "text" : "The ^orange;Avian artifact^reset; is in ^orange;The Great Sovereign Temple^reset;; one of the largest structures devoted to Kluex that the Avians have ever built. These temples tend to be guarded, so ^green;take care inside^reset; dear.", < "completionText" : "Another ^orange;artifact^reset; in place. We're getting there steadily dear. Well done!", --- > "title" : "Fetch the Avian Artifact", > "text" : "^green;The ^orange;Avian artifact^green; is in ^orange;The Great Sovereign Temple^white;; one of the largest structures devoted to Kluex that the Avians have ever built. These temples tend to be guarded, so take care inside dear.", > "completionText" : "Another artifact in place. We're getting there steadily dear. Well done!", 26c26 < "text" : "-placeholder- I have received coordinates for ^orange;The Great Sovereign Temple^reset;. ^orange;Use the ship computer^reset; to access the location." --- > "text" : "I have received coordinates for ^orange;The Great Sovereign Temple^reset;. ^green;Use the ship computer^reset; to access the location." quests\story\bootship.questtemplate 8c8 < "text" : "You should turn on the ship computer", --- > "text" : "You need to start up the ship's computer.", quests\story\floran_mission1.questtemplate 5,7c5,7 < "title" : "Hunt for the Floran Artifact", < "text" : "Can you ^green;go out and find clues to the location of the ^orange;Floran Artifact^white;, dear?", < "completionText" : "My research leads me to believe the Artifact is the prize for a ^orange;Floran Hunting Ceremony^white;! Hopefully you aren't too late to enter the competition, dear!", --- > "title" : "Find Clues to Locate the Floran Artifact", > "text" : "Now that you can get about, we need to start finding these ^orange;artifacts^reset;, dear. Maybe the Floran one first... They tend to gravitate towards dense vegetation, so I think you should ^green;search planets with thick ^orange;forests^white; for ^orange;clues^reset;, and ^green;examine Floran objects^reset;. Thank you, and good luck!", > "completionText" : "You did it! That was the last clue we needed. I know just where the Floran artifact is now.", quests\story\floran_mission2.questtemplate 6c6 < "text" : "The ^orange;clues^reset; you collected reveal that the ^orange;Floran artifact^reset; is enshrined at ^orange;The Hunting Grounds^reset;. Judging from what I've found out, ^green;you'll need to compete to get it^reset;. Be careful dear.", --- > "text" : "The clues you collected reveal that the ^orange;Floran artifact is^reset; enshrined in ^orange;The Ceremonial Hunting Caverns^reset;. Judging from what I've found out, you'll need to ^green;compete to get it^reset; . Be careful dear.", 26c26 < "text" : "-placeholder- I have received coordinates for a ^orange;Floran Hunting Ground^reset;. ^orange;Use the ship computer^reset; to access the location." --- > "text" : "I have received coordinates for the ^orange;Ceremonial Hunting Ground^reset;. ^green;Use the mission interface^reset; to access the location." quests\story\gaterepair.questtemplate 5,9c5,7 < "title" : "Getting up to Speed", < "text" : "-placeholder- We are currently in orbit around an unknown planet. Our ship ^cyan;don't look so good^reset; and it ^cyan;moves real slow too^reset;. You should find a way to fix it.. < < I have activated the teleporter. You can ^orange;use it to beam down to the planet^reset;. See if you can find any useful stuff like wood.", < "completionText" : "I'm glad you are here. We have much to do!", --- > "title" : "Getting Started", > "text" : "We are currently in orbit around an unknown world. The ship is in a sorry state and we are unable to leave orbit. I suggest you ^green;beam down to the planet's surface using the teleporter^reset;, and search for supplies and perhaps a means of fixing the ship.", > "completionText" : "Thank you for joining me dear. With your help I know we can triumph.", 22,23c20,21 < "explore" : "explore the ^orange;orbited planet^reset;", < "findGate" : "find the ^orange;mysterious ancient energy source^reset;", --- > "explore" : "Explore the ^orange;orbited planet^reset;", > "findGate" : "Find the ^orange;archaic energy source^reset;", 25,26c23,24 < "repairGate" : "Use the ^orange;Core Fragments^reset; to activate the gate", < "findEsther" : "Find the source of the ^orange;mysterious message^reset;" --- > "repairGate" : "Use the ^orange;Core Fragments^reset; to activate the Gate", > "findEsther" : "Find the source of the ^orange;mysterious messages^reset;" quests\story\glitch_mission1.questtemplate 5,7c5,7 < "title" : "Hunt for the Glitch Artifact", < "text" : "Can you ^green;go out and find clues to the location of the ^orange;Glitch Artifact^white;, dear?", < "completionText" : "The Artifact is in the possession of the owner of ^orange;The Baron's Keep^white;. This should be straightforward to acquire, dear!", --- > "title" : "Find Clues to Locate the Glitch Artifact", > "text" : "Now we need to find the ^orange;Glitch artifact^reset;. Glitch tend to reside on planets with a lot of ^orange;volcanic activity^reset; (they seem to find them vaguely comforting). ^green;Best to search there for ^orange;clues^white;. I know the Glitch are a little offbeat, but don't underestimate them: look after yourself dear.", > "completionText" : "That last clue has confirmed the location of the Glitch artifact! Excellent. Congratulations dear.", quests\story\glitch_mission2.questtemplate 6,7c6,7 < "text" : "The ^orange;Glitch artifact^reset; is in a castle, under the care of a ^orange;certain, slightly odd, Glitch^reset;. ^green;Would you go to his keep and talk to him^reset;, dear.", < "completionText" : "I'm so proud of you! ^green;After all you've done^reset;, I know that you're equal to the ^orange;challenge we face^reset;.", --- > "text" : "The ^orange;Glitch artifact^reset; is in a castle, under the care of a certain, slightly odd, Glitch. ^green;Would you go to his keep and talk to him^reset;, dear?", > "completionText" : "I'm so proud of you! After all you've done, I know that you're equal to the challenge we face.", 26c26 < "text" : "-placeholder- I have received coordinates for a ^orange;Miniknog Stronghold^reset;. ^orange;Use the ship computer^reset; to access the location." --- > "text" : "I have received coordinates for ^orange;The Baron's Keep^reset;. ^green;Use the ship computer^reset; to access the location." quests\story\human_mission1.questtemplate 6,7c6,7 < "text" : "First thing first though, dear; you need a ship in good working order. Who knows how far you'll have to travel before we're done. I think you should return to the Outpost and speak to the mechanic.", < "completionText" : "Now that your ship is in full working condition we can get started on the real task at hand.", --- > "text" : "First thing first though, dear; you need a ^orange;ship in good working order^reset. Who knows how far you'll have to travel before we're done. I think you should ^green;return to the Outpost and speak to the shipyard captain^reset.", > "completionText" : "That was no mean feat - well done, dear. Now that your ship is in full working order we can get started on the task at hand.", 20,23c20,23 < "findMechanic" : "Find ^orange;Mickey Mack^white; at the ^green;outpost^white;", < "findCrystals" : "Find ^orange;Erchius Crystals^white; in the ^green;Erchius Mining Facility^white;", < "turnInCrystals" : "Return to ^orange;Mickey Mack^white; at the ^green;outpost^white;", < "findEsther" : "Talk to ^orange;Esther Bright^white; at the ^green;outpost^white;" --- > "findMechanic" : "^green;Find ^orange;the shipyard captain^white; at the ^orange;outpost^white;", > "findCrystals" : "^green;Fetch ^orange;Erchius Crystals^white; from the ^orange;Erchius Mining Facility^white;", > "turnInCrystals" : "^green;Return^white; to ^orange;the shipyard captain^white; at the ^orange;outpost^white;", > "findEsther" : "^green;Talk to ^orange;Esther Bright^white; at the ^orange;Ark^white;" 34c34 < "text" : "-placeholder- I have received coordinates for an ^orange;Erchius Mining Facility^reset;. We should be be able to find the crystals we need there. ^orange;Use the ship computer^reset; to access the coordinates." --- > "text" : "I have received the coordinates for the ^orange;Erchius Mining Facility^reset;. If you ^green;return to the ship^reset; you can teleport there using my mission interface." quests\story\hylotl_mission1.questtemplate 5,7c5,7 < "title" : "Hunt for the Hylotl Artifact", < "text" : "Can you ^green;go out and find clues to the location of the ^orange;Hylotl Artifact^white;, dear?", < "completionText" : "I've found evidence of a place called the ^orange;Grand Pagoda Library^white;, where many ancient things were once kept. The Artifact has to be there, dear!", --- > "title" : "Find Clues to Locate the Hylotl Artifact", > "text" : "We should start work on finding the ^orange;Hylotl artifact^reset; now. ^green;You should hunt for ^orange;clues^white; on planets with vaste tracts of ^orange;ocean^reset;. The Hylotl reside both above and below the waves. ^green;Come back here when your search is complete^reset;; and look after yourself.", > "completionText" : "That was the last clue we needed to find the Hylotl artifact. Wonderful work, dear.", quests\story\hylotl_mission2.questtemplate 6,7c6,7 < "text" : "From what you've found, it seems the ^orange;Hylotl artifact^reset; is cloistered deep beneath the ocean in a place called ^orange;The Grand Library^reset;. The Library is very ancient, it should be an ^green;interesting place to visit.^reset;", < "completionText" : "Well done for saving the ^orange;artifact^reset;, dear. They're ^orange;powerful objects^reset;, and not safe in the wrong hands...", --- > "text" : "From what you've found, it seems the ^orange;Hylotl artifact^reset; is cloistered deep beneath the ocean in a place called ^orange;The Grand Pagoda Library^reset;. The Library is very ancient, ^green;it should be an interesting place to visit^reset;.", > "completionText" : "Well done for saving the artifact, dear. They're powerful objects, and not safe in the wrong hands...", 26c26 < "text" : "-placeholder- I have received coordinates for ^orange;The Grand Library^reset;. ^orange;Use the ship computer^reset; to access the location." --- > "text" : "I have received coordinates for ^orange;The Grand Pagoda Library^reset;. ^green;Use the ship computer^reset; to access the location." quests\story\protectorate.questtemplate 5,6c5,6 < "text" : "The years of training has finally paid off. Survive graduation day! ", < "completionText" : "Well... that got ugly fast.", --- > "text" : "The years of training paid off - you survived graduation day.", > "completionText" : "You made it.", radiomessages\missions.radiomessages 203,209d202 < "avianmission07" : { < "type" : "mission", < "senderName" : "Koichi", < "portraitImage" : "/interface/chatbubbles/koichi.png:", < "text" : "Sorry..." < }, < 214c207 < "text" : "This island is home to the \"Grand Library Entrance Pagoda\"." --- > "text" : "This island is home to the \"Grand Pagoda Library\" entrance." radiomessages\quests.radiomessages 4c4 < "text" : "-placeholder- My surface survey scanner has picked up a ^orange;mysterious ancient energy source^reset; on this planet. I estimate a ^cyan;32% chance^reset; that it is worth investigating. There is also a ^cyan;98% probability that you have nothing better to do.^reset;" --- > "text" : "-placeholder- My scans indicate there is some kind of ^orange;archaic energy source^reset; on this planet. I estimate a ^green;32% chance that it is worth investigating^reset;, and a 98% chance that you have nothing better to do." 11c11 < "text" : "-placeholder- If you can hear this message you have found an ^orange;ancient gateway^reset;. It's likely inactive, you will need to power it up with ^orange;Core Fragments^reset;." --- > "text" : "If you've picked up this message you must have found an ^orange;Ancient Gateway^reset; - please use it to come and find me. ^green;You can power up the Gate with ^orange;Core Fragments^reset;." 16c16 < "text" : "-placeholder- ^orange;Core Fragments^reset;? My scans show that there are ^orange;Core Fragments^reset; right here on this planet! You can probably find some near the ^orange;core of the planet^reset;." --- > "text" : "^orange;Core Fragments^reset; appear naturally within the geology of this planet; readings suggest numerous ore clusters deep below the ground, near the planet's centre." 21c21 < "text" : "-placeholder- The gate seems to be active. There is another message coming through it now!" --- > "text" : "You appear to have successfully activated the gate. And it seems another ^orange;message^reset; is coming through." 28c28 < "text" : "If you recieve this message, please come find me - the universe is under threat! ^#71f2f6;Use the Ancient Gateways and meet me in the ^orange;Ark ruins^#71f2f6;, just past the ^orange;Outpost^#white;." --- > "text" : "^green;Please come^reset;. I urgently require help; the universe depends on it. ^orange;Use the Ancient Gateway and meet me in the Ark ruins, just past the Outpost^reset." 30c30 < } \ No newline at end of file --- > } scripts\behavior.lua 5a6 > BTree.nextId = 1 7,9c8,30 < function BTree:new(path, parameters) < local newTree = {} < setmetatable(newTree, extend(self)) --- > function BTree:new(behavior, parameters) > parameters = parameters or {} > local instance = {} > > instance.back = {} > instance.front = {} > instance.loadSteps = parameters.loadSteps or 50 > > setmetatable(instance, {__index = self}) > > if type(behavior) == "string" then > instance.name = behavior > behavior = root.behaviorModule(behavior) > end > instance:loadScripts(behavior.scripts) > instance.load = coroutine.create(function() > local root = instance:parseNode(behavior.root, parseArgs(parseArgs(parameters, behaviorConfig()), behavior.parameters or {})) > instance.root = root > instance.load = nil > return true > end) > > instance:queueFront(instance.root) 11c32,33 < local behavior = root.behaviorModule(path) --- > instance.profile = Profiler:new() > instance.nodeProfiles = Profiler:new() 13,14c35,36 < behavior.parameters = parseArgs(behaviorConfig(), behavior.parameters) < self.loadScripts(behavior.scripts) --- > return instance > end 16,17c38,49 < if behavior then < newTree.root = nodeFromJson(behavior.root, behavior.parameters, behavior.name) --- > function BTree:parseNode(node, parameters, parent) > coroutine.yield() > local newNode = {} > > if node.type == "module" then > local behavior = root.behaviorModule(node.name) > self:loadScripts(behavior.scripts) > moduleParameters = {} > for k,v in pairs(node.parameters) do > moduleParameters[k] = replaceTag(v, parameters) > end > return self:parseNode(behavior.root, parseArgs(parseArgs(moduleParameters, parameters), behavior.parameters), parent) 20,21c52,57 < return newTree < end --- > newNode.id = BTree.nextId > BTree.nextId = BTree.nextId + 1 > newNode.parent = parent > newNode.name = node.name > newNode.type = node.type > newNode.output = node.output 23,24c59,69 < function BTree:run(dt) < local result = self.root:run(dt) --- > newNode.callback = _ENV[node.name] > if newNode.callback == nil or type(newNode.callback) ~= "function" then > error(string.format("Invalid action, no function \'%s\' found \n", node.name)) > end > > newNode.parameters = {} > if node.parameters then > for k,v in pairs(node.parameters) do > newNode.parameters[k] = replaceTag(v, parameters) > end > end 26c71,77 < BGroup:updateGroups() --- > -- Composite > if node.children then > newNode.children = {} > for _,child in pairs(node.children) do > table.insert(newNode.children, self:parseNode(child, parameters, newNode)) > end > end 28c79,84 < return result --- > -- Decorator > if node.child then > newNode.child = self:parseNode(node.child, parameters, newNode) > end > > return newNode 31c87 < function BTree.loadScripts(scripts) --- > function BTree:loadScripts(scripts) 37,38c93,103 < function BTree:uninit() < self.root:reset() --- > function BTree:run(dt) > if self.load then > for i=0, self.loadSteps do > local status, result = coroutine.resume(self.load) > if not status then error(result) end > if result == true then > break > end > end > end > if not self.root then return end 40,44d104 < --Leave all groups < self.joined = {} < self.joinedTasks = {} < BGroup:updateGroups() < end 46,48c106,107 < function BTree:reset() < if self.root then < self.root:reset() --- > if #self.front == 0 then > self:queueFront(self.root) 50d108 < end 52,54c110,149 < function BTree:interrupt() < if self.root then < self.root:interrupt() --- > while #self.front > 0 do > local node = self.front[#self.front] > self.current = node > table.remove(self.front, #self.front) > local ready = self:ready(node) > > -- Run node > if ready then > local status, result = self:resume(node, dt) > > -- Handle result from running the node > if result == true or result == false then > self:clearNode(node) > > if node.parent then > local rootResult = self:backPropagate(node.parent, node, result) > > if rootResult == true or rootResult == false then > self:clear() > return rootResult > end > end > else > if node.type == "action" then > self:interrupt(node) > > -- Keep action nodes in the queue > self:queueBack(node) > end > end > end > end > -- Clean up inactive nodes from the back queue > self.back = util.filter(self.back, function(v) return self:ready(v) end) > > -- Switch back queue to front > for i = #self.back, 1, -1 do > if self:ready(self.back[i]) then > table.insert(self.front, self.back[i]) > end 55a151 > self.back = {} 58,59c154,176 < function behaviorConfig() < return self.behaviorConfig or config.getParameter("behaviorConfig", {}) --- > -- Propagate results back up the tree all the way to the root > function BTree:backPropagate(node, child, childResult) > --self.nodeProfiles:start(node.name) > self.current = node > local status, result = coroutine.resume(node.cor, child, childResult) > if not status then error(result) end > --self.nodeProfiles:stop(node.name) > > if result == true or result == false then > self:clearNode(node) > > if node.children then > for _,child in pairs(node.children) do > self:remove(child) > end > end > > if node.parent ~= nil then > return self:backPropagate(node.parent, node, result) > else > return result > end > end 62,63c179,183 < --BTNode is the base node table < BTNode = {} --- > -- A node is ready if its parent is active (has a coroutine) and its parent is ready > function BTree:ready(node) > -- root is always ready > if node.parent == nil then return true end > local parentReady = self:ready(node.parent) 65,68c185,190 < function BTNode.new() < local newNode = {} < setmetatable(newNode, extend(BTNode)) < return newNode --- > if node.parent.cor == nil then > self:clearNode(node) > return false > else > return parentReady > end 71,72c193,212 < function BTNode:run(dt) < return false --- > function BTree:resume(node, dt) > local status, result > if node.cor then > if node.type == "action" then > node.parameters.dt = dt > status, result = coroutine.resume(node.cor, node.parameters, node.output or {}, node) > else > error(string.format("Already active internal node %s %s queued by %s in %s", node.id, node.name, node.parent.name, self.name)) > end > else > node.cor = coroutine.create(node.callback) > if node.type == "action" then > node.parameters.dt = dt > status, result = coroutine.resume(node.cor, node.parameters, node.output or {}, node) > else > status, result = coroutine.resume(node.cor, node, self) > end > end > if not status then error(string.format("[%s] error: %s", node.name, result)) end > return status, result 75,76c215,222 < function BTNode:reset() < return false --- > function BTree:interrupt(node) > if node.interrupt then > local status, result = coroutine.resume(node.parent.cor, node, "interrupt") > if not status then error(result) end > end > if node.parent then > self:interrupt(node.parent) > end 79,80c225,226 < function BTNode:interrupt() < return false --- > function BTree:setInterrupt(node, value) > node.interrupt = value 83,87c229,237 < ----------------------------------------------------------- < -- COMPOSITE NODES < ----------------------------------------------------------- < composites = {} < BTComposite = BTNode.new() --- > function BTree:clear() > -- Deep cleanup of nodes > self.root.cor = nil > for _,node in pairs(self.back) do > self:ready(node) > end > for _,node in pairs(self.front) do > self:ready(node) > end 89,92c239,240 < function BTComposite.new() < local newNode = {} < setmetatable(newNode, extend(BTComposite)) < return newNode --- > self.back = {} > self.front = {} 95,96c243,247 < function BTComposite.fromJson(node) < return composites[node.name].fromJson(node) --- > function BTree:clearNode(node) > if node.onClear then node.onClear() end > node.cor = nil > node.interrupt = nil > node.onClear = nil 99c250,258 < function BTComposite:reset() --- > function BTree:stack(node) > while node.parent ~= nil do > local index = 1 > if node.parent.children then > _,index = util.find(node.parent.children, function(v) return v == node end) > end > sb.logInfo("[%s]:%s", node.parent.name, index) > node = node.parent > end 102,104c261,276 < function BTComposite:interruptChildren() < for _,child in pairs(self.children) do < child:interrupt() --- > -- Clears a node and also removes it from the queue > -- Use for removing nodes where the parent will still be alive > -- i.e. for interrupted children > function BTree:remove(node) > self:clearNode(node) > for i,v in ipairs(self.front) do > if v == node then > table.remove(self.front, i) > break > end > end > for i,v in ipairs(self.back) do > if v == node then > table.remove(self.back, i) > break > end 108,109c280,297 < function BTComposite:interrupt() < self:interruptChildren() --- > function BTree:queueFront(node, args) > -- debug only, slow > -- if util.count(self.front, node) > 0 or util.count(self.back, node) > 0 then > -- self:stack(node) > -- error(string.format("Duplicate front queued node %s queued by %s. Already queued in %s", node.name, self.current.name, util.count(self.front, node) > 0 and "front" or "back")) > -- return > -- end > table.insert(self.front, node) > end > > function BTree:queueBack(node, args) > -- debug only, slow > -- if util.count(self.front, node) > 0 or util.count(self.back, node) > 0 then > -- self:stack(node) > -- error(string.format("Duplicate back queued node %s queued by %s. Already queued in %s", node.name, self.current.name, util.count(self.front, node) > 0 and "front" or "back")) > -- return > -- end > table.insert(self.back, node) 112,122c300,301 < function BTComposite:runChild(index, dt) < local child = self.children[index] < local status, result = pcall(child.run, child, dt) < if not status then < error(string.format("[%s]:%s\n%s", self.name, index, result)) < child:reset() < end < if result == true or result == false then < child:reset() < end < return result --- > function behaviorConfig() > return self.behaviorConfig or config.getParameter("behaviorConfig", {}) 125,126c304,317 < require "/scripts/behavior/composite.lua" < --- > function replaceTag(value, parameters) > if type(value) == "string" then > local tagString = value:match("^<.+>$") > if tagString ~= nil then > tagString = tagString:sub(2, -2) > if parameters[tagString] ~= nil then > return parameters[tagString] > else > sb.logInfo("Could not find parameter for tag '%s'", tagString) > end > end > end > return value > end 129c320 < -- DECORATOR NODES --- > -- COMPOSITE NODES 131,132d321 < decorators = {} < BTDecorator = BTNode.new() 134,137c323,329 < function BTDecorator.new() < local newNode = {} < setmetatable(newNode, extend(BTDecorator)) < return newNode --- > function sequence(self, tree) > for _,child in pairs(self.children) do > tree:queueFront(child) > local _,result = coroutine.yield() > if result == false then return false end > end > return true 140,142c332,333 < function BTDecorator.fromJson(node) < return decorators[node.name].fromJson(node) < end --- > function cleanup(self, tree) > local current = 1 144,146c335,341 < function BTDecorator:setChild(child) < self.child = child < end --- > -- On clear the cleanup node runs any unqueued children once > self.onClear = function() > for i=current+1, #self.children do > tree:resume(self.children[i], script.updateDt()) > tree:clearNode(self.children[i]) > end > end 148,149c343,349 < function BTDecorator:run(dt) < return self:runChild(dt) --- > for i,child in pairs(self.children) do > current = i > tree:queueFront(child) > local _,result = coroutine.yield() > if result == false then return false end > end > return true 152,153c352,358 < function BTDecorator:interrupt() < self.child:interrupt() --- > function selector(self, tree) > for _,child in pairs(self.children) do > tree:queueFront(child) > local _,result = coroutine.yield() > if result == true then return true end > end > return false 156,158c361,366 < function BTDecorator:reset() < self.child:reset() < end --- > function parallel(self, tree) > local successCount = self.parameters.success > if successCount == nil or successCount == -1 then successCount = #self.children end > > local failCount = self.parameters.fail > if failCount == nil or failCount == -1 then failCount = #self.children end 160,164c368,369 < function BTDecorator:runChild(dt) < local status, result = pcall(self.child.run, self.child, dt) < if not status then < error(string.format("[%s]\n%s", self.name, result)) < self.child:reset() --- > for i=#self.children, 1, -1 do > tree:queueFront(self.children[i]) 166,167c371,380 < if result == true or result == false then < self.child:reset() --- > > local states = {} > while true do > local node,result = coroutine.yield() > > states[node.id] = result > if util.count(states, true) >= successCount then return true end > if util.count(states, false) >= failCount then return false end > > tree:queueBack(node) 169d381 < return result 172c384,386 < require "/scripts/behavior/decorator.lua" --- > function dynamic(self, tree) > local current = 1 > tree:queueFront(self.children[current]) 174,178c388,390 < ----------------------------------------------------------- < -- ACTION NODES (Leaf nodes) < ----------------------------------------------------------- < actions = {} < BTAction = BTNode.new() --- > while true do > local node,result = coroutine.yield() > local _,index = util.find(self.children, function(id) return id == node end) 180,187c392,396 < function BTAction.new(action) < local newNode = {} < newNode.name = action.name or "failAction" < newNode.parameters = action.parameters or {} < newNode.output = action.output or {} < setmetatable(newNode, extend(BTAction)) < return newNode < end --- > if result == true then > return true > elseif result == false then > tree:queueBack(node) > tree:setInterrupt(node, true) 189,197c398,414 < function BTAction.fromJson(node) < if actions[node.name] then < return actions[node.name].fromJson(node) < end < return BTAction.new({ < name = node.name, < parameters = node.parameters, < output = node.output < }) --- > if index == #self.children then > break > end > if index == current then > current = current + 1 > tree:queueFront(self.children[current]) > end > else > -- Interruption > for i = index+1, current do > tree:remove(self.children[i]) > end > current = index > tree:setInterrupt(node, false) -- Current active node should not interrupt > end > end > return false 200,207c417,418 < function BTAction:run(dt) < if self.coroutine == nil then < if _ENV[self.name] == nil then < error(string.format("Invalid action, no function \'%s\' found \n", self.name)) < return false < end < self.coroutine = coroutine.create(_ENV[self.name]) < end --- > function randomize(self, tree) > tree:queueFront(util.randomFromList(self.children)) 209,214c420 < self.parameters.dt = dt < local status,result = coroutine.resume(self.coroutine, self.parameters, self.output) < if not status then < error(string.format("[%s] error:\n%s", self.name, result)) < return false < end --- > local _,result = coroutine.yield() 218,219c424,442 < function BTAction:reset() < self.coroutine = nil --- > ----------------------------------------------------------- > -- DECORATOR NODES > ----------------------------------------------------------- > > function repeater(self, tree) > local args = parseArgs(self.parameters, { > maxLoops = -1, > untilSuccess = false > }) > local loops = 0 > > local result > repeat > tree:queueFront(self.child) > _,result = coroutine.yield() > loops = loops + 1 > until (args.maxLoops > 0 and loops >= args.maxLoops) or (result == true and args.untilSuccess) > > return result 222c445,448 < function BTAction:interrupt() --- > function failer(self, tree) > tree:queueFront(self.child) > coroutine.yield() > return false 225,228c451,455 < ----------------------------------------------------------- < -- MODULE NODES < ----------------------------------------------------------- < BTModule = BTNode.new() --- > function succeeder(self, tree) > tree:queueFront(self.child) > coroutine.yield() > return true > end 230,236c457,460 < function BTModule.new(module) < local newNode = { < parameters = module.parameters or {}, < name = module.name < } < setmetatable(newNode, extend(BTModule)) < return newNode --- > function inverter(self, tree) > tree:queueFront(self.child) > local _,result = coroutine.yield() > return result == false 239,242c463,466 < function BTModule.fromJson(node) < return BTModule.new({ < name = node.name, < parameters = node.parameters --- > function cooldown(self, tree) > local args = parseArgs(self.parameters, { > onFail = false, > onSuccess = true 244d467 < end 246,251c469,471 < function BTModule:run(dt) < if not self.node then < local tree = root.behaviorModule(self.name) < local parameters = parseArgs(self.parameters, parseArgs(behaviorConfig(), tree.parameters)) < BTree.loadScripts(tree.scripts) < self.node = nodeFromJson(tree.root, parameters, tree.name) --- > local time = BData:getNumber("cooldown-"..self.id) > if time and world.time() < time then > return false 254,259c474,482 < local status, result = pcall(self.node.run, self.node, dt) < if not status then < error(string.format("{%s}\n%s", self.name, result)) < end < if result == true or result == false then < self.node:reset() --- > tree:queueFront(self.child) > local _,result = coroutine.yield() > if (args.onSuccess and result == true) or (args.onFail and result == false) then > > local cooldown = BData:getNumber(self.parameters.cooldown) > if type(cooldown) == "table" then > cooldown = util.randomInRange(cooldown) > end > BData:setNumber("cooldown-"..self.id, world.time() + cooldown) 264,266c487,498 < function BTModule:reset() < if self.node then < self.node:reset() --- > function filter(self, tree) > local newItems = {} > local items = BData:getList(self.parameters.list) > for _,filterItem in pairs(items) do > BData:set(self.parameters.type, "filterItem", filterItem) > > tree:queueFront(self.child) > local _,result = coroutine.yield() > > if result == true then > table.insert(newItems, filterItem) > end 267a500,501 > BData:setList(self.parameters.list, newItems) > return true 270,272c504,511 < function BTModule:interrupt() < if self.node then < self.node:interrupt() --- > function each(self, tree) > local items = BData:getList(self.parameters.list) > for _,filterItem in pairs(items) do > BData:set(self.parameters.type, "eachItem", filterItem) > > tree:queueFront(self.child) > _,result = coroutine.yield() > if result == false then return false end 273a513 > return true 276,301c516,521 < ----------------------------------------------------------- < -- JSON PARSING < ----------------------------------------------------------- < < function nodeFromJson(node, parameters, moduleName) < if node.parameters then < for k,v in pairs(node.parameters) do < node.parameters[k] = replaceTag(v, parameters) < end < end < local newNode < if node.type == "action" then < newNode = BTAction.fromJson(node) < elseif node.type == "composite" then < newNode = BTComposite.fromJson(node) < < --Load children < newNode.children = node.children < elseif node.type == "decorator" then < newNode = BTDecorator.fromJson(node) < < --Load child < newNode.child = node.child < elseif node.type == "module" then < node.parameters = parseArgs(node.parameters, parameters) < newNode = BTModule.fromJson(node) --- > function optional(self, tree) > local run = BData:getBool(self.parameters.shouldRun) > if run then > tree:queueFront(self.child) > local _,result = coroutine.yield() > return result 303c523 < sb.logInfo("Invalid node type %s", node.type) --- > return false 304a525 > end 306,312c527,530 < if newNode.children then < newNode.children = util.map(newNode.children, function(child) < return nodeFromJson(child, parameters, moduleName) < end) < elseif newNode.child then < newNode.child = nodeFromJson(newNode.child, parameters, moduleName) < end --- > function logResult(self, tree) > local args = parseArgs(self.parameters, { > text = "Log result: %s" > }) 314,316c532,535 < newNode.name = node.name < newNode.moduleName = moduleName < return newNode --- > tree:queueFront(self.child) > local _,result = coroutine.yield() > sb.logInfo(args.text, result) > return result 319,329c538,548 < function replaceTag(value, parameters) < if type(value) == "string" then < local tagString = value:match("^<.+>$") < if tagString ~= nil then < tagString = tagString:sub(2, -2) < if parameters[tagString] ~= nil then < return parameters[tagString] < else < sb.logInfo("Could not find parameter for tag '%s'", tagString) < end < end --- > > function limiter(self, tree) > local limit = self.parameters.limit or 1 > local runs = BData:getNumber("limiter-"..self.id) or 0 > if runs >= limit then return false end > > tree:queueFront(self.child) > local _,result = coroutine.yield() > if result == true then > runs = runs + 1 > BData:setNumber("limiter-"..self.id, runs) 331c550 < return value --- > return result 334c553,555 < --ACTIONS --- > ----------------------------------------------------------- > -- ACTION NODES (Leaf nodes) > ----------------------------------------------------------- 355,359d575 < function resetLimiters(args) < limiters = {} < return true < end < 488d703 < task.status = status 504c719 < end --- > end \ No newline at end of file scripts\util.lua 122c122 < for _,value in ipairs(t) do --- > for i,value in ipairs(t) do 125c125 < if current == index then return value end --- > if current == index then return value, i end 159a160,174 > function util.count(t,value) > local count = 0 > for _,v in pairs(t) do > if v == value then count = count + 1 end > end > return count > end > > function util.fold(t, a, func) > for _,v in pairs(t) do > a = func(a, v) > end > return a > end > 791a807,847 > > -- Very basic and probably not that reliable profiler > Profiler = {} > function Profiler:new() > local instance = { > totals = {}, > timers = {}, > ticks = 0 > } > setmetatable(instance, { __index = self }) > return instance > end > > function Profiler:start(key) > self.timers[key] = os.clock() > end > > function Profiler:stop(key) > if not self.totals[key] then > self.totals[key] = 0 > end > if self.timers[key] then > self.totals[key] = self.totals[key] + (os.clock() - self.timers[key]) > self.timers[key] = nil > end > end > > function Profiler:tick() > self.ticks = self.ticks + 1 > end > > function Profiler:dump() > local profiles = util.keys(self.totals) > table.sort(profiles, function(a,b) return self.totals[a] > self.totals[b] end) > sb.logInfo("-- PROFILE --") > for _,profile in ipairs(profiles) do > sb.logInfo("[%s] %s", profile, self.totals[profile]) > end > sb.logInfo("-- END --") > end > scripts\actions\builders.lua 2,3d1 < require "/scripts/behavior/composite.lua" < require "/scripts/behavior/decorator.lua" 8,17c6,14 < sequenceActions = BTComposite.new() < actions["sequenceActions"] = sequenceActions < function sequenceActions.new(args) < local selector = BTSequence.new() < selector.children = {} < for _,action in pairs(args.actions) do < local actionModule = { < type = "module", < name = action.name, < parameters = action.parameters or {} --- > function sequenceActions(args, output, node) > if #args.actions == 0 then return false end > > local tree = BData:getTable("sequenceActions-"..node.id) > if not tree then > local sequence = { > type = "composite", > name = "sequence", > children = {} 19,25c16,20 < if action.cooldown then < local cooldown = { < type = "decorator", < name = "cooldown", < parameters = { < cooldown = action.cooldown < } --- > for _,action in pairs(args.actions) do > local actionModule = { > type = "module", > name = action.name, > parameters = action.parameters or {} 27,30c22,34 < cooldown.child = actionModule < table.insert(selector.children, cooldown) < else < table.insert(selector.children, actionModule) --- > if action.cooldown then > local cooldown = { > type = "decorator", > name = "cooldown", > parameters = { > cooldown = action.cooldown > } > } > cooldown.child = actionModule > table.insert(sequence.children, cooldown) > else > table.insert(sequence.children, actionModule) > end 32d35 < end 34,35c37,39 < return selector < end --- > tree = BTree:new({root = sequence, scripts = {}}) > BData:setTable("sequenceActions-"..node.id, tree) > end 37,38c41,49 < function sequenceActions.fromJson(node) < return sequenceActions.new(node.parameters) --- > node.onClear = function() tree:clear() end > while true do > local result = tree:run(args.dt) > if result == false or result == true then > return result > else > args.dt = coroutine.yield().dt > end > end 42,55c53,61 < selectorActions = BTComposite.new() < actions["selectorActions"] = selectorActions < function selectorActions.new(args) < args = parseArgs(args, { < dynamic = false, < actions = {} < }) < local selector = args.dynamic and BTDynamic.new() or BTSelector.new() < selector.children = {} < for _,action in pairs(args.actions) do < local actionModule = { < type = "module", < name = action.name, < parameters = action.parameters or {} --- > function selectorActions(args, output, node) > if #args.actions == 0 then return false end > > local tree = BData:getTable("selectorActions-"..node.id) > if not tree then > local selector = { > type = "composite", > name = "selector", > children = {} 57,63c63,67 < if action.cooldown then < local cooldown = { < type = "decorator", < name = "cooldown", < parameters = { < cooldown = action.cooldown < } --- > for _,action in pairs(args.actions) do > local actionModule = { > type = "module", > name = action.name, > parameters = action.parameters or {} 65,68c69,81 < cooldown.child = actionModule < table.insert(selector.children, cooldown) < else < table.insert(selector.children, actionModule) --- > if action.cooldown then > local cooldown = { > type = "decorator", > name = "cooldown", > parameters = { > cooldown = action.cooldown > } > } > cooldown.child = actionModule > table.insert(selector.children, cooldown) > else > table.insert(selector.children, actionModule) > end 70d82 < end 72,73c84,86 < return selector < end --- > tree = BTree:new({root = selector, scripts = {}}) > BData:setTable("selectorActions-"..node.id, tree) > end 75,76c88,96 < function selectorActions.fromJson(node) < return selectorActions.new(node.parameters) --- > node.onClear = function() tree:clear() end > while true do > local result = tree:run(args.dt) > if result == false or result == true then > return result > else > args.dt = coroutine.yield().dt > end > end 80,89c100,108 < parallelActions = BTComposite.new() < actions["parallelActions"] = parallelActions < function parallelActions.new(args) < local parallel = BTParallel.new({success = -1, fail = -1}) < parallel.children = {} < for _,action in pairs(args.actions) do < local actionModule = { < type = "module", < name = action.name, < parameters = action.parameters or {} --- > function parallelActions(args, output, node) > if #args.actions == 0 then return false end > > local tree = BData:getTable("parallelActions-"..node.id) > if not tree then > local parallel = { > type = "composite", > name = "parallel", > children = {} 91,97c110,114 < if action.cooldown then < local cooldown = { < type = "decorator", < name = "cooldown", < parameters = { < cooldown = action.cooldown < } --- > for _,action in pairs(args.actions) do > local actionModule = { > type = "module", > name = action.name, > parameters = action.parameters or {} 99,102c116,128 < cooldown.child = actionModule < table.insert(parallel.children, cooldown) < else < table.insert(parallel.children, actionModule) --- > if action.cooldown then > local cooldown = { > type = "decorator", > name = "cooldown", > parameters = { > cooldown = action.cooldown > } > } > cooldown.child = actionModule > table.insert(parallel.children, cooldown) > else > table.insert(parallel.children, actionModule) > end 104d129 < end 106,107c131,133 < return parallel < end --- > tree = BTree:new({root = parallel, scripts = {}}) > BData:setTable("parallelActions-"..node.id, tree) > end 109,110c135,143 < function parallelActions.fromJson(node) < return parallelActions.new(node.parameters) --- > node.onClear = function() tree:clear() end > while true do > local result = tree:run(args.dt) > if result == false or result == true then > return result > else > args.dt = coroutine.yield().dt > end > end scripts\actions\movement.lua 37,39c37 < move = BTNode:new() < actions["move"] = move < function move.new(args, output) --- > function move(args, output, node) 44,62d41 < local newNode = { < args = args < } < setmetatable(newNode, extend(move)) < return newNode < end < function move.fromJson(node) < return move.new(node.parameters, node.output) < end < function move:run() < if not self.taskHandle then < self.taskHandle = addWorker(function() < local bounds = mcontroller.boundBox() < local collisionPoly = mcontroller.collisionPoly() < while true do < local run = self.args.run < if config.getParameter("pathing.forceWalkingBackwards", false) then < if run == true then run = mcontroller.movingDirection() == mcontroller.facingDirection() end < end 64,77c43,44 < local direction = BData:getNumber(self.args.direction) < if direction == nil then return false end < local position = mcontroller.position() < position = {position[1], math.ceil(position[2]) - (bounds[2] % 1)} -- align bottom of the bound box with the ground < < local move = false < -- Check for walls < for _,yDir in pairs({0, -1, 1}) do < --util.debugRect(rect.translate(bounds, vec2.add(position, {direction * 0.2, yDir})), "yellow") < if not world.rectTileCollision(rect.translate(bounds, vec2.add(position, {direction * 0.2, yDir}))) then < move = true < break < end < end --- > local bounds = mcontroller.boundBox() > local collisionPoly = mcontroller.collisionPoly() 79,88c46,64 < -- Also specifically check for a dumb collision geometry edge case where the ground goes like: < -- < -- # < -- ###### ###### < -- ############# < local boundsEnd = direction > 0 and bounds[3] or bounds[1] < local wallPoint = {position[1] + boundsEnd + direction * 0.5, position[2] + bounds[2] + 0.5} < local groundPoint = {position[1] + boundsEnd - direction * 0.5, position[2] + bounds[2] - 0.5} < if world.pointTileCollision(wallPoint) and not world.pointTileCollision(groundPoint) then < move = false --- > local handle = addWorker(function() > while true do > local run = args.run > if config.getParameter("pathing.forceWalkingBackwards", false) then > if run == true then run = mcontroller.movingDirection() == mcontroller.facingDirection() end > end > > local direction = BData:getNumber(args.direction) > if direction == nil then return false end > local position = mcontroller.position() > position = {position[1], math.ceil(position[2]) - (bounds[2] % 1)} -- align bottom of the bound box with the ground > > local move = false > -- Check for walls > for _,yDir in pairs({0, -1, 1}) do > --util.debugRect(rect.translate(bounds, vec2.add(position, {direction * 0.2, yDir})), "yellow") > if not world.rectTileCollision(rect.translate(bounds, vec2.add(position, {direction * 0.2, yDir}))) then > move = true > break 89a66,78 > end > > -- Also specifically check for a dumb collision geometry edge case where the ground goes like: > -- > -- # > -- ###### ###### > -- ############# > local boundsEnd = direction > 0 and bounds[3] or bounds[1] > local wallPoint = {position[1] + boundsEnd + direction * 0.5, position[2] + bounds[2] + 0.5} > local groundPoint = {position[1] + boundsEnd - direction * 0.5, position[2] + bounds[2] - 0.5} > if world.pointTileCollision(wallPoint) and not world.pointTileCollision(groundPoint) then > move = false > end 91,105c80,93 < -- Check for ground for the entire length of the bound box < -- Makes it so the entity can stop before a ledge < if move then < local boundWidth = bounds[3] - bounds[1] < local groundRect = rect.translate({bounds[1], bounds[2] - 1.0, bounds[3], bounds[2]}, position) < local y = 0 < for x = boundWidth % 1, math.ceil(boundWidth) do < move = false < for _,yDir in pairs({0, -1, 1}) do < --util.debugRect(rect.translate(groundRect, {direction * x, y + yDir}), "blue") < if world.rectTileCollision(rect.translate(groundRect, {direction * x, y + yDir}), {"Null", "Block", "Dynamic", "Platform"}) then < move = true < y = y + yDir < break < end --- > -- Check for ground for the entire length of the bound box > -- Makes it so the entity can stop before a ledge > if move then > local boundWidth = bounds[3] - bounds[1] > local groundRect = rect.translate({bounds[1], bounds[2] - 1.0, bounds[3], bounds[2]}, position) > local y = 0 > for x = boundWidth % 1, math.ceil(boundWidth) do > move = false > for _,yDir in pairs({0, -1, 1}) do > --util.debugRect(rect.translate(groundRect, {direction * x, y + yDir}), "blue") > if world.rectTileCollision(rect.translate(groundRect, {direction * x, y + yDir}), {"Null", "Block", "Dynamic", "Platform"}) then > move = true > y = y + yDir > break 107d94 < if move == false then break end 108a96 > if move == false then break end 109a98 > end 111,120c100,106 < if move then < mcontroller.controlMove(direction, self.args.run) < if not self.setFacingDirection then controlFace(direction) end < else < mcontroller.setXVelocity(0) < mcontroller.clearControls() < return false < end < < coroutine.yield("running") --- > if move then > mcontroller.controlMove(direction, args.run) > if not self.setFacingDirection then controlFace(direction) end > else > mcontroller.setXVelocity(0) > mcontroller.clearControls() > return false 122c108,113 < end) --- > > coroutine.yield() > end > end) > node.onClear = function() > removeWorker(handle) 125,130c116,117 < return self.taskHandle() < end < function move:reset() < if self.taskHandle then < removeWorker(self.taskHandle) < self.taskHandle = nil --- > while true do > coroutine.yield(handle()) 235,237c222 < moveToPosition = BTNode:new() < actions["moveToPosition"] = moveToPosition < function moveToPosition.new(args, output) --- > function moveToPosition(args, output, node) 247,264d231 < local newNode = { < children = {}, < args = args, < output = output or {} < } < setmetatable(newNode, extend(moveToPosition)) < return newNode < end < function moveToPosition.fromJson(node) < return moveToPosition.new(node.parameters, node.output) < end < function moveToPosition:run() < if not self.taskHandle then < self.taskHandle = addWorker(function() < if entity.entityType() == "npc" then npc.resetLounging() end < local pather = PathMover:new({run = BData:getBool(self.args.run), pathOptions = self.args.pathOptions}) < local targetPosition = BData:getPosition(self.args.position) < local position = false 266,279c233,252 < while true do < mcontroller.clearControls() < local newPosition = BData:getPosition(self.args.position) < local avoidLiquid = BData:getBool(self.args.avoidLiquid) < if not position or (newPosition[1] ~= targetPosition[1] or newPosition[2] ~= targetPosition[2]) then < position = BData:getPosition(self.args.position) < if position then < if self.args.groundPosition then < position = findGroundPosition(position, self.args.minGround, self.args.maxGround, avoidLiquid) < elseif avoidLiquid then < local liquid = world.liquidAt(rect.translate(mcontroller.boundBox(), position)) < if liquid and liquid[2] > 0.1 then < position = nil < end --- > > if entity.entityType() == "npc" then npc.resetLounging() end > local pather = PathMover:new({run = BData:getBool(args.run), pathOptions = args.pathOptions}) > local targetPosition = BData:getPosition(args.position) > local position = false > > local handle = addWorker(function() > while true do > mcontroller.clearControls() > local newPosition = BData:getPosition(args.position) > local avoidLiquid = BData:getBool(args.avoidLiquid) > if not position or (newPosition[1] ~= targetPosition[1] or newPosition[2] ~= targetPosition[2]) then > position = BData:getPosition(args.position) > if position then > if args.groundPosition then > position = findGroundPosition(position, args.minGround, args.maxGround, avoidLiquid) > elseif avoidLiquid then > local liquid = world.liquidAt(rect.translate(mcontroller.boundBox(), position)) > if liquid and liquid[2] > 0.1 then > position = nil 283c256,257 < if not position then return false end --- > end > if not position then return false end 285,286c259,260 < util.debugLine(mcontroller.position(), position, "yellow") < util.debugPoint(position, "yellow") --- > util.debugLine(mcontroller.position(), position, "yellow") > util.debugPoint(position, "yellow") 288,289c262,263 < pather.options.run = BData:getBool(self.args.run) < moved = pather:move(position, script.updateDt()) --- > pather.options.run = BData:getBool(args.run) > moved = pather:move(position, script.updateDt()) 291c265 < if not setFacingDirection() then controlFace(pather.deltaX) end --- > if not setFacingDirection() then controlFace(pather.deltaX) end 293,300c267,272 < BData:setNumber(self.output.direction, util.toDirection(pather.deltaX)) < BData:set("bool", self.output.pathfinding, moved == "pathfinding" or moved == false) < < if moved == true or moved == false then < mcontroller.clearControls() < break < end < coroutine.yield("running") --- > BData:setNumber(output.direction, util.toDirection(pather.deltaX)) > BData:set("bool", output.pathfinding, moved == "pathfinding" or moved == false) > > if moved == true or moved == false then > mcontroller.clearControls() > break 302,303c274,279 < return moved < end) --- > coroutine.yield() > end > return moved > end) > node.onClear = function() > removeWorker(handle) 305,310c281,283 < return self.taskHandle() < end < function moveToPosition:reset() < if self.taskHandle then < removeWorker(self.taskHandle) < self.taskHandle = nil --- > > while true do > coroutine.yield(handle()) scripts\actions\overrides.lua 100,102c100 < playBehavior = BTComposite:new() < actions["playBehavior"] = playBehavior < function playBehavior.new(args) --- > function playBehavior(args, output, node) 106,112d103 < local newNode = { < children = {}, < behavior = args.behavior < } < setmetatable(newNode, extend(playBehavior)) < return newNode < end 114,116c105,106 < function playBehavior.fromJson(node) < return playBehavior.new(node.parameters) < end --- > local behavior = BData:getTable(args.behavior) > if not behavior then return false end 118,121c108,111 < function playBehavior:run(dt) < local behavior = BData:getTable(self.behavior) < if not behavior then < return false --- > local tree = BData:getTable(string.format("playBehavior-%s-%s", behavior.name, node.id)) > if not tree then > tree = BTree:new(behavior.name) > BData:setTable(string.format("playBehavior-%s-%s", behavior.name, node.id), tree) 124,125c114,121 < if not self.children[behavior.name] then < self.children[behavior.name] = BTModule.new({name = behavior.name}) --- > node.onClear = function() tree:clear() end > while true do > local result = tree:run(args.dt) > if result == false or result == true then > return result > else > args.dt = coroutine.yield().dt > end 127,148c123 < < if self.current and self.current ~= behavior.name then < self.children[self.current]:interrupt() < self.children[self.current]:reset() < end < self.current = behavior.name < < return self:runChild(self.current, dt) < end < < function playBehavior:interrupt() < if self.current then < self.children[self.current]:interrupt() < end < end < < function playBehavior:reset() < if self.current then < self.children[self.current]:reset() < end < self.current = nil < end --- > end \ No newline at end of file scripts\actions\reaction.lua 413,440c413,420 < playBehaviorReaction = BTComposite:new() < actions["playBehaviorReaction"] = playBehaviorReaction < function playBehaviorReaction.new(args) < args = parseArgs(args, { < reaction = "" < }) < local newNode = { < children = {}, < reaction = args.reaction < } < setmetatable(newNode, extend(playBehaviorReaction)) < return newNode < end < < function playBehaviorReaction.fromJson(node) < return playBehaviorReaction.new(node.parameters) < end < < function playBehaviorReaction:run(dt) < local reactionName = BData:get("reaction", self.reaction) < < if not self.children[reactionName] then < local reaction = root.assetJson("/npcs/default_reactions.config:behaviorReactions")[reactionName] < < if reaction == nil then < return false < end < self.children[reactionName] = BTModule.new({name = reaction.behavior, parameters = reaction.parameters}) --- > function playBehaviorReaction(args, output, node) > local reactionName = BData:get("reaction", args.reaction) > local reaction = root.assetJson("/npcs/default_reactions.config:behaviorReactions")[reactionName] > > local tree = BData:getTable(string.format("playBehaviorReaction-%s-%s", reactionName, node.id)) > if not tree then > tree = BTree:new(reaction.behavior, reaction.parameters) > BData:setTable(string.format("playBehaviorReaction-%s-%s", reactionName, node.id), tree) 441a422 > node.onClear = function() tree:clear() end 443,459c424,430 < if self.current and self.current ~= reactionName then < self.children[self.current]:reset() < end < self.current = reactionName < < return self:runChild(self.current, dt) < end < < function playBehaviorReaction:interrupt() < if self.current then < self.children[self.current]:interrupt() < end < end < < function playBehaviorReaction:reset() < if self.current then < self.children[self.current]:reset() --- > while true do > local result = tree:run(args.dt) > if result == false or result == true then > return result > else > args.dt = coroutine.yield().dt > end 461,462c432 < self.current = nil < end --- > end \ No newline at end of file scripts\behavior\bgroup.lua 136a137,206 > > function BGroup:uninit() > self.joined = {} > self.joinedTasks = {} > self:updateGroups() > end > > function BGroup:parseGoal(goalType, goal) > if goalType == "entity" then > return BData:getEntity(goal) > elseif goalType == "position" then > return BData:getPosition(goal) > elseif goalType == "list" then > return BData:getList(goal) > end > end > -- Actions -- > > -- Group > -- Share a goal with nearby entities with the same goal > -- Keeps running until entity is no longer in the group > function group(args, output) > args = parseArgs(args, { > unique = false > }) > local unique = BData:getBool(args.unique) > local group = { > groupId = args.groupId, > goalType = args.goalType, > minMembers = args.minMembers, > maxMembers = args.maxMembers, > behavior = args.behavior > } > > group.goal = BGroup:parseGoal(group.goalType, args.goal) > local position = BData:getPosition(args.position) > > local groupResult = BGroup:joinGroup(group, position, unique) > if groupResult == "success" then > BGroup:leaveGroup(group.groupId) > return true > end > > return groupResult == true > end > > function succeedGroup(args, output) > args = parseArgs(args, { > groupId = nil > }) > > BGroup:setGroupSuccess(args.groupId) > return true > end > > function task(args, output) > args = parseArgs(args, { > groupId = nil, > taskId = nil, > minMembers = nil, > maxMembers = nil > }) > > local task = { > taskId = args.taskId, > minMembers = args.minMembers, > maxMembers = args.maxMembers > } > return BGroup:joinTask(args.groupId, task) > end \ No newline at end of file stagehands\coordinator.lua 34,36d33 < if self.btree then < self.btree:uninit() < end 40,41c37,38 < if self.btree and self.btree:run(dt) ~= "running" then < self.btree:reset() --- > if self.btree then > self.btree:run(dt) tech\distortionsphere\aquasphere.techitem 4a5 > "listIcon" : "/tech/distortionsphere/aquasphere.png:1", tech\distortionsphere\distortionsphere.techitem 4a5 > "listIcon" : "/tech/distortionsphere/distortionsphere.png:1", tech\distortionsphere\sonicsphere.techitem 4a5 > "listIcon" : "/tech/distortionsphere/sonicsphere.png:1", tech\distortionsphere\spikesphere.techitem 4a5 > "listIcon" : "/tech/distortionsphere/spikesphere.png:1", tilesets\packed\huge-objects.json 7c7 < "tilecount" : 75, --- > "tilecount" : 76, 590a591,594 > "75" : { > "//name" : "signstorelosed", > "invalid" : "true" > }, 828a833,835 > }, > "75" : { > "image" : "./../../../../tiled/packed/../packed/invalid.png" tilesets\packed\objects-by-category\decorative.json 7c7 < "tilecount" : 1285, --- > "tilecount" : 1287, 2712a2713,2730 > "1285" : { > "//description" : "This would be a neat venue for a shop.", > "//name" : "penguinbayclosed", > "//shortdescription" : "Closed Penguin Bay", > "imagePositionX" : "-56", > "imagePositionY" : "0", > "object" : "penguinbayclosed", > "tilesetDirection" : "right" > }, > "1286" : { > "//description" : "This would be a neat venue for a stall.", > "//name" : "signstoreclosed", > "//shortdescription" : "Closed Sign Store", > "imagePositionX" : "-24", > "imagePositionY" : "0", > "object" : "signstoreclosed", > "tilesetDirection" : "right" > }, 11637a11656,11661 > }, > "1285" : { > "image" : "../../../../../tiled/packed/objects/penguinbayclosed.png" > }, > "1286" : { > "image" : "../../../../../tiled/packed/objects/signstoreclosed.png" tilesets\packed\objects-by-category\seed.json 149c149 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", 580c580 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", tilesets\packed\objects-by-category\storage.json 7c7 < "tilecount" : 215, --- > "tilecount" : 216, 1144a1145,1153 > "215" : { > "//description" : "A master work of craftsmanship. Beautiful.", > "//name" : "hylotlclassicbookcase", > "//shortdescription" : "Traditional Bookcase", > "imagePositionX" : "-16", > "imagePositionY" : "0", > "object" : "hylotlclassicbookcase", > "tilesetDirection" : "right" > }, 2264a2274,2276 > }, > "215" : { > "image" : "../../../../../tiled/packed/objects/hylotlclassicbookcase.png" tilesets\packed\objects-by-colonytag\nature.json 95c95 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", 1054c1054 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", tilesets\packed\objects-by-colonytag\outpost.json 7c7 < "tilecount" : 83, --- > "tilecount" : 85, 735a736,753 > "83" : { > "//description" : "This would be a neat venue for a shop.", > "//name" : "penguinbayclosed", > "//shortdescription" : "Closed Penguin Bay", > "imagePositionX" : "-56", > "imagePositionY" : "0", > "object" : "penguinbayclosed", > "tilesetDirection" : "right" > }, > "84" : { > "//description" : "This would be a neat venue for a stall.", > "//name" : "signstoreclosed", > "//shortdescription" : "Closed Sign Store", > "imagePositionX" : "-24", > "imagePositionY" : "0", > "object" : "signstoreclosed", > "tilesetDirection" : "right" > }, 991a1010,1015 > }, > "83" : { > "image" : "../../../../../tiled/packed/objects/penguinbayclosed.png" > }, > "84" : { > "image" : "../../../../../tiled/packed/objects/signstoreclosed.png" tilesets\packed\objects-by-colonytag\pretty.json 7c7 < "tilecount" : 446, --- > "tilecount" : 448, 3374a3375,3392 > "446" : { > "//description" : "This would be a neat venue for a shop.", > "//name" : "penguinbayclosed", > "//shortdescription" : "Closed Penguin Bay", > "imagePositionX" : "-56", > "imagePositionY" : "0", > "object" : "penguinbayclosed", > "tilesetDirection" : "right" > }, > "447" : { > "//description" : "This would be a neat venue for a stall.", > "//name" : "signstoreclosed", > "//shortdescription" : "Closed Sign Store", > "imagePositionX" : "-24", > "imagePositionY" : "0", > "object" : "signstoreclosed", > "tilesetDirection" : "right" > }, 5058a5077,5082 > }, > "446" : { > "image" : "../../../../../tiled/packed/objects/penguinbayclosed.png" > }, > "447" : { > "image" : "../../../../../tiled/packed/objects/signstoreclosed.png" tilesets\packed\objects-by-race\generic.json 7c7 < "tilecount" : 1703, --- > "tilecount" : 1705, 2872c2872 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", 3388c3388 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", 6670a6671,6688 > "1703" : { > "//description" : "This would be a neat venue for a shop.", > "//name" : "penguinbayclosed", > "//shortdescription" : "Closed Penguin Bay", > "imagePositionX" : "-56", > "imagePositionY" : "0", > "object" : "penguinbayclosed", > "tilesetDirection" : "right" > }, > "1704" : { > "//description" : "This would be a neat venue for a stall.", > "//name" : "signstoreclosed", > "//shortdescription" : "Closed Sign Store", > "imagePositionX" : "-24", > "imagePositionY" : "0", > "object" : "signstoreclosed", > "tilesetDirection" : "right" > }, 16805a16824,16829 > }, > "1703" : { > "image" : "../../../../../tiled/packed/objects/penguinbayclosed.png" > }, > "1704" : { > "image" : "../../../../../tiled/packed/objects/signstoreclosed.png" tilesets\packed\objects-by-type\farmable.json 643c643 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", 652c652 < "imagePositionX" : "0", --- > "imagePositionX" : "-8", treasure\common.treasurepools 1149d1148 < {"weight" : 0.0003, "item" : [ "neoback", 1]}, treasure\largedungeons.treasurepools 1172d1171 < {"weight" : 0.01, "item" : [ "venusdepixel", 1]},