FILES ----- player.config weather.config ai\ai.config ai\mission1.aimission ai\upgradeship2.aicommand biomes\surface\magma\magma.parallax [NEW] effects\lighttrailfast.effectsource interface\windowconfig\charcreation.config items\armors\apex\apex-tier2\apextier2.chest items\armors\apex\apex-tier2\apextier2.head items\armors\apex\apex-tier2\apextier2.legs items\armors\aqua\aqua-tier2\aquatier2.chest items\armors\aqua\aqua-tier2\aquatier2.head items\armors\aqua\aqua-tier2\aquatier2.legs items\armors\avian\avian-tier2\aviantier2.chest items\armors\avian\avian-tier2\aviantier2.head items\armors\avian\avian-tier2\aviantier2.legs [NEW] items\armors\biome\icecaves\icearmor\bsleeve.png [NEW] items\armors\biome\icecaves\icearmor\chestf.png [NEW] items\armors\biome\icecaves\icearmor\chestm.png [NEW] items\armors\biome\icecaves\icearmor\fsleeve.png [NEW] items\armors\biome\icecaves\icearmor\head.png [NEW] items\armors\biome\icecaves\icearmor\icearmor.chest [NEW] items\armors\biome\icecaves\icearmor\icearmor.head [NEW] items\armors\biome\icecaves\icearmor\icearmor.legs [NEW] items\armors\biome\icecaves\icearmor\icons.png [NEW] items\armors\biome\icecaves\icearmor\mask.png [NEW] items\armors\biome\icecaves\icearmor\pants.png items\armors\floran\floran-tier2\florantier2.chest items\armors\floran\floran-tier2\florantier2.head items\armors\floran\floran-tier2\florantier2.legs items\armors\human\human-tier2\humantier2.chest items\armors\human\human-tier2\humantier2.head items\armors\human\human-tier2\humantier2.legs items\armors\novakid\novatier2\novatier2.chest items\armors\novakid\novatier2\novatier2.head items\armors\novakid\novatier2\novatier2.legs items\armors\robot\robo-tier2\glitchtier2.chest items\armors\robot\robo-tier2\glitchtier2.head items\armors\robot\robo-tier2\glitchtier2.legs items\generic\crafting\copperore.item [NEW] items\generic\crafting\glowfibreblue.item [NEW] items\generic\crafting\glowfibreblue.png items\generic\crafting\goldore.item items\generic\crafting\ironore.item items\generic\crafting\platinumore.item items\generic\crafting\rubiumore.item items\generic\crafting\silverore.item items\generic\crafting\titaniumore.item items\generic\crafting\violiumore.item items\generic\tier2\cactusjuice.consumable items\generic\tier2\pizzaslice.consumable items\generic\tier2\tomatojuice.consumable items\generic\tier3\2kbpotage.consumable items\generic\tier3\apegrapes.consumable items\generic\tier3\apexfritter.consumable items\generic\tier3\automatoshake.consumable items\generic\tier3\automatostew.consumable items\generic\tier3\bananacon.consumable items\generic\tier3\bananacreamdonut.consumable items\generic\tier3\bananacreampie.consumable items\generic\tier3\bananaicecream.consumable items\generic\tier3\cactiicecream.consumable items\generic\tier3\campfirebanana.consumable items\generic\tier3\campfirebanana.png items\generic\tier3\candyautomato.consumable items\generic\tier3\candyautomato.png items\generic\tier3\choconut.consumable items\generic\tier3\coconuticecream.consumable items\generic\tier3\coconutmilk.consumable items\generic\tier3\coconutrice.consumable items\generic\tier3\desertsalsa.consumable items\generic\tier3\fishinabone.consumable items\generic\tier3\fruitsalad.consumable items\generic\tier3\grapejuice.consumable items\generic\tier3\luckydip.consumable items\generic\tier3\pineapplejam.consumable items\generic\tier3\pineapplejuice.consumable items\generic\tier3\pineapplepizzaslice.consumable items\generic\tier3\snowcone.consumable items\generic\tier3\spookydonut.consumable items\generic\tier3\spookypie.consumable items\generic\tier3\sweetpunch.consumable items\generic\tier3\thornjuice.consumable items\guns\biome\bioluminescent\lightbow.gun items\guns\biome\bioluminescent\lightbow.png items\guns\biome\bioluminescent\lightbowfull.png items\guns\biome\bioluminescent\lightbowicon.png [NEW] items\guns\biome\cave\cavebow.frames [NEW] items\guns\biome\cave\cavebow.gun [NEW] items\guns\biome\cave\cavebow.png [NEW] items\guns\biome\cave\cavebowicon.png [NEW] items\swords\biome\cave\cavehammer.png [NEW] items\swords\biome\cave\cavehammer.sword items\swords\randomgenerated\tier3onehandedsword.generatedsword leveling\levelingmultipliers.functions monsters\boss\missile\behavior.lua monsters\boss\missile\missile.animation monsters\flying\largeflying\largeflying.monstertype monsters\ground\approachstate.lua monsters\ground\groundmonster.lua monsters\ground\largebiped\largebiped.monstertype monsters\ground\smallbiped\smallbiped.monstertype monsters\ground\smallquadruped\smallquadruped.monstertype npcs\chatstate.lua npcs\fleestate.lua npcs\main.lua npcs\rangedattackstate.lua npcs\sitstate.lua npcs\wanderstate.lua npcs\workstate.lua npcs\guard\guardstate.lua npcs\outpost\outpostapexscientist.npctype npcs\outpost\outposthumanscientist.npctype npcs\outpost\outpostpenguinpromoter.npctype objects\crafting\ironcraftingtable\ironcraftingtable.object objects\minibiome\bioluminescence\glowflowerlamp\glowflowerlamp.object [NEW] objects\minibiome\bioluminescence\glowvinelamp\glowvinelamp.frames [NEW] objects\minibiome\bioluminescence\glowvinelamp\glowvinelamp.object [NEW] objects\minibiome\bioluminescence\glowvinelamp\glowvinelamp.png [NEW] objects\minibiome\bioluminescence\glowvinelamp\glowvinelampicon.png objects\minibiome\stalactitecave\cavebed\cavebed.png objects\minibiome\stalactitecave\cavechair\cavechair.png objects\minibiome\stalactitecave\ceilingstalactite1\ceilingstalactite1.object objects\minibiome\stalactitecave\ceilingstalactite3\ceilingstalactite3.object objects\minibiome\stalactitecave\ceilingstalactite4\ceilingstalactite4.object objects\minibiome\stalactitecave\ceilingstalactite5\ceilingstalactite5.object parallax\lava2\base\1.png parallax\lava3\base\1.png parallax\lava4\base\1.png parallax\lava5\base\1.png parallax\lava6\base\1.png parallax\lava7\base\1.png parallax\lava8\base\1.png [NEW] particles\lighttrail.particle [NEW] particles\treestems\baobab.png plants\trees\ceilingtest\fleshvine\fleshvine.modularstem plants\trees\ceilingtest\floweryvine\floweryvine.modularstem plants\trees\ceilingtest\glitteringroot\glitteringroot.modularstem plants\trees\ceilingtest\podvine\fleshvine.modularstem plants\trees\ceilingtest\root\vineroot.modularstem plants\trees\ceilingtest\twistedvine\twistedvine.modularstem plants\trees\ceilingtest\vine2\vine2.modularstem plants\trees\forestceiling\stems\shadowvine\shadowvine.modularstem plants\trees\forestceiling\stems\slimevine\slimevine.modularstem plants\trees\forestceiling\stems\sulphurvine\sulphurvine.modularstem plants\trees\forestceiling\stems\tarvine\tarvine.modularstem plants\trees\forestceiling\stems\vine\vine.modularstem plants\trees\forestceiling\stems\vine2\vine2.modularstem plants\trees\forestceiling\stems\vine3\vine3.modularstem plants\trees\forestceiling\stems\vine4\vine4.modularstem plants\trees\forestceiling\stems\wildernessvine\wildernessvine.modularstem [NEW] plants\trees\savannahnew\foliage\baobab\baobab.modularfoliage [NEW] plants\trees\savannahnew\foliage\baobab\crown1.png [NEW] plants\trees\savannahnew\foliage\baobab\saplingicon.png [NEW] plants\trees\savannahnew\foliage\baobab\parallax\treeback\base\1.png [NEW] plants\trees\savannahnew\foliage\baobab\parallax\treeback2\base\1.png [NEW] plants\trees\savannahnew\foliage\baobab\parallax\treefront\base\1.png [NEW] plants\trees\savannahnew\stem\baobab\baobab.modularstem [NEW] plants\trees\savannahnew\stem\baobab\base1.png [NEW] plants\trees\savannahnew\stem\baobab\crown1.png [NEW] plants\trees\savannahnew\stem\baobab\middle1.png [NEW] plants\trees\savannahnew\stem\baobab\middle2.png [NEW] plants\trees\savannahnew\stem\baobab\middle3.png [NEW] plants\trees\savannahnew\stem\baobab\middle4.png [NEW] plants\trees\savannahnew\stem\baobab\saplingicon.png [NEW] projectiles\guns\arrows\lightarrow\icon.png [NEW] projectiles\guns\arrows\lightarrow\lightarrow.frames [NEW] projectiles\guns\arrows\lightarrow\lightarrow.png [NEW] projectiles\guns\arrows\lightarrow\lightarrow.projectile [NEW] quests\outpost\outpost0.questtemplate quests\outpost\outpost1.questtemplate quests\outpost\outpost3.questtemplate [NEW] quests\outpost\outpostskin.questtemplate [NEW] quests\outpost\endgame\penguinpromotere1.questtemplate quests\tutorial\tutorial1.questtemplate recipes\biomes\bioluminescence\glowbushlamp.recipe recipes\biomes\bioluminescence\glowchest.recipe recipes\biomes\bioluminescence\glowflowerlamp.recipe [NEW] recipes\biomes\bioluminescence\glowvinelamp.recipe [NEW] recipes\biomes\frozen\icespike.recipe [NEW] recipes\unsorted\ironcraftingtable.recipe species\humannamegen.config species\novakidnamegen.config treasure\biome.treasurepools DIFFS ----- player.config 23c23 < "blueprintUnlock" : "Learned to craft: .", --- > "blueprintUnlock" : "^green;Learned to craft: .", weather.config 104,107c104,106 < [0.3, "clear"], < [0.2, "snow"], < [0.3, "snowstorm"], < [0.1, "icestorm"] --- > [0.2, "clear"], > [0.5, "snow"], > [0.3, "snowstorm"] ai\ai.config 93c93 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 134c134 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 175c175 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 216c216 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 257c257 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 298c298 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 339c339 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", 380c380 < "text" : "We've repaired the ships thrusters. Travel within this system is now available, did you investigate that gate yet? Next we need to fix the ship's FTL drive.", --- > "text" : "We've repaired the ships thrusters. Travel within this system is now available, ^green;did you investigate that gate yet? Next we need to fix the ship's FTL drive.", ai\mission1.aimission 13c13 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 24c24 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 35c35 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 46c46 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 57c57 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 68c68 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", 79c79 < "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate.", --- > "text" : "We've received a distress signal from a lunar outpost identifying itself as the EMF (Erchius Mining Facility). Erchius Ore is used to build and repair FTL drives. I think we should investigate. I recommend you craft steel equipment before setting out.", ai\upgradeship2.aicommand 40c40 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 64c64 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 88c88 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 112c112 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 136c136 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 160c160 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 184c184 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", 208c208 < "text" : "The ship's thrusters have been repaired! Travel within this system is now available. We need to fix the ship's FTL drive with 100 moon stone. Our scanners have also picked up the presence of a strange gate in this system, we should check that out first!", --- > "text" : "The ship's thrusters have been repaired! Travel within this system is now available. ^green;We need to fix the ship's FTL drive with ^orange; 20 Erchius crystals. ^green;Our scanners have also picked up the presence of a ^orange;strange gate ^green;in this system, we should check that out first!", biomes\surface\magma\magma.parallax 3c3 < "verticalOrigin" : -15, --- > "verticalOrigin" : 0, 82c82 < "parallax" : [1.7, 9], --- > "parallax" : [1.7, 1.0], 93c93 < "parallax" : [1.8, 9], --- > "parallax" : [1.8, 1.02], 102c102 < "parallax" : [2, 9], --- > "parallax" : [2, 1.05], 111c111 < "parallax" : [3, 9], --- > "parallax" : [3, 1.08], 120c120 < "parallax" : [4, 9], --- > "parallax" : [4, 1.11], 129c129 < "parallax" : [5, 9], --- > "parallax" : [5, 1.14], 138c138 < "parallax" : [6, 9], --- > "parallax" : [6, 1.17], 147c147 < "parallax" : [6.001, 9], --- > "parallax" : [6.001, 1.18], 156c156 < "parallax" : [7, 9], --- > "parallax" : [7, 1.20], 165c165 < "parallax" : [8, 9], --- > "parallax" : [8, 1.23], 174c174 < "parallax" : [8.01, 9], --- > "parallax" : [8.01, 1.231], interface\windowconfig\charcreation.config 122c122 < "position" : [184, 30] --- > "position" : [184, 29] 263c263 < "maxWidth" : 70, --- > "maxWidth" : 120, items\armors\apex\apex-tier2\apextier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\apex\apex-tier2\apextier2.head 26a27,28 > "triggerKeys" : [ "steelarmor" ], > items\armors\apex\apex-tier2\apextier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\aqua\aqua-tier2\aquatier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\aqua\aqua-tier2\aquatier2.head 26a27,28 > "triggerKeys" : [ "steelarmor" ], > items\armors\aqua\aqua-tier2\aquatier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\avian\avian-tier2\aviantier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\avian\avian-tier2\aviantier2.head 26a27,28 > "triggerKeys" : [ "steelarmor" ], > items\armors\avian\avian-tier2\aviantier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\floran\floran-tier2\florantier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\floran\floran-tier2\florantier2.head 26a27,28 > "triggerKeys" : [ "steelarmor" ], > items\armors\floran\floran-tier2\florantier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\human\human-tier2\humantier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\human\human-tier2\humantier2.head 26a27,28 > "triggerKeys" : [ "steelarmor" ], > items\armors\human\human-tier2\humantier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\novakid\novatier2\novatier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\novakid\novatier2\novatier2.head 25a26,28 > > "triggerKeys" : [ "steelarmor" ], > items\armors\novakid\novatier2\novatier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\armors\robot\robo-tier2\glitchtier2.chest 34a35,36 > "triggerKeys" : [ "steelarmor" ], > items\armors\robot\robo-tier2\glitchtier2.head 25a26,28 > > "triggerKeys" : [ "steelarmor" ], > items\armors\robot\robo-tier2\glitchtier2.legs 25a26,27 > "triggerKeys" : [ "steelarmor" ], > items\generic\crafting\copperore.item 5c5 < "description" : "Copper ore. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "Copper ore. Can be used for smelting.", items\generic\crafting\goldore.item 5c5 < "description" : "It's some gold ore. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "It's some gold ore. Can be used for smelting.", items\generic\crafting\ironore.item 5,10c5,6 < "description" : "Iron ore. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", < "shortdescription" : "Iron Ore", < < "learnBlueprintsOnPickup" : [ < "ironcraftingtable" < ] --- > "description" : "Iron ore. Can be used for smelting.", > "shortdescription" : "Iron Ore" items\generic\crafting\platinumore.item 5c5 < "description" : "It's platinum. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "It's platinum. Can be used for smelting.", items\generic\crafting\rubiumore.item 5c5 < "description" : "Rubium ore. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "Rubium ore. Can be used for smelting.", items\generic\crafting\silverore.item 5c5 < "description" : "It's silver. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "It's silver. Can be used for smelting.", items\generic\crafting\titaniumore.item 5c5 < "description" : "It's titanium. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "It's titanium. Can be used for smelting.", items\generic\crafting\violiumore.item 5c5 < "description" : "Violium ore. Can be used for smelting or repairs. Pick up ore and right click mining tool to repair.", --- > "description" : "Violium ore. Can be used for smelting.", items\generic\tier2\cactusjuice.consumable 6a7 > "handPosition" : [0, -2], items\generic\tier2\pizzaslice.consumable 7c7 < "effects" :[ [ --- > "effects" : [ [ items\generic\tier2\tomatojuice.consumable 7c7 < "handPosition" : [8, -4], --- > "handPosition" : [8, -3], items\generic\tier3\2kbpotage.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\apegrapes.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\apexfritter.consumable 6a7 > "handPosition" : [0, 4], items\generic\tier3\automatoshake.consumable 7c7 < "handPosition" : [0, 8], --- > "handPosition" : [0, -4], items\generic\tier3\automatostew.consumable 7c7 < "handPosition" : [0, 12], --- > "handPosition" : [0, -4], items\generic\tier3\bananacon.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\bananacreamdonut.consumable 6a7 > "handPosition" : [0, -2], items\generic\tier3\bananacreampie.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\bananaicecream.consumable 6a7 > "handPosition" : [12, -6], items\generic\tier3\cactiicecream.consumable 1c1 < { --- > { 6a7 > "handPosition" : [12, -6], items\generic\tier3\campfirebanana.consumable 6a7 > "handPosition" : [4, -6], items\generic\tier3\candyautomato.consumable 7c7 < "handPosition" : [-4, 2], --- > "handPosition" : [8, -4], items\generic\tier3\choconut.consumable 6a7 > "handPosition" : [0, -2], items\generic\tier3\coconuticecream.consumable 6a7 > "handPosition" : [12, -6], items\generic\tier3\coconutmilk.consumable 4c4 < "inventoryIcon" : "coconutrice.png", --- > "inventoryIcon" : "coconutmilk.png", items\generic\tier3\coconutrice.consumable 6a7 > "handPosition" : [0, 4], items\generic\tier3\desertsalsa.consumable 6a7 > "handPosition" : [-7, -4], items\generic\tier3\fishinabone.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\fruitsalad.consumable 7c7 < "handPosition" : [0, 4], --- > "handPosition" : [0, -5], items\generic\tier3\grapejuice.consumable 6a7 > "handPosition" : [0, -2], items\generic\tier3\luckydip.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\pineapplejam.consumable 6a7 > "handPosition" : [0, 4], items\generic\tier3\pineapplejuice.consumable 7c7 < "handPosition" : [0, 4], --- > "handPosition" : [0, -4], items\generic\tier3\pineapplepizzaslice.consumable 6a7 > "handPosition" : [0, 7], items\generic\tier3\snowcone.consumable 6a7 > "handPosition" : [8, -4], items\generic\tier3\spookydonut.consumable 6a7 > "handPosition" : [0, -2], items\generic\tier3\spookypie.consumable 6a7 > "handPosition" : [0, -4], items\generic\tier3\sweetpunch.consumable 6a7 > "handPosition" : [-8, -3], items\generic\tier3\thornjuice.consumable 6a7 > "handPosition" : [0, -3], items\guns\biome\bioluminescent\lightbow.gun 7c7 < "description" : "Every light arrow loosed from this bow at full power is set aflame.", --- > "description" : "This bow shoots glowing beams of pure energy!", 20,21c20,21 < "projectileType" : "flamearrow", < "powerProjectileType" : "chargedflamearrow", --- > "projectileType" : "lightarrow", > "powerProjectileType" : "lightarrow", 32c32 < "fireSound" : [ { "file" : "/sfx/gun/bow_loose.wav" } ] --- > "fireSound" : [ { "file" : "/sfx/melee/laser_weapon_swing_light.wav" } ] items\swords\randomgenerated\tier3onehandedsword.generatedsword 3d2 < "level" : 1, leveling\levelingmultipliers.functions 4c4 < [2, 1.5], --- > [2, 2], 6,14c6,14 < [4, 7.5], < [5, 12.5], < [6, 20], < [7, 35], < [8, 80], < [9, 150], < [10, 250], < [11, 400], < [12, 650] --- > [4, 8], > [5, 16], > [6, 32], > [7, 64], > [8, 128], > [9, 256], > [10, 512], > [11, 1024], > [12, 2048] 34c34 < [2, 1.5], --- > [2, 2], 36,44c36,44 < [4, 7.5], < [5, 12.5], < [6, 20], < [7, 35], < [8, 80], < [9, 150], < [10, 250], < [11, 400], < [12, 650] --- > [4, 8], > [5, 16], > [6, 32], > [7, 64], > [8, 128], > [9, 256], > [10, 512], > [11, 1024], > [12, 2048] 63,74c63,74 < [1, 0], < [2, 0.5], < [3, 3], < [4, 7.5], < [5, 12.5], < [6, 20], < [7, 35], < [8, 80], < [9, 150], < [10, 250], < [11, 400], < [12, 650] --- > [1, -0.5], > [2, 0], > [3, 1], > [4, 3], > [5, 7], > [6, 15], > [7, 31], > [8, 63], > [9, 127], > [10, 255], > [11, 511], > [12, 1023] 93,104c93,104 < [1, -0.4], < [2, 0.5], < [3, 3], < [4, 7.5], < [5, 12.5], < [6, 20], < [7, 35], < [8, 80], < [9, 150], < [10, 250], < [11, 400], < [12, 650] --- > [1, -0.5], > [2, 0], > [3, 1], > [4, 3], > [5, 7], > [6, 15], > [7, 31], > [8, 63], > [9, 127], > [10, 255], > [11, 511], > [12, 1023] 108,119c108,114 < [1, 1], < [2, 3], < [3, 6], < [4, 10], < [5, 15], < [6, 20], < [7, 30], < [8, 45], < [9, 65], < [10, 90], < [11, 120], < [12, 155] --- > [1, 0.75], > [2, 2.2], > [3, 4.1], > [4, 6.9], > [5, 10.5], > [6, 14.25], > [7, 22.85] 123,134c118,124 < [1, 1], < [2, 3], < [3, 6], < [4, 10], < [5, 15], < [6, 20], < [7, 30], < [8, 45], < [9, 65], < [10, 90], < [11, 110], < [12, 145] --- > [1, 0.75], > [2, 2.2], > [3, 4.1], > [4, 6.9], > [5, 10.5], > [6, 14.25], > [7, 22.85] monsters\boss\missile\behavior.lua 44c44,45 < entity.rotateGroup("body", self.angle) --- > local visualAngle = math.atan2(math.sin(self.angle), math.abs(math.cos(self.angle))) > entity.rotateGroup("body", visualAngle) monsters\boss\missile\missile.animation 125a126,137 > }, > > "sounds" : { > "turnHostile" : [ ], > "deathPuff" : [ "/sfx/npc/enemydeathpuff.wav" ] > }, > "effects" : { > "blink" : { > "type" : "flash", > "time" : 0.25, > "directives" : "fade=ffffff;0.5" > } monsters\flying\largeflying\largeflying.monstertype 66c66 < "damage" : 12, --- > "damage" : 15, monsters\ground\approachstate.lua 32c32 < if checkStuck() > 4 then --- > if checkStuck() > 10 then 37c37,46 < entity.setAnimationState("movement", "run") --- > local approachPoint = {option.approachPoint[1], option.approachPoint[2]} > --Find ground > for y = 0, math.floor(approachPoint[2] - option.startRect[2]) do > if findValidStandingPosition({approachPoint[1], approachPoint[2] - y}, option.approachDelta[1]) then > approachPoint[2] = math.ceil(approachPoint[2] - y) > break > end > end > local toApproach = world.distance(approachPoint, mcontroller.position()) > local approachDistance = vec2.mag(toApproach) 40c49,57 < move(option.approachDelta, option.approachDistance >= 1.0, 0.2) --- > if math.abs(toApproach[1]) > 3 or math.abs(toApproach[2]) > 2 then > if moveTo(approachPoint, dt, {run = approachDistance >= 1.0}) then > entity.setAnimationState("movement", "run") > else > entity.setAnimationState("movement", "idle") > end > else > moveX(option.approachDelta[1], approachDistance >= 1.0) > end monsters\ground\groundmonster.lua 38a39,45 > self.movementParameters = mcontroller.baseParameters() > self.jumpHoldTime = self.movementParameters.airJumpProfile.jumpHoldTime > self.jumpSpeed = self.movementParameters.airJumpProfile.jumpSpeed > self.runSpeed = self.movementParameters.runSpeed > > self.scriptDelta = 10 > 237a245,248 > if self.debug then > world.debugText(inState, mcontroller.position(), "blue") > end > 295a307,308 > script.setUpdateDelta(hasTarget() and 1 or self.scriptDelta) > 297,298d309 < < script.setUpdateDelta(hasTarget() and 1 or 10) 775a787,1131 > > -------------------------------------------------------------------------------- > function boundingBox(force) > if self.boundingBox and not force then return self.boundingBox end > > local collisionPoly = mcontroller.collisionPoly() > local bounds = {0, 0, 0, 0} > > for _,point in pairs(collisionPoly) do > if point[1] < bounds[1] then bounds[1] = point[1] end > if point[2] < bounds[2] then bounds[2] = point[2] end > if point[1] > bounds[3] then bounds[3] = point[1] end > if point[2] > bounds[4] then bounds[4] = point[2] end > end > self.boundingBox = bounds > > return bounds > end > > -------------------------------------------------------------------------------- > -- Valid options: > -- openDoorCallback: function that will be passed a door entity id and should > -- return true if the door can be opened > -- run: whether npc should run > function moveTo(targetPosition, dt, options) > if options == nil then options = {} end > if options.run == nil then options.run = false end > self.moved = true > > targetPosition = { > math.floor(targetPosition[1]) + 0.5, > math.floor(targetPosition[2]) + 0.5 > } > > --Find new path if target position has changed > local pathTargetPosition = self.pathing.targetPosition > if pathTargetPosition == nil or > targetPosition[1] ~= pathTargetPosition[1] or > targetPosition[2] ~= pathTargetPosition[2] then > > local innerRadius = -1 > local outerRadius = 1 > if entity.findPath(targetPosition, innerRadius, outerRadius) then > self.pathing.targetPosition = targetPosition > else > return false > end > > self.pathing.delta = nil > end > > -- Store the path delta in case pathfinding doesn't succeed on the next try > local pathDelta = entity.followPath() > if pathDelta == nil then > self.pathing.targetPosition = nil > else > self.pathing.delta = pathDelta > end > > --New path and we can't move on it, try new path > if self.pathing.delta == nil then > self.pathing.targetPosition = nil > return false > end > > local position = mcontroller.position() > local verticalPathUp = verticalPathLength("up") > local verticalPathDown = verticalPathLength("down") > > --Keep jumping > if (self.pathing.jumpHoldTimer ~= nil and verticalPathUp > 0) or self.pathing.goalJumpPosition then > keepJumping(dt, options) > return true > end > self.pathing.jumpHoldTimer = nil > > --Keep dropping > if (self.pathing.downHoldTimer ~= nil and verticalPathDown > 0) or self.pathing.goalJumpPosition then > keepDropping(dt, options) > return true > end > self.pathing.downHoldTimer = nil > > script.setUpdateDelta(self.scriptDelta) > > local delta = entity.pathLookahead(0) or self.pathing.delta > > -- Open doors in the way > local closedDoorIds = world.entityLineQuery(position, { position[1] + util.clamp(delta[1], -2, 2), position[2] }, { includedTypes = {"object"}, callScript = "hasCapability", callScriptArgs = { "closedDoor" } }) > for _, closedDoorId in pairs(closedDoorIds) do > if options.openDoorCallback == nil or options.openDoorCallback(closedDoorId) then > world.callScriptedEntity(closedDoorId, "openDoor") > end > end > > local nextPathPosition = vec2.add(position, delta) > local goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(delta[1])) > > --Swimming > if goalPosition and mcontroller.inLiquid() and world.liquidAt(goalPosition) then > local goalDelta = world.distance(goalPosition, position) > if goalDelta[2] > 0 then > mcontroller.controlJump() > mcontroller.controlHoldJump() > end > moveX(goalDelta[1], options.run) > return true > end > > --If there is a ledge but the path continues, don't use this position > if goalPosition and not forwardPosition then > goalPosition = nil > end > > --Don't stand between the first path node and the next one > local nextDelta = entity.pathLookahead(1) > if nextDelta and delta[1] * nextDelta[1] < 0 then > goalPosition = nil > end > > --If the next path node isn't valid (can't stand there), search the path for a valid one > local step = 1 > local maxSteps = 30 > while not goalPosition and step < maxSteps do > local nextPathDelta = entity.pathLookahead(step) > if nextPathDelta then > nextPathPosition = vec2.add(position, nextPathDelta) > goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(nextPathDelta[1])) > step = step + 1 > else break end > end > > --No valid position found, stop moving and find new path > if not goalPosition then > self.pathing.targetPosition = nil > return false > end > > --Move on path > local goalDelta = world.distance(goalPosition, position) > local verticalMovementRatio = math.abs(goalDelta[2] / goalDelta[1]) > if goalDelta[1] == 0 then verticalMovementRatio = 10 end > local maxVerticalRatio = 1.25 --Enough to not drop down or jump up stairs > > --Keep from dropping or jumping in stairs if we don't need to > if verticalMovementRatio > maxVerticalRatio and forwardPosition then > goalDelta = world.distance(forwardPosition, position) > verticalMovementRatio = math.abs(goalDelta[2] / goalDelta[1]) > end > > --Path wants to take us steeply up, jump > if ((verticalMovementRatio > maxVerticalRatio and goalDelta[2] > 0) or verticalPathUp > 1) and not closeToCeiling() then > local jumpHold = math.max(verticalPathUp / self.jumpSpeed, distanceJumpTime(goalDelta)) > timedJump(math.max(jumpHold, 0.02), backwardPosition or forwardPosition) > return true > end > > --Path is taking us steeply down, drop > if ((verticalMovementRatio > maxVerticalRatio and goalDelta[2] < 0) or verticalPathDown > 1) and not onSolidGround() then > local dropHold = timeToFall(math.max(-goalDelta[2], verticalPathDown)) > timedDrop(dropHold) > return true > end > > --Jump over gaps > local deltaDir = util.toDirection(goalDelta[1]) > local nextStepPosition = {position[1] + deltaDir, position[2]} > if deltaDir > 0 then > nextStepPosition[1] = math.ceil(nextStepPosition[1]) > else > nextStepPosition[1] = math.floor(nextStepPosition[1]) > end > if verticalMovementRatio < 0.5 and math.abs(goalDelta[1]) > 1.5 and not findValidStandingPosition(nextStepPosition, deltaDir) then > timedJump(distanceJumpTime(goalDelta), forwardPosition or backwardPosition) > return true > end > > moveX(goalDelta[1], options.run) > > return true > end > > --PATHING-- > -------------------------------------------------------------------------------- > -- Get total length of a vertical path, step by step > function verticalPathLength(yDirection) > local direction = {up = 1, down = -1} > > local step = 1 > local firstDelta = entity.pathLookahead(0) > local lastDelta = entity.pathLookahead(step) > local length = 0 > while lastDelta do > local deltaDiff = lastDelta[2] - firstDelta[2] > if deltaDiff * direction[yDirection] > 0 and lastDelta[1] == firstDelta[1] then > length = math.abs(deltaDiff) > step = step + 1 > lastDelta = entity.pathLookahead(step) > else > break > end > end > > return length > end > > --JUMPING AND DROPPING-- > -------------------------------------------------------------------------------- > --Jump and hold jump for holdTime, also approach goalPosition > function timedJump(holdTime, goalPosition) > if not mcontroller.onGround() and not mcontroller.inLiquid() then return nil end > if holdTime == nil then holdTime = 0 end > holdTime = math.min(holdTime, self.jumpHoldTime) > > if mcontroller.inLiquid() then > holdTime = holdTime + self.jumpHoldTime > end > > mcontroller.controlJump() > self.pathing.jumpHoldTimer = holdTime > self.pathing.goalJumpPosition = goalPosition > script.setUpdateDelta(1) > end > > --Keep holding jump for the duration of the timed jump > function keepJumping(dt, options) > if self.pathing.jumpHoldTimer ~= nil then > mcontroller.controlHoldJump() > > self.pathing.jumpHoldTimer = self.pathing.jumpHoldTimer - dt > if self.pathing.jumpHoldTimer <= 0 then > self.pathing.jumpHoldTimer = nil > end > end > > if (mcontroller.onGround() or mcontroller.inLiquid()) and not self.pathing.jumpHoldTimer then self.pathing.goalJumpPosition = nil end > > if self.pathing.goalJumpPosition then > local goalDelta = world.distance(self.pathing.goalJumpPosition, mcontroller.position()) > moveX(goalDelta[1], options.run) > end > end > > --Drop and hold down for holdTime, also approach goalPosition > function timedDrop(holdTime, goalPosition) > if holdTime == nil then holdTime = 0 end > holdTime = math.min(holdTime, 0.5) > mcontroller.controlDown() > self.pathing.downHoldTimer = holdTime > self.pathing.goalJumpPosition = goalPosition > script.setUpdateDelta(1) > end > > --Keep holding down > function keepDropping(dt, options) > if self.pathing.downHoldTimer ~= nil then > mcontroller.controlDown() > > self.pathing.downHoldTimer = self.pathing.downHoldTimer - dt > if self.pathing.downHoldTimer <= 0 then > self.pathing.downHoldTimer = nil > end > end > > if self.pathing.goalJumpPosition then > local goalDelta = world.distance(self.pathing.goalJumpPosition, mcontroller.position()) > moveX(goalDelta[1], options.run) > end > end > > --Returns the time the entity needs to hold jump to reach the specified distance > --TODO: Make this not bad by using math > function distanceJumpTime(distance) > local position = mcontroller.position() > local gravity = world.gravity(mcontroller.position()) > > local fallDistanceTime = (math.abs(distance[1]) / 2) / self.runSpeed > local fallDistance = (gravity / 2) * fallDistanceTime * fallDistanceTime > fallDistance = fallDistance + distance[2] > > local holdTime = fallDistance / self.jumpSpeed > return holdTime > end > > --The time it would take to fall distance > function timeToFall(distance) > local gravity = world.gravity(mcontroller.position()) > return math.sqrt(2 * distance / gravity) > end > > --POSITIONING-- > -------------------------------------------------------------------------------- > --Finds a position on top of a tile (rather than in between tiles) that the entity can stand on > function findValidStandingPosition(nodePosition, direction) > if forceDirection == nil then forceDirection = false end > > local forwardCollisionResolve = validStandingPosition(nodePosition, direction) > local backwardCollisionResolve = validStandingPosition(nodePosition, -direction) > > if forwardCollisionResolve or backwardCollisionResolve then > return nodePosition, forwardCollisionResolve, backwardCollisionResolve > end > end > > --Checks if the entity can stand in this position > --Or if it can swim there > function validStandingPosition(position, direction) > direction = util.toDirection(direction) > local collisionPoly = mcontroller.collisionPoly() > local bounds = boundingBox() > > local groundRegion = { > position[1] + math.min(direction, 0) + 0.05, position[2] + bounds[2] - 0.95, > position[1] + math.max(direction, 0) - 0.05, position[2] + bounds[2] > } > local collisionResolve = world.resolvePolyCollision(collisionPoly, {position[1] + direction/2, position[2]}, 0.9) > if (world.rectCollision(groundRegion, false) or world.liquidAt(position)) and collisionResolve then > > return collisionResolve > end > end > > --Check if entity is right under a solid block ceiling > function closeToCeiling() > local position = mcontroller.position() > local bounds = boundingBox() > > local ceilingRegion = { > position[1] + bounds[1] + 0.1, position[2] + 1, > position[1] + bounds[3] - 0.1, position[2] + 5 > } > return world.rectCollision(ceilingRegion, true) > end > > --Check if entity is on solid ground (not platforms) > function onSolidGround() > local position = mcontroller.position() > local bounds = boundingBox() > > local groundRegion = { > position[1] + bounds[1] - 0.05, position[2] + bounds[2] - 0.95, > position[1] + bounds[3] + 0.05, position[2] + bounds[2] + 0.05 > } > return world.rectCollision(groundRegion, true) > end \ No newline at end of file monsters\ground\largebiped\largebiped.monstertype 164c164 < "baseValue" : 20 --- > "baseValue" : 25 monsters\ground\smallbiped\smallbiped.monstertype 104c104 < "damage" : 15, --- > "damage" : 12, monsters\ground\smallquadruped\smallquadruped.monstertype 106c106 < "damage" : 15, --- > "damage" : 12, 128c128 < "baseValue" : 14 --- > "baseValue" : 16 npcs\chatstate.lua 11,13d10 < local chatPositions = chatState.findChatPositions(targetId) < if not chatPositions then return false end < 15,16c12,13 < if sendNotification("chat", { targetId = targetId, conversation = conversation, targetPosition = chatPositions[2] }, distance) then < self.state.pickState({ chatPartnerId = targetId, chatConversation = conversation, targetPosition = chatPositions[1] }) --- > if sendNotification("chat", { targetId = targetId, conversation = conversation }, distance) then > self.state.pickState({ chatPartnerId = targetId, chatConversation = conversation }) 22,41d18 < function chatState.findChatPositions(targetId) < local position = mcontroller.position() < local targetPosition = world.entityPosition(targetId); < < local toTarget = world.distance(targetPosition, position); < local middle = {position[1] + toTarget[1] / 2, position[2]} < < local lineStart = {middle[1] - 1.5, middle[2] - 3} < local lineEnd = {lineStart[1] + 3, lineStart[2]} < local ground = world.collisionBlocksAlongLine(lineStart, lineEnd) < < if #ground == 4 then < if toTarget[1] < 0 then < return {{middle[1] + 1.25, middle[2]}, {middle[1] - 1.25, middle[2]}} < else < return {{middle[1] - 1.25, middle[2]}, {middle[1] + 1.25, middle[2]}} < end < end < end < 75c52 < if partnerPosition == nil or partnerState ~= "chatState" then return true end --- > if partnerPosition == nil or partnerState ~= "chatState" or not entity.entityInSight(stateData.partnerId) then return true end 79a57 > local distance = world.magnitude(toPartner) 81c59 < local toTargetPosition = world.magnitude(stateData.targetPosition, position) --- > local distanceRange = entity.configParameter("chat.distanceRange") 83,84c61,70 < if toTargetPosition > 0.5 then < if not moveTo(stateData.targetPosition, dt) then --- > if math.abs(toPartner[2]) > 2 then > if not moveTo(partnerPosition, dt) then > return true > end > elseif distance > distanceRange[2] then > if not move(toPartner[1], dt) then > return true > end > elseif distance < distanceRange[1] then > if not move(-toPartner[1], dt) then npcs\fleestate.lua 63c63 < moveTo(targetPosition, dt, { run = true, fleeDistance = safeDistance }) --- > move(fromTarget[1], dt, { run = true }) 68a69 > controlFace(-fromTarget[1]) npcs\main.lua 48a49,50 > self.jumpSpeed = self.movementParameters.airJumpProfile.jumpSpeed > self.walkSpeed = self.movementParameters.walkSpeed 373,379d374 < --[[debug < local position = mcontroller.position(); < position[2] = position[2] + 3 < position[1] = position[1] - 3 < world.debugText(self.state.stateDesc(), position, "green") < --]] < 383c378 < if not self.moved then resetPathing() end --- > if not self.moved then script.setUpdateDelta(self.scriptDelta) end 450,454d444 < function move(delta, dt, options) < return moveTo(vec2.add(mcontroller.position(), delta), dt, options) < end < < -------------------------------------------------------------------------------- 467,469c457,458 < function moveX(direction, run) < mcontroller.controlMove(direction, run) < end --- > function sayToTarget(dialogType, targetId, tags) > local dialog = nil 471,479c460,466 < -------------------------------------------------------------------------------- < function findPath(targetPosition, options) < local innerRadius, outerRadius < if options.fleeDistance ~= nil then < innerRadius = options.fleeDistance < outerRadius = options.fleeDistance * 2 < else < innerRadius = -1 < outerRadius = 2 --- > local withSpecies = dialogType .. "." .. entity.species() > > if targetId ~= nil then > local targetSpecies = world.entitySpecies(targetId) > if targetSpecies ~= nil then > dialog = entity.staticRandomizeParameter(withSpecies .. "." .. targetSpecies) > end 482,485c469,470 < if entity.findPath(targetPosition, innerRadius, outerRadius) then < self.pathing.targetPosition = targetPosition < else < self.pathing.targetPosition = nil --- > if dialog == nil then > dialog = entity.staticRandomizeParameter(withSpecies .. ".default") 488c473,485 < self.pathing.delta = nil --- > if dialog == nil then > dialog = entity.staticRandomizeParameter(withSpecies) > end > > if dialog == nil then > dialog = entity.randomizeParameter(dialogType .. ".default") > end > > if dialog ~= nil then > return entity.say(dialog, tags) > end > > return false 492,494c489,490 < -- Get total length of a vertical path, step by step < function verticalPathLength(yDirection) < local direction = {up = 1, down = -1} --- > function boundingBox(force) > if self.boundingBox and not force then return self.boundingBox end 496,508c492,499 < local step = 1 < local firstDelta = entity.pathLookahead(0) < local lastDelta = entity.pathLookahead(step) < local length = 0 < while lastDelta do < local deltaDiff = lastDelta[2] - firstDelta[2] < if deltaDiff * direction[yDirection] > 0 then < length = math.abs(deltaDiff) < step = step + 1 < lastDelta = entity.pathLookahead(step) < else < break < end --- > local collisionPoly = mcontroller.collisionPoly() > local bounds = {0, 0, 0, 0} > > for _,point in pairs(collisionPoly) do > if point[1] < bounds[1] then bounds[1] = point[1] end > if point[2] < bounds[2] then bounds[2] = point[2] end > if point[1] > bounds[3] then bounds[3] = point[1] end > if point[2] > bounds[4] then bounds[4] = point[2] end 509a501 > self.boundingBox = bounds 511c503 < return length --- > return bounds 515,517c507,543 < function timeToFall(distance) < local gravity = world.gravity(mcontroller.position()) < return math.sqrt(2 * distance / gravity) --- > function moveX(direction, run) > mcontroller.controlMove(direction, run) > self.pathing.deltaX = direction > end > > -------------------------------------------------------------------------------- > function move(direction, dt, options) > if options == nil then options = {} end > if options.run == nil then options.run = false end > direction = util.toDirection(direction) > > local position = mcontroller.position() > if direction > 0 then > position[1] = math.ceil(position[1]) > else > position[1] = math.floor(position[1]) > end > > local forceWalk = false > -- Open doors in the way > local closedDoorIds = world.entityLineQuery(position, { position[1] + util.clamp(direction, -2, 2), position[2] }, { includedTypes = {"object"}, callScript = "hasCapability", callScriptArgs = { "closedDoor" } }) > for _, closedDoorId in pairs(closedDoorIds) do > if options.openDoorCallback == nil or options.openDoorCallback(closedDoorId) then > world.callScriptedEntity(closedDoorId, "openDoor") > forceWalk = true > end > end > > local yDirs = {0, 1, -1} > for _,yDir in ipairs(yDirs) do > if findValidStandingPosition({position[1] + direction, position[2] + yDir}, direction) or forceWalk then > moveX(direction, options.run) > return true > end > end > > return false, "ledge" 535,541c561 < --[[debug < local position = mcontroller.position() < world.debugLine(position, targetPosition, "green") < --]] < < -- TODO just check if this is an x-only movement and the path is clear < --- > --Find new path if target position has changed 547c567,575 < findPath(targetPosition, options) --- > local innerRadius = -1 > local outerRadius = 1 > if entity.findPath(targetPosition, innerRadius, outerRadius) then > self.pathing.targetPosition = targetPosition > else > return false > end > > self.pathing.delta = nil 550,551c578,584 < if self.pathing.targetPosition then < local pathDelta = entity.followPath() --- > -- Store the path delta in case pathfinding doesn't succeed on the next try > local pathDelta = entity.followPath() > if pathDelta == nil then > self.pathing.targetPosition = nil > else > self.pathing.delta = pathDelta > end 553,558c586,589 < -- Store the path delta in case pathfinding doesn't succeed on the next try < if pathDelta ~= nil then < self.pathing.delta = pathDelta < else < self.pathing.targetPosition = nil < end --- > --New path and we can't move on it, try new path > if self.pathing.delta == nil then > self.pathing.targetPosition = nil > return false 562,570c593,594 < local delta < if self.pathing.delta ~= nil then < delta = self.pathing.delta < else < if options.fleeDistance ~= nil then < delta = world.distance(position, targetPosition) < else < delta = world.distance(targetPosition, position) < end --- > local verticalPathUp = verticalPathLength("up") > local verticalPathDown = verticalPathLength("down") 572c596,606 < delta = vec2.mul(vec2.norm(delta), math.min(world.magnitude(delta), 2)) --- > --Keep jumping > if (self.pathing.jumpHoldTimer ~= nil and verticalPathUp > 0) or self.pathing.goalJumpPosition then > keepJumping(dt, options) > return true > end > self.pathing.jumpHoldTimer = nil > > --Keep dropping > if (self.pathing.downHoldTimer ~= nil and verticalPathDown > 0) or self.pathing.goalJumpPosition then > keepDropping(dt, options) > return true 573a608,612 > self.pathing.downHoldTimer = nil > > script.setUpdateDelta(self.scriptDelta) > > local delta = entity.pathLookahead(0) or self.pathing.delta 583,594c622,623 < -- Keep jumping < if (self.pathing.jumpHoldTimer ~= nil and verticalPathLength("up") > 0) or self.pathing.keepJumpDirection then < if self.pathing.jumpHoldTimer ~= nil then < mcontroller.controlHoldJump() < < self.pathing.jumpHoldTimer = self.pathing.jumpHoldTimer - dt < if self.pathing.jumpHoldTimer <= 0 then < self.pathing.jumpHoldTimer = nil < end < end < < if mcontroller.onGround() and not self.pathing.jumpHoldTimer then self.pathing.keepJumpDirection = nil end --- > local nextPathPosition = vec2.add(position, delta) > local goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(delta[1])) 596,601c625,628 < if self.pathing.keepJumpDirection then < moveX(self.pathing.keepJumpDirection, options.run) < controlFace(self.pathing.keepJumpDirection) < elseif math.abs(delta[1]) > 1 then < moveX(delta[1], options.run) < end --- > --If there is a ledge but the path continues, don't use this position > if goalPosition and not forwardPosition then > goalPosition = nil > end 603c630,633 < return true --- > --Don't stand between the first path node and the next one > local nextDelta = entity.pathLookahead(1) > if nextDelta and delta[1] * nextDelta[1] < 0 then > goalPosition = nil 605d634 < self.pathing.jumpHoldTimer = nil 607,612c636,646 < if not mcontroller.onGround() and self.pathing.downHoldTimer ~= nil then < mcontroller.controlDown() < self.pathing.downHoldTimer = self.pathing.downHoldTimer - dt < if self.pathing.downHoldTimer <= 0 then < self.pathing.downHoldTimer = nil < end --- > --If the next path node isn't valid (can't stand there), search the path for a valid one > local step = 1 > local maxSteps = 30 > while not goalPosition and step < maxSteps do > local nextPathDelta = entity.pathLookahead(step) > if nextPathDelta then > nextPathPosition = vec2.add(position, nextPathDelta) > goalPosition, forwardPosition, backwardPosition = findValidStandingPosition(nextPathPosition, util.toDirection(nextPathDelta[1])) > step = step + 1 > else break end > end 614c648,652 < if math.abs(delta[1]) > 1 then moveX(delta[1], options.run) end --- > --No valid position found, stop moving and find new path > if not goalPosition then > self.pathing.targetPosition = nil > return false > end 615a654,669 > --Move on path > local goalDelta = world.distance(goalPosition, position) > local verticalMovementRatio = math.abs(goalDelta[2] / goalDelta[1]) > if goalDelta[1] == 0 then verticalMovementRatio = 10 end > local maxVerticalRatio = 1.25 --Enough to not drop down or jump up stairs > > --Keep from dropping or jumping in stairs if we don't need to > if verticalMovementRatio > maxVerticalRatio and forwardPosition then > goalDelta = world.distance(forwardPosition, position) > verticalMovementRatio = math.abs(goalDelta[2] / goalDelta[1]) > end > > --Path wants to take us steeply up, jump > if ((verticalMovementRatio > maxVerticalRatio and goalDelta[2] > 0) or verticalPathUp > 1) and not closeToCeiling() then > local jumpHold = math.max(verticalPathUp / self.jumpSpeed, distanceJumpTime(goalDelta)) > timedJump(math.max(jumpHold, 0.02), backwardPosition or forwardPosition) 618,620d671 < self.pathing.downHoldTimer = nil < < script.setUpdateDelta(self.scriptDelta) 622,634c673,677 < local region = { < math.floor(position[1] + 0.5) - 1, math.floor(position[2] + 0.5) - 3, < math.floor(position[1] + 0.5) + 1, math.floor(position[2] + 0.5) + 1, < } < local endpointGroundRegion = { < region[1] + delta[1], region[2] + delta[2] - 2, < region[3] + delta[1], region[2] + delta[2] < } < local verticalMovementRatio < if delta[1] == 0 then < verticalMovementRatio = 10 -- arbitrary "large" number < else < verticalMovementRatio = math.abs(delta[2]) / math.abs(delta[1]) --- > --Path is taking us steeply down, drop > if ((verticalMovementRatio > maxVerticalRatio and goalDelta[2] < 0) or verticalPathDown > 1) and not onSolidGround() then > local dropHold = timeToFall(math.max(-goalDelta[2], verticalPathDown)) > timedDrop(dropHold) > return true 637,663c680,684 < local nextNode = entity.pathLookahead(2) < local nextDelta = {0,0} < if nextNode then < nextDelta = vec2.sub(nextNode, delta) < end < < -- The path might just be taking us up some stairs, so we'll only jump if the < -- endpoint is not supported, or it's really taking us quite vertical and is not just a small hop < if delta[2] > 0 and (not world.rectCollision(endpointGroundRegion, false) or (verticalMovementRatio > 1.5 and nextDelta[2] >= 0)) then < --Don't jump into the ceiling < local ceilingRegion = { < position[1] - 1, position[2] + 1, < position[1] + 1, position[2] + 5 < } < if world.rectCollision(ceilingRegion, true) then < findPath(targetPosition, options) < moveX(delta[1], options.run) < return true < end < < timedJump((verticalPathLength("up") + 1) * 0.02) < elseif delta[2] < 0 and verticalMovementRatio > 1.75 and mcontroller.onGround() then < -- TODO trace from end of path to feet and see if path is trying to move us through a platform <--still relevant? < -- Drop down through a platform < mcontroller.controlDown() < self.pathing.downHoldTimer = math.min(timeToFall(verticalPathLength("down") + 1), 0.5) < script.setUpdateDelta(1) --- > --Jump over gaps > local deltaDir = util.toDirection(goalDelta[1]) > local nextStepPosition = {position[1] + deltaDir, position[2]} > if deltaDir > 0 then > nextStepPosition[1] = math.ceil(nextStepPosition[1]) 665,679c686,691 < local direction = util.toDirection(delta[1]) < < -- Might be a quick hop over an obstruction before we can follow the path, < -- note that we're not including the first block at the feet in this check, < -- but are checking a point just inside that block, so we don't always jump < -- when running up to the top of stairs (unless there is a ledge there) < local nextStepRegion = { < region[1] + direction, region[2] + 2, < region[3] + direction, region[4] < } < if world.rectCollision(nextStepRegion, true) then < timedJump(0) < moveX(direction, options.run) < return true < end --- > nextStepPosition[1] = math.floor(nextStepPosition[1]) > end > if verticalMovementRatio < 0.5 and math.abs(goalDelta[1]) > 1.5 and not findValidStandingPosition(nextStepPosition, deltaDir) then > timedJump(distanceJumpTime(goalDelta), forwardPosition or backwardPosition) > return true > end 681,686c693 < -- Jump over gaps < local maxFallDistance = 8 < local nextStepLowerRegion = { < nextStepRegion[1] + 0.5 + direction / 3, nextStepRegion[2] - maxFallDistance, < nextStepRegion[3] - 0.5 + direction / 3, nextStepRegion[4] < } --- > moveX(goalDelta[1], options.run) 688,689c695,696 < if not world.rectCollision(nextStepLowerRegion, false) then < local maxJumpDistance = 7 --- > return true > end 691,703c698,702 < local jumpRegion = { < nextStepRegion[1] + direction, nextStepRegion[2] - maxFallDistance, < nextStepRegion[3] + direction, nextStepRegion[4] - 2 < } < for offset = 1, maxJumpDistance, 1 do < if world.rectCollision(jumpRegion, false) then < timedJump((offset + 1) * 0.05, util.toDirection(delta[1])) < moveX(delta[1], options.run) < return true < end < jumpRegion[1] = jumpRegion[1] + direction < jumpRegion[3] = jumpRegion[3] + direction < end --- > --PATHING-- > -------------------------------------------------------------------------------- > -- Get total length of a vertical path, step by step > function verticalPathLength(yDirection) > local direction = {up = 1, down = -1} 705c704,715 < return false, "ledge" --- > local step = 1 > local firstDelta = entity.pathLookahead(0) > local lastDelta = entity.pathLookahead(step) > local length = 0 > while lastDelta do > local deltaDiff = lastDelta[2] - firstDelta[2] > if deltaDiff * direction[yDirection] > 0 and lastDelta[1] == firstDelta[1] then > length = math.abs(deltaDiff) > step = step + 1 > lastDelta = entity.pathLookahead(step) > else > break 709,711c719 < moveX(delta[1], options.run) < < return true --- > return length 713a722 > --JUMPING AND DROPPING-- 715c724,726 < function timedJump(holdTime, keepDirection) --- > --Jump and hold jump for holdTime, also approach goalPosition > function timedJump(holdTime, goalPosition) > if not mcontroller.onGround() then return nil end 720c731 < self.pathing.keepJumpDirection = keepDirection --- > self.pathing.goalJumpPosition = goalPosition 724,729c735,751 < -------------------------------------------------------------------------------- < function resetPathing() < self.pathing.jumpHoldTimer = nil < self.pathing.downHoldTimer = nil < self.pathing.keepJumpDirection = nil < script.setUpdateDelta(self.scriptDelta) --- > --Keep holding jump for the duration of the timed jump > function keepJumping(dt, options) > if self.pathing.jumpHoldTimer ~= nil then > mcontroller.controlHoldJump() > > self.pathing.jumpHoldTimer = self.pathing.jumpHoldTimer - dt > if self.pathing.jumpHoldTimer <= 0 then > self.pathing.jumpHoldTimer = nil > end > end > > if mcontroller.onGround() and not self.pathing.jumpHoldTimer then self.pathing.goalJumpPosition = nil end > > if self.pathing.goalJumpPosition then > local goalDelta = world.distance(self.pathing.goalJumpPosition, mcontroller.position()) > moveX(goalDelta[1], options.run) > end 732,734c754,762 < -------------------------------------------------------------------------------- < function sayToTarget(dialogType, targetId, tags) < local dialog = nil --- > --Drop and hold down for holdTime, also approach goalPosition > function timedDrop(holdTime, goalPosition) > if holdTime == nil then holdTime = 0 end > holdTime = math.min(holdTime, 0.5) > mcontroller.controlDown() > self.pathing.downHoldTimer = holdTime > self.pathing.goalJumpPosition = goalPosition > script.setUpdateDelta(1) > end 736c764,767 < local withSpecies = dialogType .. "." .. entity.species() --- > --Keep holding down > function keepDropping(dt, options) > if self.pathing.downHoldTimer ~= nil then > mcontroller.controlDown() 738,741c769,771 < if targetId ~= nil then < local targetSpecies = world.entitySpecies(targetId) < if targetSpecies ~= nil then < dialog = entity.staticRandomizeParameter(withSpecies .. "." .. targetSpecies) --- > self.pathing.downHoldTimer = self.pathing.downHoldTimer - dt > if self.pathing.downHoldTimer <= 0 then > self.pathing.downHoldTimer = nil 745,746c775,777 < if dialog == nil then < dialog = entity.staticRandomizeParameter(withSpecies .. ".default") --- > if self.pathing.goalJumpPosition then > local goalDelta = world.distance(self.pathing.goalJumpPosition, mcontroller.position()) > moveX(goalDelta[1], options.run) 747a779 > end 749,751c781,785 < if dialog == nil then < dialog = entity.staticRandomizeParameter(withSpecies) < end --- > --Returns the time the entity needs to hold jump to reach the specified distance > --TODO: Make this not bad by using math > function distanceJumpTime(distance) > local position = mcontroller.position() > local gravity = world.gravity(mcontroller.position()) 753,754c787,811 < if dialog == nil then < dialog = entity.randomizeParameter(dialogType .. ".default") --- > local fallDistanceTime = (math.abs(distance[1]) / 2) / self.walkSpeed > local fallDistance = (gravity / 2) * fallDistanceTime * fallDistanceTime > fallDistance = fallDistance + distance[2] > > local holdTime = fallDistance / self.jumpSpeed > return holdTime > end > > --The time it would take to fall distance > function timeToFall(distance) > local gravity = world.gravity(mcontroller.position()) > return math.sqrt(2 * distance / gravity) > end > > --POSITIONING-- > -------------------------------------------------------------------------------- > --Finds a position on top of a tile (rather than in between tiles) that the entity can stand on > function findValidStandingPosition(nodePosition, direction) > if forceDirection == nil then forceDirection = false end > > local forwardCollisionResolve = validStandingPosition(nodePosition, direction) > local backwardCollisionResolve = validStandingPosition(nodePosition, -direction) > > if forwardCollisionResolve or backwardCollisionResolve then > return nodePosition, forwardCollisionResolve, backwardCollisionResolve 755a813 > end 757,758c815,827 < if dialog ~= nil then < return entity.say(dialog, tags) --- > --Checks if the entity can stand in this position > function validStandingPosition(position, direction) > direction = util.toDirection(direction) > local collisionPoly = mcontroller.collisionPoly() > local bounds = boundingBox() > > local groundRegion = { > position[1] + math.min(direction, 0) + 0.05, position[2] + bounds[2] - 1, > position[1] + math.max(direction, 0) - 0.05, position[2] + bounds[2] > } > local collisionResolve = world.resolvePolyCollision(collisionPoly, {position[1] + direction/2, position[2]}, 0.9) > if world.rectCollision(groundRegion, false) and collisionResolve then > return collisionResolve 759a829 > end 761c831,840 < return false --- > --Check if entity is right under a solid block ceiling > function closeToCeiling() > local position = mcontroller.position() > local bounds = boundingBox() > > local ceilingRegion = { > position[1] + bounds[1] + 0.1, position[2] + 1, > position[1] + bounds[3] - 0.1, position[2] + 5 > } > return world.rectCollision(ceilingRegion, true) 762a842,856 > > --Check if entity is on solid ground (not platforms) > function onSolidGround() > local position = mcontroller.position() > local bounds = boundingBox() > > local groundRegion = { > position[1] + bounds[1] - 0.05, position[2] + bounds[2] - 0.95, > position[1] + bounds[3] + 0.05, position[2] + bounds[2] + 0.05 > } > if world.rectCollision(groundRegion, true) then > drawDebugRect(groundRegion, "red") > end > return world.rectCollision(groundRegion, true) > end \ No newline at end of file npcs\rangedattackstate.lua 94c94 < move({ -toTarget[1], 0 }, dt) --- > move(-toTarget[1], dt) 100c100 < move({ toTarget[1], 0 }, dt) --- > move(toTarget[1], dt) 138c138 < move(toTarget, dt, { run = true }) --- > move(toTarget[1], dt, { run = true }) npcs\sitstate.lua 46c46 < if self.pathing.delta then deltaX = self.pathing.delta[1] end --- > if self.pathing.deltaX then deltaX = self.pathing.deltaX end npcs\wanderstate.lua 58c58 < if self.pathing.delta then deltaX = self.pathing.delta[1] end --- > if self.pathing.deltaX then deltaX = self.pathing.deltaX end 145c145 < local moved, reason = move({ stateData.direction, 0 }, dt, { --- > local moved, reason = move(stateData.direction, dt, { npcs\workstate.lua 75c75 < move(toTarget, dt) --- > moveTo(stateData.targetPosition, dt) npcs\guard\guardstate.lua 156d155 < 157a157,160 > deltaX = toTarget[1] > if self.pathing.deltaX then deltaX = self.pathing.deltaX end > controlFace(deltaX) > npcs\outpost\outpostapexscientist.npctype 6c6,7 < "turnInQuests" : [ "radardish1.gearup" ], --- > "offeredQuests" : [ "outpostSkin.gearup" ], > "turnInQuests" : [ "outpostSkin.gearup", "radardish1.gearup" ], npcs\outpost\outposthumanscientist.npctype 6,7c6,7 < "offeredQuests" : [ "humanscientistE1.gearup" ], < "turnInQuests" : [ "humanscientistE1.gearup" ], --- > "offeredQuests" : [ "outpost0.gearup", "humanscientistE1.gearup" ], > "turnInQuests" : [ "outpost0.gearup", "humanscientistE1.gearup" ], npcs\outpost\outpostpenguinpromoter.npctype 5a6,7 > "offeredQuests" : [ "penguinpromoterE1.gearup" ], > "turnInQuests" : [ "penguinpromoterE1.gearup" ], objects\crafting\ironcraftingtable\ironcraftingtable.object 35a36,38 > ], > "learnBlueprintsOnPickup" : [ > "ironcraftingtable" 37a41 > objects\minibiome\bioluminescence\glowflowerlamp\glowflowerlamp.object 21c21 < "lightColor" : [252, 197, 67], --- > "lightColor" : [255, 248, 50], objects\minibiome\stalactitecave\ceilingstalactite1\ceilingstalactite1.object 56a57,64 > ], > > "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], > "smashDropOptions" : [ > [ [ "rockcave", 2, { } ] ] > ], > "breakDropOptions" : [ > [ [ "rockcave", 2, { } ] ] objects\minibiome\stalactitecave\ceilingstalactite3\ceilingstalactite3.object 56a57,64 > ], > > "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], > "smashDropOptions" : [ > [ [ "rockcave", 2, { } ] ] > ], > "breakDropOptions" : [ > [ [ "rockcave", 2, { } ] ] objects\minibiome\stalactitecave\ceilingstalactite4\ceilingstalactite4.object 38a39,46 > ], > > "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], > "smashDropOptions" : [ > [ [ "rockcave", 2, { } ] ] > ], > "breakDropOptions" : [ > [ [ "rockcave", 2, { } ] ] objects\minibiome\stalactitecave\ceilingstalactite5\ceilingstalactite5.object 18,38c18 < "particleEmitter" : { < "emissionRate" : 0.1, < "emissionVariance" : 0.05, < "pixelOrigin" : [0, 0], < < "particle" : { < "type" : "textured", < "image" : "/particles/hazard/hazardstat.png", < "size" : 1.0, < "color" : [73, 179, 253, 255], < "fade" : 0, < "destructionAction" : "shrink", < "destructionTime" : 7, < "initialVelocity" : [3, 4], < "finalVelocity" : [-3, 2], < "approach" : [4, 1], < "timeToLive" : 1, < "layer" : "middle" < } < < }, --- > 59a40,47 > ], > > "smashSounds" : [ "/sfx/objects/capsule_break1.wav", "/sfx/objects/capsule_break2.wav", "/sfx/objects/capsule_break3.wav" ], > "smashDropOptions" : [ > [ [ "rockcave", 2, { } ] ] > ], > "breakDropOptions" : [ > [ [ "rockcave", 2, { } ] ] plants\trees\ceilingtest\fleshvine\fleshvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\floweryvine\floweryvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\glitteringroot\glitteringroot.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\podvine\fleshvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\root\vineroot.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\twistedvine\twistedvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\ceilingtest\vine2\vine2.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\shadowvine\shadowvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\slimevine\slimevine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\sulphurvine\sulphurvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\tarvine\tarvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\vine\vine.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\vine2\vine2.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\vine3\vine3.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\vine4\vine4.modularstem 4c4 < "health" : 10, --- > "health" : 2, plants\trees\forestceiling\stems\wildernessvine\wildernessvine.modularstem 4c4 < "health" : 10, --- > "health" : 2, quests\outpost\outpost1.questtemplate 2a3 > "prerequisites" : [ "outpost0.gearup" ], 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 Nano Suit.", < "completionText" : "The perfect coffee! Here, you deserve this. You can equip the Nano Suit at your tech station. Nano Suits sit beneath your armor and give you unique abilities!", --- > "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.", quests\tutorial\tutorial1.questtemplate 10d9 < "enableAiCommands" : [ "upgradeBeamaxe1" ], recipes\biomes\bioluminescence\glowbushlamp.recipe 4c4,5 < { "item" : "glowfibreyellow", "count" : 3 } --- > { "item" : "glowfibreyellow", "count" : 3 }, > { "item" : "clay", "count" : 2 } recipes\biomes\bioluminescence\glowchest.recipe 3,4c3,5 < { "item" : "glowfibreorange", "count" : 3 }, < { "item" : "glowfibreyellow", "count" : 3 } --- > { "item" : "glowfibreorange", "count" : 5 }, > { "item" : "glowfibreyellow", "count" : 5 }, > { "item" : "glowfibreblue", "count" : 20 } recipes\biomes\bioluminescence\glowflowerlamp.recipe 4c4,5 < { "item" : "glowfibreyellow", "count" : 3 } --- > { "item" : "glowfibreyellow", "count" : 3 }, > { "item" : "clay", "count" : 2 } species\humannamegen.config 6,7c6,7 < [ { "mode" : "alts" }, "Ace", "Arch", "Bat", "Bate", "Brig", "Chris", "Cross", "Ed", "Dew", "Dona", "Elm", "Far", "Futter", "Good", "Galt", "Hop", "Crow", "Jack", "Lint", "Love", "Greg", "Mitch", "Moss", "Nate", "Orf", "Priest", "Paul", "Rich", "Stepp", "Thom", "Wil" ], < [ { "mode" : "alts" }, "son", "man", "mann", "ley", "born", "by", "mer", "ron", "ton", "mon", "well", "ald", "ell", "all", "ness", "tello", "roy", "ment", "wall", "wale", "liss", "less", "leth", "by", "-Smythe", "-Jones", "-Peters", "-Funke" ] --- > [ { "mode" : "alts" }, "Addison", "Alex", "Alexis", "Aleksei", "Andre", "Angel", "Ashley", "Ashton", "Bailey", "Billy", "Blair", "Byron", "Caden", "Cameron", "Carmen", "Carmine", "Carson", "Cassidy", "Chen", "Chiaki", "Cody", "Corey", "Dakota", "Dallas", "Delaney", "Devon", "Ellery", "Emerson", "Fabian", "Francis", "Georgi", "Hadley", "Harley", "Hayden", "Ira", "Jaden", "Jamie", "Jan", "Jesse", "Jin", "Jude", "Julian", "Kadin", "Kelsey", "Kiley", "Koichi", "Lane", "Lee", "Lindsay", "Lonnie", "Liu", "Lucian", "Mallory", "Montana", "Morgan", "Marley", "Naoko", "Nevada", "Noel", "Orion", "Oleg", "Paris", "Parker", "Payton", "Perry", "Quinn", "Reed", "Rene", "Robin", "Scout", "Shay", "Shelby", "Sonny", "Skylar", "Sunny", "Sydney", "Stormy", "Taylor", "Tory", "Tyler", "Ulf", "Wesley", "Wynne", "Yang", "Yi", "Yuri", "Yury" ], > [ { "mode" : "alts" }, " Acaba", " Acton", " Adams", " Akers", " Aldrin", " Allen", " Altman", " Anders", " Anderson", " Apt", " Armstrong", " Ashby", " Atkov", " Avdeyev", " Bagian", " Baker", " Barratt", " Barry", " Bartoe", " Baturin", " Baudry", " Bean", " Binnie", " Bowen", " Bowersox", " Brady", " Cabana", " Cagle", " Caldeiro", " Camarda", " Carey", " Carpenter", " Carr", " Carter", " Casper", " Cassidy", " Cenker", " Currie", " Davis", " DeLucas", " Dezhurov", " Dunbar", " Dutton", " Dyomin", " Dyson", " Edwards", " Eisele", " England", " Engle", " Evans", " Ewald", " Eyharts", " Faris", " Farkas", " Favier", " Shenzhou", " Ferguson", " Fettman", " Gaffney", " Gardener", " Garriot", " Glazkov", " Grechko", " Hadfield", " Hansen", " Henricks", " Hieb", " Hoshide", " Hart", " Ivins", " Ivanov", " Jones", " Jr.", " Kaleri", " Kelly", " Korzun", " Kotov", " Kregel", " Lee", " Lind", " Loria", " Lu", " Low", " McDivitt", " McCulley", " McCool", " McBride", " McLean", " Manarov", " Morin", " Nagel", " Nowak", " Oswald", " O'Leary", " O'Connor", " Pailes", " Parker", " Payton", " Popov", " Pontes", " Ramon", " Readdy", " Reilly", " Reisman", " Revin", " Rogers", " Roosa", " Runco", " Sacco", " Satcher", " Scobee", " Sellers", " Sharma", " Shaw", " So-Yeon", " Spring", " Stewart", " Swanson", " Tani", " Tanner", " Titov", " Thuot", " Tokarev", " Thiele", " Usachov", " Voss", " Veach", " Wakata", " Wang", " Walker", " Williams", " Wyman", " Tesla", " Edison", " Franklin", " Riches", " Lawson", " Bryce", " Bayliss", " Yeon", " Yui", "-Smythe", "Smith", "-Jones", "-Peters", "-Funke" ] 10,66d9 < // "names" : [ < // {"mode" : "alts"}, < // [ < // {"mode" : "serie"}, < // [{"mode" : "alts"}, < // "Morte", < // "Gari", < // "Acker", < // "Ale", < // "Bate", < // "Apple", < // "Ash", < // "Bake", < // "Bald", < // "" < // ], < // [{"mode" : "alts"}, < // "berry", < // "bourne", < // "bund", < // "by", < // "den", < // "field", < // "ford", < // "grove", < // "ham", < // "ham", < // "man", < // "mer", < // "more", < // "ridge", < // "roy", < // // "s", < // // "sby", < // // "sley", < // // "slow", < // "son", < // "ster", < // "stine", < // "ton", < // "tram", < // "wald", < // "wale", < // "wall", < // "well", < // "win", < // "wood", < // "worth", < // "wright" < // ] < // ], < // [ < // {"mode" : "serie"}, < // [{"mode" : "alts"}, "Whit", "Glimmer", "Fenta"], < // [{"mode" : "alts"}, "bund", "more", "scue"] < // ] < // ] species\novakidnamegen.config 6,7c6,7 < [ { "mode" : "alts" }, "Ace", "Acro", "Acryl", "Ammo", "Amyl", "Aqu", "Badde", "Benze", "Benzy", "Buta", "Butan", "Butyl", "Carbo", "Clint", "Clem", "Country", "Cetus", "Chloro", "Corvus", "Cylo", "Decane", "Diace", "Dich", "Dieth", "Diethyl", "Diox", "Dioxol", "Dodeca", "Dowano", "Dyme", "Epich", "Ethane", "Ethoxy", "Ethyl", "Freon", "Fuel", "Furan", "Furf", "Goode", "Green", "Gun", "Gutter", "Heptane", "Hexan", "Hexen", "Hydro", "Isobu", "Jet", "Kero", "Lacto", "Leo", "Libra", "Lynx", "Lyra", "Magie", "Merca", "Metha", "Methan", "Methox", "Methyl", "Milli", "Minera", "Naptha", "Nitric", "Nitro", "Nonane", "Octane", "Octyl", "Orio", "Oxy", "Pentan", "Perch", "Pers", "Pheno", "Phenyl", "Pinen", "Propane", "Propyl", "Propyl", "Saddle", "Styre", "Slang", "Tert", "Tetra", "Ursa", "Uggly", "Varni", "Vela", "Vinyl", "Virgo", "Xylene", "Xenon" ], < [ { "mode" : "alts" }, "-Head", "-Wood", "-Horn", " Snipe", "-Man", " Firewater", " Moonshine", " Fandango", " Jackeroo", " Gas", " Gunn", " Eastwood", " Cowpuncher", " Cowhand", " Rustler", "Dodger", " Clodhopp", "Nova", " Shavetail", " Saddlebum", " Gungiver", "-Guzzler", " Tanglefoot", " Tanhider", " Sparrowcatch", " Winder", " Snappehead", " Monoxide", " Dioxide", " Bandwagon", " Rider", " Badlander", " Bandero", "-Son", " Barreled", "-Burner", " Blatherskit", " Whistleberry", " Yellowbelly", " Sawbones", " Valleytan", " Saltlicker", " Tenderfoot", " Chickabiddy", " Calaboose", " Caboodle", " Trapper", " Driver", "-Slinger", " Maverick", "-Carbonate", " Ether", " Sulfide", " Lamine", " Dioxide", " Chloride", " Gasoline", " Ace-High", " Murphy", " Cody", " Baker", " Bushwacker", " Allen", " Livingston", " Bootlicker", "Steele", "Anderson", " Jones", " Starret", " Page", " Waller", " Hayes", " O'Brien", " Ford", " Jr.", " Hoxie", " Bannon", " McCrea", " O'Day", " McCoy" ] --- > [ { "mode" : "alts" }, "Ace", "Acro", "Acryl", "Ammo", "Amyl", "Aqu", "Badde", "Benze", "Benzy", "Butane", "Butyl", "Carbo", "Clint", "Clem", "Country", "Cetus", "Chloro", "Corvus", "Cylo", "Decane", "Diace", "Dich", "Dieth", "Diethyl", "Dioxi", "Dioxol", "Dodeca", "Dowan", "Dyme", "Epich", "Ethane", "Ethoxy", "Ethyl", "Freon", "Fuel", "Furan", "Furf", "Goode", "Green", "Gun", "Gutter", "Heptan", "Hexan", "Hexen", "Hydro", "Isobu", "Jet", "Kero", "Lacto", "Leo", "Libra", "Lynx", "Lyra", "Magie", "Merca", "Metha", "Methan", "Methox", "Methyl", "Milli", "Minera", "Naptha", "Nitric", "Nitro", "Nonane", "Octane", "Octyl", "Orio", "Oxy", "Pentan", "Perch", "Pers", "Pheno", "Phenyl", "Pinen", "Propane", "Propyl", "Propyl", "Saddle", "Styre", "Slang", "Tert", "Tetra", "Ursa", "Uggly", "Varni", "Vela", "Vinyl", "Virgo", "Xylene", "Xenon" ], > [ { "mode" : "alts" }, " Head", "-Wood", "-Horn", " Snipe", " Oxide", " Firewater", " Moonshine", " Fandango", " Jackeroo", " Gasse", " Gunn", " Glycol", " The-Kidd", " Cowhand", " Rustler", " Dodger", " Clodhopp", " Nova", " Shavetail", " Saddlebum", " Gungiver", "-Guzzler", " Foote", " Tanhide", " Sparrow", " Catcher", " Sulfide", " Snappe", " Monoxide", " Dioxide", " Banwagon", " Rider", " Badlande", " Bandero", " Sr.", " Buckaroo", " Burner", " Blathaskit", " Whistleton", " Yellabelly", " Sawbones", " Valleytan", " Saltlick", " Tendafoot", " Chicabiddy", " Calaboose", " Caboodle", " Trapper", " Driver", "-Slinger", " Maverick", " Carbonate", " Ether", " Sulfide", " Lamine", " Dioxide", " Chloride", " Gaso'lin", " Ace-High", " Murphy", " Cody", " Baker", " Bushwack", " Allen", " Levinston", " Bootlicker", " Steele", " Jones", " Starret", " Page", " Waller", " Hayes", " O'Brien", " Ford", " Jr.", " Hoxie", " Bannon", " McCrea", " O'Day", " McCoy" ] treasure\biome.treasurepools 85c85 < {"weight" : 0.1, "item" : "cactislammer"}, --- > {"weight" : 0.2, "item" : "cactislammer"}, 143a144 > {"weight" : 0.1, "item" : ["mediumsnowball", 2]}, 149c150,151 < {"weight" : 0.3, "item" : "snowinfantrypants"} --- > {"weight" : 0.3, "item" : "snowinfantrypants"}, > {"weight" : 0.3, "item" : "snowcone"} 465a468 > {"weight" : 1.0, "item" : ["glowfibreblue", 3]}, 467a471 > {"weight" : 0.3, "item" : "glowvinelamp-recipe"}, 500,508c504,512 < {"weight" : 0.4, "item" : "shroomblock-recipe"}, < {"weight" : 0.4, "item" : "shroombed-recipe"}, < {"weight" : 0.4, "item" : "shroomchair-recipe"}, < {"weight" : 0.4, "item" : "shroomchest-recipe"}, < {"weight" : 0.4, "item" : "shroomdoor-recipe"}, < {"weight" : 0.4, "item" : "shroomlamp-recipe"}, < {"weight" : 0.4, "item" : "shroomtable-recipe"}, < {"weight" : 0.2, "item" : "shroomwardrobe-recipe"}, < {"weight" : 0.1, "item" : "shroomstatue-recipe"}, --- > {"weight" : 0.2, "item" : "shroomblock-recipe"}, > {"weight" : 0.2, "item" : "shroombed-recipe"}, > {"weight" : 0.2, "item" : "shroomchair-recipe"}, > {"weight" : 0.2, "item" : "shroomchest-recipe"}, > {"weight" : 0.2, "item" : "shroomdoor-recipe"}, > {"weight" : 0.2, "item" : "shroomlamp-recipe"}, > {"weight" : 0.2, "item" : "shroomtable-recipe"}, > {"weight" : 0.4, "item" : "shroomwardrobe-recipe"}, > {"weight" : 0.3, "item" : "shroomstatue-recipe"}, 551c555 < {"weight" : 0.6, "item" : ["money", 2]}, --- > {"weight" : 1.0, "item" : ["money", 2]}, 554,558c558,562 < {"weight" : 0.005, "item" : "gnomegun"}, < {"weight" : 0.005, "item" : "gnomecaphead"}, < {"weight" : 0.005, "item" : "gnomehead"}, < {"weight" : 0.005, "item" : "househathead"}, < {"weight" : 0.005, "item" : "buildinghathead"} --- > {"weight" : 0.01, "item" : "gnomegun"}, > {"weight" : 0.1, "item" : "gnomecaphead"}, > {"weight" : 0.01, "item" : "gnomehead"}, > {"weight" : 0.1, "item" : "househathead"}, > {"weight" : 0.1, "item" : "buildinghathead"} 777a782 > {"weight" : 0.05, "item" : "alienskullhead"}, 804a810,831 > ], > "poolRounds" : [ > [0.5, 1], > [0.5, 2] > ], > "allowDuplication" : false > }] > ], > > "frozencaves" : [ > [1, { > "pool" : [ > {"weight" : 1.0, "item" : ["snowflake", 3]}, > {"weight" : 0.5, "item" : ["snowflake", 4]}, > {"weight" : 0.2, "item" : ["snowflake", 5]}, > {"weight" : 0.3, "item" : "icearmorhead"}, > {"weight" : 0.3, "item" : "icearmorchest"}, > {"weight" : 0.3, "item" : "icearmorlegs"}, > {"weight" : 0.05, "item" : "icecubehead"}, > {"weight" : 0.2, "item" : "freezeray"}, > {"weight" : 0.2, "item" : "icechucker"}, > {"weight" : 0.3, "item" : "frozenbow"}