FILES ----- [NEW] ai\missionfloran1.aimission [NEW] ai\missionhuman1.aimission [NEW] ai\missionhylotl1.aimission [NEW] ai\missionpeguin2.aimission [NEW] ai\missionpenguin1.aimission [NEW] animations\greenmonstersplosion\greenmonstersplosion.animation [NEW] animations\greenmonstersplosion\greenmonstersplosion.frames [NEW] animations\greenmonstersplosion\greenmonstersplosion.png behaviors\npc\combat.behavior behaviors\npc\hostileguard.behavior [NEW] behaviors\npc\npcblink.behavior behaviors\npc\crew\teleport.behavior behaviors\npc\overrides\override-follow.behavior [NEW] behaviors\npc\quests\quest-kidnapping-idle.behavior [NEW] behaviors\npc\quests\quest-kidnapping-notification.behavior [NEW] behaviors\npc\quests\quest-kidnapping-questgiver-notification.behavior [NEW] cinematics\artifacts\artifact.png [NEW] cinematics\artifacts\hylotlartifact.cinematic [NEW] cinematics\artifacts\hylotlartifact.png dialog\quest.config dungeons\microdungeons\biomes\forest\playerforest1.json dungeons\microdungeons\biomes\forest\playerforest2.json dungeons\missions\tentaclemissions\bossroomtest.json dungeons\other\naturalcave\naturalcave.dungeon [NEW] interface\actionbar\actionbarpickup.frames [NEW] interface\actionbar\actionbarpickup.png interface\quests\mainquestgiver.png interface\quests\mainquestreceiver.png interface\windowconfig\actionbar.config items\rotting.config items\active\weapons\other\exmachina\exmachina.activeitem [NEW] items\generic\old\meatballs.consumable [NEW] items\generic\old\meatballs.png items\generic\other\valentinechocolates.consumable items\generic\produce\coffeebeans.consumable items\generic\produce\kelp.item items\generic\produce\potato.consumable items\generic\produce\rice.consumable items\generic\produce\sugar.item items\generic\produce\wheat.item items\generic\shop\candy.consumable items\generic\shop\cannedfood.consumable items\generic\shop\chocolate.consumable monsters\monster.lua monsters\crawlers\tentaclecrawler\tentaclecrawler.monstertype monsters\flyers\tentaclebomb\tentaclebomb.monstertype monsters\flyers\tentaclegnat\tentaclegnat.monstertype monsters\flyers\tentaclespawner\tentaclespawner.monstertype monsters\ghosts\tentacleghost\tentacleghost.monstertype monsters\walkers\anglure\anglure.monstertype monsters\walkers\bobot\bobot.animation monsters\walkers\bulbop\bulbop.animation [NEW] monsters\walkers\bulbop\bulbopleaf.png monsters\walkers\crabcano\crabcano.monstertype monsters\walkers\crutter\crutter.animation monsters\walkers\hypnare\hypnare.animation [NEW] monsters\walkers\hypnare\hypnareleaf.png monsters\walkers\tentacleclam\tentacleclam.monstertype npcs\bmain.lua npcs\story\baron.npctype npcs\story\esther.npctype objects\ancient\hologram2\hologram2.object objects\biome\tentacle\spawner\bossrightspawner.animation objects\biome\tentacle\spawner\bossrightspawner.object objects\biome\tentacle\spawner\bossrightspawner.png [NEW] objects\clues\floran\championspeardisplay\championspeardisplay.frames [NEW] objects\clues\floran\championspeardisplay\championspeardisplay.object [NEW] objects\clues\floran\championspeardisplay\championspeardisplay.png [NEW] objects\clues\floran\championspeardisplay\championspeardisplayicon.png [NEW] objects\clues\floran\floranhunterpainting\floranhunterpainting.frames [NEW] objects\clues\floran\floranhunterpainting\floranhunterpainting.object [NEW] objects\clues\floran\floranhunterpainting\floranhunterpainting.png [NEW] objects\clues\floran\floranhunterpainting\floranhunterpaintingicon.png [NEW] objects\clues\floran\ixolingpike\ixolingpike.frames [NEW] objects\clues\floran\ixolingpike\ixolingpike.object [NEW] objects\clues\floran\ixolingpike\ixolingpike.png [NEW] objects\clues\floran\ixolingpike\ixolingpikeicon.png [NEW] objects\clues\glitch\glitchchess\glitchchess.frames [NEW] objects\clues\glitch\glitchchess\glitchchess.object [NEW] objects\clues\glitch\glitchchess\glitchchess.png [NEW] objects\clues\glitch\glitchchess\glitchchessicon.png objects\clues\glitch\glitchdecree\glitchdecree.png objects\clues\glitch\glitchdecree\glitchdecreeicon.png [NEW] objects\clues\glitch\glitchhorndisplay\glitchhorndisplay.frames [NEW] objects\clues\glitch\glitchhorndisplay\glitchhorndisplay.object [NEW] objects\clues\glitch\glitchhorndisplay\glitchhorndisplay.png [NEW] objects\clues\glitch\glitchhorndisplay\glitchhorndisplayicon.png [NEW] objects\clues\glitch\glitchscribe\glitchscribe.frames [NEW] objects\clues\glitch\glitchscribe\glitchscribe.object [NEW] objects\clues\glitch\glitchscribe\glitchscribe.png [NEW] objects\clues\glitch\glitchscribe\glitchscribeicon.png [NEW] objects\farmables\mothlamp\mothlamp.animation [NEW] objects\farmables\mothlamp\mothlamp.object [NEW] objects\farmables\mothlamp\post.frames [NEW] objects\farmables\mothlamp\post.png [NEW] objects\farmables\mothlamp\posticon.png [NEW] objects\farmables\mothlamp\postlit.frames [NEW] objects\farmables\mothlamp\postlit.png [NEW] objects\mission\floranmission\floranartifactaltar\artifactindicator.png objects\mission\floranmission\floranartifactaltar\floranartifactaltar.animation objects\mission\floranmission\floranartifactaltar\floranartifactaltar.frames objects\mission\floranmission\floranartifactaltar\floranartifactaltar.lua objects\mission\floranmission\floranartifactaltar\floranartifactaltar.object objects\mission\floranmission\floranartifactaltar\floranartifactaltar.png [NEW] objects\mission\hylotlmission\hylotlartifactaltar\artifactindicator.png objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.animation objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.lua objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.object objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.png objects\outpost\infinityexpress\infinityexpress.object objects\outpost\terramart\terramart.object [NEW] objects\scripts\harvestable.lua particles\burningdamagenumber.particle particles\damagenumber.particle particles\electricdamagenumber.particle particles\frozenburningdamagenumber.particle particles\icedamagenumber.particle particles\poisondamagenumber.particle [NEW] particles\explosions\deathpoof\greendeathember.particle [NEW] particles\explosions\deathpoof\greenmonstersplosion.particle [NEW] particles\monsterdeath\bulbopleaf.particle particles\monsterdeath\gleapsplat.particle [NEW] particles\monsterdeath\hypnareleaf.particle plants\trees\ceilingtest\floweryvine\floweryvine.modularstem plants\trees\forestceiling\stems\alpinevine\alpinevine.modularstem plants\trees\forestceiling\stems\colourfulvine\colourfulvine.modularstem plants\trees\forestceiling\stems\darkvine\darkvine.modularstem plants\trees\forestceiling\stems\desertvine\desertvine.modularstem plants\trees\forestceiling\stems\geodevine\geodevine.modularstem plants\trees\forestceiling\stems\hivevine\hivevine.modularstem plants\trees\forestceiling\stems\oasisvine\oasisvine.modularstem plants\trees\forestceiling\stems\purplevine\purplevine.modularstem plants\trees\forestceiling\stems\rootvine\rootvine.modularstem plants\trees\forestceiling\stems\rootvine2\rootvine2.modularstem plants\trees\forestceiling\stems\rootvine3\rootvine3.modularstem plants\trees\forestceiling\stems\shadowvine\shadowvine.modularstem plants\trees\forestceiling\stems\slimevine\slimevine.modularstem plants\trees\forestceiling\stems\snowyvine\snowyvine.modularstem plants\trees\forestceiling\stems\sulphurvine\sulphurvine.modularstem plants\trees\forestceiling\stems\swampvine\swampvine.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 plants\trees\seatrees\stem\kelp\kelp.modularstem plants\trees\seatrees\stem\seaweed\seaweed.modularstem plants\trees\seatrees\stem\toxickelp\toxickelp.modularstem projectiles\boss\dragonboss\dragonbone\dragonbone.projectile projectiles\boss\dragonboss\dragonfoot\dragonfoot.projectile projectiles\boss\dragonboss\dragonhead\dragonhead.projectile [NEW] projectiles\uniquemonster\anglurebulb\anglurebulb.frames [NEW] projectiles\uniquemonster\anglurebulb\anglurebulb.png [NEW] projectiles\uniquemonster\anglurebulb\anglurebulb.projectile quests\quests.config quests\generated\guard.config quests\generated\normal.config quests\generated\villager.config [NEW] quests\generated\templates\kidnapping.questtemplate quests\outpost\old\coldskin2.questtemplate quests\outpost\old\heatskin2.questtemplate quests\outpost\old\outpostmission1.questtemplate quests\outpost\old\penguinmission2.questtemplate quests\outpost\old\penguinmission3.questtemplate [NEW] quests\scripts\artifact.lua quests\scripts\conditions\scanning.lua quests\scripts\generated\kill.lua quests\scripts\tutorial\protectorate.lua quests\story\floran_mission1.questtemplate quests\story\floran_mission2.questtemplate [NEW] quests\story\hylotl_mission1.questtemplate [NEW] quests\story\hylotl_mission2.questtemplate rendering\opengl20.config [NEW] rendering\xboxone.config scripts\spawnpoint.lua scripts\quest\manager.lua scripts\quest\messaging.lua scripts\quest\participant.lua scripts\quest\player.lua scripts\quest\manager\plugin.lua scripts\quest\manager\spawn_entities.lua [NEW] sfx\environmental\vine_cut1.ogg [NEW] sfx\environmental\vine_cut2.ogg [NEW] sfx\environmental\vine_cut3.ogg tiles\materials\brainsblock.png tiles\materials\jellyblock.png treasure\harvest.treasurepools treasure\starter.treasurepools DIFFS ----- behaviors\npc\combat.behavior 2a3 > "description": "", 4a6 > "/scripts/behavior.lua", 6c8 < "/scripts/behavior.lua" --- > "/scripts/behavior/bdata.lua" 128a131,141 > "title": "setEntity", > "type": "action", > "name": "setEntity", > "parameters": { > "entity": "target" > }, > "output": { > "entity": "combatTarget" > } > }, > { 396a410,418 > } > }, > { > "title": "unset", > "type": "action", > "name": "unset", > "parameters": { > "type": "entity", > "key": "combatTarget" behaviors\npc\hostileguard.behavior 2a3 > "description": "", 6c7 < "/npcs/bmain.lua", --- > "/scripts/actions/dialog.lua", 18a20,25 > { > "title": "overrides", > "type": "module", > "name": "overrides", > "parameters": {} > }, behaviors\npc\crew\teleport.behavior 6,10c6 < "/scripts/actions/entities.lua", < "/scripts/actions/position.lua", < "/scripts/actions/status.lua", < "/scripts/actions/time.lua", < "/scripts/actions/movement.lua" --- > "/scripts/actions/entities.lua" 41c37 < "position": "playerPosition" --- > "position": "targetPosition" 45,148c41,44 < "title": "groundPosition", < "type": "action", < "name": "groundPosition", < "parameters": { < "avoidLiquid": true, < "maxHeight": 5, < "minHeight": -5, < "position": "playerPosition" < }, < "output": { < "position": "playerPosition" < } < }, < { < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "camouflage0", < "duration": 20 < } < }, < { < "title": "cleanup", < "type": "composite", < "name": "cleanup", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "blinkout" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 0.5 < } < }, < { < "title": "setPosition", < "type": "action", < "name": "setPosition", < "parameters": { < "footPosition": false, < "position": "playerPosition" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 0.25 < } < } < ] < }, < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": { < "type": "sliding", < "state": "off", < "fromEntity": "attackTarget", < "toEntity": "fleeTarget" < }, < "children": [ < { < "title": "removeEphemeralEffect", < "type": "action", < "name": "removeEphemeralEffect", < "parameters": { < "name": "camouflage0" < } < }, < { < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "blinkin" < } < } < ] < } < ] --- > "title": "npcblink", > "type": "module", > "name": "npcblink", > "parameters": {} behaviors\npc\overrides\override-follow.behavior 3d2 < "description": "", 11,12c10,11 < "/scripts/actions/time.lua", < "/scripts/actions/movement.lua" --- > "/scripts/actions/movement.lua", > "/scripts/actions/time.lua" 14c13,16 < "parameters": {}, --- > "parameters": { > "pathingTimeLimit": 2, > "delayBeforeTeleport": 1 > }, 175c177 < "title": "dynamic", --- > "title": "sequence", 177c179 < "name": "dynamic", --- > "name": "sequence", 181,183c183,185 < "title": "sequence", < "type": "composite", < "name": "sequence", --- > "title": "inverter", > "type": "decorator", > "name": "inverter", 185,202c187,208 < "children": [ < { < "title": "entityInRange", < "type": "action", < "name": "entityInRange", < "parameters": { < "entity": "nearestTarget", < "range": 5, < "position": "self" < } < }, < { < "title": "timer", < "type": "action", < "name": "timer", < "parameters": { < "time": 1 < } --- > "child": { > "title": "isValidTarget", > "type": "action", > "name": "isValidTarget", > "parameters": { > "entity": "combatTarget" > } > } > }, > { > "title": "inverter", > "type": "decorator", > "name": "inverter", > "parameters": {}, > "child": { > "title": "entityInRange", > "type": "action", > "name": "entityInRange", > "parameters": { > "entity": "nearestTarget", > "range": 20, > "position": "self" 204c210 < ] --- > } 212c218 < "success": 2 --- > "success": -1 223c229 < "position": "targetPos" --- > "position": "targetPosition" 227,241c233,342 < "title": "moveToPosition", < "type": "action", < "name": "moveToPosition", < "parameters": { < "avoidLiquid": true, < "failFast": false, < "groundPosition": true, < "maxGround": 5, < "minGround": -5, < "position": "targetPos", < "run": false < }, < "output": { < "direction": "direction", < "pathfinding": "isPathfinding" --- > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": 1 > }, > "children": [ > { > "title": "moveToPosition", > "type": "action", > "name": "moveToPosition", > "parameters": { > "avoidLiquid": true, > "failFast": false, > "groundPosition": true, > "maxGround": 5, > "minGround": -20, > "position": "targetPosition", > "run": true, > "pathOptions": {} > }, > "output": { > "direction": "direction", > "pathfinding": "isPathfinding" > } > }, > { > "title": "failer", > "type": "decorator", > "name": "failer", > "parameters": {}, > "child": { > "title": "dynamic", > "type": "composite", > "name": "dynamic", > "parameters": {}, > "children": [ > { > "title": "parallel", > "type": "composite", > "name": "parallel", > "parameters": { > "fail": 1, > "success": -1 > }, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "isPathfinding" > } > }, > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": "" > } > } > ] > }, > { > "title": "runner", > "type": "action", > "name": "runner", > "parameters": {} > } > ] > } > } > ] > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "timer", > "type": "action", > "name": "timer", > "parameters": { > "time": "" > } > }, > { > "title": "npcblink", > "type": "module", > "name": "npcblink", > "parameters": {} > } > ] > } > ] dialog\quest.config 875a876,891 > }, > "kidnapping" : { > "kidnappersDead" : { > "default" : { > "default" : [ > "You saved me! Thank you hero!" > ] > } > }, > "followHome" : { > "default" : { > "default" : [ > "I'm still frightened. Can you take me home to ?" > ] > } > } dungeons\microdungeons\biomes\forest\playerforest1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\biomes\forest\playerforest2.json [TMX file differences are left out for huge size.] dungeons\missions\tentaclemissions\bossroomtest.json [TMX file differences are left out for huge size.] dungeons\other\naturalcave\naturalcave.dungeon 858c858 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 864,872d863 < "name" : "entrance2a", < "rules" : [ < [ "maxSpawnCount", [0] ], < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] < ], < "def" : [ "image", [ "entrance2a.png", "entrance2a-objects.png" ] ] < }, < < { 876c867 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 885c876 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 894c885 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 903c894 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 912c903 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 921c912 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 930c921 < [ "doNotCombineWith", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] --- > [ "doNotCombineWith", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ] 1147c1138 < [ "doNotCombineWith", [ "entrance2a", "entrance2b", "entrance2c" ] ] --- > [ "doNotCombineWith", [ "entrance2b", "entrance2c" ] ] 1210c1201 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6", "6a", "6b", "6c", "6d", "6e" ] ] --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6", "6a", "6b", "6c", "6d", "6e" ] ] 1220c1211 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], 1231c1222 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], 1242c1233 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], 1253c1244 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], 1264c1255 < [ "doNotConnectToPart", [ "entrance1", "entrance2a", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], --- > [ "doNotConnectToPart", [ "entrance1", "entrance2b", "entrance2c", "entrance3", "entrance4a", "entrance4b", "entrance5", "entrance6" ] ], interface\windowconfig\actionbar.config 32a33,39 > "pickupToActionBar" : { > "type" : "button", > "position" : [269, 32], > "base" : "/interface/actionbar/actionbarpickup.png:unchecked", > "baseImageChecked" : "/interface/actionbar/actionbarpickup.png:checked", > "checkable" : true > }, items\rotting.config 2c2 < "baseTimeToRot" : 3600, --- > "baseTimeToRot" : 10800, 6,7c6,7 < [60, "Almost too rotten to eat"], < [600, "Starting to smell rotten"], --- > [300, "Almost too rotten to eat"], > [900, "Starting to smell rotten"], 9c9 < [86400, "Should keep for awhile"], --- > [10800, "Should keep for awhile"], items\active\weapons\other\exmachina\exmachina.activeitem 93c93 < "projectileType" : "crustoiseshell", --- > "projectileType" : "rocketshell", items\generic\other\valentinechocolates.consumable 11c11 < "rottingMultiplier" : 5.0, --- > "rottingMultiplier" : 5, items\generic\produce\coffeebeans.consumable 13c13 < "rottingMultiplier" : 5.0, --- > "rottingMultiplier" : 5, items\generic\produce\kelp.item 7c7,12 < "shortdescription" : "Kelp" --- > "shortdescription" : "Kelp", > "tooltipKind" : "food", > "builder" : "/items/buildscripts/buildfood.lua", > "maxStack" : 1, > "itemAgingScripts" : ["/scripts/items/rotting.lua"], > "rottingMultiplier" : 5 items\generic\produce\potato.consumable 13c13 < "rottingMultiplier" : 5.0, --- > "rottingMultiplier" : 5, items\generic\produce\rice.consumable 13c13 < "rottingMultiplier" : 25.0, --- > "rottingMultiplier" : 10, items\generic\produce\sugar.item 7a8,9 > "tooltipKind" : "food", > "builder" : "/items/buildscripts/buildfood.lua", 10c12 < "rottingMultiplier" : 25.0, --- > "rottingMultiplier" : 10, items\generic\produce\wheat.item 7a8,9 > "tooltipKind" : "food", > "builder" : "/items/buildscripts/buildfood.lua", 10c12 < "rottingMultiplier" : 25.0, --- > "rottingMultiplier" : 10, items\generic\shop\candy.consumable 12c12 < "rottingMultiplier" : 25.0, --- > "rottingMultiplier" : 10, items\generic\shop\cannedfood.consumable 4c4 < "price" : 50, --- > "price" : 200, 8c8 < "foodValue" : 20, --- > "foodValue" : 50, 13c13 < "rottingMultiplier" : 25.0, --- > "rottingMultiplier" : 10, items\generic\shop\chocolate.consumable 13c13 < "rottingMultiplier" : 5.0, --- > "rottingMultiplier" : 5, monsters\monster.lua 373a374,385 > -- param damageTeam > function setDamageTeam(args, output) > args = parseArgs(args, { > damageTeam = nil > }) > local damageTeam = BData:getTable(args.damageTeam) > if damageTeam == nil then return false end > > monster.setDamageTeam(damageTeam) > return true > end > monsters\crawlers\tentaclecrawler\tentaclecrawler.monstertype 11c11 < "dropPools" : [ { "default" : "crustoiseTreasure", "bow" : "crustoiseHunting" } ], --- > "dropPools" : [ ], monsters\flyers\tentaclebomb\tentaclebomb.monstertype 11c11 < "dropPools" : [ { "default" : "paratailTreasure", "bow" : "paratailHunting" } ], --- > "dropPools" : [ ], monsters\flyers\tentaclegnat\tentaclegnat.monstertype 11c11 < "dropPools" : [ { "default" : "agrobatTreasure", "bow" : "agrobatHunting" } ], --- > "dropPools" : [ ], monsters\flyers\tentaclespawner\tentaclespawner.monstertype 11c11 < "dropPools" : [ { "default" : "agrobatTreasure", "bow" : "agrobatHunting" } ], --- > "dropPools" : [ ], monsters\ghosts\tentacleghost\tentacleghost.monstertype 11c11 < "dropPools" : [ { "default" : "wisperTreasure", "bow" : "wisperHunting" } ], --- > "dropPools" : [ ], monsters\walkers\anglure\anglure.monstertype 18a19 > "deathBehavior" : "monster-death", 80a82,96 > } > } > ], > > "deathActions" : [ > { > "name" : "action-projectile", > "parameters" : { > "projectileCount" : 1, > "projectileType" : "anglurebulb", > "projectileParameters" : {}, > "power" : 0, > "aimDirection" : [1, 1], > "inaccuracy" : 0, > "fireOffset" : [2, 1] monsters\walkers\bobot\bobot.animation 135,143c135,138 < { "particle" : "monstersplosion" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, --- > { "particle" : "electricswoosh1" }, > { "particle" : "electricswoosh2" }, > { "particle" : "electricswoosh1" }, > { "particle" : "electricswoosh2" }, monsters\walkers\bulbop\bulbop.animation 133a134 > { "particle" : "bulbopleaf" }, monsters\walkers\crabcano\crabcano.monstertype 18a19 > "deathBehavior" : "monster-death", 81a83,97 > } > } > ], > > "deathActions" : [ > { > "name" : "action-projectile", > "parameters" : { > "projectileCount" : 1, > "projectileType" : "regularexplosion2", > "projectileParameters" : {}, > "power" : 0, > "aimDirection" : [0, 0], > "inaccuracy" : 0, > "fireOffset" : [0, 0] monsters\walkers\crutter\crutter.animation 116,124c116,124 < { "particle" : "monstersplosion" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, < { "particle" : "deathember" }, --- > { "particle" : "greenmonstersplosion" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, > { "particle" : "greendeathember" }, monsters\walkers\hypnare\hypnare.animation 161a162,165 > { "particle" : "hypnareleaf" }, > { "particle" : "hypnareleaf" }, > { "particle" : "hypnareleaf" }, > { "particle" : "hypnareleaf" }, monsters\walkers\tentacleclam\tentacleclam.monstertype 11c11 < "dropPools" : [ { "default" : "bulbopTreasure", "bow" : "bulbopHunting" } ], --- > "dropPools" : [ ], npcs\bmain.lua 268a269,280 > -- param damageTeam > function setDamageTeam(args, output) > args = parseArgs(args, { > damageTeam = nil > }) > local damageTeam = BData:getTable(args.damageTeam) > if damageTeam == nil then return false end > > npc.setDamageTeam(damageTeam) > return true > end > npcs\story\baron.npctype 62c62 < "Speachless. ..." --- > "Speechless. ..." npcs\story\esther.npctype 20,21c20,21 < "offeredQuests" : [ "floran_mission1", "floran_mission2" ], < "turnInQuests" : [ "floran_mission1" ], --- > "offeredQuests" : [ "floran_mission1", "floran_mission2", "hylotl_mission1", "hylotl_mission2" ], > "turnInQuests" : [ "floran_mission1", "hylotl_mission1" ], objects\ancient\hologram2\hologram2.object 15c15 < "avianDescription" : "This picture of a being destroying worlds rivals the might of Gods.", --- > "avianDescription" : "This picture of a being destroying worlds rivals the might of gods.", objects\biome\tentacle\spawner\bossrightspawner.animation 114c114 < "offset" : [-9.5, -7.0] --- > "offset" : [-9.5, -6.25] 135c135 < "offset" : [-8.625, -6.0] --- > "offset" : [-8.625, -5.25] 156c156 < "offset" : [-7.5, -7.0] --- > "offset" : [-7.5, -6.25] 177c177 < "offset" : [-5.0, -6.0] --- > "offset" : [-5.0, -5.25] 198c198 < "offset" : [-4.5, -3.875] --- > "offset" : [-4.5, -3.175] 219c219 < "offset" : [-2.0, -5.0] --- > "offset" : [-2.0, -4.25] 240c240 < "offset" : [-1.5, -6.0] --- > "offset" : [-1.5, -5.25] 261c261 < "offset" : [5.5, 3.5] --- > "offset" : [5.5, 4.25] 285,286c285,286 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-9.5, -7.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-9.5, -7.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-9.5, -6.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-9.5, -6.25] } 292,293c292,293 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-8.625, -6.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-8.625, -6.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-8.625, -5.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-8.625, -5.25] } 299,300c299,300 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-7.5, -7.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-7.5, -7.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-7.5, -6.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-7.5, -6.25] } 306,307c306,307 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-5.0, -6.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-5.0, -6.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-5.0, -5.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-5.0, -5.25] } 313,314c313,314 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-4.5, -3.875] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-4.5, -3.875] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-4.5, -3.15] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-4.5, -3.15] } 320,321c320,321 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-2.0, -5.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-2.0, -5.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-2.0, -4.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-2.0, -4.25] } 327,328c327,328 < { "count" : 5, "particle" : "tentacleshard", "offset" : [-1.5, -6.0] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-1.5, -6.0] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [-1.5, -5.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [-1.5, -5.25] } 334,335c334,335 < { "count" : 5, "particle" : "tentacleshard", "offset" : [5.5, 3.5] }, < { "count" : 8, "particle" : "tentaclegooshard", "offset" : [5.5, 3.5] } --- > { "count" : 5, "particle" : "tentacleshard", "offset" : [5.5, 4.25] }, > { "count" : 8, "particle" : "tentaclegooshard", "offset" : [5.5, 4.25] } 343c343 < "position" : [-5.0, -6.0], --- > "position" : [-5.0, -5.25], 349c349 < "position" : [5.5, 3.5], --- > "position" : [5.5, 4.25], objects\biome\tentacle\spawner\bossrightspawner.object 39c39 < "offset" : [1.0, 1.0], --- > "offset" : [1.0, 1.75], 44c44 < "offset" : [1.875, 2.0], --- > "offset" : [1.875, 2.75], 49c49 < "offset" : [3.0, 1.0], --- > "offset" : [3.0, 1.75], 54c54 < "offset" : [5.5, 2.0], --- > "offset" : [5.5, 2.75], 59c59 < "offset" : [6.0, 4.125], --- > "offset" : [6.0, 4.875], 64c64 < "offset" : [8.5, 3.0], --- > "offset" : [8.5, 3.75], 69c69 < "offset" : [9.0, 2.0], --- > "offset" : [9.0, 2.75], 74c74 < "offset" : [16.0, 11.5], --- > "offset" : [16.0, 12.25], objects\mission\floranmission\floranartifactaltar\floranartifactaltar.animation 3,22d2 < "stateTypes" : { < "altarState" : { < "default" : "full", < "states" : { < "full" : { < "frames" : 1, < "properties" : { < "particleEmittersOn" : [ "charge" ] < } < }, < "empty" : { < "frames" : 1, < "properties" : { < "particleEmittersOff" : [ "charge" ] < } < } < } < } < }, < 26,41c6,7 < "centered" : true < }, < < "partStates" : { < "altarState" : { < "full" : { < "properties" : { < "image" : ":full." < } < }, < "empty" : { < "properties" : { < "image" : ":empty." < } < } < } --- > "centered" : true, > "image" : "" 57a24 > "active" : true, 83,85d49 < }, < < "sounds" : { objects\mission\floranmission\floranartifactaltar\floranartifactaltar.frames 4,7c4 < "dimensions" : [2, 1], < "names" : [ < [ "full.1", "empty.1" ] < ] --- > "dimensions" : [1, 1] objects\mission\floranmission\floranartifactaltar\floranartifactaltar.lua 2c2 < storage.artifactTaken = storage.artifactTaken or true --- > 5,6c5,7 < function onInteraction() < if not storage.artifactTaken then --- > function onInteraction(args) > if args and args.sourceId then > world.sendEntityMessage(args.sourceId, "triggerArtifactObject", object.name()) 8c9,11 < end \ No newline at end of file --- > local universeFlag = config.getParameter("triggerUniverseFlag") > if universeFlag then world.setUniverseFlag(universeFlag) end > end objects\mission\floranmission\floranartifactaltar\floranartifactaltar.object 7c7 < "description" : "It looks old and altary.", --- > "description" : "It looks like it was made to hold something important.", 11c11 < "category" : "teleporter", --- > "category" : "artifact", 13c13 < "inventoryIcon" : "floranartifactaltar.png:empty.1", --- > "inventoryIcon" : "floranartifactaltar.png", 16c16 < "image" : "floranartifactaltar.png:empty.1", --- > "image" : "floranartifactaltar.png", 29a30 > "questIndicatorPosition" : [0, -2.0], 37c38,40 < "scripts" : [ "floranartifactaltar.lua" ] --- > "scripts" : [ "floranartifactaltar.lua" ], > > "triggerUniverseFlag" : "outpost_mission2" objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.animation 3,22d2 < "stateTypes" : { < "altarState" : { < "default" : "full", < "states" : { < "full" : { < "frames" : 1, < "properties" : { < "particleEmittersOn" : [ "charge" ] < } < }, < "empty" : { < "frames" : 1, < "properties" : { < "particleEmittersOff" : [ "charge" ] < } < } < } < } < }, < 26,41c6,7 < "centered" : true < }, < < "partStates" : { < "altarState" : { < "full" : { < "properties" : { < "image" : ":full." < } < }, < "empty" : { < "properties" : { < "image" : ":empty." < } < } < } --- > "centered" : true, > "image" : "" 51c17 < "color" : [50, 75, 200], --- > "color" : [50, 140, 20], 57a24 > "active" : true, 65c32 < "color" : [80, 110, 210, 230], --- > "color" : [100, 190, 30, 230], 83,85d49 < }, < < "sounds" : { objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.lua 2c2 < storage.artifactTaken = storage.artifactTaken or true --- > 5,6c5,7 < function onInteraction() < if not storage.artifactTaken then --- > function onInteraction(args) > if args and args.sourceId then > world.sendEntityMessage(args.sourceId, "triggerArtifactObject", object.name()) 8c9,11 < end \ No newline at end of file --- > local universeFlag = config.getParameter("triggerUniverseFlag") > if universeFlag then world.setUniverseFlag(universeFlag) end > end objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.object 11c11 < "category" : "teleporter", --- > "category" : "artifact", 13c13 < "inventoryIcon" : "hylotlartifactaltar.png:empty.1", --- > "inventoryIcon" : "hylotlartifactaltar.png", 16c16 < "image" : "hylotlartifactaltar.png:empty.1", --- > "image" : "hylotlartifactaltar.png", 28a29,31 > "turnInQuests" : [ "hylotl_mission2" ], > "questIndicatorPosition" : [0, -2.0], > 35,36c38,41 < "scripts" : [ "hylotlartifactaltar.lua" ] < } --- > "scripts" : [ "hylotlartifactaltar.lua" ], > > "triggerUniverseFlag" : "outpost_mission2" > } \ No newline at end of file objects\outpost\infinityexpress\infinityexpress.object 36c36 < { "item" : "meatballs" }, --- > { "item" : "cannedfood" }, objects\outpost\terramart\terramart.object 30d29 < { "item" : "meatballs" }, particles\burningdamagenumber.particle 7a8 > "fullbright" : true, particles\damagenumber.particle 7a8 > "fullbright" : true, particles\electricdamagenumber.particle 7a8 > "fullbright" : true, particles\frozenburningdamagenumber.particle 7a8 > "fullbright" : true, particles\icedamagenumber.particle 7a8 > "fullbright" : true, particles\poisondamagenumber.particle 7a8 > "fullbright" : true, particles\monsterdeath\gleapsplat.particle 9c9 < "finalVelocity" : [0, -30], --- > "finalVelocity" : [0, -50], plants\trees\ceilingtest\floweryvine\floweryvine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\alpinevine\alpinevine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\colourfulvine\colourfulvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\darkvine\darkvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\desertvine\desertvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\geodevine\geodevine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\hivevine\hivevine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\oasisvine\oasisvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\purplevine\purplevine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\rootvine\rootvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\rootvine2\rootvine2.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\rootvine3\rootvine3.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\shadowvine\shadowvine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\slimevine\slimevine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\snowyvine\snowyvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\sulphurvine\sulphurvine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\swampvine\swampvine.modularstem 11a12,16 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\tarvine\tarvine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\vine\vine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\vine2\vine2.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\vine3\vine3.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\vine4\vine4.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\forestceiling\stems\wildernessvine\wildernessvine.modularstem 9a10,14 > "sounds" : { > "breakTree" : [ > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] > }, plants\trees\seatrees\stem\kelp\kelp.modularstem 10c10 < [ { "item" : "kelp", "count" : 2 } ] --- > [ { "item" : "kelp", "count" : 1 } ] 14,18c14,15 < { "file" : "/sfx/environmental/tree_breaking.ogg" }, < { "file" : "/sfx/environmental/tree_breaking_alt.ogg" } < ], < "hitGround" : [ { "file" : "/sfx/environmental/tree_hitground.ogg" }, { "file" : "/sfx/environmental/tree_hitground2.ogg" } ], < "damageTree" : [ { "file" : "/sfx/tools/axe_chop_normal.ogg" }, { "file" : "/sfx/tools/axe_chop_tough.ogg" }, { "file" : "/sfx/tools/axe_chop_light.ogg" } ] --- > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] plants\trees\seatrees\stem\seaweed\seaweed.modularstem 9c9 < [ { "item" : "logblock", "count" : 3 } ] --- > [ { "item" : "kelp", "count" : 1 } ] 13,17c13,14 < { "file" : "/sfx/environmental/tree_breaking.ogg" }, < { "file" : "/sfx/environmental/tree_breaking_alt.ogg" } < ], < "hitGround" : [ { "file" : "/sfx/environmental/tree_hitground.ogg" }, { "file" : "/sfx/environmental/tree_hitground2.ogg" } ], < "damageTree" : [ { "file" : "/sfx/tools/axe_chop_normal.ogg" }, { "file" : "/sfx/tools/axe_chop_tough.ogg" }, { "file" : "/sfx/tools/axe_chop_light.ogg" } ] --- > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] plants\trees\seatrees\stem\toxickelp\toxickelp.modularstem 10c10 < [ { "item" : "kelp", "count" : 2 } ] --- > [ { "item" : "kelp", "count" : 1 } ] 14,18c14,15 < { "file" : "/sfx/environmental/tree_breaking.ogg" }, < { "file" : "/sfx/environmental/tree_breaking_alt.ogg" } < ], < "hitGround" : [ { "file" : "/sfx/environmental/tree_hitground.ogg" }, { "file" : "/sfx/environmental/tree_hitground2.ogg" } ], < "damageTree" : [ { "file" : "/sfx/tools/axe_chop_normal.ogg" }, { "file" : "/sfx/tools/axe_chop_tough.ogg" }, { "file" : "/sfx/tools/axe_chop_light.ogg" } ] --- > { "file" : "/sfx/environmental/vine_cut1.ogg" }, { "file" : "/sfx/environmental/vine_cut2.ogg" }, { "file" : "/sfx/environmental/vine_cut3.ogg" } > ] projectiles\boss\dragonboss\dragonbone\dragonbone.projectile 48c48,61 < "damageKind" : "default" --- > "damageKind" : "default", > "actionOnCollide" : [ > { > "action" : "sound", > "options" : [ > "/sfx/melee/fist_hit_metal1_quiet.ogg", > "/sfx/melee/fist_hit_metal2_quiet.ogg", > "/sfx/melee/fist_hit_metal3_quiet.ogg", > "/sfx/melee/fist_hit_metal4_quiet.ogg", > "/sfx/melee/fist_hit_metal5_quiet.ogg", > "/sfx/melee/fist_hit_metal6_quiet.ogg" > ] > } > ] projectiles\boss\dragonboss\dragonfoot\dragonfoot.projectile 48c48,61 < "damageKind" : "default" --- > "damageKind" : "default", > "actionOnCollide" : [ > { > "action" : "sound", > "options" : [ > "/sfx/melee/fist_hit_metal1_quiet.ogg", > "/sfx/melee/fist_hit_metal2_quiet.ogg", > "/sfx/melee/fist_hit_metal3_quiet.ogg", > "/sfx/melee/fist_hit_metal4_quiet.ogg", > "/sfx/melee/fist_hit_metal5_quiet.ogg", > "/sfx/melee/fist_hit_metal6_quiet.ogg" > ] > } > ] projectiles\boss\dragonboss\dragonhead\dragonhead.projectile 49c49,59 < "damageKind" : "default" --- > "damageKind" : "default", > "actionOnCollide" : [ > { > "action" : "sound", > "options" : [ > "/sfx/objects/metalbarrel_break1.ogg", > "/sfx/objects/metalbarrel_break2.ogg", > "/sfx/objects/metalbarrel_break3.ogg" > ] > } > ] quests\quests.config 30c30 < "defaultCustomIndicator" : "questrelevant", --- > "defaultCustomIndicator" : "/interface/quests/questrelevant.png", quests\generated\guard.config 82d81 < "spawnOffset" : [1.0, 3.5], quests\generated\normal.config 67d66 < "spawnOffset" : [2.0, 3.5], 158d156 < "spawnOffset" : [2.0, 3.5], quests\generated\villager.config 27d26 < "spawnOffset" : [2.0, 3.5], 60,71c59,75 < "managerPlugins" : [{ < "script" : "/scripts/quest/manager/spawn_entities.lua", < "pluginClass" : "SpawnEntities", < "pluginConfig" : { < "group" : "enemies", < "spawnCount" : 3, < "positionParam" : "spawnPoint", < "spawnOffset" : [2.0, 3.5], < "persistent" : true, < "spawnParameter" : "enemy", < "drops" : "items", < "levelBoost" : 1.0 --- > "managerPlugins" : [ > { > "script" : "/scripts/quest/manager/spawn_entities.lua", > "pluginClass" : "SpawnEntities", > "pluginConfig" : { > "group" : "enemies", > "spawnCount" : 3, > "positionParam" : "spawnPoint", > "persistent" : true, > "spawnParameter" : "enemy", > "drops" : "items", > "levelBoost" : 1.0, > > "setParameter" : "enemy%s", > "participantDef" : { > } > } 73c77 < }], --- > ], 85a90,186 > ] > }, > > "testing_kidnapping" : { > "templateId" : "kidnapping.generated", > "difficulty" : 0.5, > "participants" : { > "questGiver" : { > "turnInQuest" : true, > "behaviorOverrides" : [ > { > "type" : "notification", > "behavior" : { > "name" : "quest-kidnapping-questgiver-notification" > } > } > ] > } > }, > > "managerPlugins" : [ > { > "script" : "/scripts/quest/manager/spawn_entities.lua", > "pluginClass" : "SpawnEntities", > "pluginConfig" : { > "group" : "enemies", > "spawnCount" : 3, > "positionParam" : "spawnPoint", > "persistent" : true, > "spawnParameter" : "enemy", > "levelBoost" : 1.0, > > "setParameter" : "enemy%s", > "participantDef" : { > "behaviorOverrides" : [{ > "type" : "follow", > "target" : "victim" > }] > } > } > }, > { > "script" : "/scripts/quest/manager/spawn_entities.lua", > "pluginClass" : "SpawnEntities", > "pluginConfig" : { > "group" : "victims", > "spawnCount" : 1, > "positionParam" : "spawnPoint", > "persistent" : true, > > "entityType" : "npc", > "species" : "human", > "typeName" : "villager", > "parameters" : { > "damageTeamType" : "assistant" > }, > > "setParameter" : "victim", > "participantDef" : { > "critical" : true, > "behaviorOverrides" : [ > { > "type" : "follow", > "target" : "enemy1" > }, > { > "type" : "follow", > "target" : "player" > }, > { > "type" : "follow", > "target" : "questGiver" > }, > { > "type" : "notification", > "behavior" : { > "name" : "quest-kidnapping-notification" > } > }, > { > "type" : "idle", > "behavior" : { > "name" : "quest-kidnapping-idle" > } > } > ] > } > } > } > ], > > "preconditions" : [ > ["tagSet", "locationTags", ["test"]], > ["findLocation", "spawnPoint", "locationTags"], > ["isNpcThreat", "locationTags", "enemy"] > ], > "postconditions" : [ quests\outpost\old\coldskin2.questtemplate 16c16 < "associatedMission" : "mission3", --- > "associatedMission" : "missionfloran1", quests\outpost\old\heatskin2.questtemplate 18c18 < "associatedMission" : "mission4", --- > "associatedMission" : "missionpenguin2", quests\outpost\old\outpostmission1.questtemplate 18c18 < "associatedMission" : "mission1", --- > "associatedMission" : "missionhuman1", quests\outpost\old\penguinmission2.questtemplate 17c17 < "associatedMission" : "mission2", --- > "associatedMission" : "missionpenguin1", quests\outpost\old\penguinmission3.questtemplate 20c20 < "associatedMission" : "mission2", --- > "associatedMission" : "missionpenguin1", quests\scripts\conditions\scanning.lua 11a12,38 > function scanObjectsCondition:onQuestStart() > -- check for any objects the player may already be carrying > for objectName, value in pairs(self.objectValues) do > if player.hasItem({name = objectName, count = 1}) then > storage.scannedObjects[objectName] = value > end > end > self:computeTotal() > if self:conditionMet() then > if self.radioMessages.startAlreadyComplete then > player.radioMessage(self.radioMessages.startAlreadyComplete) > end > elseif self.totalValue > 0 then > if self.radioMessages.startWithProgress then > player.radioMessage(self.radioMessages.startWithProgress) > end > end > end > > function scanObjectsCondition:onUpdate() > for _, objectName in pairs(self:remainingObjects()) do > if player.hasItem({name = objectName, count = 1}) then > self:onObjectScanned(nil, nil, objectName) > end > end > end > quests\scripts\generated\kill.lua 5,6c5,8 < self.questClient:setMessageHandler("entitiesDead", onEnemiesDead) < self.questClient:setMessageHandler("entitiesSpawned", onEnemiesSpawned) --- > self.questClient:setMessageHandler("entitiesDead", onEntitiesDead) > self.questClient:setMessageHandler("entitiesSpawned", onEntitiesSpawned) > > storage.enemyGroupCount = storage.enemyGroupCount or 0 9c11 < function onEnemiesDead(_, _, group) --- > function onEntitiesDead(_, _, group) 11c13,23 < storage.enemiesDead = true --- > storage.enemyGroupCount = storage.enemyGroupCount - 1 > if storage.enemyGroupCount <= 0 then > storage.enemiesDead = true > > local notificationType = config.getParameter("enemiesDeadNotification") > if notificationType then > for _,victim in pairs(storage.victims or {}) do > notifyNpc(victim.uniqueId, notificationType) > end > end > end 14,20c26,39 < function onEnemiesSpawned(_, _, group, enemies) < if group ~= "enemies" then return end < local enemyParameters = jarray() < for i, enemy in pairs(enemies) do < local parameter = "enemyEntity" .. tostring(i) < quest.setParameter(parameter, enemy) < table.insert(enemyParameters, parameter) --- > function onEntitiesSpawned(_, _, group, entities) > if group == "victims" then > storage.victims = entities > > elseif group == "enemies" then > storage.enemyGroupCount = storage.enemyGroupCount + 1 > > local enemyParameters = jarray() > for i, enemy in pairs(entities) do > local parameter = "enemyEntity" .. tostring(i) > quest.setParameter(parameter, enemy) > table.insert(enemyParameters, parameter) > end > setIndicators(enemyParameters) 22d40 < setIndicators(enemyParameters) quests\scripts\tutorial\protectorate.lua 84c84 < player.sortItems() --- > -- player.sortItems() quests\story\floran_mission1.questtemplate 4,5c4,5 < "text" : "Can you go out and find clues to the location of the ^orange;Floran Artifact^white;, dear?", < "completionText" : "The clues have lead me to believe the Artifact is at a ^orange;Floran Hunting Ceremony^white;! Here are the co-ordinates, dear!", --- > "text" : "Can you ^green;go out and find clues to the location of the ^orange;Floran Artifact^white;, dear?", > "completionText" : "My research leads me to believe the Artifact is the prize for a ^orange;Floran Hunting Ceremony^white;! Hopefully you aren't too late to enter the competition, dear!", 21,23c21,40 < "outpostlight" : 1, < "ancientpillar" : 1, < "terramart" : 1 --- > "floranbonedisplay1" : 2, > "floranbonedisplay2" : 4, > "floranbookcase" : 4, > "floranpainting1" : 2, > "floranpainting2" : 4, > "floranpainting3" : 2, > "floranscreen2" : 2, > "huntingdisplay1" : 3, > "huntingbigstatue" : 5, > "huntingstatue" : 3, > "huntingtrophy1" : 2, > "huntingtrophy2" : 2, > "huntingtrophy3" : 2, > "huntingweaponrack1" : 2, > "plantpanel" : 4, > "planturn1" : 2, > "planturn2" : 1, > "championspeardisplay" : 20, > "floranhunterpainting" : 20, > "ixolingpike" : 20 25c42 < "targetValue" : 3, --- > "targetValue" : 60, 28c45 < "terramart" : { --- > "championspeardisplay" : { 32,33c49,58 < "senderName" : "[Esther]", < "text" : "Of course! Terramart was always the key to this.", --- > "senderName" : "Esther", > "text" : "Traditional Floran culture places great importance on their hunts and their hunters, doesn't it? Good find, dear.", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > "floranhunterpainting" : { > "messageId" : "floran_mission1_up2", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "This picture of a Floran hunter shows them in a strange horned outfit. I wonder if that could narrow down a location...", 42,43c67,68 < "senderName" : "[Esther]", < "text" : "Hmmm... that's interesting! See what else you can find.", --- > "senderName" : "Esther", > "text" : "Hmmm... That's interesting! See what else you can find.", 50,51c75,140 < "senderName" : "[Esther]", < "text" : "Another piece of this twisted puzzle falls into place.", --- > "senderName" : "Esther", > "text" : "A curious find, but helpful nonetheless!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp3", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "Floran culture sure is fascinating. Good find, dear!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp4", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "I'm sure this can help, even if a little!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp5", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "The Floran people sure are an excitable bunch!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp6", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "Nice find, dear!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp7", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "Interesting find! Keep going, you're doing well!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp8", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "How peculiar!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp9", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "You might think this might not be of use to me, but you'd be wrong!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > { > "messageId" : "floran_mission1_gp10", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "You can find useful information from anything if you know where to look!", 54a144,159 > "startWithProgress" : { > "messageId" : "floran_mission1_swp", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "It looks like you've already found some items that might give us clues. I'll begin my analysis while you search for more!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, > "startAlreadyComplete" : { > "messageId" : "floran_mission1_sac", > "type" : "quest", > "unique" : false, > "senderName" : "Esther", > "text" : "Wow, you're quite the collector of Floran antiquities! You already have enough informative trinkets to help me find the location of the Artifact! Well done, dear!", > "portraitImage" : "/interface/chatbubbles/esthertalk.png:" > }, 60c165 < "text" : "Great, this should tell us everything we need to know!", --- > "text" : "Wonderful - I believe I now know just where the Artifact might be! ^#71f2f6;Come and meet me back at the Ark when you're ready^white;, dear.", quests\story\floran_mission2.questtemplate 4,5c4,5 < "title" : "^orange;Hunt for the Floran Artifact", < "text" : "^green;I should travel to the ^orange;Floran Hunting Ceremony^green; using SAIL^white;. The ^orange;Artifact^white; will be there.", --- > "title" : "^orange;The Floran Hunting Ceremony", > "text" : "^green;I should travel to the ^orange;Floran Hunting Ceremony^green; using SAIL^white;. The ^orange;Artifact^white; will no doubt be there.", 16c16 < "script" : "/quests/scripts/main.lua", --- > "script" : "/quests/scripts/artifact.lua", 18,19c18,21 < "associatedMission" : "mission3", < "requireTurnIn" : true --- > "associatedMission" : "missionfloran1", > > "artifactObject" : "floranartifactaltar", > "artifactImage" : "/objects/mission/floranmission/floranartifactaltar/artifactindicator.png" rendering\opengl20.config 8,14d7 < "lightMap" : { < "type" : "texture", < "uniform" : "lightMap", < "textureSizeUniform" : "lightMapSize", < "textureAddressing" : "clamp", < "textureFiltering" : "linear" < }, 28a22,30 > } > }, > > "effectTextures" : { > "lightMap" : { > "textureUniform" : "lightMap", > "textureSizeUniform" : "lightMapSize", > "textureAddressing" : "clamp", > "textureFiltering" : "linear" scripts\spawnpoint.lua 1a2 > require("/scripts/rect.lua") 7a9,14 > local function canStandAt(boundBox) > local collidesHere = world.rectTileCollision(boundBox, {"Block", "Null"}) > local collidesBelow = world.rectTileCollision(rect.translate(boundBox, {0, -1}), {"Block", "Platform", "Dynamic"}) > return not collidesHere and collidesBelow > end > 21,23c28,29 < local collidesHere = world.rectTileCollision(makeSpawnRect(x, y, rectWidth, rectHeight), {"Block", "Null"}) < local collidesBelow = world.rectTileCollision(makeSpawnRect(x, y-1, rectWidth, rectHeight), {"Block", "Null", "Platform", "Dynamic"}) < return not collidesHere and collidesBelow --- > local boundBox = makeSpawnRect(x, y, rectWidth, rectHeight) > return canStandAt(boundBox) 35a42,82 > return nil > end > > -- Return a position where an entity with the given boundBox can stand without > -- colliding with any tiles. > function findSpaceInRect(region, boundBox) > function checkPosition(x, y) > local translatedBox = rect.translate(boundBox, {x, y}) > local ll = rect.ll(translatedBox) > local ur = rect.ur(translatedBox) > return rect.contains(region, ll) and rect.contains(region, ur) and canStandAt(translatedBox) > end > > local innerRegion = {math.ceil(region[1] - boundBox[1]), math.ceil(region[2] - boundBox[2]), math.floor(region[3] - boundBox[3]), math.floor(region[4] - boundBox[4])} > > if innerRegion[1] >= innerRegion[3] or innerRegion[2] >= innerRegion[4] then > return nil > end > > for i = 1, 5 do > local x = math.random(innerRegion[1], innerRegion[3]) > local initialY = math.random(innerRegion[2], innerRegion[4]) > for y = initialY, initialY-5, -1 do > if checkPosition(x, y) then > return {x, y} > end > end > end > > local validPositions = {} > for x = innerRegion[1], innerRegion[3] do > for y = innerRegion[2], innerRegion[4] do > if checkPosition(x,y) then > table.insert(validPositions, {x, y}) > end > end > end > if #validPositions > 0 then > return validPositions[math.random(#validPositions)] > end > scripts\quest\manager.lua 0a1 > require("/scripts/set.lua") 78a80,90 > function QuestManager:setQuestParameter(questId, paramName, paramValue) > local arc = self:arc() > for _,questDesc in pairs(arc.quests) do > if questDesc.questId == questId then > questDesc.parameters[paramName] = paramValue > break > end > end > self.data.arc = storeQuestArcDescriptor(arc) > end > 107c119,121 < self.outbox:sendMessage(player, questId .. "." .. message, ...) --- > if questId then > self.outbox:sendMessage(player, questId .. "." .. message, ...) > end 176,177d189 < local criticalSet = {} < 182,183c194,195 < for name,participantDef in pairs(participants[questId]) do < local uniqueId = questDesc.parameters[name].uniqueId --- > for paramName,participantDef in pairs(participants[questId]) do > local uniqueId = questDesc.parameters[paramName].uniqueId 185,209c197 < self.data.participants[uniqueId] = self.data.participants[uniqueId] or { < roles = {}, < turnInQuests = {}, < offerQuest = nil, < behaviorOverrides = {}, < participateIn = {}, < stateDeltas = {} < } < < local participant = self.data.participants[uniqueId] < < participant.roles[questId] = name < if participantDef.turnInQuest then < participant.turnInQuests[#participant.turnInQuests+1] = questId < end < if participantDef.offerQuest then < participant.offerQuest = self.data.arc < end < participant.behaviorOverrides[questId] = participantDef.behaviorOverrides or {} < participant.participateIn[questId] = true < participant.stateDeltas[questId] = participantDef.stateDeltas or {} < < if participantDef.critical then < criticalSet[uniqueId] = true < end --- > self:reserveParticipant(questId, uniqueId, participantDef, paramName) 212,217d199 < < for participant,_ in pairs(criticalSet) do < self.data.criticalParticipants[participant] = self.data.criticalParticipants[participant] or {} < local quests = self.data.criticalParticipants[participant] < quests[#quests+1] = questId < end 218a201 > end 220,225c203,235 < for uniqueId, role in pairs(self.data.participants) do < self.outbox.contactList:registerWorldEntity(uniqueId) < self.outbox:sendMessage(uniqueId, "reserve", self.uniqueId, self:arc(), role) < if role.offerQuest then < self.data.offering = true < end --- > function QuestManager:reserveParticipant(questId, uniqueId, participantDef, paramName) > participantDef = participantDef or {} > > self.data.participants[uniqueId] = self.data.participants[uniqueId] or { > turnInQuests = {}, > offerQuest = nil, > behaviorOverrides = {}, > participateIn = {}, > stateDeltas = {} > } > > local participant = self.data.participants[uniqueId] > > if participantDef.turnInQuest then > participant.turnInQuests[#participant.turnInQuests+1] = questId > end > if participantDef.offerQuest then > participant.offerQuest = self.data.arc > end > participant.behaviorOverrides[questId] = participantDef.behaviorOverrides or {} > participant.participateIn[questId] = true > participant.stateDeltas[questId] = participantDef.stateDeltas or {} > > if participantDef.critical then > self.data.criticalParticipants[uniqueId] = self.data.criticalParticipants[uniqueId] or {} > local quests = self.data.criticalParticipants[uniqueId] > quests[#quests+1] = questId > end > > self.outbox.contactList:registerWorldEntity(uniqueId) > self.outbox:sendMessage(uniqueId, "reserve", self.uniqueId, self:arc(), participant) > if participant.offerQuest then > self.data.offering = true 309a320,322 > if not set.new(util.toList(self.data.playerStarted))[questId] then > self.plugins:questStarted(questId) > end 312,313d324 < self:sendToParticipants("playerStarted", player, questId) < self:resetExpiration() 314a326,327 > self:sendToParticipants("playerStarted", player, questId, self:questParameters(questId)) > self:resetExpiration() scripts\quest\messaging.lua 59,61c59,63 < self.contacts[uniqueId] = { < player = true < } --- > if not self.contacts[uniqueId] then > self.contacts[uniqueId] = { > player = true > } > end 65c67,69 < self.contacts[uniqueId] = {} --- > if not self.contacts[uniqueId] then > self.contacts[uniqueId] = {} > end scripts\quest\participant.lua 154d153 < -- roles : [String], 186a186,191 > function QuestParticipant:setQuestParameters(questId, parameters) > local questDesc = loadQuestDescriptor(self.data.quests[questId]) > questDesc.parameters = parameters > self.data.quests[questId] = storeQuestDescriptor(questDesc) > end > 285c290 < function QuestParticipant:playerStartedHandler(stagehand, player, questId) --- > function QuestParticipant:playerStartedHandler(stagehand, player, questId, updatedParameters) 288a294,295 > > self:setQuestParameters(questId, updatedParameters) scripts\quest\player.lua 13,16c13,18 < self.contacts[uniqueId] = { < server = serverUuid or player.serverUuid(), < world = worldId or player.worldId() < } --- > if not self.contacts[uniqueId] then > self.contacts[uniqueId] = { > server = serverUuid or player.serverUuid(), > world = worldId or player.worldId() > } > end scripts\quest\manager\plugin.lua 16a17,19 > function QuestPlugin:questStarted() > end > 87a91 > QuestPluginManager.questStarted = filteredPluginCall("questStarted") scripts\quest\manager\spawn_entities.lua 10a11,13 > self.data.entitiesNeedReserving = self.data.entitiesNeedReserving or false > self.data.entitiesAvailable = self.data.entitiesAvailable or false > self.entityIds = {} 17a21,27 > if not self.data.entitiesAvailable then > for uniqueId,_ in pairs(self.data.entities) do > self.questManager.outbox.contactList:setEnabled(uniqueId, true) > end > self.data.entitiesAvailable = true > end > 38c48 < local function spawnEntity(position, spawnConfig) --- > local function spawnEntity(spawnConfig) 43c53 < return world.spawnMonster(spawnConfig.typeName, position, parameters) --- > return world.spawnMonster(spawnConfig.typeName, entity.position(), parameters) 46c56 < return world.spawnNpc(position, spawnConfig.species, spawnConfig.typeName, parameters.level, nil, parameters) --- > return world.spawnNpc(entity.position(), spawnConfig.species, spawnConfig.typeName, parameters.level, nil, parameters) 58,60c68,69 < function SpawnEntities:spawnUnique(position) < < local entitySpawnConfig = { position = position } --- > function SpawnEntities:spawnUnique() > local entitySpawnConfig = { } 82c91 < local entityId = spawnEntity(position, entitySpawnConfig) --- > local entityId = spawnEntity(entitySpawnConfig) 98a108,111 > > self.justSpawned = true > self.data.entitiesNeedReserving = entitySpawnConfig.entityType == "npc" > self.data.entitiesAvailable = entitySpawnConfig.entityType ~= "npc" 102c115,116 < function SpawnEntities:spawnPosition() --- > -- Find a position for an entity with the given space requirements > function SpawnEntities:findPosition(boundBox) 114a129,130 > options.rectWidth = boundBox[3] - boundBox[1] > options.rectHeight = boundBox[4] - boundBox[2] 117c133 < return vec2.add(positions[math.random(#positions)], self.config.spawnOffset) --- > return vec2.sub(positions[math.random(#positions)], {boundBox[1], boundBox[2]}) 124c140,141 < return randomPositionInRect(positionParam.region, self.config.spawnOffset) --- > local position = findSpaceInRect(positionParam.region, boundBox) > if position then return position end 133a151,185 > function SpawnEntities:questStarted() > self.entityIds = {} > self.data.entities = {} > local entityCount = 0 > for i = 1, (self.config.spawnCount or 1) do > local uniqueId, entityId = self:spawnUnique() > > local boundBox = world.callScriptedEntity(entityId, "mcontroller.boundBox") > local position = self:findPosition(boundBox) > world.callScriptedEntity(entityId, "mcontroller.setPosition", position) > > self.data.entities[uniqueId] = true > self.entityIds[uniqueId] = entityId > entityCount = entityCount + 1 > > if self.config.setParameter then > local entityParam = self:entityParam(uniqueId) > local paramName = string.format(self.config.setParameter, entityCount) > self.questManager:setQuestParameter(self.questId, paramName, entityParam) > end > end > end > > function SpawnEntities:entityParam(uniqueId) > local entityId = self.entityIds[uniqueId] or world.loadUniqueEntity(uniqueId) > if not world.entityExists(entityId) then return nil end > > return { > type = "entity", > uniqueId = uniqueId, > name = self:entityParamName() or world.entityName(entityId), > portrait = world.entityPortrait(entityId, "full") > } > end > 137,144c189,195 < local entityIds = {} < if not self.data.entities then < self.data.entities = {} < local position = self:spawnPosition() < for i = 1, (self.config.spawnCount or 1) do < local uniqueId, entityId = self:spawnUnique(position) < self.data.entities[uniqueId] = true < entityIds[uniqueId] = entityId --- > assert(self.data.entities ~= nil) > > if self.data.entitiesNeedReserving then > for uniqueId,_ in pairs(self.data.entities) do > self.questManager.outbox.contactList:registerWorldEntity(uniqueId) > self.questManager.outbox.contactList:setEnabled(uniqueId, false) > self.questManager:reserveParticipant(self.questId, uniqueId, self.config.participantDef) 146c197 < self.justSpawned = true --- > self.data.entitiesNeedReserving = false 149c200 < local enemyParams = {} --- > local entityParams = {} 151,159c202,204 < local entityId = entityIds[uniqueId] or world.loadUniqueEntity(uniqueId) < if world.entityExists(entityId) then < local enemyParam = { < type = "entity", < uniqueId = uniqueId, < name = self:entityParamName() or world.entityName(entityId), < portrait = world.entityPortrait(entityId, "full") < } < enemyParams[#enemyParams+1] = enemyParam --- > local entityParam = self:entityParam(uniqueId) > if entityParam then > table.insert(entityParams, entityParam) 162c207,208 < self.questManager:sendToPlayer(player, "entitiesSpawned", self.config.group, enemyParams) --- > > self.questManager:sendToPlayer(player, "entitiesSpawned", self.config.group, entityParams) treasure\harvest.treasurepools 643a644,656 > ], > > "silkHarvest" : [ > [0, { > "pool" : [ > {"weight" : 1.0, "item" : "silk"} > ], > "poolRounds" : [ > [0.33, 1], > [0.34, 2], > [0.33, 3] > ] > } ] treasure\starter.treasurepools 8c8,9 < {"item" : [ "meatballs", 1 ]} --- > {"item" : [ "cannedfood", 1 ]}, > {"item" : [ "cannedfood", 1 ]}