FILES ----- dungeons\missions\apexmissions\apexmission1.json dungeons\missions\avianmissions\avianmission1.json dungeons\missions\floranmissions\floranmission1.dungeon dungeons\missions\glitchmissions\glitchmission1.json dungeons\missions\hylotlmissions\hylotlmission1.json [NEW] interface\confirmation\monstertradeconfirmation.config interface\windowconfig\playerinventory.config interface\windowconfig\questlog.config npcs\story\esther.npctype npcs\story\koichihologram.npctype objects\ancient\monolithgate\monolithgate.animation objects\mission\apexmission\apexartifactaltar\apexartifactaltar.object objects\mission\avianmission\avianartifactaltar\avianartifactaltar.object objects\mission\floranmission\floranartifactaltar\floranartifactaltar.object objects\mission\glitchmission\glitchartifactaltar\glitchartifactaltar.object objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.object objects\scripts\artifactaltar.lua objects\ship\brokenapexfuelhatch\brokenapexfuelhatchtier0.object objects\ship\brokenavianfuelhatch\brokenavianfuelhatchtier0.object objects\ship\brokenfloranfuelhatch\brokenfloranfuelhatchtier0.object objects\ship\brokenglitchfuelhatch\brokenglitchfuelhatchtier0.object objects\ship\brokenhumanfuelhatch\brokenhumanfuelhatchtier0.object objects\ship\brokenhylotlfuelhatch\brokenhylotlfuelhatchtier0.object objects\ship\brokennovakidfuelhatch\brokennovakidfuelhatchtier0.object projectiles\throwable\capturepod\capturepod.lua [NEW] quests\generated\petnames.config quests\generated\pools\pools.config [NEW] quests\generated\pools\tradablemonsters.config quests\generated\questpools\tenant.config quests\generated\templates\capture_pet.questtemplate quests\scripts\artifact.lua quests\scripts\generated\capture_pet.lua quests\scripts\story\gateway1.lua quests\scripts\story\shiprepair.lua quests\story\apex_mission1.questtemplate quests\story\apex_mission2.questtemplate quests\story\arkopening.questtemplate quests\story\avian_mission1.questtemplate quests\story\avian_mission2.questtemplate quests\story\floran_mission1.questtemplate quests\story\floran_mission2.questtemplate quests\story\gateway1.questtemplate quests\story\glitch_mission1.questtemplate quests\story\glitch_mission2.questtemplate quests\story\hylotl_mission1.questtemplate quests\story\hylotl_mission2.questtemplate quests\story\shiprepair.questtemplate radiomessages\missions.radiomessages scripts\tenant.lua scripts\companions\util.lua scripts\questgen\generator.lua scripts\questgen\relations.lua tenants\chef_apex.tenant tenants\chef_avian.tenant tenants\chef_floran.tenant tenants\chef_glitch.tenant tenants\chef_human.tenant tenants\chef_hylotl.tenant tenants\chef_random.tenant tenants\merchant_apex.tenant tenants\merchant_avian.tenant tenants\merchant_floran.tenant tenants\merchant_glitch.tenant tenants\merchant_human.tenant tenants\merchant_hylotl.tenant tenants\merchant_random.tenant tenants\villager_apex.tenant tenants\villager_avian.tenant tenants\villager_floran.tenant tenants\villager_glitch.tenant tenants\villager_human.tenant tenants\villager_hylotl.tenant tenants\villager_random.tenant tenants\furniture\astronaut.tenant tenants\furniture\cabin.tenant tenants\furniture\farm.tenant tenants\furniture\gothic.tenant tenants\furniture\island.tenant tenants\furniture\retroscifi.tenant tenants\furniture\saloon.tenant tenants\furniture\sea.tenant tenants\furniture\spooky.tenant tenants\furniture\steampunk.tenant tenants\guards\guardt2_apex.tenant tenants\guards\guardt2_avian.tenant tenants\guards\guardt2_floran.tenant tenants\guards\guardt2_glitch.tenant tenants\guards\guardt2_human.tenant tenants\guards\guardt2_hylotl.tenant tenants\guards\guardt2_random.tenant tenants\guards\guardt3_apex.tenant tenants\guards\guardt3_avian.tenant tenants\guards\guardt3_floran.tenant tenants\guards\guardt3_glitch.tenant tenants\guards\guardt3_human.tenant tenants\guards\guardt3_hylotl.tenant tenants\guards\guardt3_random.tenant tenants\guards\guardt4_apex.tenant tenants\guards\guardt4_avian.tenant tenants\guards\guardt4_floran.tenant tenants\guards\guardt4_glitch.tenant tenants\guards\guardt4_human.tenant tenants\guards\guardt4_hylotl.tenant tenants\guards\guardt4_random.tenant tenants\guards\guardt5a_apex.tenant tenants\guards\guardt5a_avian.tenant tenants\guards\guardt5a_floran.tenant tenants\guards\guardt5a_glitch.tenant tenants\guards\guardt5a_human.tenant tenants\guards\guardt5a_hylotl.tenant tenants\guards\guardt5a_random.tenant tenants\guards\guardt5m_apex.tenant tenants\guards\guardt5m_avian.tenant tenants\guards\guardt5m_floran.tenant tenants\guards\guardt5m_glitch.tenant tenants\guards\guardt5m_human.tenant tenants\guards\guardt5m_hylotl.tenant tenants\guards\guardt5m_random.tenant tenants\guards\guardt5s_apex.tenant tenants\guards\guardt5s_avian.tenant tenants\guards\guardt5s_floran.tenant tenants\guards\guardt5s_glitch.tenant tenants\guards\guardt5s_human.tenant tenants\guards\guardt5s_hylotl.tenant tenants\guards\guardt5s_random.tenant tenants\guards\guardt6a_apex.tenant tenants\guards\guardt6a_avian.tenant tenants\guards\guardt6a_floran.tenant tenants\guards\guardt6a_glitch.tenant tenants\guards\guardt6a_human.tenant tenants\guards\guardt6a_hylotl.tenant tenants\guards\guardt6a_random.tenant tenants\guards\guardt6m_apex.tenant tenants\guards\guardt6m_avian.tenant tenants\guards\guardt6m_floran.tenant tenants\guards\guardt6m_glitch.tenant tenants\guards\guardt6m_human.tenant tenants\guards\guardt6m_hylotl.tenant tenants\guards\guardt6m_random.tenant tenants\guards\guardt6s_apex.tenant tenants\guards\guardt6s_avian.tenant tenants\guards\guardt6s_floran.tenant tenants\guards\guardt6s_glitch.tenant tenants\guards\guardt6s_human.tenant tenants\guards\guardt6s_hylotl.tenant tenants\guards\guardt6s_random.tenant tenants\guards\guard_apex.tenant tenants\guards\guard_avian.tenant tenants\guards\guard_floran.tenant tenants\guards\guard_glitch.tenant tenants\guards\guard_human.tenant tenants\guards\guard_hylotl.tenant tenants\guards\guard_random.tenant tenants\other\apexresearchlab.tenant tenants\other\avianairship.tenant tenants\other\aviantomb.tenant tenants\other\creepling.tenant tenants\other\electrician.tenant tenants\other\floranhuntinggrounds.tenant tenants\other\friendlycultist.tenant tenants\other\glitchcastle.tenant tenants\other\glitchsewer.tenant tenants\other\hazmat.tenant tenants\other\humanbunker.tenant tenants\other\humanprison.tenant tenants\other\lunarbase.tenant tenants\other\neon.tenant tenants\other\philanthropist.tenant tenants\other\scientist.tenant tenants\other\socialite.tenant tenants\other\traveller.tenant tenants\sub-biome\alpine.tenant tenants\sub-biome\bones.tenant tenants\sub-biome\colourful.tenant tenants\sub-biome\eyepatch.tenant tenants\sub-biome\flesh.tenant tenants\sub-biome\foundry.tenant tenants\sub-biome\geode.tenant tenants\sub-biome\giantflower.tenant tenants\sub-biome\glow.tenant tenants\sub-biome\hive.tenant tenants\sub-biome\oasis.tenant tenants\sub-biome\prism.tenant tenants\sub-biome\scorched.tenant tenants\sub-biome\shroom.tenant tenants\sub-biome\spring.tenant tenants\sub-biome\steamspring.tenant tenants\sub-biome\swamp.tenant tenants\sub-biome\tar.tenant DIFFS ----- dungeons\missions\apexmissions\apexmission1.json [TMX file differences are left out for huge size.] dungeons\missions\avianmissions\avianmission1.json [TMX file differences are left out for huge size.] dungeons\missions\floranmissions\floranmission1.dungeon 2556c2556 < "brush" : [ [ "clear" ], [ "object", "floranartifactaltar" ] ] --- > "brush" : [ [ "clear" ], [ "object", "floranartifactaltar", { "parameters" : { "uniqueId" : "floranartifactaltar" } } ] ] dungeons\missions\glitchmissions\glitchmission1.json [TMX file differences are left out for huge size.] dungeons\missions\hylotlmissions\hylotlmission1.json [TMX file differences are left out for huge size.] interface\windowconfig\playerinventory.config 264c264 < "position" : [117, 145], --- > "position" : [117, 153], 270c270 < "position" : [154, 134], --- > "position" : [154, 142], 280c280 < "position" : [175, 151], --- > "position" : [175, 159], 287c287 < "position" : [175, 142], --- > "position" : [175, 150], interface\windowconfig\questlog.config 134a135 > "position" : [0, 4], // only for sorting 142a144 > "position" : [0, 3], // only for sorting 180a183 > "position" : [0, 2], // only for sorting 188a192 > "position" : [0, 1], // only for sorting npcs\story\esther.npctype 27,28c27,47 < "offeredQuests" : [ "human_mission1", "floran_mission1", "floran_mission2", "hylotl_mission1", "hylotl_mission2", "avian_mission1", "avian_mission2", "apex_mission1", "apex_mission2", "glitch_mission1", "glitch_mission2", "arkopening", "destroyruin" ], < "turnInQuests" : [ "gateway1", "human_mission1", "floran_mission1", "hylotl_mission1", "avian_mission1", "apex_mission1", "glitch_mission1", "arkopening", "destroyruin" ], --- > "offeredQuests" : [ > "human_mission1", > "floran_mission1","floran_mission2", > "hylotl_mission1", "hylotl_mission2", > "avian_mission1", "avian_mission2", > "apex_mission1", "apex_mission2", > "glitch_mission1", "glitch_mission2", > "arkopening", > "destroyruin" > ], > "turnInQuests" : [ > "gateway1", > "human_mission1", > "floran_mission1", "floran_mission2", > "hylotl_mission1", "hylotl_mission2", > "avian_mission1", "avian_mission2", > "apex_mission1", "apex_mission2", > "glitch_mission1", "glitch_mission2", > "arkopening", > "destroyruin" > ], npcs\story\koichihologram.npctype 60c60 < "There are even texts here that predate our near-extinction at the hands of the Floran hordes!" --- > "Did you know the texts here predate our near-extinction at the hands of the Floran hordes?" objects\ancient\monolithgate\monolithgate.animation 103c103 < "zLevel" : 2, --- > "zLevel" : 3, objects\mission\apexmission\apexartifactaltar\apexartifactaltar.object 29d28 < "turnInQuests" : [ "apex_mission2" ], objects\mission\avianmission\avianartifactaltar\avianartifactaltar.object 29d28 < "turnInQuests" : [ "apex_mission2" ], objects\mission\floranmission\floranartifactaltar\floranartifactaltar.object 29d28 < "turnInQuests" : [ "floran_mission2" ], objects\mission\glitchmission\glitchartifactaltar\glitchartifactaltar.object 29d28 < "turnInQuests" : [ "glitch_mission2" ], objects\mission\hylotlmission\hylotlartifactaltar\hylotlartifactaltar.object 29d28 < "turnInQuests" : [ "hylotl_mission2" ], objects\scripts\artifactaltar.lua 1a2,3 > object.setUniqueId(config.getParameter("uniqueId")) > 4,5d5 < < world.setProperty("altarposition", entity.position()) 9,11d8 < if args and args.sourceId then < world.sendEntityMessage(args.sourceId, "triggerArtifactObject", object.name()) < end objects\ship\brokenapexfuelhatch\brokenapexfuelhatchtier0.object 31a32,35 > "turninQuests" : [ > "shiprepair" > ], > objects\ship\brokenavianfuelhatch\brokenavianfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > objects\ship\brokenfloranfuelhatch\brokenfloranfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > objects\ship\brokenglitchfuelhatch\brokenglitchfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > objects\ship\brokenhumanfuelhatch\brokenhumanfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > objects\ship\brokenhylotlfuelhatch\brokenhylotlfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > objects\ship\brokennovakidfuelhatch\brokennovakidfuelhatchtier0.object 31a32,35 > "turnInQuests" : [ > "shiprepair" > ], > projectiles\throwable\capturepod\capturepod.lua 1a2 > require "/scripts/companions/util.lua" 12,17d12 < self.monsterDrawables = world.entityPortrait(entityId, "full") < self.monsterName = world.entityName(entityId) < if self.monsterName == "" then < self.monsterName = "Unknown" < end < self.monsterDescription = world.entityDescription(entityId) 44,52c39,40 < world.spawnItem("filledcapturepod", mcontroller.position(), 1, { < description = self.monsterDescription, < tooltipFields = { < subtitle = self.monsterName, < objectImage = self.monsterDrawables < }, < podUuid = sb.makeUuid(), < pets = {pet} < }) --- > local pod = createFilledPod(pet) > world.spawnItem(pod.name, mcontroller.position(), pod.count, pod.parameters) quests\generated\pools\pools.config 36a37,41 > "tradableMonster" : { > "relation" : "UnaryPool", > "type" : "MonsterType", > "poolFile" : "/quests/generated/pools/tradablemonsters.config" > }, quests\generated\questpools\tenant.config 8c8 < [1.0, "capture_pet"] --- > [0.3, "capture_pet"] 237a238,239 > "generateRewardBag" : false, > 241d242 < "turnInQuest" : true, 275,278d275 < ["itemList", "extraRewards", "money", "capturepodPrice"], < ["itemName", "money", {"literal":"money"}], < ["price", "capturepod", "capturepodPrice"], < 282,283c279,280 < ["worldThreatLevel", "worldLevel"], < [">=", "worldLevel", 4], --- > ["tradableMonster", "tradedMonster"], > ["!=", "tradedMonster", "monster"], 285d281 < ["owns", "player", "capturepod", 1], 287,288c283 < ["monsterTenants", "deed", 0], < ["itemName", "capturepod", {"literal":"capturepod"}] --- > ["monsterTenants", "deed", 0] quests\generated\templates\capture_pet.questtemplate 5c5,6 < "type" : "entity" --- > "type" : "entity", > "indicator" : "/interface/quests/questreceiver.png" 16a18,24 > "tradedMonster" : { > "type" : "monsterType", > "example" : { > "name" : "Scaveran", > "typeName" : "scaveran" > } > }, 22c30,32 < "rewards" : [ ], --- > "rewards" : [[ > { "name" : "capturepod", "count" : 1 } > ]], 42c52 < "^cyan;I want a pet to keep me company." --- > "^cyan;I want a to keep me company." 48c58 < "Find me a ^orange;^white; - ^green;capture it with your ^orange;Capture Pod^white;. If you're not sure where to find one, have a ^green;look around near the ^orange;^white;." --- > "Someone gave me a , but I don't know how to look after it. I'd be more familiar with a ^orange;^white;. Could you ^green;capture me a ^orange;^white; with this ^orange;Capture Pod^white;?\nIf you're not sure where to start, you could try looking around the ^orange;^white; - I saw a few over that way." 82c92,93 < } --- > }, > "turnInHidesIndicators" : false quests\scripts\artifact.lua 1a2,3 > require "/scripts/util.lua" > require "/quests/scripts/portraits.lua" 4c6,8 < self.artifactObject = config.getParameter("artifactObject") --- > self.descriptions = config.getParameter("descriptions") > > self.artifactUid = config.getParameter("artifactUid") 7c11,19 < self.maxCompassDistance = config.getParameter("maxCompassDistance", 100) --- > quest.setParameter("artifactUid", {type = "entity", uniqueId = self.artifactUid, indicator = self.artifactImage}) > > self.estherUid = config.getParameter("estherUid") > > self.trackArtifact = util.uniqueEntityTracker(self.artifactUid) > self.trackEsther = util.uniqueEntityTracker(self.estherUid) > > setPortraits() > end 9,10c21,25 < quest.setParameter("artifactObject", {type = "item", item = self.artifactObject, indicator = self.artifactImage}) < quest.setIndicators({"artifactObject"}) --- > function questInteract(entityId) > if not storage.artifact and world.entityUniqueId(entityId) == self.artifactUid then > storage.artifact = true > quest.setIndicators({}) > player.playCinematic(config.getParameter("artifactCinema")) 12,16c27,29 < message.setHandler("triggerArtifactObject", function(_, _, objectName) < if objectName == self.artifactObject then < quest.complete() < end < end) --- > -- don't block the interaction, the object sets universe flags on interact > return false > end 22a36 > player.playCinematic(config.getParameter("missionUnlockedCinema")) 26,29c40,49 < function update(dt) < local objective = config.getParameter("objective") < if objective then < quest.setObjectiveList({{objective, false}}) --- > function questComplete() > setPortraits() > end > > function pointCompassAt(position) > if position then > local direction = world.distance(position, mcontroller.position()) > quest.setCompassDirection(vec2.angle(direction)) > elseif position == nil then > quest.setCompassDirection(nil) 30a51 > end 32,34c53,57 < local artifactPosition = world.getProperty("altarposition") < if artifactPosition then < quest.setCompassDirection(vec2.angle(world.distance(artifactPosition, mcontroller.position()))) --- > function update(dt) > if not storage.artifact then > quest.setIndicators({"artifactUid"}) > quest.setObjectiveList({{self.descriptions.artifact, false}}) > pointCompassAt(self.trackArtifact()) 36c59,62 < quest.setCompassDirection(nil) --- > quest.setIndicators({}) > quest.setObjectiveList({{self.descriptions.turnIn, false}}) > pointCompassAt(self.trackEsther()) > quest.setCanTurnIn(true) quests\scripts\generated\capture_pet.lua 2a3 > require("/scripts/companions/util.lua") 4c5 < function onQuestStart() --- > function onInit() 6a8,48 > self.questClient:setEventHandler({"questGiver", "interaction"}, onQuestGiverInteraction) > > if not storage.rewardAdded then > local textGenerator = currentQuestTextGenerator() > local tradedMonster = quest.parameters().tradedMonster > > local pet = { > name = root.generateName("/quests/generated/petnames.config:names", quest.seed()), > description = textGenerator:substituteTags("A gift from ."), > portrait = tradedMonster.portrait, > config = { > type = tradedMonster.typeName, > parameters = tradedMonster.parameters > } > } > quest.addReward(createFilledPod(pet)) > storage.rewardAdded = true > end > end > > function onQuestGiverInteraction(target, interactor) > if interactor ~= entity.id() then return end > if not hasRequiredItem() then return end > > local textGenerator = currentQuestTextGenerator() > local dialogConfig = root.assetJson("/interface/confirmation/monstertradeconfirmation.config") > for key, value in pairs(dialogConfig) do > if type(value) == "string" then > value = textGenerator:substituteTags(value) > dialogConfig[key] = value > end > end > > local monster = quest.parameters().monster > dialogConfig.images.portrait = monster.portrait > > promises:add(player.confirm(dialogConfig), function (agree) > if agree then > quest.complete() > end > end) 17a60,65 > else > if hasRequiredItem() then > setIndicators({"questGiver"}) > else > setIndicators({}) > end 26a75,78 > end > > function onQuestStart() > player.giveItem({ name = "capturepod", count = 1}) quests\scripts\story\gateway1.lua 5a6 > setPortraits() 25c26,27 < findEsther --- > findEsther, > turnIn 108c110 < while not storage.complete do --- > while storage.stage == 3 do 112c114,115 < storage.complete = true --- > storage.stage = 4 > quest.setIndicators({}) 120c123,134 < quest.complete() --- > self.state:set(self.stages[storage.stage]) > end > > function turnIn() > quest.setCompassDirection(nil) > quest.setObjectiveList({{self.descriptions.findEsther, false}}) > > quest.setCanTurnIn(true) > > while true do > coroutine.yield() > end quests\scripts\story\shiprepair.lua 25a26 > wakeSail, 52,55d52 < function questComplete() < setPortraits() < end < 64a62,77 > function wakeSail() > quest.setObjectiveList({{self.descriptions.wakeSail, false}}) > > local findTechStation = util.uniqueEntityTracker(self.techstationUid, self.compassUpdate) > while storage.stage == 1 do > pointCompassAt(findTechStation()) > > if player.shipUpgrades().shipLevel > 0 then > storage.stage = 2 > end > coroutine.yield() > end > > self.state:set(self.stages[storage.stage]) > end > 69c82 < while storage.stage == 1 do --- > while storage.stage == 2 do 74c87 < storage.stage = 2 --- > storage.stage = 3 86c99 < while storage.stage == 2 do --- > while storage.stage == 3 do 90c103 < storage.stage = 3 --- > storage.stage = 4 102,103d114 < quest.setParameter("fuelhatch", {type = "entity", uniqueId = self.fuelhatchUid}) < quest.setIndicators({"fuelhatch"}) 109,115c120 < self.onInteract = function(entityId) < if world.entityUniqueId(entityId) == self.fuelhatchUid and player.consumeItem({name = self.shipRepairItem, count = self.shipRepairCount}) then < storage.complete = true < self.onInteract = nil < return true < end < end --- > quest.setCanTurnIn(true) 118c123 < while not storage.complete do --- > while true do 123c128,129 < storage.stage = 2 --- > storage.stage = 3 > quest.setCanTurnIn(false) 125d130 < self.onInteract = nil 128a134 > end 130,131c136 < player.upgradeShip(config.getParameter("shipUpgrade")) < player.playCinematic(config.getParameter("upgradeCinema")) --- > function questComplete() 134a140,141 > player.consumeItem({name = self.shipRepairItem, count = self.shipRepairCount}) > player.upgradeShip(config.getParameter("shipUpgrade")) 136,139c143 < util.wait(2.0) < < player.startQuest(config.getParameter("followUp")) < quest.complete() --- > setPortraits() quests\story\apex_mission1.questtemplate 10d9 < "completionCinema" : "/cinematics/coordinates.cinematic", 19c18,19 < "default" : "questGiver" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21d20 < "followUp" : "apex_mission2", quests\story\apex_mission2.questtemplate 5,7c5,7 < "title" : "^orange;The Miniknog Stronghold", < "text" : "^green;I should travel to the ^orange;Miniknog Stronghold^green; using SAIL^white; and find the ^orange;Artifact^white;!", < "completionText" : "I found the Artifact! ^green;I should bring it to ^orange;Esther ^green;at the Ark^white;.", --- > "title" : "Fetch the Apex Artifact", > "text" : "I'm afraid the ^orange;Apex artifact^reset; is being held in a ^orange;Miniknog stronghold^reset;. It may be hard to get access, dear. Please ^green;be careful down there^reset;, the ^orange;Miniknog^reset; can be vicious.", > "completionText" : "I'm so pleased our band is growing; that we're gathering ^orange;allies along with the ^orange;artifacts^reset;. It's almost like starting a ^orange;new Protectorate...^reset;", 10d9 < "completionCinema" : "/cinematics/artifacts/apexartifact.cinematic", 19c18,19 < "default" : "player" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21a22 > "missionUnlockedCinema" : "/cinematics/coordinates.cinematic", 23c24,29 < "artifactObject" : "apexartifactaltar", --- > "descriptions" : { > "artifact" : "find the ^orange;artifact^reset; in the ^orange;Miniknog stronghold^reset;", > "turnIn" : "return to ^orange;Esther^reset; at ^orange;the Ark^reset;" > }, > > "artifactUid" : "apexartifactaltar", 25c31,34 < "objective" : "locate the Apex artifact" --- > > "estherUid" : "estheroutpost", > > "artifactCinema" : "/cinematics/artifacts/apexartifact.cinematic" quests\story\arkopening.questtemplate 25,26c25,26 < "openArk" : "open the Ark", < "turnIn" : "talk to Esther" --- > "openArk" : "open ^orange;the Ark^reset;", > "turnIn" : "talk to ^orange;Esther^reset" quests\story\avian_mission1.questtemplate 10d9 < "completionCinema" : "/cinematics/coordinates.cinematic", 19c18,19 < "default" : "questGiver" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21d20 < "followUp" : "avian_mission2", quests\story\avian_mission2.questtemplate 6,7c6,7 < "text" : "^green;I should travel to the ^orange;Temple of Kluex^green; using SAIL^white; and find the ^orange;Artifact^white;!", < "completionText" : "I found the Artifact! ^green;I should bring it to ^orange;Esther ^green;at the Ark^white;.", --- > "text" : "The ^orange;Avian artifact^reset; is in ^orange;The Great Sovereign Temple^reset;; one of the largest structures devoted to Kluex that the Avians have ever built. These temples tend to be guarded, so ^green;take care inside^reset; dear.", > "completionText" : "Another ^orange;artifact^reset; in place. We're getting there steadily dear. Well done!", 10d9 < "completionCinema" : "/cinematics/artifacts/avianartifact.cinematic", 19c18,19 < "default" : "player" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21a22 > "missionUnlockedCinema" : "/cinematics/coordinates.cinematic", 23c24,29 < "artifactObject" : "avianartifactaltar", --- > "descriptions" : { > "artifact" : "find the ^orange;artifact^reset; in the ^orange;Great Sovereign Temple^reset;", > "turnIn" : "return to ^orange;Esther^reset; at ^orange;the Ark^reset;" > }, > > "artifactUid" : "avianartifactaltar", 25c31,34 < "objective" : "locate the Avian artifact" --- > > "estherUid" : "estheroutpost", > > "artifactCinema" : "/cinematics/artifacts/avianartifact.cinematic" quests\story\floran_mission1.questtemplate 10d9 < "completionCinema" : "/cinematics/coordinates.cinematic", 19c18,19 < "default" : "questGiver" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21d20 < "followUp" : "floran_mission2", quests\story\floran_mission2.questtemplate 5,7c5,7 < "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.", < "completionText" : "I found the Artifact! ^green;I should bring it to ^orange;Esther ^green;at the Ark^white;.", --- > "title" : "Fetch the Floran Artifact", > "text" : "The ^orange;clues^reset; you collected reveal that the ^orange;Floran artifact^reset; is enshrined at ^orange;The Hunting Grounds^reset;. Judging from what I've found out, ^green;you'll need to compete to get it^reset;. Be careful dear.", > "completionText" : "Excellent, you did wonderfully! We're one sixth of the way there, dear. Nothing to sniff at. And now we have ^orange;Nuru^reset; to help us, too.", 10d9 < "completionCinema" : "/cinematics/artifacts/floranartifact.cinematic", 19c18,19 < "default" : "player" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21a22 > "missionUnlockedCinema" : "/cinematics/coordinates.cinematic", 23c24,29 < "artifactObject" : "floranartifactaltar", --- > "descriptions" : { > "artifact" : "find the ^orange;artifact^reset; in ^green;the Hunting Grounds^reset;", > "turnIn" : "return to ^orange;Esther^reset; at ^green;the Ark^reset;" > }, > > "artifactUid" : "floranartifactaltar", 25c31,34 < "objective" : "locate the Floran artifact" --- > > "estherUid" : "estheroutpost", > > "artifactCinema" : "/cinematics/artifacts/floranartifact.cinematic" quests\story\gateway1.questtemplate 5c5 < "logOnly" : true, --- > "logOnly" : false, 7c7 < "text" : "Good job fixing up the ship. Now we can traverse this entire star system. I wonder if there are other survivors around?", --- > "text" : "Good job fixing up the ship. Now we can traverse this entire star system. But before we go out there, let me give you a situation report.", 22c22 < "talkToSail" : "talk to ^orange;S.A.I.L^reset;", --- > "talkToSail" : "sit through ^orange;S.A.I.L's^reset; ^orange;situation report^reset;", quests\story\glitch_mission1.questtemplate 10d9 < "completionCinema" : "/cinematics/coordinates.cinematic", 19c18,19 < "default" : "questGiver" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21d20 < "followUp" : "glitch_mission2", quests\story\glitch_mission2.questtemplate 5,7c5,7 < "title" : "^orange;The Baron's Keep", < "text" : "^green;I should travel to ^orange;The Baron's Keep^green; using SAIL^white; and find the ^orange;Artifact^white;!", < "completionText" : "I found the Artifact! ^green;I should bring it to ^orange;Esther ^green;at the Ark^white;.", --- > "title" : "Fetch the Glitch Artifact", > "text" : "The ^orange;Glitch artifact^reset; is in a castle, under the care of a ^orange;certain, slightly odd, Glitch^reset;. ^green;Would you go to his keep and talk to him^reset;, dear.", > "completionText" : "I'm so proud of you! ^green;After all you've done^reset;, I know that you're equal to the ^orange;challenge we face^reset;.", 10d9 < "completionCinema" : "/cinematics/artifacts/glitchartifact.cinematic", 19c18,19 < "default" : "player" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21a22 > "missionUnlockedCinema" : "/cinematics/coordinates.cinematic", 23c24,29 < "artifactObject" : "glitchartifactaltar", --- > "descriptions" : { > "artifact" : "find the ^orange;artifact^reset; in the ^orange;old Glitch keep^reset;", > "turnIn" : "return to ^orange;Esther^reset; at ^orange;the Ark^reset;" > }, > > "artifactUid" : "glitchartifactaltar", 25c31,34 < "objective" : "locate the Glitch artifact" --- > > "estherUid" : "estheroutpost", > > "artifactCinema" : "/cinematics/artifacts/glitchartifact.cinematic" quests\story\hylotl_mission1.questtemplate 10d9 < "completionCinema" : "/cinematics/coordinates.cinematic", 19c18,19 < "default" : "questGiver" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21d20 < "followUp" : "hylotl_mission2", quests\story\hylotl_mission2.questtemplate 5,7c5,7 < "title" : "^orange;The Grand Pagoda Library", < "text" : "^green;I should travel to the ^orange;Grand Pagoda Library^green; using SAIL^white; and find the ^orange;Artifact^white;!", < "completionText" : "I found the Artifact! ^green;I should bring it to ^orange;Esther ^green;at the Ark^white;.", --- > "title" : "Fetch the Hylotl Artifact", > "text" : "From what you've found, it seems the ^orange;Hylotl artifact^reset; is cloistered deep beneath the ocean in a place called ^orange;The Grand Library^reset;. The Library is very ancient, it should be an ^green;interesting place to visit.^reset;", > "completionText" : "Well done for saving the ^orange;artifact^reset;, dear. They're ^orange;powerful objects^reset;, and not safe in the wrong hands...", 10d9 < "completionCinema" : "/cinematics/artifacts/hylotlartifact.cinematic", 19c18,19 < "default" : "player" --- > "questStarted" : "questGiver", > "questComplete" : "questReceiver" 21a22 > "missionUnlockedCinema" : "/cinematics/coordinates.cinematic", 23c24,29 < "artifactObject" : "hylotlartifactaltar", --- > "descriptions" : { > "artifact" : "find the ^orange;artifact^reset; in the ^orange;Grand Pagoda Library^reset;", > "turnIn" : "return to ^orange;Esther^reset; at ^orange;the Ark^reset;" > }, > > "artifactUid" : "hylotlartifactaltar", 25c31,34 < "objective" : "locate the Hylotl artifact" --- > > "estherUid" : "estheroutpost", > > "artifactCinema" : "/cinematics/artifacts/hylotlartifact.cinematic" quests\story\shiprepair.questtemplate 4d3 < "logOnly" : true, 6,7c5,7 < "text" : "I have escaped earth. My newly acquired ship is in pretty poor condition. I should see what I can do to fix it.", < "completionText" : "The ship is functional!", --- > "text" : "Zzz...", > "completionText" : "Great job collecting these ^orange;Core Fragments^reset;, Protector. Now for the tricky part. You can't blow them up too fast, or too slow. You have to blow them up just so...", > "completionCinema" : "/cinematics/repair/apex/repair.cinematic", 15c15 < "questStarted" : "player", --- > "questStarted" : "questGiver", 20c20,21 < "getShipStatus" : "talk to ^orange;S.A.I.L^white; for a ship status update", --- > "wakeSail" : "wake ^orange;S.A.I.L^reset;", > "getShipStatus" : "get a status update from ^orange;S.A.I.L^reset;", 37d37 < "upgradeCinema" : "/cinematics/repair/apex/repair.cinematic", radiomessages\missions.radiomessages 219c219 < "text" : "Current exterior pressure reading 15 quash. Scans show this structure is capable of withstanding in excess of 100 quash. Chance of survival - surprisingly high." --- > "text" : "Current exterior pressure reading 15 quash. Scans show this structure is capable of withstanding in excess of 80 quash. Chance of survival - surprisingly high." scripts\tenant.lua 132a133,141 > if storage.respawner then > local respawnerEntityId = world.loadUniqueEntity(storage.respawner) > if world.entityExists(respawnerEntityId) then > if world.callScriptedEntity(respawnerEntityId, "countMonsterTenants") > 0 then > return > end > end > end > scripts\companions\util.lua 73a74,89 > > function createFilledPod(pet) > return { > name = "filledcapturepod", > count = 1, > parameters = { > description = pet.description, > tooltipFields = { > subtitle = pet.name or "Unknown", > objectImage = pet.portrait > }, > podUuid = sb.makeUuid(), > pets = {pet} > } > } > end scripts\questgen\generator.lua 469c469 < function QuestGenerator:createRewards(overallDifficulty) --- > function QuestGenerator:createRewardBag(overallDifficulty) 516a517 > local suppressRewardBag = false 538a540,545 > > if operation.config.generateRewardBag ~= nil then > if not operation.config.generateRewardBag then > suppressRewardBag = true > end > end 541c548,550 < quests[#quests].parameters.rewards = self:createRewards(overallDifficulty) --- > if not suppressRewardBag then > quests[#quests].parameters.rewards = self:createRewardBag(overallDifficulty) > end scripts\questgen\relations.lua 1120,1135d1119 < < QuestRelations.worldThreatLevel = defineQueryRelation("worldThreatLevel", true) { < [case(1, NonNil)] = function (self, level) < if xor(self.negated, level == world.threatLevel()) then < return {{level}} < end < return Relation.empty < end, < < [case(2, Nil)] = function (self) < if self.negated then return Relation.some end < return {{world.threatLevel()}} < end, < < default = Relation.empty < } tenants\chef_apex.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_avian.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_floran.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_glitch.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_human.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_hylotl.tenant 18d17 < "damageTeamType" : "friendly" tenants\chef_random.tenant 17d16 < "damageTeamType" : "friendly" tenants\merchant_apex.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_avian.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_floran.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_glitch.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_human.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_hylotl.tenant 19d18 < "damageTeamType" : "friendly" tenants\merchant_random.tenant 18d17 < "damageTeamType" : "friendly" tenants\villager_apex.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_avian.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_floran.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_glitch.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_human.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_hylotl.tenant 17d16 < "damageTeamType" : "friendly" tenants\villager_random.tenant 16d15 < "damageTeamType" : "friendly" tenants\furniture\astronaut.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\cabin.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\farm.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\gothic.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\island.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\retroscifi.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\saloon.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\sea.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\spooky.tenant 17d16 < "damageTeamType" : "friendly" tenants\furniture\steampunk.tenant 17d16 < "damageTeamType" : "friendly" tenants\guards\guardt2_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt2_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt3_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt3_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt4_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt4_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt5a_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5a_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt5m_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5m_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt5s_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt5s_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt6a_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6a_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt6m_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6m_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guardt6s_apex.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_avian.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_floran.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_glitch.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_human.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_hylotl.tenant 20d19 < "damageTeamType" : "friendly" tenants\guards\guardt6s_random.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_apex.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_avian.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_floran.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_glitch.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_human.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_hylotl.tenant 19d18 < "damageTeamType" : "friendly" tenants\guards\guard_random.tenant 18d17 < "damageTeamType" : "friendly" tenants\other\apexresearchlab.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\avianairship.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\aviantomb.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\creepling.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\electrician.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\floranhuntinggrounds.tenant 18d17 < "damageTeamType" : "friendly" tenants\other\friendlycultist.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\glitchcastle.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\glitchsewer.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\hazmat.tenant 18d17 < "damageTeamType" : "friendly" tenants\other\humanbunker.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\humanprison.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\lunarbase.tenant 18d17 < "damageTeamType" : "friendly" tenants\other\neon.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\philanthropist.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\scientist.tenant 17d16 < "damageTeamType" : "friendly" tenants\other\socialite.tenant 18d17 < "damageTeamType" : "friendly" tenants\other\traveller.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\alpine.tenant 18d17 < "damageTeamType" : "friendly" tenants\sub-biome\bones.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\colourful.tenant 18d17 < "damageTeamType" : "friendly" 27c26 < } \ No newline at end of file --- > } tenants\sub-biome\eyepatch.tenant 18d17 < "damageTeamType" : "friendly" 27c26 < } \ No newline at end of file --- > } tenants\sub-biome\flesh.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\foundry.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\geode.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\giantflower.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\glow.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\hive.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\oasis.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\prism.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\scorched.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\shroom.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\spring.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\steamspring.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\swamp.tenant 17d16 < "damageTeamType" : "friendly" tenants\sub-biome\tar.tenant 17d16 < "damageTeamType" : "friendly"