FILES ----- player.config ai\enableteleporter.aicommand behaviors\npc\idle.behavior behaviors\npc\tenant.behavior [NEW] behaviors\npc\overrides\override-flee.behavior [NEW] behaviors\npc\overrides\override-follow.behavior [NEW] behaviors\npc\overrides\override-idle.behavior [NEW] behaviors\npc\overrides\overrides.behavior [NEW] behaviors\npc\quests\quest-steal.behavior [NEW] dialog\quest.config [NEW] interface\quests\mainquestgiver.png [NEW] interface\quests\mainquestreceiver.png [NEW] interface\quests\questrelevant.png interface\quests\newquest\details.png [NEW] interface\quests\newquest\portraitbackground.png [NEW] interface\quests\questfailed\questfailed.png interface\windowconfig\newquest.config interface\windowconfig\questcomplete.config [NEW] interface\windowconfig\questfailed.config interface\windowconfig\questlog.config [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\default.frames [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\electricspinswoosh.png [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\elementalspin.altability [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\elementalspin.lua [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\firespinswoosh.png [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\icespinswoosh.png [NEW] items\active\weapons\melee\altabilities\spear\elementalspin\poisonspinswoosh.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\default.frames [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\electricrocketcharge.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\firerocketcharge.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\icerocketcharge.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\poisonrocketcharge.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\rocketcharge.png [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.altability [NEW] items\active\weapons\melee\altabilities\spear\rocketspear\rocketspear.lua items\active\weapons\melee\spear\rarespear.activeitem npcs\base.npctype npcs\bmain.lua npcs\guard.npctype npcs\merchant.npctype npcs\merchantpools.config npcs\tutorial.npctype npcs\villageguard.npctype npcs\villager.npctype npcs\biome\frogvillager.npctype npcs\biome\savannahvillager.npctype npcs\biome\shadowvillager.npctype objects\colony\colonydeed\colonydeed.lua objects\colony\colonydeed\colonydeed.object objects\colony\colonydeed\scanning.lua [NEW] objects\generic\mechanicalelevator\mechanicalelevator.animation [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlong.object [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlongbottom.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlongicon.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlongstand.frames [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlongstand.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorlongtop.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshort.object [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshortbottom.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshorticon.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshortstand.frames [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshortstand.png [NEW] objects\generic\mechanicalelevator\mechanicalelevatorshorttop.png [NEW] objects\generic\mechanicalelevator\platform.png [NEW] objects\generic\steelelevator\platform.png [NEW] objects\generic\steelelevator\steelelevator.animation [NEW] objects\generic\steelelevator\steelelevatorlong.object [NEW] objects\generic\steelelevator\steelelevatorlongbottom.png [NEW] objects\generic\steelelevator\steelelevatorlongicon.png [NEW] objects\generic\steelelevator\steelelevatorlongstand.png [NEW] objects\generic\steelelevator\steelelevatorlongtop.png [NEW] objects\generic\steelelevator\steelelevatorshort.object [NEW] objects\generic\steelelevator\steelelevatorshortbottom.png [NEW] objects\generic\steelelevator\steelelevatorshorticon.png [NEW] objects\generic\steelelevator\steelelevatorshortstand.png [NEW] objects\generic\steelelevator\steelelevatorshorttop.png objects\generic\woodenelevator\woodenelevatorlong.object [NEW] objects\generic\woodenelevator\woodenelevatorlongicon.png objects\generic\woodenelevator\woodenelevatorshort.object [NEW] objects\generic\woodenelevator\woodenelevatorshorticon.png objects\wired\movingplatform\movingelevatorlong.object objects\wired\movingplatform\movingelevatorshort.object [NEW] projectiles\swoosh\spear\spinswoosh\default.frames [NEW] projectiles\swoosh\spear\spinswoosh\electricspinswoosh.png [NEW] projectiles\swoosh\spear\spinswoosh\electricspinswoosh.projectile [NEW] projectiles\swoosh\spear\spinswoosh\firespinswoosh.png [NEW] projectiles\swoosh\spear\spinswoosh\firespinswoosh.projectile [NEW] projectiles\swoosh\spear\spinswoosh\icespinswoosh.png [NEW] projectiles\swoosh\spear\spinswoosh\icespinswoosh.projectile [NEW] projectiles\swoosh\spear\spinswoosh\poisonspinswoosh.png [NEW] projectiles\swoosh\spear\spinswoosh\poisonspinswoosh.projectile quests\ftlrepairmain.questtemplate quests\fuel.questtemplate quests\quests.config quests\food\firstcrops.questtemplate quests\food\hoe.questtemplate quests\food\wateringcan.questtemplate [NEW] quests\generated\comfort.config [NEW] quests\generated\control.config [NEW] quests\generated\protection.config [NEW] quests\generated\subquests.config [NEW] quests\generated\comfort\add_object_to_house.questtemplate [NEW] quests\generated\pools\clothing.config [NEW] quests\generated\pools\cookedfood.config [NEW] quests\generated\pools\farmable.config [NEW] quests\generated\pools\furniture.config [NEW] quests\generated\pools\furnituresets.config [NEW] quests\generated\pools\pools.config [NEW] quests\generated\pools\weapon.config [NEW] quests\generated\protection\collect_fine.questtemplate [NEW] quests\generated\subquests\bribe.questtemplate [NEW] quests\generated\subquests\build_home.questtemplate [NEW] quests\generated\subquests\collect_for_safekeeping.questtemplate [NEW] quests\generated\subquests\collect_gift.questtemplate [NEW] quests\generated\subquests\cooking.questtemplate [NEW] quests\generated\subquests\craft.questtemplate [NEW] quests\generated\subquests\extort.questtemplate [NEW] quests\generated\subquests\farming.questtemplate [NEW] quests\generated\subquests\fetch.questtemplate [NEW] quests\generated\subquests\gift.questtemplate [NEW] quests\generated\subquests\intimidate.questtemplate [NEW] quests\generated\subquests\reward.questtemplate [NEW] quests\generated\subquests\share_secret.questtemplate [NEW] quests\generated\subquests\spread_rumors.questtemplate [NEW] quests\generated\subquests\steal.questtemplate quests\outpost\coldskin1.questtemplate quests\outpost\coldskin2.questtemplate quests\outpost\coldskin3.questtemplate quests\outpost\heatskin1.questtemplate quests\outpost\heatskin2.questtemplate quests\outpost\kelpquest.questtemplate quests\outpost\outpost0.questtemplate quests\outpost\outpost1.questtemplate quests\outpost\outpostmission1.questtemplate quests\outpost\outpostskin.questtemplate quests\outpost\penguinmission.questtemplate quests\outpost\penguinmission2.questtemplate quests\outpost\penguinmission3.questtemplate quests\outpost\endgame\avianrefugeee1.questtemplate quests\outpost\endgame\avianrefugeee2.questtemplate quests\outpost\endgame\examplequest.questtemplate quests\outpost\endgame\humanscientiste1.questtemplate quests\outpost\endgame\hylotlperformere1.questtemplate quests\outpost\endgame\hylotlperformere2part1.questtemplate quests\outpost\endgame\hylotlperformere2part2.questtemplate quests\outpost\endgame\hylotlwarriore1.questtemplate quests\outpost\endgame\hylotlwarriore2.questtemplate quests\outpost\endgame\penguinpromotere1.questtemplate quests\outpost\phase1optional\bountyhunter1.questtemplate quests\outpost\phase1optional\floranfan1.questtemplate quests\outpost\phase1optional\humanscientist1.questtemplate quests\outpost\phase1optional\hylotlperformer1.questtemplate quests\outpost\phase1optional\radardish1.questtemplate quests\outpost\phase1optional\underside1.questtemplate quests\outpost\phase2optional\apexmechanic2.questtemplate quests\outpost\phase2optional\avianrefugee2part1.questtemplate quests\outpost\phase2optional\avianrefugee2part2.questtemplate quests\outpost\phase2optional\bountyhunter2.questtemplate quests\outpost\phase2optional\floranscholar2.questtemplate quests\outpost\phase2optional\glitchsilenttype2.questtemplate quests\outpost\phase2optional\humanexcon2.questtemplate quests\outpost\phase2optional\humansurvivor2.questtemplate quests\outpost\phase3optional\avianexplorer3.questtemplate quests\outpost\phase3optional\bountyhunter3.questtemplate quests\outpost\phase3optional\glitchsilenttype3.questtemplate quests\outpost\phase3optional\hylotlperformer3.questtemplate quests\outpost\phase4optional\apexrefugee4.questtemplate quests\outpost\phase4optional\avianexplorer4.questtemplate quests\outpost\phase4optional\avianmercenary4.questtemplate quests\outpost\phase4optional\bountyhunter4.questtemplate quests\outpost\phase4optional\floranhunter4.questtemplate quests\outpost\phase4optional\humanexcon4.questtemplate quests\outpost\shipupgrade\license1.questtemplate quests\outpost\shipupgrade\license2.questtemplate quests\outpost\shipupgrade\license3.questtemplate quests\outpost\shipupgrade\license4.questtemplate quests\outpost\shipupgrade\license5.questtemplate [NEW] quests\scripts\main.lua [NEW] quests\scripts\conditions\gather.lua [NEW] quests\scripts\conditions\player.lua [NEW] quests\scripts\conditions\ship.lua [NEW] quests\scripts\generated\add_object_to_house.lua [NEW] quests\scripts\generated\build_home.lua [NEW] quests\scripts\generated\collect_fine.lua [NEW] quests\scripts\generated\common.lua [NEW] quests\scripts\generated\fetch.lua [NEW] quests\scripts\generated\gift.lua [NEW] quests\scripts\generated\steal.lua quests\tutorial\apextutorial.questtemplate quests\tutorial\aviantutorial.questtemplate quests\tutorial\distressbeacon.questtemplate quests\tutorial\florantutorial.questtemplate quests\tutorial\glitchtutorial.questtemplate quests\tutorial\humantutorial.questtemplate quests\tutorial\hylotltutorial.questtemplate quests\tutorial\novakidtutorial.questtemplate quests\tutorial\tutorial1.questtemplate quests\tutorial\tutorial2.questtemplate quests\tutorial\tutorial3.questtemplate quests\tutorial\tutorial4.questtemplate quests\tutorial\tutorial5.questtemplate quests\tutorial\tutorial6.questtemplate quests\tutorial\tutorial7.questtemplate quests\tutorial\tutorial8.questtemplate [NEW] recipes\craftingtable\woodenelevatorlong.recipe [NEW] recipes\craftingtable\woodenelevatorshort.recipe [NEW] recipes\ironcraftingtable\steelelevatorlong.recipe [NEW] recipes\ironcraftingtable\steelelevatorshort.recipe [NEW] scripts\relationships.lua scripts\tenant.lua scripts\util.lua scripts\actions\dialog.lua scripts\actions\entities.lua [NEW] scripts\actions\overrides.lua scripts\actions\position.lua [NEW] scripts\actions\quests.lua scripts\behavior\bdata.lua [NEW] scripts\quest\manager.lua [NEW] scripts\quest\messaging.lua [NEW] scripts\quest\participant.lua [NEW] scripts\quest\player.lua [NEW] scripts\questgen\context.lua [NEW] scripts\questgen\generator.lua [NEW] scripts\questgen\planner.lua [NEW] scripts\questgen\plannertests.lua [NEW] scripts\questgen\predicands.lua [NEW] scripts\questgen\relations.lua [NEW] scripts\questgen\util.lua [NEW] stagehands\mailbox.lua [NEW] stagehands\mailbox.stagehand [NEW] stagehands\questmanager.lua [NEW] stagehands\questmanager.stagehand DIFFS ----- player.config 49a50,51 > { "item" : "woodenelevatorshort" }, > { "item" : "woodenelevatorlong" }, 183a186,189 > > // STEEL ITEMS > { "item" : "steelelevatorshort" }, > { "item" : "steelelevatorlong" }, ai\enableteleporter.aicommand 18c18 < "questId" : "tutorial1.gearup" --- > "quest" : "tutorial1.gearup" behaviors\npc\idle.behavior 6c6 < "/scripts/actions/notification.lua", --- > "/scripts/actions/math.lua", 8a9,10 > "/scripts/actions/quests.lua", > "/scripts/actions/notification.lua", 19c21 < "title": "sequence", --- > "title": "parallel", 21,22c23,27 < "name": "sequence", < "parameters": {}, --- > "name": "parallel", > "parameters": { > "fail": -1, > "success": -1 > }, 60a66,204 > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "succeeder", > "type": "decorator", > "name": "succeeder", > "parameters": {}, > "child": { > "title": "cooldown", > "type": "decorator", > "name": "cooldown", > "parameters": { > "cooldown": 30, > "onFail": true, > "onSuccess": true > }, > "child": { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "unsetFlag", > "type": "action", > "name": "unsetFlag", > "parameters": { > "name": "suppressQuestGeneration" > } > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "chance", > "type": "action", > "name": "chance", > "parameters": { > "chance": 0.975 > } > }, > { > "title": "sequence", > "type": "composite", > "name": "sequence", > "parameters": {}, > "children": [ > { > "title": "findStagehand", > "type": "action", > "name": "findStagehand", > "parameters": { > "orderBy": "nearest", > "position": "self", > "range": 50, > "type": "questmanager" > }, > "output": { > "list": "questManagers" > } > }, > { > "title": "listSize", > "type": "action", > "name": "listSize", > "parameters": { > "list": "questManagers" > }, > "output": { > "number": "questManagerCount" > } > }, > { > "title": "greaterThan", > "type": "action", > "name": "greaterThan", > "parameters": { > "first": "questManagerCount", > "second": 2 > } > } > ] > }, > { > "title": "findObject", > "type": "action", > "name": "findObject", > "parameters": { > "position": "self", > "range": 50, > "orderBy": "nearest", > "name": "questgentest" > } > } > ] > }, > { > "title": "setFlag", > "type": "action", > "name": "setFlag", > "parameters": { > "name": "suppressQuestGeneration" > } > } > ] > } > } > }, > { > "title": "selector", > "type": "composite", > "name": "selector", > "parameters": {}, > "children": [ > { > "title": "hasFlag", > "type": "action", > "name": "hasFlag", > "parameters": { > "name": "suppressQuestGeneration" > } > }, > { > "title": "generateQuest", > "type": "action", > "name": "generateQuest", > "parameters": {} > } > ] > } > ] behaviors\npc\tenant.behavior 6,8d5 < "/npcs/bmain.lua", < "/scripts/actions/sensor.lua", < "/scripts/actions/status.lua", 10a8 > "/npcs/bmain.lua", 12c10,11 < "/scripts/tenant.lua" --- > "/scripts/tenant.lua", > "/scripts/actions/status.lua" 22,86c21,24 < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "receivedNotification", < "type": "action", < "name": "receivedNotification", < "parameters": { < "type": "tenant.despawn" < } < }, < { < "title": "setDeathParticleBurst", < "type": "action", < "name": "setDeathParticleBurst", < "parameters": {} < }, < { < "title": "setDropPools", < "type": "action", < "name": "setDropPools", < "parameters": { < "dropPools": [] < } < }, < { < "title": "selector", < "type": "composite", < "name": "selector", < "parameters": {}, < "children": [ < { < "title": "sequence", < "type": "composite", < "name": "sequence", < "parameters": {}, < "children": [ < { < "title": "visibleToPlayer", < "type": "action", < "name": "visibleToPlayer", < "parameters": {} < }, < { < "title": "addEphemeralEffect", < "type": "action", < "name": "addEphemeralEffect", < "parameters": { < "name": "beamoutanddie", < "duration": null < } < } < ] < }, < { < "title": "suicide", < "type": "action", < "name": "suicide", < "parameters": {} < } < ] < } < ] --- > "title": "overrides", > "type": "module", > "name": "overrides", > "parameters": {} interface\windowconfig\newquest.config 51a52,78 > "portraitImage" : { > "type" : "image", > "offset" : [48, 50], > "position" : [9, 94] > }, > "portraitTitle" : { > "type" : "label", > "position" : [32, 87], > "hAnchor" : "mid", > "charLimit" : 12, > "fontSize" : 8, > "value" : "", > "color" : "white" > }, > "objectivePortraitImage" : { > "type" : "image", > "offset" : [25, 10], > "position" : [250, 68] > }, > "objectivePortraitTitle" : { > "type" : "label", > "position" : [245, 68], > "hAnchor" : "right", > "fontSize" : 8, > "value" : "", > "color" : "green" > }, 98c125 < "position" : [9, 128], --- > "position" : [65, 132], 101c128 < "wrapWidth" : 264, --- > "wrapWidth" : 190, interface\windowconfig\questcomplete.config 26a27,53 > "portraitImage" : { > "type" : "image", > "offset" : [48, 50], > "position" : [9, 94] > }, > "portraitTitle" : { > "type" : "label", > "position" : [32, 87], > "hAnchor" : "mid", > "charLimit" : 12, > "fontSize" : 8, > "value" : "", > "color" : "white" > }, > "objectivePortraitImage" : { > "type" : "image", > "offset" : [25, 10], > "position" : [250, 68] > }, > "objectivePortraitTitle" : { > "type" : "label", > "position" : [245, 68], > "hAnchor" : "right", > "fontSize" : 8, > "value" : "", > "color" : "green" > }, 78c105 < "position" : [9, 128], --- > "position" : [65, 132], 81c108 < "wrapWidth" : 264, --- > "wrapWidth" : 190, interface\windowconfig\questlog.config 58c58 < "position" : [164, 66], --- > "position" : [169, 66], 66c66 < "position" : [175, 88], --- > "position" : [180, 88], 70a71,82 > "labelPortraitTitle" : { > "type" : "label", > "position" : [180, 98], > "fontSize" : 8, > "color" : "green" > }, > "imagePortrait" : { > "type" : "image", > "position" : [155, 88], > "scale" : 1.0, > "offset" : [30, 10] > }, 134a147,152 > }, > "imagePortrait" : { > "type" : "image", > "scale" : 1.0, > "offset" : [25, 10], > "position" : [120, 0] items\active\weapons\melee\spear\rarespear.activeitem 116,117c116,119 < "/items/active/weapons/melee/altabilities/generic/blinkexplosion/blinkexplosion.altability", < "/items/active/weapons/melee/altabilities/spear/barrier/barrier.altability" --- > //"/items/active/weapons/melee/altabilities/generic/blinkexplosion/blinkexplosion.altability", > //"/items/active/weapons/melee/altabilities/spear/barrier/barrier.altability", > //"/items/active/weapons/melee/altabilities/spear/elementalspin/elementalspin.altability", > "/items/active/weapons/melee/altabilities/spear/rocketspear/rocketspear.altability" npcs\base.npctype 21a22,31 > "questGenerator" : { > "drives" : ["comfort", "protection", "control"], > "queryCooldown" : 60, > "maxPlanCost" : 5, > // Override enableParticipation in npctypes to enable the quest generator > // and participation in other NPC's quests (if the behavior tree includes > // the 'overrides' behavior module). > "enableParticipation" : false > }, > npcs\bmain.lua 4a5,6 > require "/scripts/quest/participant.lua" > require "/scripts/relationships.lua" 19,20c21,22 < setOfferedQuests() < setTurninQuests() --- > local questOutbox = Outbox.new("questOutbox", ContactList.new("questContacts")) > self.quest = QuestParticipant.new("quest", questOutbox) 43a46,49 > > message.setHandler("notify", function (_, _, notification) > notify(notification) > end) 48a55,56 > self.quest:update() > 73a82,83 > self.quest:fireEvent("interaction", args.sourceId) > 86a97,100 > function die() > self.quest:die() > end > 87a102 > self.quest:uninit() 94,107d108 < end < < function setOfferedQuests() < local offeredQuests = entity.configParameter("offeredQuests") < if type(offeredQuests) == "table" and #offeredQuests > 0 then < entity.setOfferedQuests(offeredQuests) < end < end < < function setTurninQuests() < local turnInQuests = entity.configParameter("turnInQuests") < if type(turnInQuests) == "table" and #turnInQuests > 0 then < entity.setTurnInQuests(turnInQuests) < end npcs\guard.npctype 9a10,13 > "questGenerator" : { > "enableParticipation" : true > }, > 407c411 < } \ No newline at end of file --- > } npcs\merchant.npctype 15a16,19 > "questGenerator" : { > "enableParticipation" : true > }, > npcs\merchantpools.config 214,215c214,215 < { "item" : { "name" : "steelbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "outpostMission1.gearup" } ] }, < { "item" : { "name" : "plutoniumrod" }, "conditions" : [ { "type" : "prerequisite", "quest" : "outpostMission1.gearup" } ] }, --- > { "item" : { "name" : "steelbar" }, "prerequisiteQuest" : "outpostMission1.gearup" }, > { "item" : { "name" : "plutoniumrod" }, "prerequisiteQuest" : "outpostMission1.gearup" }, 217,218c217,218 < { "item" : { "name" : "titaniumbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "penguinmission2.gearup" } ] }, < { "item" : { "name" : "silverbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "penguinmission2.gearup" } ] }, --- > { "item" : { "name" : "titaniumbar" }, "prerequisiteQuest" : "penguinmission2.gearup" }, > { "item" : { "name" : "silverbar" }, "prerequisiteQuest" : "penguinmission2.gearup" }, 220,221c220,221 < { "item" : { "name" : "durasteelbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "coldskin2.gearup" } ] }, < { "item" : { "name" : "diamond" }, "conditions" : [ { "type" : "prerequisite", "quest" : "coldskin2.gearup" } ] }, --- > { "item" : { "name" : "durasteelbar" }, "prerequisiteQuest" : "coldskin2.gearup" }, > { "item" : { "name" : "diamond" }, "prerequisiteQuest" : "coldskin2.gearup" }, 223,227c223,227 < { "item" : { "name" : "refinedaegisalt" }, "conditions" : [ { "type" : "prerequisite", "quest" : "heatskin2.gearup" } ] }, < { "item" : { "name" : "refinedrubium" }, "conditions" : [ { "type" : "prerequisite", "quest" : "heatskin2.gearup" } ] }, < { "item" : { "name" : "refinedviolium" }, "conditions" : [ { "type" : "prerequisite", "quest" : "heatskin2.gearup" } ] }, < { "item" : { "name" : "goldbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "heatskin2.gearup" } ] }, < { "item" : { "name" : "platinumbar" }, "conditions" : [ { "type" : "prerequisite", "quest" : "heatskin2.gearup" } ] } --- > { "item" : { "name" : "refinedaegisalt" }, "prerequisiteQuest" : "heatskin2.gearup" }, > { "item" : { "name" : "refinedrubium" }, "prerequisiteQuest" : "heatskin2.gearup" }, > { "item" : { "name" : "refinedviolium" }, "prerequisiteQuest" : "heatskin2.gearup" }, > { "item" : { "name" : "goldbar" }, "prerequisiteQuest" : "heatskin2.gearup" }, > { "item" : { "name" : "platinumbar" }, "prerequisiteQuest" : "heatskin2.gearup" } 1465c1465 < } \ No newline at end of file --- > } npcs\tutorial.npctype 11a12,15 > "questGenerator" : { > "enableParticipation" : true > }, > npcs\villageguard.npctype 11a12,15 > "questGenerator" : { > "enableParticipation" : true > }, > 678c682 < } \ No newline at end of file --- > } npcs\villager.npctype 10a11,14 > "questGenerator" : { > "enableParticipation" : true > }, > npcs\biome\frogvillager.npctype 10a11,14 > "questGenerator" : { > "enableParticipation" : true > }, > npcs\biome\savannahvillager.npctype 10a11,14 > "questGenerator" : { > "enableParticipation" : true > }, > npcs\biome\shadowvillager.npctype 10a11,14 > "questGenerator" : { > "enableParticipation" : true > }, > objects\colony\colonydeed\colonydeed.lua 0a1,2 > require("/scripts/quest/participant.lua") > 10a13,15 > local questParticipantOutbox = Outbox.new("questParticipantOutbox", ContactList.new("questParticipantContacts")) > self.questParticipant = QuestParticipant.new("questParticipant", questParticipantOutbox) > 14c19 < delay = "deed.scanFrequency", --- > delay = scanDelay, 57a63,64 > self.questParticipant:fireEvent("interaction", args.sourceId) > 79a87,88 > self.questParticipant:die() > 83a93,96 > function uninit() > self.questParticipant:uninit() > end > 84a98,99 > self.questParticipant:update() > 93a109,123 > function getStealableObjects() > -- Used by the quest generator to determine what objects can be stolen: > if not storage.occupier then return {} end > local scanResults = scanHouseContents(storage.house.boundary) > local objects = {} > for objectId,_ in pairs(scanResults.objects or {}) do > objects[#objects+1] = objectId > end > return objects > end > > function getOwnedObjectNames() > return storage.house and storage.house.objects or {} > end > 175a206,212 > function scanDelay() > if self.questParticipant:hasActiveQuest() then > return entity.randomizeParameterRange("deed.questScanFrequency") > end > return entity.randomizeParameterRange("deed.scanFrequency") > end > 208a246 > if not storage.occupier then return nil end 217a256,260 > function getTenants() > if not storage.occupier then return {} end > return storage.occupier.tenants > end > 318a362,370 > function deedUniqueId() > local uniqueId = world.entityUniqueId(entity.id()) > if not uniqueId then > uniqueId = sb.makeUuid() > world.setUniqueId(entity.id(), uniqueId) > end > return uniqueId > end > 326c378 < tenant.uniqueId = sb.makeUuid() --- > tenant.uniqueId = tenant.uniqueId or sb.makeUuid() 329c381 < world.callScriptedEntity(entityId, "setupTenant", storage.house.floorPosition, storage.house.boundary) --- > world.callScriptedEntity(entityId, "setupTenant", storage.house.floorPosition, storage.house.boundary, deedUniqueId()) 333a386,397 > function sendNewTenantNotification() > if entity.configParameter("owner") then > local tenants = {} > for _,tenant in ipairs(storage.occupier.tenants) do > tenants[#tenants+1] = tenant.uniqueId > end > -- Send a message to the owner of the deed for any quests they're > -- playing to handle. > world.sendEntityMessage(entity.configParameter("owner"), "colonyDeed.newHome", tenants, storage.house.objects, storage.house.boundary) > end > end > 338c402 < local scanResults = scanHouseContents(house.tags, house.poly) --- > local scanResults = scanHouseContents(house.poly) 341c405,406 < elseif scanResults.tags then --- > elseif scanResults.objects then > local tags = countTags(scanResults.objects, house.doors) 344c409 < contents = scanResults.tags, --- > contents = tags, 346c411,412 < floorPosition = house.floor --- > floorPosition = house.floor, > objects = countObjects(scanResults.objects, house.doors) 352c418,419 < chooseTenants(seed, scanResults.tags) --- > chooseTenants(seed, tags) > 355a423 > sendNewTenantNotification() 396a465 > local grumbles = {} 400c469,472 < return {{"enclosedArea"}} --- > grumbles[#grumbles+1] = {"enclosedArea"} > else > storage.house.floorPosition = house.floor > storage.house.boundary = house.poly 403,407c475 < storage.house.floorPosition = house.floor < storage.house.boundary = house.poly < < local grumbles = {} < local scanResults = scanHouseContents(house.tags, house.poly) --- > local scanResults = scanHouseContents(storage.house.boundary) 411a480,496 > local objects = countObjects(scanResults.objects, house.doors or {}) > storage.house.objects = storage.house.objects or {} > for objectName, count in pairs(objects) do > local oldCount = storage.house.objects[objectName] or 0 > if count > oldCount then > self.questParticipant:fireEvent("objectAdded", objectName, count - oldCount) > end > end > for objectName, count in pairs(storage.house.objects) do > local newCount = objects[objectName] or 0 > if newCount < count then > self.questParticipant:fireEvent("objectRemoved", objectName, count - newCount) > end > end > storage.house.objects = objects > > local tags = countTags(scanResults.objects, house.doors or {}) 413c498 < local currentAmount = scanResults.tags[tag] or 0 --- > local currentAmount = tags[tag] or 0 objects\colony\colonydeed\colonydeed.object 48a49 > "questScanFrequency" : [1.0, 2.0], //cooldown time between scans (during quests) objects\colony\colonydeed\scanning.lua 18c18 < function scanHouseContents(tags, boundary) --- > function scanHouseContents(boundary) 19a20 > local objectSet = {} 23d23 < util.debugLog("House at " .. vecToString(self.position) .. " contains:") 28,35d27 < util.debugLog(" " .. object .. ": " .. world.entityName(object) .. " at " .. vecToString(world.entityPosition(object))) < local objectTags = world.objectConfigParameter(object, "tags", {}) < util.debugLog(" Tags: {" .. table.concat(objectTags, ", ") .. "}") < < for _,tag in ipairs(objectTags) do < tags[tag] = (tags[tag] or 0) + #(world.objectSpaces(object)) < end < 41a34,35 > else > objectSet[object] = true 46,54d39 < if #objects == 0 then < util.debugLog(" Nothing.") < else < util.debugLog("Tag count:") < for tag,count in pairs(tags) do < util.debugLog(" " .. tag .. " = " .. count) < end < end < 58d42 < tags = tags, 61c45 < objects = objects --- > objects = objectSet 70d53 < tags = {}, 72c55,56 < poly = nil --- > poly = nil, > doors = {} 76,77c60,61 < local tags = {} < tags, poly, remainingPerimeter = scanHouseBoundary(floor, remainingPerimeter) --- > local scanResults = scanHouseBoundary(floor, remainingPerimeter) > poly, remainingPerimeter, doors = scanResults.poly, scanResults.remainingPerimeter, scanResults.doors 80,82c64,66 < tags = tags, < floor = nil, < poly = nil --- > floor = floor, > poly = nil, > doors = doors 96,98c80,82 < tags = tags, < floor = nil, < poly = nil --- > floor = floor, > poly = nil, > doors = doors 102c86,94 < -- If we add tags to materials, this bit of code could be replaced: --- > return { > floor = floor, > poly = poly, > doors = doors > } > end > > function countTags(...) > local tags = {} 107,111c99,132 < return { < tags = tags, < floor = floor, < poly = poly < } --- > for _,objectSet in ipairs({...}) do > for objectId,_ in pairs(objectSet) do > local objectTags = world.objectConfigParameter(objectId, "tags", {}) > > for _,tag in ipairs(objectTags) do > tags[tag] = (tags[tag] or 0) + #(world.objectSpaces(objectId)) > end > end > end > > util.debugLog("Tag count:") > local anyTags = false > for tag,count in pairs(tags) do > util.debugLog(" " .. tag .. " = " .. count) > anyTags = true > end > if not anyTags then > util.debugLog(" No tags.") > end > > return tags > end > > function countObjects(...) > local objectCounts = {} > util.debugLog("House at " .. vecToString(self.position) .. " contains:") > for _,objectSet in ipairs({...}) do > for objectId,_ in pairs(objectSet) do > local objectName = world.entityName(objectId) > objectCounts[objectName] = (objectCounts[objectName] or 0) + 1 > util.debugLog(" " .. world.entityName(objectId)) > end > end > return objectCounts 229c250 < local tags = {} --- > local doors = {} 233,234c254,256 < if isDoor(position) then < tags["door"] = (tags["door"] or 0) + 1 --- > local doorsHere = doorsAtPosition(position) > for _,doorId in pairs(doorsHere) do > doors[doorId] = true 259c281,285 < return tags, poly, remainingPerimeter --- > return { > poly = poly, > remainingPerimeter = remainingPerimeter, > doors = doors > } 266c292,296 < return tags, nil --- > return { > poly = poly, > remainingPerimeter = remainingPerimeter, > doors = doors > } 274,275c304,308 < local objects = world.objectQuery(position, position, {callScript = "doorOccupiesSpace", callScriptArgs = {world.xwrap(position)}}) < return #objects > 0 --- > return #doorsAtPosition(position) > 0 > end > > function doorsAtPosition(position) > return world.objectQuery(position, position, {callScript = "doorOccupiesSpace", callScriptArgs = {world.xwrap(position)}}) objects\generic\woodenelevator\woodenelevatorlong.object 6c6 < "rarity" : "Rare", --- > "rarity" : "common", 8c8 < "price" : 100, --- > "price" : 75, 10,11c10,11 < "description" : "A moving platform.", < "shortdescription" : "Long Elevator", --- > "description" : "This simple wooden elevator operates on a pulley system.", > "shortdescription" : "Long Wooden Elevator", 13a14 > /* todo 19a21,22 > "novakidDescription" : "A moving platform.", > */ 21c24 < "inventoryIcon" : "platform.png", --- > "inventoryIcon" : "woodenelevatorlongicon.png", objects\generic\woodenelevator\woodenelevatorshort.object 6c6 < "rarity" : "Rare", --- > "rarity" : "common", 8c8 < "price" : 100, --- > "price" : 50, 10,11c10,11 < "description" : "A moving platform.", < "shortdescription" : "Short Elevator", --- > "description" : "This simple wooden elevator operates on a pulley system.", > "shortdescription" : "Short Wooden Elevator", 13a14 > /* todo 19a21,22 > "novakidDescription" : "A moving platform.", > */ 21c24 < "inventoryIcon" : "platform.png", --- > "inventoryIcon" : "woodenelevatorshorticon.png", objects\wired\movingplatform\movingelevatorlong.object 8c8 < "price" : 100, --- > "price" : 225, objects\wired\movingplatform\movingelevatorshort.object 8c8 < "price" : 100, --- > "price" : 125, quests\ftlrepairmain.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 3 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "fuel.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "fuel.gearup", > "shipLevel" : 3 > } quests\fuel.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "liquidfuel", "count" : 20, "consume" : false } < ], --- > "portrait" : "player", 10c8,21 < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "gatherRequirements" : { > "items" : { > "liquidfuel" : { > "count" : 20, > "consume" : false > } > } > } > } quests\quests.config 12c12,30 < } --- > }, > "indicators" : { > "questgiver" : { > "image" : "/interface/quests/questgiver.png" > }, > "questreceiver" : { > "image" : "/interface/quests/questreceiver.png" > }, > "mainquestgiver" : { > "image" : "/interface/quests/mainquestgiver.png" > }, > "mainquestreceiver" : { > "image" : "/interface/quests/mainquestreceiver.png" > }, > "questrelevant" : { > "image" : "/interface/quests/questrelevant.png" > } > }, > "defaultCustomIndicator" : "questrelevant" quests\food\firstcrops.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "wheat", "count" : 5, "consume" : false } < ], --- > "portrait" : "player", 11,12c9,23 < "moneyRange" : [100, 100] < } \ No newline at end of file --- > "moneyRange" : [100, 100], > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "gatherRequirements" : { > "items" : { > "wheat" : { > "count" : 5, > "consume" : false > } > } > } > } > } quests\food\hoe.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "hoe", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 13c11,24 < "followUp" : "wateringcan.gearup" --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "wateringcan.gearup", > "gatherRequirements" : { > "items" : { > "hoe" : { > "count" : 1, > "consume" : false > } > } > } > } quests\food\wateringcan.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "woodenwateringcan", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 13,14c11,25 < "followUp" : "hoe.gearup" < } \ No newline at end of file --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "hoe.gearup", > "gatherRequirements" : { > "items" : { > "woodenwateringcan" : { > "count" : 1, > "consume" : false > } > } > } > } > } quests\outpost\coldskin1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "tag" : "durasteelarmor", "consume" : false } < ], --- > "portrait" : "questGiver", 14,15c12,28 < "followUp" : "coldskin2.gearup", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "coldskin2.gearup", > "requireTurnIn" : true, > "gatherRequirements" : { > "tags" : { > "durasteelarmor" : { > "count" : 1, > "consume" : false > } > } > } > } quests\outpost\coldskin2.questtemplate 6c6 < "completionConditions" : [ ], --- > "portrait" : "player", 10,12c10,19 < "associatedMission" : "mission3", < "followUp" : "coldskin3.gearup", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "associatedMission" : "mission3", > "followUp" : "coldskin3.gearup", > "requireTurnIn" : true > } quests\outpost\coldskin3.questtemplate 6c6,7 < "completionConditions" : [ ], --- > "questStartedPortrait" : "player", > "questCompletePortrait" : "questReceiver", 10d10 < "equipTech" : ["coldprotectionTech"], 12c12,20 < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "equipTech" : ["coldprotectionTech"], > "requireTurnIn" : true > } quests\outpost\heatskin1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "tag" : "tier5armor", "consume" : false } < ], --- > "portrait" : "questGiver", 14,15c12,28 < "followUp" : "heatskin2.gearup", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "heatskin2.gearup", > "requireTurnIn" : true, > "gatherRequirements" : { > "tags" : { > "tier5armor" : { > "count" : 1, > "consume" : false > } > } > } > } quests\outpost\heatskin2.questtemplate 6c6,7 < "completionConditions" : [], --- > "questStartedPortrait" : "player", > "questCompletePortrait" : "questReceiver", 9d9 < "equipTech" : ["heatprotectionTech"], 11,12c11,20 < "associatedMission" : "mission4", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "equipTech" : ["heatprotectionTech"], > "associatedMission" : "mission4", > "requireTurnIn" : true > } quests\outpost\kelpquest.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "kelp", "count" : 300 } < ], --- > "portrait" : "questGiver", 13d10 < "equipTech" : ["radiationprotectionTech"], 15c12,28 < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "equipTech" : ["radiationprotectionTech"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "kelp" : { > "count" : 300, > "consume" : true > } > } > } > } quests\outpost\outpost0.questtemplate 1c1 < { --- > { 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "woodencraftingtable", "count" : 1 } < ], --- > "portrait" : "questGiver", 14c12,27 < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "woodencraftingtable" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\outpost1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "chocolate", "count" : 1 } < ], --- > "portrait" : "questGiver", 14c12,25 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "chocolate" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\outpostmission1.questtemplate 6c6 < "completionConditions" : [ ], --- > "portrait" : "player", 12,13c12,20 < "associatedMission" : "mission1", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "associatedMission" : "mission1", > "requireTurnIn" : true > } quests\outpost\outpostskin.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "tag" : "steelarmor", "consume" : false } < ], --- > "portrait" : "questGiver", 13d10 < "equipTech" : ["breathprotectionTech"], 16,17c13,30 < "followUp" : "outpostMission1.gearup", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "equipTech" : ["breathprotectionTech"], > "followUp" : "outpostMission1.gearup", > "requireTurnIn" : true, > "gatherRequirements" : { > "tags" : { > "steelarmor" : { > "count" : 1, > "consume" : false > } > } > } > } quests\outpost\penguinmission.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "tag" : "titaniumarmor", "consume" : false } < ], --- > "portrait" : "questGiver", 14,15c12,28 < "followUp" : "penguinmission2.gearup", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "penguinmission2.gearup", > "requireTurnIn" : true, > "gatherRequirements" : { > "tags" : { > "titaniumarmor" : { > "count" : 1, > "consume" : false > } > } > } > } quests\outpost\penguinmission2.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "dreadwreckage", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 13,15c11,27 < "followUp" : "penguinmission3.gearup", < "associatedMission" : "mission2", < "requireTurnIn" : false --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "associatedMission" : "mission2", > "followUp" : "penguinmission3.gearup", > "gatherRequirements" : { > "items" : { > "dreadwreckage" : { > "count" : 1, > "consume" : false > } > } > } > } quests\outpost\penguinmission3.questtemplate 7,9c7,8 < "completionConditions" : [ < { "type" : "gather", "item" : "dreadwreckage", "count" : 1 } < ], --- > "questStartedPortrait" : "player", > "questCompletePortrait" : "questReceiver", 15,16c14,30 < "associatedMission" : "mission2", < "requireTurnIn" : true --- > "questGiverIndicator" : "mainquestgiver", > "questReceiverIndicator" : "mainquestreceiver", > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "associatedMission" : "mission2", > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "dreadwreckage" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\endgame\avianrefugeee1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "bluestim", "count" : 5 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "bluestim" : { > "count" : 5, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\endgame\avianrefugeee2.questtemplate 8,11c8 < "acceptItems" : [[ "paperwingsback-recipe", 1]], < "completionConditions" : [ < { "type" : "gather", "item" : "paperwingsback", "count" : 1 } < ], --- > "portrait" : "questGiver", 16c13,27 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "acceptItems" : [[ "paperwingsback-recipe", 1]], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "paperwingsback" : { > "count" : 1, > "consume" : true > } > } > } > } 18c29 < \ No newline at end of file --- > quests\outpost\endgame\examplequest.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "leather", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "leather" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\endgame\humanscientiste1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "medievalglobe", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "medievalglobe" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\endgame\hylotlperformere1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "orange", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "orange" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\endgame\hylotlperformere2part1.questtemplate 8c8,9 < "completionConditions" : [], --- > "questStartedPortrait" : "questGiver", > "questCompletePortrait" : "questReceiver", 11,12c12,18 < "followUp" : "hylotlperformerE2part2.gearup", < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "hylotlperformerE2part2.gearup", > "requireTurnIn" : true > } 14c20 < \ No newline at end of file --- > quests\outpost\endgame\hylotlperformere2part2.questtemplate 8d7 < "completionConditions" : [], 13c12,17 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true > } 15c19 < \ No newline at end of file --- > quests\outpost\endgame\hylotlwarriore1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "bone", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "bone" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\endgame\hylotlwarriore2.questtemplate 8,11c8 < "acceptItems" : [[ "kennel-recipe", 1]], < "completionConditions" : [ < { "type" : "gather", "item" : "kennel", "count" : 1 } < ], --- > "portrait" : "questGiver", 16c13,27 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "acceptItems" : [[ "kennel-recipe", 1]], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "kennel" : { > "count" : 1, > "consume" : true > } > } > } > } 18c29 < \ No newline at end of file --- > quests\outpost\endgame\penguinpromotere1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "cookedfish", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "cookedfish" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase1optional\bountyhunter1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "cake", "count" : 1 } < ], --- > "portrait" : "questGiver", 14c12,25 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "cake" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase1optional\floranfan1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "coolchest", "count" : 1 } < ], --- > "portrait" : "questGiver", 14c12,25 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "coolchest" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase1optional\humanscientist1.questtemplate 1c1 < { --- > { 7,9c7 < "completionConditions" : [ < { "type" : "gather", "tag" : "bug", "consume" : true } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "tags" : { > "bug" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase1optional\hylotlperformer1.questtemplate 7,9c7 < "completionConditions" : [ < { "type" : "gather", "item" : "comedyscript", "count" : 1 } < ], --- > "portrait" : "questGiver", 12c10,23 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "comedyscript" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase1optional\radardish1.questtemplate 7,9c7,8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 1 } < ], --- > "questStartedPortrait" : "player", > "questCompletePortrait" : "questReceiver", 14c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase1optional\underside1.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "climbingrope", "count" : 10 } < ], --- > "portrait" : "questGiver", 13c11,24 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "climbingrope" : { > "count" : 10, > "consume" : true > } > } > } > } quests\outpost\phase2optional\apexmechanic2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "copperbar", "count" : 10 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "copperbar" : { > "count" : 10, > "consume" : true > } > } > } > } quests\outpost\phase2optional\avianrefugee2part1.questtemplate 8c8 < "completionConditions" : [], --- > "portrait" : "questGiver", 11c11,16 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true > } quests\outpost\phase2optional\avianrefugee2part2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "paper", "count" : 5 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "paper" : { > "count" : 5, > "consume" : true > } > } > } > } quests\outpost\phase2optional\bountyhunter2.questtemplate 8,11c8 < "acceptItems" : [[ "mysterioustrashbag", 1]], < "completionConditions" : [ < { "type" : "gather", "item" : "mysteriousashes", "count" : 1 } < ], --- > "portrait" : "questGiver", 16c13,27 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "acceptItems" : [[ "mysterioustrashbag", 1]], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "mysteriousashes" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase2optional\floranscholar2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "fullwood1", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "fullwood1" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase2optional\glitchsilenttype2.questtemplate 8c8 < "completionConditions" : [], --- > "portrait" : "questGiver", 13c13,18 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true > } quests\outpost\phase2optional\humanexcon2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "gunpowder", "count" : 5 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "gunpowder" : { > "count" : 5, > "consume" : true > } > } > } > } quests\outpost\phase2optional\humansurvivor2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "coconut", "count" : 3 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "coconut" : { > "count" : 3, > "consume" : true > } > } > } > } quests\outpost\phase3optional\avianexplorer3.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "moonemblem", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "moonemblem" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase3optional\bountyhunter3.questtemplate 8,11c8 < "completionConditions" : [ < { "type" : "gather", "item" : "cheese", "count" : 1 }, < { "type" : "gather", "item" : "liquidpoison", "count" : 1 } < ], --- > "portrait" : "questGiver", 16c13,30 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "cheese" : { > "count" : 1, > "consume" : true > }, > "liquidpoison" : { > "count" : 1, > "consume" : true > } > } > } > } 18c32 < \ No newline at end of file --- > quests\outpost\phase3optional\glitchsilenttype3.questtemplate 8,11c8 < "acceptItems" : [[ "pleaseget", 1]], < "completionConditions" : [ < { "type" : "gather", "item" : "medievalcodex", "count" : 1 } < ], --- > "portrait" : "questGiver", 16c13,27 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "acceptItems" : [[ "pleaseget", 1]], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "medievalcodex" : { > "count" : 1, > "consume" : true > } > } > } > } 18c29 < \ No newline at end of file --- > quests\outpost\phase3optional\hylotlperformer3.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "string", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "string" : { > "count" : 1, > "consume" : true > } > } > } > } quests\outpost\phase4optional\apexrefugee4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "winningticket", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "winningticket" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase4optional\avianexplorer4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "treasuremap", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "treasuremap" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase4optional\avianmercenary4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "goldenducky", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "goldenducky" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase4optional\bountyhunter4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "leather", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "leather" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase4optional\floranhunter4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "floranbonedisplay2", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "floranbonedisplay2" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\phase4optional\humanexcon4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "prisonstonesign", "count" : 1 } < ], --- > "portrait" : "questGiver", 15c13,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "prisonstonesign" : { > "count" : 1, > "consume" : true > } > } > } > } 17c28 < \ No newline at end of file --- > quests\outpost\shipupgrade\license1.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 2 } < ], --- > "portrait" : "questGiver", 13d10 < "enableAiCommands" : ["upgradeShip4"], 15c12,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : ["upgradeShip4"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 2, > "consume" : true > } > } > } > } quests\outpost\shipupgrade\license2.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 4 } < ], --- > "portrait" : "questGiver", 13d10 < "enableAiCommands" : ["upgradeShip5"], 15c12,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : ["upgradeShip5"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 4, > "consume" : true > } > } > } > } quests\outpost\shipupgrade\license3.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 8 } < ], --- > "portrait" : "questGiver", 13d10 < "enableAiCommands" : ["upgradeShip6"], 15c12,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : ["upgradeShip6"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 8, > "consume" : true > } > } > } > } quests\outpost\shipupgrade\license4.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 16 } < ], --- > "portrait" : "questGiver", 13d10 < "enableAiCommands" : ["upgradeShip7"], 15c12,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : ["upgradeShip7"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 16, > "consume" : true > } > } > } > } quests\outpost\shipupgrade\license5.questtemplate 8,10c8 < "completionConditions" : [ < { "type" : "gather", "item" : "diamond", "count" : 32 } < ], --- > "portrait" : "questGiver", 13d10 < "enableAiCommands" : ["upgradeShip8"], 15c12,26 < "requireTurnIn" : true --- > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : ["upgradeShip8"], > "requireTurnIn" : true, > "gatherRequirements" : { > "items" : { > "diamond" : { > "count" : 32, > "consume" : true > } > } > } > } quests\tutorial\apextutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\aviantutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\distressbeacon.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "ironbeacon", "count" : 1 } < ], --- > "portrait" : "player", 12c10,23 < ] --- > ], > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "gatherRequirements" : { > "items" : { > "ironbeacon" : { > "count" : 1, > "consume" : true > } > } > } > } quests\tutorial\florantutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\glitchtutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\humantutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\hylotltutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\novakidtutorial.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "shiplevel", "level" : 2 } < ], --- > "portrait" : "player", 10,11c8,15 < "followUp" : "ftlrepairmain.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "ftlrepairmain.gearup", > "shipLevel" : 2 > } quests\tutorial\tutorial1.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "flashlight", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,12c8,23 < "enableAiCommands" : [ "upgradeBeamaxe1" ], < "followUp" : "tutorial2.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "enableAiCommands" : [ "upgradeBeamaxe1" ], > "followUp" : "tutorial2.gearup", > "gatherRequirements" : { > "items" : { > "flashlight" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial2.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "woodencraftingtable", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial3.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial3.gearup", > "gatherRequirements" : { > "items" : { > "woodencraftingtable" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial3.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "bandage", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial4.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial4.gearup", > "gatherRequirements" : { > "items" : { > "bandage" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial4.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "cookedalienmeat", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial5.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial5.gearup", > "gatherRequirements" : { > "items" : { > "cookedalienmeat" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial5.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "stonefurnace", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial6.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial6.gearup", > "gatherRequirements" : { > "items" : { > "stonefurnace" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial6.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "ironbar", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial7.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial7.gearup", > "gatherRequirements" : { > "items" : { > "ironbar" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial7.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "ironanvil", "count" : 1, "consume" : false } < ], --- > "portrait" : "player", 10,11c8,22 < "followUp" : "tutorial8.gearup", < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "followUp" : "tutorial8.gearup", > "gatherRequirements" : { > "items" : { > "ironanvil" : { > "count" : 1, > "consume" : false > } > } > } > } quests\tutorial\tutorial8.questtemplate 6,8c6 < "completionConditions" : [ < { "type" : "gather", "item" : "corefragmentore", "count" : 20, "consume" : false } < ], --- > "portrait" : "player", 10c8,21 < "canBeAbandoned" : false --- > "canBeAbandoned" : false, > > "updateDelta" : 10, > "script" : "/quests/scripts/main.lua", > "scriptConfig" : { > "gatherRequirements" : { > "items" : { > "corefragmentore" : { > "count" : 20, > "consume" : false > } > } > } > } scripts\tenant.lua 3a4 > storage.respawner = nil 8c9,19 < notify({ type = "tenant.despawn" }) --- > entity.setDeathParticleBurst(nil) > entity.setDropPools({}) > > local bounds = mcontroller.boundBox() > local position = mcontroller.position() > local collisionArea = {bounds[1] + position[1], bounds[2] + position[2], bounds[3] + position[1], bounds[4] + position[2]} > if world.isVisibleToPlayer(collisionArea) then > status.addEphemeralEffect("beamoutanddie") > else > status.setResource("health", 0) > end 11c22 < function tenant.setHome(position, boundary) --- > function tenant.setHome(position, boundary, deedUniqueId) 13a25 > storage.respawner = deedUniqueId 35c47 < return world.entityType(entity.id()) == "npc" --- > return false scripts\util.lua 77,78c77,78 < for k,v in ipairs(t) do < table.insert(newTable, func(v)) --- > for k,v in pairs(t) do > newTable[k] = func(v) 82a83,93 > function util.take(n, list) > local result = {} > for i,elem in ipairs(list) do > if i <= n then > result[i] = elem > else > break > end > end > return result > end 212a224,227 > function util.randomChoice(options) > return options[math.random(#options)] > end > 358a374,381 > function util.tableKeys(tbl) > local keys = {} > for key,_ in pairs(tbl) do > keys[#keys+1] = key > end > return keys > end > 407c430,467 < end \ No newline at end of file --- > end > > function shuffle(list) > -- Fisher-Yates shuffle > if #list < 2 then return end > for i = #list, 2, -1 do > local j = math.random(i) > local tmp = list[j] > list[j] = list[i] > list[i] = tmp > end > end > > function shallowCopy(list) > local result = setmetatable({}, getmetatable(list)) > for k,v in pairs(list) do > result[k] = v > end > return result > end > > function shuffled(list) > local result = shallowCopy(list) > shuffle(result) > return result > end > > function isEmpty(tbl) > for _,_ in pairs(tbl) do > return false > end > return true > end > > function xor(a,b) > -- Logical xor > return (a and not b) or (not a and b) > end scripts\actions\dialog.lua 18,19c18,20 < local species = entity.species() < dialog = dialog[species] or dialog.default --- > return speciesDialog(dialog, targetId) > end > end 21,25c22,24 < if targetId then < dialog = dialog[world.entitySpecies(targetId)] or dialog.default < else < dialog = dialog.default < end --- > function speciesDialog(dialog, targetId) > local species = entity.species() > dialog = dialog[species] or dialog.default 27c26,29 < return dialog --- > if targetId then > dialog = dialog[world.entitySpecies(targetId)] or dialog.default > else > dialog = dialog.default 28a31,32 > > return dialog 94c98 < end \ No newline at end of file --- > end scripts\actions\entities.lua 412a413,451 > ------------------------------------------------ > -- STAGEHANDS > ------------------------------------------------ > > -- param position > -- param range > -- param type > -- param orderBy > -- output entity > -- output list > function findStagehand(args, output) > args = parseArgs(args, { > position = "self", > range = 20, > type = nil, > orderBy = "nearest" > }) > > local position = BData:getPosition(args.position) > if position == nil then return false end > > local stagehands = world.entityQuery(position, args.range, { includedTypes = {"stagehand"}, order = args.orderBy }) > if args.type then > local filtered = {} > for _,entityId in pairs(stagehands) do > if world.stagehandType(entityId) == args.type then > table.insert(filtered, entityId) > end > end > stagehands = filtered > end > > if #stagehands > 0 then > BData:setEntity(output.entity, stagehands[1]) > BData:setList(output.list, stagehands) > return true > end > return false > end scripts\actions\position.lua 101a102 > BData:setNumber(output.magnitude, world.magnitude(target, position)) 122c123 < end \ No newline at end of file --- > end scripts\behavior\bdata.lua 12c12,13 < "bool" --- > "bool", > "behavior" 95a97,108 > function BData:getBehavior(key) > if type(key) == "table" then > return key > else > return self:get("behavior", key) > end > end > > function BData:setBehavior(key, behavior) > self:set("behavior", key, behavior) > end > 256a270,299 > end > return true > end > > -- param list > -- output number > function listSize(args, output) > args = parseArgs(args, { > list = nil > }) > local list = BData:getList(args.list) > if list == nil then return false end > > if output.number then > BData:setNumber(output.number, #list) > end > return true > end > > -- param list > -- output list > function listShuffle(args, output) > args = parseArgs(args, { > list = nil > }) > local list = BData:getList(args.list) > if list == nil then return false end > > if output.list then > BData:setList(output.list, shuffled(list))