FILES ----- ai\ai.config ai\upgradebeamaxe1.aicommand ai\upgradebeamaxe2.aicommand ai\upgradebeamaxe3.aicommand ai\upgradebeamaxe4.aicommand ai\upgradebeamaxe5.aicommand ai\upgradebeamaxe6.aicommand [NEW] animations\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.animation [NEW] animations\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.frames [NEW] animations\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.png [NEW] animations\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.animation [NEW] animations\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.frames [NEW] animations\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.png [NEW] behaviors\nodes.json behaviors\monsters\tracking.behavior behaviors\monsters\boss\spiderboss\acidspray.behavior behaviors\monsters\boss\spiderboss\hatch.behavior behaviors\monsters\boss\spiderboss\hurt.behavior behaviors\monsters\boss\spiderboss\main.behavior behaviors\monsters\boss\spiderboss\return.behavior [NEW] behaviors\monsters\boss\spiderboss\shellshards.behavior behaviors\monsters\boss\spiderboss\slam.behavior behaviors\monsters\boss\spiderboss\sweep.behavior behaviors\monsters\unique\ixoling.behavior behaviors\npc\converse.behavior behaviors\npc\flee.behavior behaviors\npc\floranspectator.behavior behaviors\npc\sit.behavior behaviors\npc\sleep.behavior behaviors\npc\wander.behavior behaviors\sequences\beamout.behavior behaviors\sequences\floranmission\floranmissionstart.behavior behaviors\sequences\floranmission\floranmissionswitch.behavior behaviors\sequences\floranmission\nurucombat.behavior behaviors\sequences\floranmission\nurutunnel.behavior [NEW] damage\ice.damage dungeons\missions\floranmissions\floranmission1-objects.png dungeons\missions\floranmissions\floranmission1.png dungeons\missions\hylotlmissions\hylotlmission1.json dungeons\other\challengerooms\challengerooms.dungeon [NEW] dungeons\other\challengerooms\puzzle1.json [NEW] dungeons\other\challengerooms\quicksilver1.json [NEW] effects\icetrailwide.effectsource humanoid\novakid\malebody.png interface\ai\ai.config [NEW] items\armors\backitems\aviangodwings\aviangodwings.back [NEW] items\armors\backitems\aviangodwings\back.png [NEW] items\armors\backitems\aviangodwings\icon.png [NEW] items\armors\backitems\bladedwings\back.png [NEW] items\armors\backitems\bladedwings\bladedwings.back [NEW] items\armors\backitems\bladedwings\icon.png [NEW] items\armors\backitems\butterflywings\back.png [NEW] items\armors\backitems\butterflywings\butterflywings.back [NEW] items\armors\backitems\butterflywings\icon.png [NEW] items\armors\backitems\demonwings\back.png [NEW] items\armors\backitems\demonwings\demonwings.back [NEW] items\armors\backitems\demonwings\icon.png [NEW] items\armors\backitems\falconwings\back.png [NEW] items\armors\backitems\falconwings\falconwings.back [NEW] items\armors\backitems\falconwings\icon.png [NEW] items\armors\backitems\guardwings\back.png [NEW] items\armors\backitems\guardwings\guardwings.png.back [NEW] items\armors\backitems\guardwings\icon.png [NEW] items\armors\backitems\halogenpack\back.png [NEW] items\armors\backitems\halogenpack\halogenpack.back [NEW] items\armors\backitems\halogenpack\halogenpackicon.png items\armors\backitems\lanternstick\lanternstick.back [NEW] items\armors\backitems\tribalfeathers\back.png [NEW] items\armors\backitems\tribalfeathers\icon.png [NEW] items\armors\backitems\tribalfeathers\tribalfeathers.back [NEW] items\armors\backitems\tribalwings\back.png [NEW] items\armors\backitems\tribalwings\icon.png [NEW] items\armors\backitems\tribalwings\tribalwings.back [NEW] items\armors\backitems\xenonpack\back.png [NEW] items\armors\backitems\xenonpack\xenonpack.back [NEW] items\armors\backitems\xenonpack\xenonpackicon.png items\generic\other\blanktechcard.item [NEW] items\generic\other\manipulatormodule.item [NEW] items\generic\other\manipulatormodule.png items\generic\other\techchip.item [NEW] items\generic\other\upgradecomponent.item [NEW] items\generic\other\upgradecomponent.png monsters\bmonster.lua monsters\tenant.lua monsters\boss\spiderboss\spiderboss.animation monsters\boss\spiderboss\spiderboss.monstertype [NEW] monsters\boss\spiderboss\body\body.frames [NEW] monsters\boss\spiderboss\body\body.monsterpart [NEW] monsters\boss\spiderboss\body\body.png [NEW] monsters\boss\spiderboss\legs\legs.frames [NEW] monsters\boss\spiderboss\legs\legs.monsterpart [NEW] monsters\boss\spiderboss\legs\legs.png [NEW] monsters\boss\spiderboss\shell\shell.frames [NEW] monsters\boss\spiderboss\shell\shell.monsterpart [NEW] monsters\boss\spiderboss\shell\shell.png npcs\bmain.lua npcs\chefmerchant.npctype npcs\follower.npctype npcs\returnhomestate.lua npcs\tenant.lua npcs\villager.npctype [NEW] objects\ancient\airbooster\airbooster.frames [NEW] objects\ancient\airbooster\airbooster.object [NEW] objects\ancient\airbooster\airbooster.png [NEW] objects\ancient\airbooster\airboosterceiling.frames [NEW] objects\ancient\airbooster\airboosterceiling.png [NEW] objects\ancient\airbooster\airboostericon.png [NEW] objects\ancient\airbooster\airboosterleft.frames [NEW] objects\ancient\airbooster\airboosterleft.png [NEW] objects\ancient\airbooster\airboosterright.frames [NEW] objects\ancient\airbooster\airboosterright.png [NEW] objects\ancient\ancientbouldertrap\ancientbouldertrap.frames [NEW] objects\ancient\ancientbouldertrap\ancientbouldertrap.object [NEW] objects\ancient\ancientbouldertrap\ancientbouldertrap.png [NEW] objects\ancient\ancientbouldertrap\ancientbouldertrapicon.png objects\ancient\ancientcrystaltrap\ancientcrystaltrap.object objects\ancient\ancientcrystaltrap\ancientcrystaltrap.png objects\ancient\ancientcrystaltrap\ancientcrystaltrapicon.png objects\ancient\ancientflametrap\ancientflametrap.object objects\ancient\ancientflametrap\ancientflametrapicon.png [NEW] objects\ancient\ancienthiddenplatform\ancienthiddenplatform.frames [NEW] objects\ancient\ancienthiddenplatform\ancienthiddenplatform.object [NEW] objects\ancient\ancienthiddenplatform\ancienthiddenplatform.png [NEW] objects\ancient\ancienthiddenplatform\ancienthiddenplatformicon.png [NEW] objects\ancient\ancienticetrap\ancienticetrap.frames [NEW] objects\ancient\ancienticetrap\ancienticetrap.object [NEW] objects\ancient\ancienticetrap\ancienticetrap.png [NEW] objects\ancient\ancienticetrap\ancienticetrapceiling.frames [NEW] objects\ancient\ancienticetrap\ancienticetrapceiling.png [NEW] objects\ancient\ancienticetrap\ancienticetrapicon.png [NEW] objects\ancient\ancienticetrap\ancienticetrapleft.frames [NEW] objects\ancient\ancienticetrap\ancienticetrapleft.png [NEW] objects\ancient\ancienticetrap\ancienticetrapright.frames [NEW] objects\ancient\ancienticetrap\ancienticetrapright.png [NEW] objects\ancient\jumpbooster\jumpbooster.frames [NEW] objects\ancient\jumpbooster\jumpbooster.object [NEW] objects\ancient\jumpbooster\jumpbooster.png [NEW] objects\ancient\jumpbooster\jumpboosterceiling.frames [NEW] objects\ancient\jumpbooster\jumpboosterceiling.png [NEW] objects\ancient\jumpbooster\jumpboostericon.png [NEW] objects\ancient\jumpbooster\jumpboosterleft.frames [NEW] objects\ancient\jumpbooster\jumpboosterleft.png [NEW] objects\ancient\jumpbooster\jumpboosterright.frames [NEW] objects\ancient\jumpbooster\jumpboosterright.png [NEW] objects\ancient\powerbooster\powerbooster.frames [NEW] objects\ancient\powerbooster\powerbooster.object [NEW] objects\ancient\powerbooster\powerbooster.png [NEW] objects\ancient\powerbooster\powerboosterceiling.frames [NEW] objects\ancient\powerbooster\powerboosterceiling.png [NEW] objects\ancient\powerbooster\powerboostericon.png [NEW] objects\ancient\powerbooster\powerboosterleft.frames [NEW] objects\ancient\powerbooster\powerboosterleft.png [NEW] objects\ancient\powerbooster\powerboosterright.frames [NEW] objects\ancient\powerbooster\powerboosterright.png [NEW] objects\ancient\speedbooster\speedbooster.frames [NEW] objects\ancient\speedbooster\speedbooster.object [NEW] objects\ancient\speedbooster\speedbooster.png [NEW] objects\ancient\speedbooster\speedboosterceiling.frames [NEW] objects\ancient\speedbooster\speedboosterceiling.png [NEW] objects\ancient\speedbooster\speedboostericon.png [NEW] objects\ancient\speedbooster\speedboosterleft.frames [NEW] objects\ancient\speedbooster\speedboosterleft.png [NEW] objects\ancient\speedbooster\speedboosterright.frames [NEW] objects\ancient\speedbooster\speedboosterright.png objects\avian\bouldertrap\bouldertrap.object objects\colony\colonydeed\colonydeed.lua objects\colony\colonydeed\colonydeed.object objects\colony\colonydeed\scanning.lua objects\hylotl\hylotlclassicpainting1\hylotlclassicpainting1.object [NEW] objects\outpost\floop\floop.frames [NEW] objects\outpost\floop\floop.object [NEW] objects\outpost\floop\floop.png [NEW] objects\outpost\floop\icon.png [NEW] objects\outpost\floor\floor.frames [NEW] objects\outpost\floor\floor.object [NEW] objects\outpost\floor\floor.png [NEW] objects\outpost\floor\icon.png [NEW] particles\icetrailwide.particle [NEW] particles\shellshard\shellshard1.particle [NEW] particles\shellshard\shellshard2.particle [NEW] particles\shellshard\shellshard3.particle [NEW] particles\shellshard\shellshard4.particle [NEW] particles\shellshard\shellshard5.particle [NEW] particles\shellshard\shellshard6.particle projectiles\physics.config [NEW] projectiles\boss\spiderboss\shellshards\default.frames [NEW] projectiles\boss\spiderboss\shellshards\shellshard1.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard1.projectile [NEW] projectiles\boss\spiderboss\shellshards\shellshard2.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard2.projectile [NEW] projectiles\boss\spiderboss\shellshards\shellshard3.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard3.projectile [NEW] projectiles\boss\spiderboss\shellshards\shellshard4.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard4.projectile [NEW] projectiles\boss\spiderboss\shellshards\shellshard5.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard5.projectile [NEW] projectiles\boss\spiderboss\shellshards\shellshard6.png [NEW] projectiles\boss\spiderboss\shellshards\shellshard6.projectile projectiles\traps\ancientcrystaltrapbeam\ancientcrystaltrapbeam.projectile projectiles\traps\ancientcrystaltrapbeam\icon.png [NEW] projectiles\traps\ancienttrapboulderappearrolling\ancienttrapboulderappearrolling.frames [NEW] projectiles\traps\ancienttrapboulderappearrolling\ancienttrapboulderappearrolling.png [NEW] projectiles\traps\ancienttrapboulderappearrolling\ancienttrapboulderappearrolling.projectile [NEW] projectiles\traps\ancienttrapboulderrolling\ancienttrapboulderrolling.frames [NEW] projectiles\traps\ancienttrapboulderrolling\ancienttrapboulderrolling.png [NEW] projectiles\traps\ancienttrapboulderrolling\ancienttrapboulderrolling.projectile [NEW] projectiles\traps\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.config [NEW] projectiles\traps\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.frames [NEW] projectiles\traps\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.png [NEW] projectiles\traps\ancienttrapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.projectile [NEW] projectiles\traps\jumpboostergas\icon.png [NEW] projectiles\traps\jumpboostergas\jumpboostergas.frames [NEW] projectiles\traps\jumpboostergas\jumpboostergas.png [NEW] projectiles\traps\jumpboostergas\jumpboostergas.projectile [NEW] projectiles\traps\lowgravboostergas\icon.png [NEW] projectiles\traps\lowgravboostergas\lowgravboostergas.frames [NEW] projectiles\traps\lowgravboostergas\lowgravboostergas.png [NEW] projectiles\traps\lowgravboostergas\lowgravboostergas.projectile [NEW] projectiles\traps\powerboostergas\icon.png [NEW] projectiles\traps\powerboostergas\powerboostergas.frames [NEW] projectiles\traps\powerboostergas\powerboostergas.png [NEW] projectiles\traps\powerboostergas\powerboostergas.projectile [NEW] projectiles\traps\speedboostergas\icon.png [NEW] projectiles\traps\speedboostergas\speedboostergas.frames [NEW] projectiles\traps\speedboostergas\speedboostergas.png [NEW] projectiles\traps\speedboostergas\speedboostergas.projectile [NEW] projectiles\traps\trapboulderappearbouncy\trapboulderappearbouncy.frames [NEW] projectiles\traps\trapboulderappearbouncy\trapboulderappearbouncy.png [NEW] projectiles\traps\trapboulderappearbouncy\trapboulderappearbouncy.projectile [NEW] projectiles\traps\trapboulderappearbouncy\trapboulderappearbouncylong.projectile [NEW] projectiles\traps\trapboulderappearrolling\trapboulderappearrolling.frames [NEW] projectiles\traps\trapboulderappearrolling\trapboulderappearrolling.png [NEW] projectiles\traps\trapboulderappearrolling\trapboulderappearrolling.projectile [NEW] projectiles\traps\trapboulderbouncy\trapboulderbouncy.frames [NEW] projectiles\traps\trapboulderbouncy\trapboulderbouncy.png [NEW] projectiles\traps\trapboulderbouncy\trapboulderbouncy.projectile [NEW] projectiles\traps\trapboulderbouncy\trapboulderbouncylong.projectile [NEW] projectiles\traps\trapboulderrolling\trapboulderrolling.frames [NEW] projectiles\traps\trapboulderrolling\trapboulderrolling.png [NEW] projectiles\traps\trapboulderrolling\trapboulderrolling.projectile [NEW] projectiles\traps\trapboulderrollingsmashexplosion\ancienttrapboulderrollingsmashexplosion.png [NEW] projectiles\traps\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.config [NEW] projectiles\traps\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.frames [NEW] projectiles\traps\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.png [NEW] projectiles\traps\trapboulderrollingsmashexplosion\trapboulderrollingsmashexplosion.projectile [NEW] projectiles\traps\trapice\icon.png [NEW] projectiles\traps\trapice\trapice.frames [NEW] projectiles\traps\trapice\trapice.png [NEW] projectiles\traps\trapice\trapice.projectile quests\outpost\outpost1.questtemplate quests\outpost\outpost2.questtemplate quests\outpost\outpost3.questtemplate quests\outpost\phase3optional\avianexplorer3.questtemplate quests\outpost\phase3optional\glitchsilenttype3.questtemplate quests\outpost\phase4optional\avianexplorer4.questtemplate [NEW] recipes\armor\other\halogenpack\halogenpack.recipe [NEW] recipes\armor\other\xenonpack\xenonpack.recipe scripts\behavior.lua scripts\actions\entities.lua scripts\actions\math.lua scripts\actions\movement.lua scripts\actions\position.lua scripts\actions\sensor.lua scripts\actions\status.lua scripts\actions\time.lua [NEW] sfx\objects\gasbooster_loop.wav [NEW] sfx\objects\gasbooster_off.wav [NEW] stats\effects\halogenglow\halogenglow.animation [NEW] stats\effects\halogenglow\halogenglow.lua [NEW] stats\effects\halogenglow\halogenglow.statuseffect [NEW] stats\effects\xenonglow\xenonglow.animation [NEW] stats\effects\xenonglow\xenonglow.lua [NEW] stats\effects\xenonglow\xenonglow.statuseffect [NEW] tech\flyingjump.png [NEW] tech\flyingjump\flyingjump.animation [NEW] tech\flyingjump\flyingjump.lua [NEW] tech\flyingjump\flyingjump.tech [NEW] tech\flyingjump\flyingjump.techitem treasure\common.treasurepools DIFFS ----- ai\ai.config 109c109 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech Drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 151c151 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 193c193 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 235c235 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 277c277 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 319c319 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 361c361 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", 403c403 < "text" : "Here you can augment your body with tech cards and nano suits. ^orange;Tech cards ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", --- > "text" : "Here you can augment your body with tech drives and nano suits. ^orange;Tech drives ^green;will give you unique abilities whilst ^orange;nano suits ^green;will allow you to survive in otherwise deadly environments.", ai\upgradebeamaxe1.aicommand 8c8 < "itemsRequired" : [ ["copperbar", 10] ], --- > "itemsRequired" : [ ["manipulatormodule", 1] ], 32c32 < "text" : "^white;With ^orange;10 bars of refined copper^white;, I can upgrade your matter manipulator to ^green;increase its mining power a bit^white;.", --- > "text" : "^white;With ^orange;1 manipulator module^white;, I can upgrade your matter manipulator to ^green;increase its mining power a bit^white;. You should be able to ^green;find some by exploring!^green;", 39c39 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded with ^green;increased mining power!^green;", 46c46 < "text" : "^white;Failure. We'll need ^orange;10 copper bars ^white;to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;a manipulator module ^white;to complete this upgrade.", ai\upgradebeamaxe2.aicommand 8c8 < "itemsRequired" : [ ["silverbar", 10] ], --- > "itemsRequired" : [ ["manipulatormodule", 5] ], 30c30 < "text" : "^white;With ^orange;10 bars of refined silver^white;, I can upgrade your matter manipulator to ^green;allow the collection of liquids^white;.", --- > "text" : "^white;With ^orange;5 manipulator modules^white;, I can upgrade your matter manipulator to ^green;allow the collection of liquids^white;.", 37c37 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded to ^green;allow the collection of liquids.^green;", 44c44 < "text" : "^white;Failure. We'll need ^orange;10 silver bars ^white;to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;5 manipulator modules ^white;to complete this upgrade.", ai\upgradebeamaxe3.aicommand 8c8 < "itemsRequired" : [ ["goldbar", 10], ["titaniumbar", 10] ], --- > "itemsRequired" : [ ["manipulatormodule", 15] ], 32c32 < "text" : "^white;With ^orange;10 bars of gold^white; and ^orange;10 bars of titanium^white;, I can upgrade your matter manipulator to ^green;increase its mining area^white;.", --- > "text" : "^white;With ^orange;15 manipulator modules^white;, I can upgrade your matter manipulator to ^green;increase its mining area^white;.", 39c39 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded to ^green;increase its mining area.^green;", 46c46 < "text" : "^white;Failure. We'll need ^orange;10 gold bars^white; and ^orange;10 titanium bars^white; to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;15 manipulator modules^white; to complete this upgrade.", ai\upgradebeamaxe4.aicommand 8c8 < "itemsRequired" : [ ["durasteelbar", 20] ], --- > "itemsRequired" : [ ["manipulatormodule", 25] ], 32c32 < "text" : "^white;With ^orange;20 bars of durasteel^white;, I can upgrade your matter manipulator to ^green;further increase its mining power^white;.", --- > "text" : "^white;With ^orange;25 manipulator modules^white;, I can upgrade your matter manipulator to ^green;further increase its mining power^white;.", 39c39 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded to ^green;further increase its mining power.^green;", 46c46 < "text" : "^white;Failure. We'll need ^orange;20 durasteel bars^white; to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;25 manipulator modules^white; to complete this upgrade.", ai\upgradebeamaxe5.aicommand 8c8 < "itemsRequired" : [ ["refinedaegisalt", 10], ["refinedrubium", 10], ["refinedviolium", 10] ], --- > "itemsRequired" : [ ["manipulatormodule", 35] ], 32c32 < "text" : "^white;With ^orange;10 refined units^white; each of ^orange;aegisalt, rubium, and violium^white;, I can upgrade your matter manipulator to ^green;greatly increase its mining power^white;.", --- > "text" : "^white;With ^orange;35 manipulator modules^white;, I can upgrade your matter manipulator to ^green;greatly increase its mining power^white;.", 39c39 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded with ^green;greatly increased mining power.^green;", 46c46 < "text" : "^white;Failure. We'll need ^orange;10 refined aegisalt, 10 refined rubium, and 10 refined violium ^white;to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;35 manipulator modules^white; to complete this upgrade.", ai\upgradebeamaxe6.aicommand 8c8 < "itemsRequired" : [ ["solariumstar", 10], ["diamond", 10] ], --- > "itemsRequired" : [ ["manipulatormodule", 50] ], 28c28 < "text" : "^white;With ^orange;10 solarium stars^white; and ^orange;10 diamonds^white;, I can upgrade your matter manipulator to ^green;further increase its mining area^white;.", --- > "text" : "^white;With ^orange;50 manipulator modules^white;, I can upgrade your matter manipulator to ^green;greatly increase its mining power^white;.", 35c35 < "text" : "^white;Success! Your matter manipulator has been upgraded.", --- > "text" : "^white;Success! Your matter manipulator has been upgraded with ^green;greatly increased mining power.^green;", 42c42 < "text" : "^white;Failure. We'll need ^orange;10 solarium stars^white; and ^orange;10 diamonds^white; to complete this upgrade.", --- > "text" : "^white;Failure. We'll need ^orange;50 manipulator modules^white; to complete this upgrade.", behaviors\monsters\tracking.behavior 50,53c50 < "name": "wasDamaged", < "parameters": { < "toEntity": "newTarget" < } --- > "name": "wasDamaged" 60,61c57,60 < "getEntity": "damageSource", < "setEntity": "newTarget" --- > "entity": "damageSource" > }, > "output": { > "entity" : "newTarget" 101,102c100,103 < "range": "", < "toEntity": "newTarget" --- > "range": "" > }, > "output": { > "entity" : "newTarget" 130c131 < "getEntity": "newTarget" --- > "entity": "newTarget" 139c140 < "getEntity": "newTarget" --- > "entity": "newTarget" 170,171c171,174 < "list": "targets", < "setEntity": "target" --- > "list": "targets" > }, > "output": { > "entity" : "target" 225,226c228,231 < "list": "targets", < "setEntity": "target" --- > "list": "targets" > }, > "output": { > "entity" : "target" behaviors\monsters\boss\spiderboss\acidspray.behavior 32,33c32,35 < "direction": "spitSide", < "toDirection": "spitSide" --- > "direction": "spitSide" > }, > "output": { > "direction": "spitSide" 46,47c48,50 < "parameters": { < "toDirection": "spitSide" --- > "parameters": {}, > "output": { > "direction": "spitSide" 60,61c63,66 < "factor": 20, < "toNumber": "spitX" --- > "factor": 20 > }, > "output": { > "result": "spitX" 69,70c74 < "fromIndex": "spawn", < "toIndex": "attack", --- > "position": "spawn", 72a77,79 > }, > "output": { > "position": "attack" 85d91 < "title": "distance", 89,90c95,98 < "toPosition": "attack", < "toVector": "toAttack" --- > "to": "attack" > }, > "output": { > "vector": "toAttack" 107c115 < "getVec2": "toAttack", --- > "vector": "toAttack", 154,155c162,165 < "toEntity": "target", < "toVector": "toTarget" --- > "target": "target" > }, > "output": { > "vector" : "toTarget" 163c173 < "getVec2": "toTarget", --- > "vector": "toTarget", 175a186,188 > }, > "output": { > "number": "fireAngle" 184d196 < "toVector": "fireVector", 185a198,200 > }, > "output": { > "vector": "fireVector" 197d211 < "toVector": "fireOffset", 198a213,215 > }, > "output": { > "vector": "fireOffset" 246c263 < "direction": "fireVector", --- > "aimVector": "fireVector", 256d272 < "toVector": "fireVector", 257a274,276 > }, > "output": { > "vector": "fireVector" behaviors\monsters\boss\spiderboss\hatch.behavior 41,42c41,44 < "offset": "", < "toIndex": "hatch" --- > "offset": "" > }, > "output": { > "position" : "hatch" 60c62 < "monsterType": "ixoling" --- > "type": "ixoling" behaviors\monsters\boss\spiderboss\hurt.behavior 16c16 < "title": "parallel", --- > "title": "sequence", 18,21c18,19 < "name": "parallel", < "parameters": { < "success": 2 < }, --- > "name": "sequence", > "parameters": {}, 24,30c22,25 < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "vulnerability", < "duration": 0.1 < } --- > "type": "module", > "path": "/behaviors/monsters/boss/spiderboss/shellshards.behavior", > "title": "/behaviors/monsters/boss/spiderboss/shellshards.behavior", > "parameters": {} 33c28 < "title": "sequence", --- > "title": "parallel", 35c30 < "name": "sequence", --- > "name": "parallel", 37,38c32 < "type": "sliding", < "state": "off" --- > "success": 2 42c36 < "title": "setAnimationState", --- > "title": "addEphemeralEffect", 44c38 < "name": "setAnimationState", --- > "name": "addEphemeralEffect", 46,47c40,41 < "type": "body", < "state": "hurt" --- > "name": "vulnerability", > "duration": 0.1 51,71c45,47 < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "type": "shell", < "state": "invisible" < } < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "type": "legs", < "state": "hurt" < } < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", --- > "title": "sequence", > "type": "composite", > "name": "sequence", 74,98c50,51 < "state": "on" < } < }, < { < "title": "rotate", < "type": "action", < "name": "rotate", < "parameters": { < "angle": 4.71 < } < }, < { < "title": "setParticleEmitterActive", < "type": "action", < "name": "setParticleEmitterActive", < "parameters": { < "emitter": "slide", < "active": true < } < }, < { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": {}, --- > "state": "off" > }, 101c54 < "title": "lineTileCollision", --- > "title": "setAnimationState", 103c56 < "name": "lineTileCollision", --- > "name": "setAnimationState", 105,108c58,152 < "offset": [ < 0, < -17.5 < ] --- > "type": "body", > "state": "hurt" > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "type": "shell", > "state": "invisible" > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "type": "legs", > "state": "hurt" > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "type": "sliding", > "state": "on" > } > }, > { > "title": "rotate", > "type": "action", > "name": "rotate", > "parameters": { > "angle": 4.71 > } > }, > { > "title": "setParticleEmitterActive", > "type": "action", > "name": "setParticleEmitterActive", > "parameters": { > "emitter": "slide", > "active": true > } > }, > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": {}, > "children": [ > { > "title": "lineTileCollision", > "type": "action", > "name": "lineTileCollision", > "parameters": { > "offset": [ > 0, > -17.5 > ] > } > }, > { > "title": "controlFly", > "type": "action", > "name": "controlFly", > "parameters": { > "vector": [ > 0, > -1 > ], > "speed": 5 > } > } > ] > }, > { > "title": "setParticleEmitterActive", > "type": "action", > "name": "setParticleEmitterActive", > "parameters": { > "emitter": "slide", > "active": false > } > }, > { > "title": "setAnimationState", > "type": "action", > "name": "setAnimationState", > "parameters": { > "type": "sliding", > "state": "off" 114a159,164 > "parameters": {} > }, > { > "title": "setVelocity", > "type": "action", > "name": "setVelocity", 116c166 < "vector": [ --- > "velocity": [ 118,120c168,169 < -1 < ], < "speed": 5 --- > 0 > ] 121a171,176 > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 126,157c181,192 < "title": "setParticleEmitterActive", < "type": "action", < "name": "setParticleEmitterActive", < "parameters": { < "emitter": "slide", < "active": false < } < }, < { < "title": "setAnimationState", < "type": "action", < "name": "setAnimationState", < "parameters": { < "type": "sliding", < "state": "off" < } < }, < { < "title": "controlFly", < "type": "action", < "name": "controlFly", < "parameters": {} < }, < { < "title": "setVelocity", < "type": "action", < "name": "setVelocity", < "parameters": { < "getVec2": [ < 0, < 0 < ] --- > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "resourcePercentage", > "type": "action", > "name": "resourcePercentage", > "parameters": { > "resource": "health", > "percentage": "" > } 159,164d193 < }, < { < "title": "runner", < "type": "action", < "name": "runner", < "parameters": {} 167,181d195 < }, < { < "title": "inverter", < "type": "decorator", < "name": "inverter", < "parameters": {}, < "child": { < "title": "resourcePercentage", < "type": "action", < "name": "resourcePercentage", < "parameters": { < "resource": "health", < "percentage": "" < } < } behaviors\monsters\boss\spiderboss\main.behavior 83a84,89 > }, > { > "type": "module", > "path": "/behaviors/monsters/boss/spiderboss/shellshards.behavior", > "title": "Shards", > "parameters": {} behaviors\monsters\boss\spiderboss\return.behavior 37,38c37,40 < "toPosition": "spawn", < "toVector": "toSpawn" --- > "to": "spawn" > }, > "output": { > "vector": "toSpawn" 52c54 < "toPosition": "spawn", --- > "target": "spawn", 76c78 < "getVec2": "toSpawn", --- > "vector": "toSpawn", behaviors\monsters\boss\spiderboss\slam.behavior 101,102c101,104 < "toEntity": "target", < "toDirection": "targetX" --- > "target": "target" > }, > "output": { > "direction": "targetX" 218c220 < "vector": [ --- > "velocity": [ 267c269 < "direction": [ --- > "aimVector": [ behaviors\monsters\boss\spiderboss\sweep.behavior 32,33c32,35 < "direction": "sweepSide", < "toDirection": "sweepSide" --- > "direction": "sweepSide" > }, > "output": { > "direction": "sweepSide" 40,41c42,44 < "parameters": { < "toDirection": "sweepSide" --- > "parameters": {}, > "output": { > "direction": "sweepSide" 52,53c55,58 < "factor": 20, < "toNumber": "sweepX" --- > "factor": 20 > }, > "output": { > "result": "sweepX" 61,62c66 < "fromIndex": "spawn", < "toIndex": "attack", --- > "position": "spawn", 64a69,71 > }, > "output": { > "position": "attack" 90,91c97,100 < "toPosition": "attack", < "toVector": "toAttack" --- > "to": "attack" > }, > "output": { > "vector": "toAttack" 99c108 < "getVec2": "toAttack", --- > "vector": "toAttack", 140,141c149,152 < "direction": "sweepSide", < "toDirection": "sweepMove" --- > "direction": "sweepSide" > }, > "output": { > "direction": "sweepMove" 150,151c161,164 < "factor": 12, < "toNumber": "lineTest" --- > "factor": 12 > }, > "output": { > "result" : "lineTest" 222c235 < "direction": [ --- > "aimVector": [ behaviors\monsters\unique\ixoling.behavior 70c70,72 < "gravityEnabled": false --- > "config": { > "gravityEnabled": false > } 192c194,196 < "speed": 10 --- > "projectileConfig": { > "speed": 10 > } 212,213c216,219 < "toEntity": "target", < "toDirection": "targetDirection" --- > "target": "target" > }, > "output": { > "direction" : "targetDirection" behaviors\npc\converse.behavior 39c39 < "name": "sayToTarget", --- > "name": "sayToEntity", 41c41 < "target": "interactionSource", --- > "entity": "interactionSource", behaviors\npc\flee.behavior 38,39c38,41 < "getEntity": "damageSource", < "setEntity": "fleeTarget" --- > "entity": "damageSource" > }, > "output": { > "entity" : "fleeTarget" 45c47 < "name": "sayToTarget", --- > "name": "sayToEntity", 47c49 < "target": "fleeTarget", --- > "entity": "fleeTarget", 73,74c75,78 < "getEntity": "notificationTarget", < "setEntity": "fleeTarget" --- > "entity": "notificationTarget" > }, > "output": { > "entity": "fleeTarget" 80c84 < "name": "sayToTarget", --- > "name": "sayToEntity", 82c86 < "target": "fleeTarget", --- > "entity": "fleeTarget", 133c137,140 < "toEntity": "fleeTarget" --- > "target": "fleeTarget" > }, > "output": { > "direction" : "direction" 140c147,152 < "parameters": {} --- > "parameters": { > "direction": "direction" > }, > "output": { > "direction": "direction" > } 179c191 < "target": "fleeTarget", --- > "entity": "fleeTarget", behaviors\npc\floranspectator.behavior 23c23,26 < "parameters": {} --- > "parameters": {}, > "output": { > "direction": "direction" > } 63,64c66,69 < ], < "toEntity": "player" --- > ] > }, > "output": { > "entity": "player" 84d88 < "chance": 0.25 98c102 < "name": "sayToTarget", --- > "name": "sayToEntity", 100c104 < "target": "player", --- > "entity": "player", 136c140,145 < "parameters": {} --- > "parameters": { > "direction": "direction" > }, > "output": { > "direction": "direction" > } behaviors\npc\sit.behavior 24,33d23 < 0, < 0.2 < ] < } < }, < { < "type": "action", < "name": "withinTimeRange", < "parameters": { < "range": [ 35c25 < 1 --- > 0.2 46,47c36,39 < "range": 50, < "toEntity": "chair" --- > "range": 50 > }, > "output": { > "entity": "chair" 54,55c46,49 < "entity": "chair", < "toPosition": "chair" --- > "entity": "chair" > }, > "output": { > "position": "chair" 62,63c56,59 < "position": "chair", < "toPosition": "chair" --- > "position": "chair" > }, > "output": { > "position" : "chair" 78a75,77 > }, > "output": { > "direction": "direction" behaviors\npc\sleep.behavior 30,31c30,33 < "orientation": "lay", < "toEntity": "bed" --- > "orientation": "lay" > }, > "output": { > "entity": "bed" 38,39c40,43 < "entity": "bed", < "toPosition": "bed" --- > "entity": "bed" > }, > "output": { > "position": "bed" 46,47c50,53 < "position": "bed", < "toPosition": "bed" --- > "position": "bed" > }, > "output": { > "position": "bed" 62a69,71 > }, > "output": { > "direction": "direction" behaviors\npc\wander.behavior 37,46d36 < 0, < 0.2 < ] < } < }, < { < "type": "action", < "name": "withinTimeRange", < "parameters": { < "range": [ 48c38 < 1 --- > 0.2 56c46,49 < "name": "findOuterDoor" --- > "name": "findOuterDoor", > "parameters": { > "range": 50 > } 76a70,72 > }, > "output": { > "direction": "direction" 117c113,116 < "name": "findOuterDoor" --- > "name": "findOuterDoor", > "parameters": { > "range": 50 > } 137a137,139 > }, > "output": { > "direction": "direction" 162c164,167 < "name": "setDirection" --- > "name": "setDirection", > "output": { > "direction": "direction" > } 168,169c173,175 < "parameters": { < "toIndex": "start" --- > "parameters": {}, > "output": { > "position": "start" 190d195 < "toIndex": "ahead", 191a197,199 > }, > "output": { > "position": "ahead" behaviors\sequences\beamout.behavior 70c70 < "effect": "beamout" --- > "name": "beamout" behaviors\sequences\floranmission\floranmissionstart.behavior 69,70c69,72 < "range": 10, < "toEntity": "player" --- > "range": 10 > }, > "output": { > "entity": "player" 155a158,160 > }, > "output": { > "direction": "direction" 186,187c191,194 < ], < "toEntity": "switch" --- > ] > }, > "output": { > "entity": "switch" 207c214 < "flag": "beamout" --- > "name": "beamout" 224c231 < "flag": "beamout" --- > "name": "beamout" behaviors\sequences\floranmission\floranmissionswitch.behavior 12a13 > "parameters": {}, 20,36c21,29 < "title": "Until success", < "type": "decorator", < "name": "repeater", < "parameters": { < "untilSuccess": true < }, < "child": { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 0.5 < }, < "child": { < "title": "queryEntity", < "type": "action", < "name": "queryEntity", --- > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "cooldown", > "type": "decorator", > "name": "cooldown", 38,45c31,46 < "entityTypes": [ < "player" < ], < "range": 10, < "position": [ < 1222, < 1056 < ] --- > "cooldown": 0.5 > }, > "child": { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "range": 10, > "position": [ > 1222, > 1056 > ] > } 46a48,53 > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 48c55 < } --- > ] 59,61c66,68 < "title": "Until success", < "type": "decorator", < "name": "repeater", --- > "title": "timer", > "type": "action", > "name": "timer", 63,75c70,82 < "untilSuccess": true < }, < "child": { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 0.5 < }, < "child": { < "title": "queryEntity", < "type": "action", < "name": "queryEntity", --- > "time": 1 > } > }, > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "cooldown", > "type": "decorator", > "name": "cooldown", 77,84c84,99 < "entityTypes": [ < "player" < ], < "range": 7, < "position": [ < 1224, < 1072 < ] --- > "cooldown": 0.5 > }, > "child": { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "range": 10, > "position": [ > 1222, > 1056 > ] > } 85a101,106 > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 87c108 < } --- > ] 110d130 < "toEntity": "switch", 112a133,135 > }, > "output": { > "entity": "switch" 140,163c163,173 < "title": "until success", < "type": "decorator", < "name": "repeater", < "parameters": { < "untilSuccess": true < }, < "child": { < "title": "parallel", < "type": "composite", < "name": "parallel", < "parameters": { < "fail": 1 < }, < "children": [ < { < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "position": [ < 1253, < 1087 < ] < } --- > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1 165,172c175,206 < { < "title": "faceDirection", < "type": "action", < "name": "faceDirection", < "parameters": {} < } < ] < } --- > "children": [ > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "position": [ > 1253, > 1087 > ] > }, > "output": { > "direction": "direction" > } > }, > { > "title": "faceDirection", > "type": "action", > "name": "faceDirection", > "parameters": { > "direction": "direction" > } > } > ] > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] behaviors\sequences\floranmission\nurucombat.behavior 69,71c69,73 < "orderby": "nearest", < "toEntity": "target", < "type": "spiderboss" --- > "type": "spiderboss", > "orderby": "nearest" > }, > "output": { > "entity": "target" 78,80c80,82 < "title": "repeater", < "type": "decorator", < "name": "repeater", --- > "title": "parallel", > "type": "composite", > "name": "parallel", 82,100c84,188 < "child": { < "title": "dynamic", < "type": "composite", < "name": "dynamic", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "target", < "xRange": 10 --- > "children": [ > { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "target", > "xRange": 10 > } > }, > { > "type": "action", > "name": "entityPosition", > "parameters": { > "entity": "target" > }, > "output": { > "position": "targetPosition" > } > }, > { > "title": "setAimPosition", > "type": "action", > "name": "setAimPosition", > "parameters": { > "position": "targetPosition", > "offset": [ > 0, > 0 > ] > } > }, > { > "title": "beginPrimaryFire", > "type": "action", > "name": "beginPrimaryFire", > "parameters": {} > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "entityDirection", > "type": "action", > "name": "entityDirection", > "parameters": { > "target": "target" > }, > "output": { > "direction": "targetDirection" > } > }, > { > "title": "controlMove", > "type": "action", > "name": "controlMove", > "parameters": { > "direction": "targetDirection" > } > }, > { > "type": "action", > "name": "offsetDirection", > "parameters": { > "position": "self", > "direction": "targetDirection" > }, > "output": { > "position" : "ahead" > } > }, > { > "title": "setAimPosition", > "type": "action", > "name": "setAimPosition", > "parameters": { > "position": "ahead", > "offset": [ > 0, > 0 > ] > } > }, > { > "title": "endPrimaryFire", > "type": "action", > "name": "endPrimaryFire", > "parameters": {} 102,186c190,200 < }, < { < "title": "entityPosition", < "type": "action", < "name": "entityPosition", < "parameters": { < "entity": "target", < "toPosition": "targetPosition" < } < }, < { < "title": "setAimPosition", < "type": "action", < "name": "setAimPosition", < "parameters": { < "position": "targetPosition", < "offset": [ < 0, < 0 < ] < } < }, < { < "title": "beginPrimaryFire", < "type": "action", < "name": "beginPrimaryFire", < "parameters": {} < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "entityDirection", < "type": "action", < "name": "entityDirection", < "parameters": { < "toEntity": "target", < "toDirection": "targetDirection" < } < }, < { < "title": "controlMove", < "type": "action", < "name": "controlMove", < "parameters": { < "direction": "targetDirection" < } < }, < { < "title": "offsetDirection", < "type": "action", < "name": "offsetDirection", < "parameters": { < "position": "self", < "direction": "targetDirection", < "toindex": "ahead" < } < }, < { < "title": "setAimPosition", < "type": "action", < "name": "setAimPosition", < "parameters": { < "position": "ahead", < "offset": [ < 0, < 0 < ] < } < }, < { < "title": "endPrimaryFire", < "type": "action", < "name": "endPrimaryFire", < "parameters": {} < } < ] < } < ] < } --- > ] > } > ] > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] behaviors\sequences\floranmission\nurutunnel.behavior 12a13 > "parameters": {}, 20,36c21,29 < "title": "repeater", < "type": "decorator", < "name": "repeater", < "parameters": { < "untilSuccess": true < }, < "child": { < "title": "cooldown", < "type": "decorator", < "name": "cooldown", < "parameters": { < "cooldown": 1 < }, < "child": { < "title": "queryEntity", < "type": "action", < "name": "queryEntity", --- > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "cooldown", > "type": "decorator", > "name": "cooldown", 38,45c31,46 < "entityTypes": [ < "player" < ], < "position": [ < 1325, < 1080 < ], < "range": 25 --- > "cooldown": 1 > }, > "child": { > "title": "queryEntity", > "type": "action", > "name": "queryEntity", > "parameters": { > "entityTypes": [ > "player" > ], > "position": [ > 1457, > 1101 > ], > "range": 10 > } 46a48,53 > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} 48c55 < } --- > ] 61c68 < "direction": -1 --- > "direction": 1 dungeons\missions\hylotlmissions\hylotlmission1.json [TMX file differences are left out for huge size.] dungeons\other\challengerooms\challengerooms.dungeon 7c7 < "anchor" : [ "adventure1", "adventure2", "challengeroom1", "platform1", "platform2", "platform3", "platform4" ], --- > "anchor" : [ "adventure1", "adventure2", "challengeroom1", "platform1", "platform2", "platform3", "platform4", "puzzle1" ], 62a63,69 > }, > { > "name" : "puzzle1", > "rules" : [ > [ "maxSpawnCount", [1] ] > ], > "def" : [ "tmx", "puzzle1.json" ] interface\ai\ai.config 3c3 < "unlockTechText" : "\n\n^green;Unlock this tech with a blank tech card.", --- > "unlockTechText" : "\n\n^green;Unlock this tech with a blank tech drive.", items\armors\backitems\lanternstick\lanternstick.back 53c53,55 < ] --- > ], > > "learnBlueprintsOnPickup" : [ "halogenpack" ] items\generic\other\blanktechcard.item 5,6c5,6 < "description" : "A blank tech card, I can program tech onto this at my ship's computer.", < "shortdescription" : "Blank Tech Card" --- > "description" : "A blank tech drive, I can program tech onto this at my ship's computer.", > "shortdescription" : "Tech Drive" items\generic\other\techchip.item 5c5 < "description" : "A tech chip. I can slot a bunch of these together to make a functioning tech card!", --- > "description" : "A tech chip. I can slot a bunch of these together to make a functioning tech drive!", monsters\bmonster.lua 59,62d58 < function wasInteracted() < return self.interacted == true < end < 71,78c67,68 < function visibleToPlayer(args) < local bounds = mcontroller.boundBox() < local position = mcontroller.position() < local collisionArea = {bounds[1] + position[1], bounds[2] + position[2], bounds[3] + position[1], bounds[4] + position[2]} < < return world.isVisibleToPlayer(collisionArea) < end < --- > -- param type > -- param state 98,111c88,90 < function getAngle(args) < local angle < if args.getVec2 then < local direction = vec2.norm(BData:getVec2(args.getVec2)) < if direction == nil then return false end < angle = math.atan(direction[2], direction[1]) < else < angle = BData:getNumber(args.angle) < end < angle = angle + entity.configParameter("rotationOffset", 0) < return angle < end < < --- > -- param angle > -- param vector > -- param immediate 114a94 > vector = nil 120c100,107 < angle = getAngle(args) --- > if args.vector then > local vector = vec2.norm(BData:getVec2(args.vector)) > if vector == nil then return false end > angle = math.atan(vector[2], vector[1]) > else > angle = BData:getNumber(args.angle) > end > 134a122 > -- param emitter 136c124,125 < args = parseArgs(args, { --- > args = parseArgs(args, { > emitter = nil 144a134,135 > -- param emitter > -- param active 154a146 > -- param sound 156a149 > sound = nil monsters\tenant.lua 13,14c13,14 < function tenant.returnHome() < receiveNotification({ name = "returnHome" }) --- > function tenant.returnHome(reason) > receiveNotification({ name = "returnHome", reason = reason }) monsters\boss\spiderboss\spiderboss.animation 337a338,367 > "shellshards" : { > "emissionRate" : 1.0, > "offsetRegion" : [-6, -7, 6, 0], > "particles" : [ > { "particle" : "shellshard1" }, > { "particle" : "shellshard2" }, > { "particle" : "shellshard3" }, > { "particle" : "shellshard4" }, > { "particle" : "shellshard5" }, > { "particle" : "shellshard6" }, > { "particle" : "shellshard1" }, > { "particle" : "shellshard2" }, > { "particle" : "shellshard3" }, > { "particle" : "shellshard4" }, > { "particle" : "shellshard5" }, > { "particle" : "shellshard6" }, > { "particle" : "shellshard1" }, > { "particle" : "shellshard2" }, > { "particle" : "shellshard3" }, > { "particle" : "shellshard4" }, > { "particle" : "shellshard5" }, > { "particle" : "shellshard6" }, > { "particle" : "shellshard1" }, > { "particle" : "shellshard2" }, > { "particle" : "shellshard3" }, > { "particle" : "shellshard4" }, > { "particle" : "shellshard5" }, > { "particle" : "shellshard6" } > ] > }, monsters\boss\spiderboss\spiderboss.monstertype 82c82 < "baseValue" : 95 --- > "baseValue" : 0 npcs\bmain.lua 40a41 > -- param content 61,66c62 < function logInfo(args) < world.logInfo(args.text) < return true < end < < function wasInteracted() --- > function wasInteracted(args) 70c66 < function wasDamaged() --- > function wasDamaged(args) 101c97,99 < function sayToTarget(args) --- > -- param dialogType > -- param entity > function sayToEntity(args) 104c102 < target = "target" --- > entity = "target" 106,112c104,106 < local targetId = BData:getEntity(args.target) < local dialog = entity.staticRandomizeParameter(getDialogType(args.dialogType, targetId)) < < if dialog ~= nil then < entity.say(dialog, tags) < return true < end --- > local entityId = BData:getEntity(args.entity) > local dialog = entity.staticRandomizeParameter(getDialogType(args.dialogType, entityId)) > if entityId == nil or dialog == nil then return false end 114c108,109 < return false --- > entity.say(dialog, tags) > return true 116a112,113 > -- param dialogType > -- param entity 119c116,117 < dialogType = "converse.dialog" --- > dialogType = "converse.dialog", > entity = nil 121,122c119,120 < local targetId = BData:getEntity(args.target) < self.dialog = entity.configParameter(getDialogType(args.dialogType, targetId)) --- > local entityId = BData:getEntity(args.entity) > self.dialog = entity.configParameter(getDialogType(args.dialogType, entityId)) 131,132c129,130 < args = parseArgs(args, {}) < world.logInfo("%s", self.dialog) --- > args = parseArgs(args, { > }) 134,136c132 < if self.dialog == nil or #self.dialog == 0 then < return false < end --- > if self.dialog == nil or #self.dialog == 0 then return false end 148a145 > -- param entity 167,182c164,167 < function addEphemeralEffect(args) < args = parseArgs(args, {}) < if args.effect == nil then return false end < < status.addEphemeralEffect(args.effect) < return true < end < < function visibleToPlayer(args) < local bounds = mcontroller.boundBox() < local position = mcontroller.position() < local collisionArea = {bounds[1] + position[1], bounds[2] + position[2], bounds[3] + position[1], bounds[4] + position[2]} < < return world.isVisibleToPlayer(collisionArea) < end < --- > -- param slot > -- param itemName > -- param definition > -- param level 187c172,173 < definition = "uncommonrocketlauncher" --- > definition = "uncommonrocketlauncher", > level = nil 197a184,185 > -- param position > -- param offset 200a189 > offset = {0,0} npcs\chefmerchant.npctype 189a190,204 > }, > "arrivedHome" : { > "beacon" : { > "default" : [ > "Honey! I'm home!", > "You called?", > "Yes, m'lord?" > ] > }, > "rent" : { > "default" : [ > "I hope this paltry payment will suffice.", > "I don't like paying taxes, but if it's for you, I don't mind." > ] > } npcs\follower.npctype 114a115,129 > }, > "arrivedHome" : { > "beacon" : { > "default" : [ > "Honey! I'm home!", > "You called?", > "Yes, m'lord?" > ] > }, > "rent" : { > "default" : [ > "I hope this paltry payment will suffice.", > "I don't like paying taxes, but if it's for you, I don't mind." > ] > } npcs\returnhomestate.lua 5c5,8 < return { targetPosition = storage.home.position } --- > return { > targetPosition = storage.home.position, > reason = args.notification.reason > } 10a14,17 > function returnHomeState.arrived(stateData) > sayToTarget("tenant.dialog.arrivedHome." .. stateData.reason) > end > 15a23 > returnHomeState.arrived(stateData) 32c40,44 < return stateData.teleportTime >= 2 --- > if stateData.teleportTime >= 2 then > returnHomeState.arrived(stateData) > return true > end > return false npcs\tenant.lua 21,22c21,22 < function tenant.returnHome() < receiveNotification({ name = "returnHome" }) --- > function tenant.returnHome(reason) > receiveNotification({ name = "returnHome", reason = reason }) npcs\villager.npctype 85a86,100 > }, > "arrivedHome" : { > "beacon" : { > "default" : [ > "Honey! I'm home!", > "You called?", > "Yes, m'lord?" > ] > }, > "rent" : { > "default" : [ > "I hope this paltry payment will suffice.", > "I don't like paying taxes, but if it's for you, I don't mind." > ] > } 1029,1030d1043 < "You're my Venus, I'm your fire.", < "Let's get drunk on chartreuse and discuss art.", 1033d1045 < "You have your own spaceship? Mad jelly, yo.", 1048d1059 < "You remind me of Swamp Thing.", 1054,1055d1064 < "The Circle of Thorns is closing in.", < "You're almost as scary as the Helion.", 1085d1093 < "I'm sorry in advance for when you find out about Robot Wars.", 1088,1089d1095 < "Don't you wish your girlfriend was hot like me?", < "Go ask an Apex to teach you how to twerk. Trust me.", 1100d1105 < "Tell Platinum I said hello.", 1142d1146 < "The Circle of Thorns will come for you, fish.", objects\ancient\ancientcrystaltrap\ancientcrystaltrap.object 204c204 < "activeLightColor" : [128, 38, 44], // light color to emit when the object is 'on' --- > "activeLightColor" : [0, 0, 0], // light color to emit when the object is 'on' objects\ancient\ancientflametrap\ancientflametrap.object 5c5 < "description" : "A flame trap designed to deter invaders.", --- > "description" : "This trap spews flames to deter invaders.", objects\avian\bouldertrap\bouldertrap.object 78c78 < "projectile" : "trapboulderappear", // name of projectile (required) --- > "projectile" : "trapboulderappearrolling", // name of projectile (required) objects\colony\colonydeed\colonydeed.lua 17,18d16 < callTenantsHome() < 22a21,24 > callTenantsHome("rent") > else > callTenantsHome("beacon") > entity.setAnimationState("deedState", "beacon") 25d26 < entity.setAnimationState("deedState", "beacon") 163c164 < function callTenantsHome() --- > function callTenantsHome(reason) 172c173 < world.callScriptedEntity(entityId, "tenant.returnHome") --- > world.callScriptedEntity(entityId, "tenant.returnHome", reason) 178c179,181 < math.randomseed(seed) --- > if seed then > math.randomseed(seed) > end 213c216,218 < math.randomseed(os.time()) --- > if seed then > math.randomseed(os.time()) > end 270c275,279 < chooseTenants(hash, tags) --- > local seed = nil > if self.hashHouseAsSeed then > seed = hash > end > chooseTenants(seed, tags) objects\colony\colonydeed\colonydeed.object 15a16 > "direction": "right", 39a41,42 > "requireFilledBackground" : true, //whether tenants require the background to be filled, > "hashHouseAsSeed" : false, //whether the seed for tenants should be based on the precise layout of the house objects\colony\colonydeed\scanning.lua 80a81,83 > if self.requireFilledBackground and not isBackgroundFilled(poly) then > return tags, nil > end 127a131,168 > end > > function polyBoundBox(poly) > local minX = poly[1][1] > local maxX = poly[1][1] > local minY = poly[1][2] > local maxY = poly[1][2] > for _,vertex in ipairs(poly) do > if vertex[1] < minX then > minX = vertex[1] > end > if vertex[1] > maxX then > maxX = vertex[1] > end > if vertex[2] < minY then > minY = vertex[2] > end > if vertex[2] > maxY then > maxY = vertex[2] > end > end > return {{minX,minY}, {maxX,maxY}} > end > > function isBackgroundFilled(poly) > local boundBox = polyBoundBox(poly) > for x = math.ceil(boundBox[1][1]), math.floor(boundBox[2][1]) do > for y = math.ceil(boundBox[1][2]), math.floor(boundBox[2][2]) do > local pos = {x,y} > if world.polyContains(poly, pos) then > -- permit gaps in the background where the foreground is filled > if not world.tileIsOccupied(pos, false) and not world.tileIsOccupied(pos, true) then > return false > end > end > end > end > return true objects\hylotl\hylotlclassicpainting1\hylotlclassicpainting1.object 5c5 < "description" : "-todo-", --- > "description" : "A famous classical painting", 12,15c12,15 < "apexDescription" : "-todo- (ignore until drawn)", < "avianDescription" : "-todo- (ignore until drawn)", < "floranDescription" : "-todo- (ignore until drawn)", < "glitchDescription" : "-todo- (ignore until drawn)", --- > "apexDescription" : "A fine example of renaissance craftsmanship.", > "avianDescription" : "It's a painting of a classy lady.", > "floranDescription" : "A painting of a deliciousss human.", > "glitchDescription" : "Confused. This painting ", projectiles\physics.config 154a155,168 > "rollingboulder" : { > "mass" : 1.0, > "gravityMultiplier" : 1.6, > "bounceFactor" : 0.1, > "maxMovementPerStep" : 0.4, > > "collisionPoly" : [ [-1, -1], [1, -1], [1, 1], [-1, 1] ], > "ignorePlatformCollision" : true, > > "airFriction" : 0.0, > "liquidFriction" : 8.0, > "groundFriction" : 0.0 > }, > projectiles\traps\ancientcrystaltrapbeam\ancientcrystaltrapbeam.projectile 9c9 < "lightColor" : [36, 159, 184], --- > "lightColor" : [115, 211, 255], quests\outpost\outpost1.questtemplate 5,6c5,6 < "text" : "I'm so thirsty! I've been here for so long it's been months since I had a coffee. ^green;If you find some coffee beans on a forest planet and ^orange;make me some coffee ^green;in the coffee machine over there, ^white;I'll give you a blank tech card and tell other people how helpful you are!", < "completionText" : "Thanks for the coffee but I'm not drinking it straight out of your matter manipulator! You'll need to do better than that for a tech card. Talk to me again when you're not busy.", --- > "text" : "I'm so thirsty! I've been here for so long it's been months since I had a coffee. ^green;If you find some coffee beans on a forest planet and ^orange;make me some coffee ^green;in the coffee machine over there, ^white;I'll give you a blank tech drive and tell other people how helpful you are!", > "completionText" : "Thanks for the coffee but I'm not drinking it straight out of your matter manipulator! You'll need to do better than that for a tech drive. Talk to me again when you're not busy.", quests\outpost\outpost2.questtemplate 5c5 < "text" : "If you go to a desert planet and ^green;make me a ^orange;glass mug ^green;out of heated sand ^white;I might actually be able to drink that coffee you gave me. Maybe then I'll give you the Tech Card.", --- > "text" : "If you go to a desert planet and ^green;make me a ^orange;glass mug ^green;out of heated sand ^white;I might actually be able to drink that coffee you gave me. Maybe then I'll give you the Tech Drive.", quests\outpost\outpost3.questtemplate 5,6c5,6 < "text" : "If you ^green;get some steel and forge a ^orange;stirring spoon ^green;for me ^white;the drink will be perfect! ^green;Craft it on a metalwork station ^white;and I'll surely give you the blank tech card.", < "completionText" : "The perfect coffee! Here, you deserve this. ^green;You can use the ^orange;blank tech card ^green;to unlock tech at your ship's computer. I've told other people how helpful you are, I'm sure they'll have jobs for you.", --- > "text" : "If you ^green;get some steel and forge a ^orange;stirring spoon ^green;for me ^white;the drink will be perfect! ^green;Craft it on a metalwork station ^white;and I'll surely give you the blank tech drive.", > "completionText" : "The perfect coffee! Here, you deserve this. ^green;You can use the ^orange;blank tech drive ^green;to unlock tech at your ship's computer. I've told other people how helpful you are, I'm sure they'll have jobs for you.", quests\outpost\phase3optional\avianexplorer3.questtemplate 6c6 < "text" : "Good eternal evening! You look like someone in need of adventure, would you like to go on an adventure for me? ^green;If you can find a ^orange;moon emblem ^green;in an Avian tomb I'll give you this blank tech card in return!", --- > "text" : "Good eternal evening! You look like someone in need of adventure, would you like to go on an adventure for me? ^green;If you can find a ^orange;moon emblem ^green;in an Avian tomb I'll give you this blank tech drive in return!", quests\outpost\phase3optional\glitchsilenttype3.questtemplate 7c7 < "completionText" : "Thankful. I can talk at last! This book contains a datachip I was able to use to restore my speech module. Thank you so much! Here, have this blank tech card.", --- > "completionText" : "Thankful. I can talk at last! This book contains a datachip I was able to use to restore my speech module. Thank you so much! Here, have this blank tech drive.", quests\outpost\phase4optional\avianexplorer4.questtemplate 6,7c6,7 < "text" : "Hello again! Would you like to go on another adventure? Avian pirates are always in search of treasure, ^green;if you can find an airship I'm sure they'll have a ^orange;treasure map ^green;on board. Bring it to me and I'll reward you with another tech card.", < "completionText" : "Aha! You found one. Who knows what wonderful treasure is marked here. Take this tech card! You earned it.", --- > "text" : "Hello again! Would you like to go on another adventure? Avian pirates are always in search of treasure, ^green;if you can find an airship I'm sure they'll have a ^orange;treasure map ^green;on board. Bring it to me and I'll reward you with another tech drive.", > "completionText" : "Aha! You found one. Who knows what wonderful treasure is marked here. Take this tech drive! You earned it.", scripts\behavior.lua 189a190 > local result 191,193c192,199 < if i > self.current then < if interruption then < child:reset() --- > if i <= self.current then > result = child:run(dt) > if result == true then > self:reset() > return true > elseif result == false then > child:reset() > self.current = self.current + 1 195c201,202 < break --- > if i < self.current then interruption = true end > self.current = i 197,203c204 < end < < local result = child:run(dt) < if result == true then < self:reset() < return true < elseif result == false then --- > elseif interruption then 205d205 < self.current = self.current + 1 207,209c207 < if i < self.current then interruption = true end < self.current = i < return "running" --- > break 213c211 < return false --- > return result 272a271,308 > -- Random node > -- Runs one random child > BTRandomize = BTComposite.new() > composites["randomize"] = BTRandomize > > function BTRandomize.new(children) > local newNode = { > children = children or {}, > } > setmetatable(newNode, extend(BTRandomize)) > return newNode > end > > function BTRandomize.fromJson(node) > local children = {} > for _,child in pairs(node.children) do > table.insert(children, nodeFromJson(child)) > end > return BTRandomize.new(children) > end > > function BTRandomize:run(dt) > if self.current == nil then self.current = math.random(1, #self.children) end > > local result = self.children[self.current]:run(dt) > > if result == true or result == false then > self:reset() > end > > return result > end > > function BTRandomize:reset() > self.current = nil > self:resetChildren() > end > 473c509 < if self.result == true or self.result == true then --- > if self.result == true or self.result == false then 497a534 > newNode.output = action.output or {} 505c542,543 < parameters = node.parameters --- > parameters = node.parameters, > output = node.output 519c557 < local status,result = coroutine.resume(self.coroutine, self.parameters) --- > local status,result = coroutine.resume(self.coroutine, self.parameters, self.output) 554c592,605 < BData = {} --- > BData = { > board = {} > } > > function BData:set(type, key, value) > self.board[type] = self.board[type] or {} > if key == nil then return false end > self.board[type][key] = value > end > > function BData:get(type, key) > self.board[type] = self.board[type] or {} > return self.board[type][key] > end 557,558c608 < self.numbers = self.numbers or {} < self.numbers[key] = number --- > self:set("number", key, number) 562d611 < self.numbers = self.numbers or {} 566c615 < return self.numbers[key] --- > return self:get("number", key) 571,572c620 < self.entities = self.entities or {} < self.entities[key] = entityId --- > self:set("entity", key, entityId) 576d623 < self.entities = self.entities or {} 582c629 < return self.entities[key] --- > return self:get("entity", key) 587,588c634 < self.vectors = self.vectors or {} < self.vectors[key] = vector --- > self:set("vec2", key, vector) 592d637 < self.vectors = self.vectors or {} 596c641 < return self.vectors[key] --- > return self:get("vec2", key) 601,602c646 < self.positions = self.positions or {} < self.positions[key] = position --- > self:set("position", key, position) 606d649 < self.positions = self.positions or {} 612c655 < return self.positions[key] --- > return self:get("position", key) 616,627c659,664 < BData.setListTypes = { < setEntity = BData.setEntity, < setNumber = BData.setNumber, < setPosition = BData.setPosition, < setVec2 = BData.setVec2 < } < < function BData.setListType(args) < return args.setEntity and "setEntity" or < args.setNumber and "setNumber" or < args.setPosition and "setPosition" or < args.setVec2 and "setVec2" --- > function BData.listType(args) > for k,v in pairs(args) do > if k ~= "list" and k ~= "dt" then > return k,v > end > end 630,641c667,671 < BData.getListTypes = { < getEntity = BData.getEntity, < getNumber = BData.getNumber, < getPosition = BData.getPosition, < getVec2 = BData.getVec2 < } < < function BData.getListType(args) < return args.getEntity and "getEntity" or < args.getNumber and "getNumber" or < args.getPosition and "getPosition" or < args.getVec2 and "getVec2" --- > function BData:setList(listKey, list) > self.lists = self.lists or {} > if listKey == nil then return false end > self.lists[listKey] = list > return true 651c681 < function BData:popList(listKey, listType, toIndex) --- > function BData:popList(listKey) 655,657c685 < if toIndex then < self[listType](self, toIndex, self.lists[listKey][1]) < end --- > local value = self.lists[listKey][1] 659c687 < return true --- > return value 661d688 < return false 664c691 < function BData:getList(listKey, listType, toIndex) --- > function BData:getList(listKey) 668,671c695 < if toIndex then < self[listType](self, toIndex, self.lists[listKey][1]) < end < return true --- > return self.lists[listKey][1] 673d696 < return false 704,705d726 < -- Runner < -- Keeps running, must be cancelled by the behavior 712c733,734 < function random(args) --- > -- param text > function logInfo(args) 714c736 < chance = 0.5 --- > text = "log info" 716,717c738,739 < < return math.random() < args.chance --- > world.logInfo(args.text) > return true 720,721c742,743 < function setFlag(args) < if self.flags == nil then self.flags = {} end --- > -- param name > function setFlag(args, output) 723c745 < self.flags[args.flag] = true --- > BData:set("bool", args.name, true) 727,728c749,750 < function unsetFlag(args) < if self.flags == nil then self.flags = {} end --- > -- param name > function unsetFlag(args, output) 730c752 < self.flags[args.flag] = nil --- > BData:set("bool", args.name, false) 734,735c756,757 < function hasFlag(args) < if self.flags == nil then self.flags = {} end --- > -- param name > function hasFlag(args, output) 737c759 < return self.flags[args.flag] == true --- > return BData:get("bool", args.name) == true 741c763 < self.flags = {} --- > BData.board.bool = {} 745c767,773 < function listPush(args) --- > > -- param list > -- param entity > -- param number > -- param position > -- param vector > function listPush(args, output) 746a775 > list = nil 748,749c777,779 < local getType = BData.getListType(args) < local value = BData[getType](BData, args[getType]) --- > local getType,index = BData.listType(args) > local value = BData:get(getType, index) > if value == nil then return false end 753c783,788 < function listPop(args) --- > -- param list > -- output entity > -- output number > -- output position > -- output vector > function listPop(args, output) 754a790 > list = nil 756,758c792,799 < local setType = BData.setListType(args) < local toIndex = setType and args[setType] < return BData:popList(args.list, setType, toIndex) --- > local value = BData:popList(args.list) > if value == nil then return false end > > local setType,index = BData.listType(output) > if setType then > BData:set(setType, index, value) > end > return true 761c802,807 < function listGet(args) --- > -- param list > -- output entity > -- output number > -- output position > -- output vector > function listGet(args, output) 762a809 > list = nil 764,766c811,818 < local setType = BData.setListType(args) < local toIndex = setType and args[setType] < return BData:getList(args.list, setType, toIndex) --- > local value = BData:getList(args.list) > if value == nil then return false end > > local setType,index = BData.listType(output) > if setType then > BData:set(setType, index, value) > end > return true 768a821,825 > -- param list > -- param entity > -- param number > -- param position > -- param vector 770a828 > list = nil 772,773c830,831 < local getType = BData.getListType(args) < local value = BData[getType](BData, args[getType]) --- > local getType,index = BData.listType(args) > local value = BData:get(getType, index) 777c835,837 < function setEntity(args) --- > -- param entity > -- output entity > function setEntity(args, output) 779,780c839 < getEntity = "self", < setEntity = "target" --- > entity = "self", 783c842 < local entityId = BData:getEntity(args.getEntity) --- > local entityId = BData:getEntity(args.entity) 786c845 < BData:setEntity(args.setEntity, entityId) --- > BData:setEntity(output.entity, entityId) 790c849,851 < function setNumber(args) --- > -- param entity > -- output entity > function setNumber(args, output) 792,793c853 < number = 0, < toNumber = "number" --- > number = 0 799c859 < BData:setNumber(args.toNumber, BData:getNumber(args.number)) --- > BData:setNumber(output.number, BData:getNumber(args.number)) scripts\actions\entities.lua 1c1,2 < function entityExists(args) --- > -- param entity > function entityExists(args, output) 9c10 < return entityId and world.entityExists(entityId) --- > return world.entityExists(entityId) 12c13,15 < function entityPosition(args) --- > -- param entity > -- output position > function entityPosition(args, output) 14,15c17 < entity = "self", < toPosition = "entity" --- > entity = "self" 21c23 < BData:setPosition(args.toPosition, world.entityPosition(entityId)) --- > BData:setPosition(output.position, world.entityPosition(entityId)) 25c27,32 < function entityInRange(args) --- > -- param position > -- param entity > -- param range > -- param xRange > -- param yRange > function entityInRange(args, output) 27c34,35 < entity = "self" --- > position = "self", > entity = "target" 30,31c38,40 < local entityId = BData:getEntity(args.entity) < if entityId == nil then return false end --- > local position = BData:getPosition(args.position) > local targetId = BData:getEntity(args.entity) > if targetId == nil or position == nil then return false end 33c42 < local position = world.entityPosition(entityId) --- > local targetPosition = world.entityPosition(targetId) 36c45 < return world.magnitude(mcontroller.position(), position) <= BData:getNumber(args.range) --- > return world.magnitude(targetPosition, position) <= BData:getNumber(args.range) 38c47 < return math.abs(world.distance(mcontroller.position(), position)[1]) <= BData:getNumber(args.xRange) --- > return math.abs(world.distance(targetPosition, position)[1]) <= BData:getNumber(args.xRange) 40c49 < return math.abs(world.distance(mcontroller.position(), position)[2]) <= BData:getNumber(args.yRange) --- > return math.abs(world.distance(targetPosition, position)[2]) <= BData:getNumber(args.yRange) 46c55,56 < function entityInSight(args) --- > -- param entity > function entityInSight(args, output) 57c67,71 < function entityDirection(args) --- > -- param entity > -- param target > -- output direction > -- output vector > function entityDirection(args, output) 60,61c74 < toEntity = "entity", < toDirection = "direction" --- > target = "entity", 65c78 < local targetId = BData:getEntity(args.toEntity) --- > local targetId = BData:getEntity(args.target) 69,72c82,83 < if args.toVector then < BData:setVec2(args.toVector, toTarget); < end < BData:setNumber(args.toDirection, util.toDirection(toTarget[1])) --- > BData:setVec2(output.vector, toTarget); > BData:setNumber(output.direction, util.toDirection(toTarget[1])) 76c87,93 < function queryEntity(args) --- > -- param position > -- param range > -- param entityTypes > -- param orderBy > -- output entity > -- output list > function queryEntity(args, output) 78d94 < range = 20, 79a96 > range = 20, 82d98 < toEntity = "queried" 90c106,107 < BData:setEntity(args.toEntity, nearEntities[1]) --- > BData:setEntity(output.entity, nearEntities[1]) > BData:setList(output.list, nearEntities) 97c114,125 < function findLoungable(args) --- > ------------------------------------------------ > -- LOUNGABLES > ------------------------------------------------ > > -- param position > -- param range > -- param orderBy > -- param orientation > -- param unoccupied > -- output entity > -- output list > function findLoungable(args, output) 99d126 < range = 20, 101c128,129 < toEntity = "loungable", --- > range = 20, > orderBy = "nearest", 106a135 > if position == nil then return false end 109c138 < local entityId --- > 110a140 > local unoccupied = {} 113,114c143 < entityId = loungableId < break; --- > table.insert(unoccupied, entityId) 117,118c146 < else < entityId = loungables[1] --- > loungables = unoccupied 121,122c149,151 < if entityId then < BData:setEntity(args.toEntity, loungables[1]) --- > if #loungables > 0 then > BData:setEntity(output.entity, loungables[1]) > BData:setList(output.list, loungables) 129c158,178 < function findObject(args) --- > -- param entity > function loungableOccupied(args, output) > args = parseArgs(args, { > entity = "loungable" > }) > local entityId = BData:getEntity(entity) > if entityId == nil then return false end > > return world.loungeableOccupied(entityId) > end > > ------------------------------------------------ > -- OBJECTS > ------------------------------------------------ > > -- param position > -- param range > -- param orderBy > -- output entity > -- output list > function findObject(args, output) 131d179 < range = 20, 133c181 < toEntity = "object", --- > range = 20, 137a186 > if position == nil then return false end 140,143c189,194 < for _,objectId in pairs(objects) do < if args.name == nil or world.entityName(objectId) == args.name then < BData:setEntity(args.toEntity, objectId) < return true --- > if args.name then > local filtered = {} > for _,objectId in pairs(objects) do > if world.entityName(objectId) == args.name then > table.insert(filtered, objectId) > end 144a196 > objects = filtered 146a199,203 > if #objects > 0 then > BData:setEntity(output.entity, objects[1]) > BData:setList(output.list, objects) > return true > end 150,167c207 < ------------------------------------------------ < -- LOUNGABLES < ------------------------------------------------ < < function loungableOccupied(args) < args = parseArgs(args, { < entity = "loungable" < }) < local entityId = BData:getEntity(entity) < if entityId == nil then return false end < < return world.loungeableOccupied(entityId) < end < < ------------------------------------------------ < -- OBJECTS < ------------------------------------------------ < --- > -- param interactObject 184c224,233 < function spawnProjectile(args) --- > -- param position > -- param offset > -- param projectileType > -- param angle > -- param aimVector > -- param sourceEntity > -- param trackSource > -- param projectileConfig > -- param scalePower > function spawnProjectile(args, output) 189c238,239 < direction = {mcontroller.facingDirection(),0}, --- > angle = 0, > aimVector = nil, 192c242 < config = {}, --- > projectileConfig = {}, 206,209c256,260 < local direction < if args.angle then < local angle = BData:getNumber(args.angle) < direction = {math.sin(angle), math.cos(angle)} --- > if args.projectileConfig.speed then args.projectileConfig.speed = BData:getNumber(args.speed) end > > local aimVector > if args.aimVector then > aimVector = BData:getVec2(args.aimVector) 211c262,263 < direction = BData:getVec2(args.direction) --- > local angle = BData:getNumber(args.angle) > aimVector = {math.sin(angle), math.cos(angle)} 214c266 < if position == nil or offset == nil or sourceId == nil or direction == nil then --- > if position == nil or offset == nil or sourceId == nil or aimVector == nil then 218c270 < world.spawnProjectile(args.projectileType, vec2.add(position, offset), sourceId, direction, args.trackSource, args) --- > world.spawnProjectile(args.projectileType, vec2.add(position, offset), sourceId, aimVector, args.trackSource, args.projectileConfig) 226c278,284 < function findMonster(args) --- > -- param position > -- param range > -- param type > -- param orderBy > -- output entity > -- output list > function findMonster(args, output) 228d285 < range = 20, 229a287,288 > range = 20, > type = nil, 237,241c296,303 < local nearEntities = world.entityQuery(position, args.range, { includedTypes = {"monster"}, orderby = args.orderBy }) < for _,entityId in pairs(nearEntities) do < if not args.type or world.monsterType(entityId) == args.type then < BData:setEntity(args.toEntity, entityId) < return true --- > local monsters = world.entityQuery(position, args.range, { includedTypes = {"monster"}, orderby = args.orderBy }) > if args.type then > local filtered = {} > for _,entityId in pairs(monsters) do > if world.monsterType(entityId) == args.type then > table.insert(filtered, entityId) > return true > end 242a305 > monsters = filtered 244a308,311 > if #monsters > 0 then > BData:setEntity(output.entity, monsters[1]) > BData:setList(output.list, monsters) > end 247a315,317 > -- param position > -- param type > -- param level 251c321 < monsterType = "smallbiped", --- > type = "smallbiped", 256c326 < args.level = BData:getNumber(args.level) --- > local level = BData:getNumber(args.level) 259c329 < world.spawnMonster(args.monsterType, position, args) --- > world.spawnMonster(args.type, position, {level = level}) scripts\actions\math.lua 1c1,4 < function multiply(args) --- > -- param number > -- param factor > -- output result > function multiply(args, output) 6,10c9,11 < if args.number then < if args.toNumber == nil then args.toNumber = args.number end < BData:setNumber(args.toNumber, BData:getNumber(args.number) * BData:getNumber(args.factor)) < return true < end --- > local number = BData:getNumber(args.number) > local factor = BData:getNumber(args.factor) > if number == nil or factor == nil then return false end 12c13,14 < return false --- > BData:setNumber(output.result, number * factor) > return true 15c17,20 < function add(args) --- > -- param number > -- param addend > -- output result > function add(args, output) 20,24c25,27 < if args.number then < if args.toNumber == nil then args.toNumber = args.number end < BData:setNumber(args.toNumber, BData:getNumber(args.number) + BData:getNumber(args.addend)) < return true < end --- > local number = BData:getNumber(args.number) > local addend = BData:getNumber(args.addend) > if number == nil or addend == nil then return false end 26c29,30 < return false --- > BData:setNumber(output.result, number + addend) > return true 29c33,37 < function vecRotate(args) --- > -- param vector > -- param angle > -- param direction > -- output vector > function vecRotate(args, output) 32,33c40,41 < toVector = "rotated", < angle = 0 --- > angle = 0, > direction = nil 46c54,72 < BData:setVec2(args.toVector, vec2.rotate(vector, angle)) --- > BData:setVec2(output.vector, vec2.rotate(vector, angle)) > return true > end > > -- param min > -- param max > -- output number > function random(args, output) > args = parseArgs(args, { > min = 0, > max = 1, > }) > > local min = BData:getNumber(args.min) > local max = BData:getNumber(args.max) > if min == nil or max == nil then return false end > > local rand = math.random() * (max - min) + min > BData:setNumber(output.number, rand) 53a80,81 > -- param first > -- param second scripts\actions\movement.lua 1,3c1,13 < -- @param direction direction to move in, defaults to random direction < -- @param run whether to run, defaults to false < function move(args) --- > function getDirection(direction) > if direction == "facing" then > return mcontroller.facingDirection() > elseif direction == "back" then > return -mcontroller.facingDirection() > else > return BData:getNumber(direction) > end > end > > -- param direction > -- param run > function move(args, output) 37c47,49 < function controlMove(args) --- > -- param direction > -- param run > function controlMove(args, output) 50,51c62,64 < --Set a random direction if none is specified < function setDirection(args) --- > -- param direction > -- output direction > function setDirection(args, output) 54d66 < toDirection = "direction" 59c71 < BData:setNumber(args.toDirection, direction) --- > BData:setNumber(output.direction, direction) 63,64c75,77 < --Set a random direction if none is set already < function reverseDirection(args) --- > -- param direction > -- output direction > function reverseDirection(args, output) 68d80 < if args.toDirection == nil then args.toDirection = args.direction end 73c85 < BData:setNumber(args.toDirection, -direction) --- > BData:setNumber(output.direction, -direction) 77,87c89,96 < function getDirection(direction) < if direction == "facing" then < return mcontroller.facingDirection() < elseif direction == "back" then < return -mcontroller.facingDirection() < else < return BData:getNumber(direction) < end < end < < function moveToPosition(args) --- > -- param position > -- param run > -- param groundPosition > -- param minGround > -- param maxGround > -- param avoidLiquid > -- output direction > function moveToPosition(args, output) 105a115 > BData:setNumber(output.direction, util.toDirection(self.pathing.deltaX)) 108,110d117 < < self.movementDelta = self.pathing.deltaX < BData:setNumber("direction", util.toDirection(self.movementDelta)) 115,117c122,129 < function setVelocity(args) < args = parseArgs(args, { < velocity = {0,0} --- > -- param velocity > -- param x > -- param y > function setVelocity(args, output) > args = parseArgs(args, { > velocity = {0,0}, > x = nil, > y = nil 132,145c144,145 < < function warpToPosition(args) < args = parseArgs(args, { < position = "self" < }) < < local position = BData:getPosition(args.position) < if not position then return false end < < mcontroller.setPosition(position) < return true < end < < function faceEntity(args) --- > -- param entity > function faceEntity(args, output) 157c157,158 < function faceDirection(args) --- > -- param direction > function faceDirection(args, output) 168c169 < function onGround(args) --- > function onGround(args, output) 172c173,176 < function flyToPosition(args) --- > -- param position > -- param tolerance > -- output vector > function flyToPosition(args, output) 175,176c179 < tolerance = 1, < setVec2 = "move" --- > tolerance = 1 185c188 < BData:setVec2(args.setVec2, toTarget) --- > BData:setVec2(output.vector, toTarget) 195c198,202 < function controlFly(args) --- > -- param vector > -- param x > -- param y > -- param speed > function controlFly(args, output) 212,213c219,222 < function controlParameters(args) < args = parseArgs(args, { --- > -- param config > function controlParameters(args, output) > args = parseArgs(args, { > config = {} 215d223 < args.dt = nil; 217c225 < mcontroller.controlParameters(args) --- > mcontroller.controlParameters(args.config) 226c234,236 < function openDoors(args) --- > -- param direction > -- param distance > function openDoors(args, output) 252c262,264 < function closeDoors(args) --- > -- param direction > -- param distance > function closeDoors(args, output) 276,277c288,290 < function findOuterDoor(args) < self.targetPositions = self.targetPositions or {} --- > -- param position > -- param range > function findOuterDoor(args, output) 279,280c292,293 < searchRadius = entity.configParameter("wander.doorSearchRadius") or 50, < position = mcontroller.position() --- > position = "self", > range = 20 283c296,297 < local doorIds = world.entityQuery(args.position, args.searchRadius, { --- > local position = BData:getPosition(args.position) > local doorIds = world.entityQuery(position, args.searchRadius, { scripts\actions\position.lua 1c1,4 < function offsetPosition(args) --- > -- param position > -- param offset > -- output position > function offsetPosition(args, output) 3,4c6 < fromIndex = "self", < toIndex = "offset", --- > position = "self", 15,18c17,18 < local position = BData:getPosition(args.fromIndex) < if position == nil then < return false < end --- > local position = BData:getPosition(args.position) > if position == nil then return false end 20c20 < BData:setPosition(args.toIndex, vec2.add(position, offset)) --- > BData:setPosition(output.position, vec2.add(position, offset)) 24c24,28 < function offsetDirection(args) --- > -- param position > -- param multiplier > -- param direction > -- output position > function offsetDirection(args, output) 28d31 < toIndex = "ahead", 37c40 < BData:setPosition(args.toIndex, vec2.add(position, offset)) --- > BData:setPosition(output.position, vec2.add(position, offset)) 42c45,50 < function groundPosition(args) --- > -- param position > -- param minHeight > -- param maxHeight > -- param avoidLiquid > -- output position > function groundPosition(args, output) 46,47c54 < avoidLiquid = true, < toPosition = "ground" --- > avoidLiquid = true 60c67 < BData:setPosition(args.toPosition, position) --- > BData:setPosition(output.position, position) 64c71,72 < function isInside(args) --- > -- param position > function isInside(args, output) 66c74 < position = mcontroller.position() --- > position = "self" 72c80,81 < return material and material ~= "dirt" and material ~= "drysand" --- > local hasMaterial = material ~= nil and material ~= false > return hasMaterial and material ~= "dirt" and material ~= "drysand" 75c84,87 < function distance(args) --- > -- param from > -- param to > -- output vector > function distance(args, output) 77,78c89 < position = "self", < toVector = "distance" --- > from = "self", 81,82c92,93 < local position = BData:getPosition(args.position) < local target = BData:getPosition(args.toPosition) --- > local position = BData:getPosition(args.from) > local target = BData:getPosition(args.to) 85c96 < BData:setVec2(args.toVector, world.distance(target, position)) --- > BData:setVec2(output.vector, world.distance(target, position)) 89c100,103 < function inRange(args) --- > -- param position > -- param target > -- param range > function inRange(args, output) 92c106 < toPosition = "spawn", --- > target = "spawn", 97c111 < local targetPosition = BData:getPosition(args.toPosition) --- > local targetPosition = BData:getPosition(args.target) scripts\actions\sensor.lua 1c1,6 < function lineTileCollision(args) --- > -- param position > -- param offset > -- param x > -- param y > -- param collisionType > function lineTileCollision(args, output) 3c8 < getPosition = "self", --- > position = "self", 14,18c19,20 < local position = BData:getPosition(args.getPosition) < < if sensorOffset == nil or position == nil then < return false < end --- > local position = BData:getPosition(args.position) > if sensorOffset == nil or position == nil then return false end 21d22 < world.debugLine(position, targetPosition, world.lineTileCollision(position, targetPosition, args.collisionType) and "red" or "green") 22a24,31 > end > > function visibleToPlayer(args) > local bounds = mcontroller.boundBox() > local position = mcontroller.position() > local collisionArea = {bounds[1] + position[1], bounds[2] + position[2], bounds[3] + position[1], bounds[4] + position[2]} > > return world.isVisibleToPlayer(collisionArea) scripts\actions\status.lua 1c1,3 < function resourcePercentage(args) --- > -- param resource > -- param percentage > function resourcePercentage(args, output) 10c12,14 < function setResource(args) --- > -- param resource > -- param amount > function setResource(args, output) 20c24,26 < function setResourcePercentage(args) --- > -- param resource > -- param percentage > function setResourcePercentage(args, output) 30c36,38 < function addEphemeralEffect(args) --- > -- param name > -- param duration > function addEphemeralEffect(args, output) 39c47,48 < function removeEphemeralEffect(args) --- > -- param name > function removeEphemeralEffect(args, output) scripts\actions\time.lua 9a10 > -- param time 23a25 > -- param range 25,26c27,29 < local range = args.range or {0, 0} < --- > args = parseArgs(args, { > range = {0,0} > }) 28c31,35 < return timeOfDay >= range[1] and timeOfDay <= range[2] --- > if args.range[1] < args.range[2] then > return timeOfDay >= args.range[1] and timeOfDay <= args.range[2] > else > return timeOfDay <= args.range[1] and timeOfDay >= args.range[2] > end treasure\common.treasurepools 84a85,86 > {"weight" : 0.9, "item" : "manipulatormodule"}, > {"weight" : 0.3, "item" : "upgradecomponent"},