FILES ----- behaviors\npc\accuse.behavior behaviors\npc\bounty\bounty-beamout.behavior dungeons\microdungeons\bounty\fueldepot_1.json dungeons\microdungeons\bounty\safehouse_10.json dungeons\microdungeons\bounty\safehouse_11.json dungeons\microdungeons\bounty\safehouse_14.json dungeons\microdungeons\bounty\safehouse_15.json dungeons\microdungeons\bounty\safehouse_17.json dungeons\microdungeons\bounty\safehouse_18.json dungeons\microdungeons\bounty\safehouse_19.json dungeons\microdungeons\bounty\safehouse_20.json dungeons\microdungeons\bounty\safehouse_9.json interface\cockpit\cockpit.lua interface\scripted\bountyboard\bountyboardgui.config interface\scripted\bountyboard\bountyboardgui.lua items\active\unsorted\miningdrone\miningdrone.activeitem items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem items\active\weapons\ranged\unrand\neopistol\npcneopistol.activeitem items\active\weapons\ranged\unrand\neoshotgun\npcneoshotgun.activeitem items\active\weapons\ranged\unrand\neotommygun\npcneotommygun.activeitem items\active\weapons\ranged\unrand\neouzi\npcneouzi.activeitem monsters\boss\ophanim\ophanim.lua monsters\boss\ophanim\ophanim.monstertype monsters\boss\swansong\swansong.lua monsters\boss\swansong\swansong.monstertype monsters\crawlers\crustoise\icecrustoise.monstertype monsters\crawlers\iguarmor\iceiguarmor.monstertype monsters\crawlers\oculob\fireoculob.monstertype monsters\crawlers\pulpin\poisonpulpin.monstertype monsters\crawlers\snaggler\icesnaggler.monstertype monsters\crawlers\tintic\electrictintic.monstertype monsters\flyers\agrobat\iceagrobat.monstertype monsters\flyers\batong\poisonbatong.monstertype monsters\flyers\bobfae\poisonbobfae.monstertype monsters\flyers\monopus\firemonopus.monstertype monsters\flyers\paratail\poisonparatail.monstertype monsters\ghosts\gosmet\firegosmet.monstertype monsters\ghosts\ignome\electricignome.monstertype monsters\ghosts\lumoth\firelumoth.monstertype monsters\ghosts\pyromantle\poisonpyromantle.monstertype monsters\ghosts\skimbus\electricskimbus.monstertype monsters\ghosts\spookit\firespookit.monstertype monsters\ghosts\squeem\firesqueem.monstertype monsters\ghosts\wisper\firewisper.monstertype monsters\walkers\anglure\electricanglure.monstertype monsters\walkers\bobot\firebobot.monstertype monsters\walkers\bulbop\poisonbulbop.monstertype monsters\walkers\capricoat\electriccapricoat.monstertype monsters\walkers\fennix\icefennix.monstertype monsters\walkers\gleap\firegleap.monstertype monsters\walkers\hypnare\icehypnare.monstertype monsters\walkers\kingnutmidgeling\poisonkingnutmidgeling.monstertype monsters\walkers\lilodon\firelilodon.monstertype monsters\walkers\mandraflora\poisonmandraflora.monstertype monsters\walkers\miasmop\icemiasmop.monstertype monsters\walkers\nutmidge\poisonnutmidge.monstertype monsters\walkers\nutmidgeling\poisonnutmidgeling.monstertype monsters\walkers\oogler\fireoogler.monstertype monsters\walkers\peblit\icepeblit.monstertype monsters\walkers\petricub\electricpetricub.monstertype monsters\walkers\pipkin\poisonpipkin.monstertype monsters\walkers\quagmutt\quagmutt.monstertype monsters\walkers\ringram\iceringram.monstertype monsters\walkers\scaveran\poisonscaveran.monstertype monsters\walkers\taroni\firetaroni.monstertype monsters\walkers\toumingo\firetoumingo.monstertype monsters\walkers\trictus\poisontrictus.monstertype monsters\walkers\yokat\electricyokat.monstertype npcs\outpost\captainnoble.npctype objects\neon\neonhologram\neonhologram.object objects\neon\neonlamppost\neonlamppost.object objects\neon\neonlight\neonlight.object objects\neon\neonpeacekeeperemblem\neonpeacekeeperemblem.object objects\neon\neonstore\neonstore.object objects\neon\neontriangle\neontriangle.object objects\peacekeeper\peacekeeperchair\peacekeeperchair.object objects\peacekeeper\peacekeeperdesk\peacekeeperdesk.object objects\peacekeeper\peacekeeperdoor\peacekeeperdoor.object objects\peacekeeper\peacekeeperfurnishings\peacekeeperfurnishings.object objects\peacekeeper\peacekeeperlamppost\peacekeeperlamppost.object objects\peacekeeper\peacekeepernotes\peacekeepernotes.object objects\peacekeeper\peacekeeperpainting\peacekeeperpainting.object objects\peacekeeper\peacekeeperposter1\peacekeeperposter1.object objects\peacekeeper\peacekeeperposter2\peacekeeperposter2.object objects\peacekeeper\peacekeepertable\peacekeepertable.object objects\peacekeeper\peacekeepervendingmachine\peacekeepervendingmachine.object objects\wired\standingturret\standingturret.lua objects\wired\standingturret\standingturret.object projectiles\boss\swansong\ophanimspawner\ophanimspawner.lua [NEW] quests\bounty\assignment.config quests\bounty\bounty.lua quests\bounty\bountyassignment.lua quests\bounty\bountyassignment.questtemplate quests\bounty\bounty_cyberspace.questtemplate quests\bounty\bounty_gen.lua quests\bounty\bounty_mission.questtemplate quests\bounty\capture_bounty.questtemplate quests\bounty\capture_ship_bounty.questtemplate quests\bounty\capture_space_bounty.questtemplate quests\bounty\clue_bounties.config quests\bounty\clue_items.config quests\bounty\clue_npcs.config quests\bounty\cultist_mission1.questtemplate quests\bounty\find_clue_item.questtemplate quests\bounty\find_clue_npc.questtemplate quests\bounty\find_clue_object.questtemplate quests\bounty\find_clue_scan.questtemplate quests\bounty\find_space_clue_item.questtemplate quests\bounty\find_space_clue_npc.questtemplate quests\bounty\find_space_clue_object.questtemplate quests\bounty\find_space_clue_scan.questtemplate quests\bounty\find_tutorial_clues.questtemplate quests\bounty\generator.config quests\bounty\kill_bounty_monster.questtemplate quests\bounty\scan_planets.questtemplate scripts\bountygeneration.lua scripts\player\playerbounty.lua stagehands\bountymanager.lua stats\effects\maxhealthboost\maxhealthboost.lua [NEW] stats\effects\maxhealthboost\maxhealthreduction.statuseffect tenants\other\peacekeepertenant.tenant treasure\space.treasurepools vehicles\modularmech\mechparts_arm.config vehicles\modularmech\modularmech.lua vehicles\modularmech\armscripts\beamarm.lua DIFFS ----- behaviors\npc\accuse.behavior 6d5 < "/scripts/actions/entity.lua", 11a11 > "/scripts/actions/entity.lua", 66,73d65 < }, < { < "title": "setDying", < "type": "action", < "name": "setDying", < "parameters": { < "shouldDie": {"value": false} < } behaviors\npc\bounty\bounty-beamout.behavior 11,12c11,12 < "/scripts/actions/npc.lua", < "/scripts/actions/quests.lua" --- > "/scripts/actions/quests.lua", > "/scripts/actions/npc.lua" 88a89,96 > "title": "fireQuestEvent", > "type": "action", > "name": "fireQuestEvent", > "parameters": { > "eventName": {"value": "clueGiven"} > } > }, > { 103c111 < "title": "setDying", --- > "title": "setDropPools", 105c113 < "name": "setDying", --- > "name": "setDropPools", 107c115 < "shouldDie": {"value": true} --- > "dropPools": {"value": []} 111c119 < "title": "fireQuestEvent", --- > "title": "setDying", 113c121 < "name": "fireQuestEvent", --- > "name": "setDying", 115c123 < "eventName": {"value": "clueGiven"} --- > "shouldDie": {"value": true} dungeons\microdungeons\bounty\fueldepot_1.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_10.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_11.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_14.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_15.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_17.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_18.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_19.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_20.json [TMX file differences are left out for huge size.] dungeons\microdungeons\bounty\safehouse_9.json [TMX file differences are left out for huge size.] interface\cockpit\cockpit.lua 128c128,130 < if player.getProperty("bountyStation") then --- > local bountyStation = player.getProperty("bountyStation") or {} > bountyStation = bountyStation[player.serverUuid()] > if bountyStation then 217a220 > bountyStation = bountyStation[player.serverUuid()] interface\scripted\bountyboard\bountyboardgui.config 252,254d251 < "majorsToCapstone" : 2, < "newAssignmentDistance" : [200, 250], < 257,691d253 < < "bountyRanks" : [ < { < "threshold" : 0, < "description" : "Rank I: Hopeful Hunter", < "icon" : "/interface/scripted/bountyboard/rank1.png", < "systemTypes" : ["whitestar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["capstone1"] < }, < "rewardMultipliers" : { < "money" : 1.5, < "rank" : 1.0 < } < }, < { < "threshold" : 90, < "description" : "Rank II: Aspiring Apprehender", < "icon" : "/interface/scripted/bountyboard/rank2.png", < "systemTypes" : ["orangestar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["capstone2"] < }, < "rewardMultipliers" : { < "money" : 2.0, < "rank" : 2.0 < } < }, < { < "threshold" : 310, < "description" : "Rank III: Dependable Deputy", < "icon" : "/interface/scripted/bountyboard/rank3.png", < "systemTypes" : ["yellowstar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["capstone3"] < }, < "rewardMultipliers" : { < "money" : 2.5, < "rank" : 4.0 < } < }, < { < "threshold" : 700, < "description" : "Rank IV: Seasoned Sleuth", < "icon" : "/interface/scripted/bountyboard/rank4.png", < "systemTypes" : ["bluestar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["capstone4"] < }, < "rewardMultipliers" : { < "money" : 3.0, < "rank" : 8.0 < } < }, < { < "threshold" : 1830, < "description" : "Rank V: Proven Peacekeeper", < "icon" : "/interface/scripted/bountyboard/rank5.png", < "systemTypes" : ["redstar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["majorCapstone"] < }, < "rewardMultipliers" : { < "money" : 3.5, < "rank" : 16.0 < }, < "pointsToCapstone" : 1000 < } < ], < < "finalAssignment" : { < "description" : "Rank V: Proven Peacekeeper", < "icon" : "/interface/scripted/bountyboard/rank5.png", < "systemTypes" : ["redstar"], < "gang" : { < "name" : "Apocalyptic Occasus Cult", < "hat" : "cultisthead", < "species" : ["human"] < }, < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["occasusCommander"] < }, < "rewardMultipliers" : { < "money" : 3.5, < "rank" : 16.0 < }, < "pointsToCapstone" : 1000 < }, < < "tutorialAssignment" : { < "description" : "Rank I: Hopeful Hunter", < "icon" : "/interface/scripted/bountyboard/rank1.png", < "systemTypes" : ["whitestar"], < "bounties" : { < "minorSpecial" : ["cyberspace", "minorMonster", "minorPlanet"], < "minorPlanet" : ["minorMonster", "minorPlanet"], < "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], < "major" : ["majorGang"], < "capstone" : ["tutorialCapstone"] < }, < "gang" : { < "name" : "Rowdy Peace Disturbers", < "hat" : "grouchohead" < }, < "rewardMultipliers" : { < "money" : 1.5, < "rank" : 1.0 < }, < "pointsToCapstone" : 0 < }, < < "bountyTypes" : { < // minors < "minorMonster" : { < "poster" : "minor", < "questConfig" : { < "arcType" : "minor", < "targetType" : "monster", < "preBountyQuest" : "pre_bounty_minor_monster", < "questCategories" : ["planet"], < "rewards" : { < "money" : 350, < "rank" : 5, < "credits" : 1 < } < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "posterColor" : "minorColor" < } < }, < "minorPlanet" : { < "poster" : "minor", < "questConfig" : { < "arcType" : "minor", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_minor_npc", < "questCategories" : ["planet"], < "rewards" : { < "money" : 500, < "rank" : 5, < "credits" : 1 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "posterColor" : "minorColor" < } < }, < "minorSpace" : { < "poster" : "minor", < "questConfig" : { < "arcType" : "minor", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_minor_npc", < "questCategories" : ["anomaly", "ship"], < "rewards" : { < "money" : 500, < "rank" : 5, < "credits" : 1 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "posterColor" : "minorColor" < } < }, < < // special minor bounties < "cyberspace" : { < "poster" : "minor", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_minor_npc", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "cyberspace", < "stepCount" : [1, 1], < "rewards" : { < "money" : 500, < "rank" : 5, < "credits" : 1 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "posterColor" : "minorColor" < } < }, < "fuel_bounty" : { < "poster" : "minor", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_minor_npc", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "fuel_bounty", < "stepCount" : [1, 1], < "rewards" : { < "money" : 500, < "rank" : 5, < "credits" : 1 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "posterColor" : "minorColor" < } < }, < < // majors < "majorGang" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty", < "questCategories" : ["planet", "anomaly", "ship"], < "rewards" : { < "money" : 1000, < "rank" : 25, < "credits" : 3 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "majorText", < "posterColor" : "majorColor" < } < }, < "majorCapstone" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "capture_bounty", < "stepCount" : [1, 1], < "rewards" : { < "money" : 1000, < "rank" : 25, < "credits" : 5 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < < // capstones < "capstone1" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_capstone", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "capstone_1", < "stepCount" : [1, 1], < "rewards" : { < "money" : 2500, < "rank" : 25, < "credits" : 5 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < "capstone2" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_capstone", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "capstone_2", < "stepCount" : [1, 1], < "rewards" : { < "money" : 2500, < "rank" : 20, < "credits" : 5 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < "capstone3" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_capstone", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "capstone_3", < "stepCount" : [1, 1], < "rewards" : { < "money" : 2500, < "rank" : 20, < "credits" : 5 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < "capstone4" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "targetType" : "npc", < "preBountyQuest" : "pre_bounty_capstone", < "questCategories" : ["planet", "anomaly", "ship"], < "endStep" : "capstone_4", < "stepCount" : [1, 1], < "rewards" : { < "money" : 2500, < "rank" : 20, < "credits" : 5 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < "occasusCommander" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "target" : { < "type" : "monster", < "name" : "Asra Nox", < "monster" : { < "monsterType" : "cultistboss", < "parameters" : { < "shortdescription" : "Asra Nox" < } < }, < "portraitCenter" : [0.0, 0.0], < "portraitScale" : 1.0 < }, < "targetType" : "npc", < "preBountyQuest" : "pre_bounty", < "questCategories" : ["planet", "anomaly", "ship"], < "stepCount" : [3, 3], < "endStep" : "cultist_mission", < "rewards" : { < "money" : 2500, < "rank" : 20, < "credits" : 10 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < }, < "tutorialCapstone" : { < "poster" : "major", < "questConfig" : { < "arcType" : "major", < "target" : { < "type" : "npc", < "name" : "Captain Ignoble", < "species" : "novakid", < "typeName" : "ignobletarget", < "parameters" : {} < }, < "targetType" : "npc", < "preBountyQuest" : "pre_bounty", < "questCategories" : ["planet"], < "stepCount" : [2, 2], < "endStep" : "tutorial_bounty", < "rewards" : { < "money" : 50, < "rank" : 20, < "credits" : 1 < }, < "useGang" : true < }, < "randomTags" : { < "wantedImage" : "wantedImage", < "captureType" : "capstoneText", < "posterColor" : "majorColor" < } < } < }, interface\scripted\bountyboard\bountyboardgui.lua 9c9,14 < self.bountyTypes = config.getParameter("bountyTypes") --- > self.bountyTypes = root.assetJson("/quests/bounty/assignment.config:bountyTypes") > self.bountyRanks = root.assetJson("/quests/bounty/assignment.config:bountyRanks") > self.finalAssignment = root.assetJson("/quests/bounty/assignment.config:finalAssignment") > self.tutorialAssignment = root.assetJson("/quests/bounty/assignment.config:tutorialAssignment") > self.newAssignmentDistance = root.assetJson("/quests/bounty/assignment.config:newAssignmentDistance") > 15,18d19 < self.bountyRanks = config.getParameter("bountyRanks") < self.finalAssignment = config.getParameter("finalAssignment") < self.tutorialAssignment = config.getParameter("tutorialAssignment") < self.newAssignmentDistance = config.getParameter("newAssignmentDistance") 204c205 < if self.assignment == nil then --- > if self.assignment == nil and self.playerRankPoints == 0 then 274a276,282 > local bountyData = player.getProperty("bountyData") or {} > bountyData = bountyData[player.serverUuid()] or {} > self.posters = bountyData.posters or jarray() > self.assignment = bountyData.assignment > self.lastAssignment = bountyData.lastAssignment > self.assignmentLog = bountyData.assignmentLog or jarray() > 276,280c284,285 < self.posters = player.getProperty("bountyPosters") or jarray() < self.assignment = player.getProperty("bountyAssignment") < self.lastAssignment = player.getProperty("lastBountyAssignment") < self.assignmentLog = player.getProperty("bountyAssignmentLog") or jarray() < self.bountyStation = player.getProperty("bountyStation") or {} --- > local bountyStation = player.getProperty("bountyStation") or {} > self.bountyStation = bountyStation[player.serverUuid()] or {} 420,425d424 < player.setProperty("bountyPoints", self.playerRankPoints) < player.setProperty("lastBountyAssignment", self.lastAssignment) < player.setProperty("bountyAssignment", self.assignment) < player.setProperty("bountyAssignmentLog", self.assignmentLog) < player.setProperty("bountyStation", self.bountyStation) < 442a442,456 > > local newBountyData = { > lastAssignment = self.lastAssignment, > assignment = self.assignment, > assignmentLog = self.assignmentLog, > posters = self.posters > } > local bountyData = player.getProperty("bountyData") or {} > bountyData[player.serverUuid()] = newBountyData > player.setProperty("bountyData", bountyData) > > player.setProperty("bountyPoints", self.playerRankPoints) > local bountyStation = player.getProperty("bountyStation") or {} > bountyStation[player.serverUuid()] = self.bountyStation > player.setProperty("bountyStation", bountyStation) 915,934c929,931 < local rank = self.assignment.rank or getPlayerRank() < local nextRankInfo = self.bountyRanks[rank + 1] < < local pointsToCapstone = 100 < if self.assignment and self.assignment.pointsToCapstone ~= nil then < pointsToCapstone = self.assignment.pointsToCapstone < end < if (nextRankInfo and self.playerRankPoints >= nextRankInfo.threshold) or pointsToCapstone <= 0 then < loadBoard(true) < return < end < < if nextRankInfo then < player.setProperty("bountyPoints", nextRankInfo.threshold + 10) < else < local rankInfo = self.bountyRanks[rank] < self.assignment.pointsToCapstone = -10 < player.setProperty("bountyAssignment", self.assignment) < end < --- > player.setProperty("bountyData", nil) > player.setProperty("bountyPoints", nil) > player.setProperty("bountyStation", nil) 936d932 < player.setProperty("bountyPosters", nil) 938,943d933 < < < -- player.setProperty("bountyPoints", 200) < -- player.setProperty("lastBountyAssignment", nil) < -- player.setProperty("bountyAssignment", nil) < -- player.setProperty("bountyPosters", {}) items\active\unsorted\miningdrone\miningdrone.activeitem 8,9c8,9 < "description" : "--TODO--", < "shortdescription" : "miningdrone", --- > "description" : "A disposable, mechanical owl that will fly in a direction and dig a tunnel when thrown.", > "shortdescription" : "Mining Drone", items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem 41,43c41,43 < "fireTime" : 0.1, < "baseDps" : 7.5, < "energyUsage" : 100, --- > "fireTime" : 0.2, > "baseDps" : 10.0, > "energyUsage" : 50, items\active\weapons\ranged\unrand\neopistol\npcneopistol.activeitem 46c46 < "baseDps" : 5, --- > "baseDps" : 7, items\active\weapons\ranged\unrand\neoshotgun\npcneoshotgun.activeitem 46c46 < "baseDps" : 5, --- > "baseDps" : 7, items\active\weapons\ranged\unrand\neotommygun\npcneotommygun.activeitem 46c46 < "baseDps" : 10, --- > "baseDps" : 12, items\active\weapons\ranged\unrand\neouzi\npcneouzi.activeitem 46c46 < "baseDps" : 6.0, --- > "baseDps" : 8.0, monsters\boss\ophanim\ophanim.lua 16a17 > self.spawnEnergyPickup = false 19a21,22 > self.spawnEnergyPickup = config.getParameter("spawnEnergyPickup") > 33a37,39 > if self.spawnEnergyPickup then > world.spawnProjectile("mechenergypickup", mcontroller.position()) > end 139c145 < damage = 10, --- > damage = 5 * root.evalFunction("spaceMonsterLevelPowerMultiplier", monster.level()), monsters\boss\ophanim\ophanim.monstertype 25a26,27 > "healthLevelFunction" : "spaceMonsterLevelHealthMultiplier", > 68c70 < "baseValue" : 800 --- > "baseValue" : 500 monsters\boss\swansong\swansong.lua 133c133 < return power * root.evalFunction("monsterLevelPowerMultiplier", monster.level()) --- > return power * root.evalFunction("spaceMonsterLevelPowerMultiplier", monster.level()) 281c281 < function anglePrediction(targetId, time, trackRange) --- > function anglePrediction(sourcePosition, targetId, time, trackRange) 283c283 < local toTarget = world.distance(world.entityPosition(targetId), mcontroller.position()) --- > local toTarget = world.distance(world.entityPosition(targetId), sourcePosition) 369a370 > local step = 0 373,375c374,383 < await(rocketSwarmAttack(attackConfig.rocketSwarm)) < for i = 1, 5 do < await(meleeSequenceAttack(attackConfig.melee)) --- > if step == 0 or step == 2 then > await(rocketSwarmAttack(attackConfig.rocketSwarm)) > end > if step == 1 or step == 2 then > await(deathLaserAttack(attackConfig.deathLaser)) > end > if step == 0 or step == 1 then > for i = 1, 4 do > await(meleeSequenceAttack(attackConfig.melee)) > end 377d384 < await(deathLaserAttack(attackConfig.deathLaser)) 385c392 < for i = 1, 3 do --- > for i = 1, 2 do 389a397 > step = (step + 1) % 3 413c421 < status.addEphemeralEffect("loweredprotection") --- > status.addEphemeralEffect("maxhealthreduction") 613c621 < await(delay(0.5)) -- windup --- > await(delay(0.3)) -- windup 738a747,748 > await(flyTo(storage.spawnPosition)) > 783c793 < return --- > return 797a808,813 > local energyIndices = {} > for i = 1, maxSpawn do > table.insert(energyIndices, i) > end > shuffle(energyIndices) > energyIndices = util.take(3, energyIndices) 803c819,823 < world.spawnProjectile("ophanimspawner", sourcePosition, entity.id(), aimDir, false, {speed = 25}) --- > local params = {speed = 25} > if contains(energyIndices, i) then > params.spawnEnergyPickup = true > end > world.spawnProjectile("ophanimspawner", sourcePosition, entity.id(), aimDir, false, params) 1036c1056 < targetAngle = anglePrediction(self.target, 1.0, 35) --- > targetAngle = anglePrediction(mcontroller.position(), self.target, 1.0, 35) 1154c1174,1179 < stop(), --- > function() > while vec2.mag(mcontroller.velocity()) > 1.0 do > mcontroller.controlApproachVelocity({0.0, 0.0}, self.airForce) > coroutine.yield() > end > end, 1266c1291 < for i = 1, 3 do --- > for i = 1, 6 do 1270c1295 < local targetAngle = vec2.angle(toTarget) --- > local targetAngle = anglePrediction(sourcePosition, self.target, 1.0, 45) 1277c1302 < await(delay(0.5)) -- windup --- > await(delay(0.3)) -- windup 1338c1363 < await(handBeam("left", anglePrediction(self.target, 1.0, 35), setDamagePartActive)) --- > await(handBeam("left", anglePrediction(mcontroller.position(), self.target, 1.0, 35), setDamagePartActive)) 1344c1369 < await(handBeam("right", anglePrediction(self.target, 1.0, 35), setDamagePartActive)) --- > await(handBeam("right", anglePrediction(mcontroller.position(), self.target, 1.0, 35), setDamagePartActive)) monsters\boss\swansong\swansong.monstertype 20d19 < 40c39 < "rocketCount" : 20, --- > "rocketCount" : 15, 72c71 < "power" : 10, --- > "power" : 5, 80c79 < "beams" : 8 --- > "beams" : 10 105a105,107 > > "healthLevelFunction" : "spaceMonsterLevelHealthMultiplier", > "powerLevelFunction" : "spaceMonsterLevelPowerMultiplier", 183c185 < "damage" : 10, --- > "damage" : 4, 214c216 < "baseValue" : 1500 --- > "baseValue" : 8000 217c219 < "baseValue" : 85.0 --- > "baseValue" : 0.0 monsters\crawlers\crustoise\icecrustoise.monstertype 170c170 < "baseValue" : 0.5 --- > "baseValue" : -0.5 173c173 < "baseValue" : 1.0 --- > "baseValue" : 0.0 176c176 < "baseValue" : 0.0 --- > "baseValue" : 0.5 179c179 < "baseValue" : 0.0 --- > "baseValue" : 1.0 188c188 < "baseValue" : -0.5 --- > "baseValue" : 0.0 monsters\crawlers\iguarmor\iceiguarmor.monstertype 187c187 < "baseValue" : 0.0 --- > "baseValue" : -0.5 190c190 < "baseValue" : -0.5 --- > "baseValue" : 0.5 193c193 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\crawlers\oculob\fireoculob.monstertype 173c173 < "baseValue" : -0.5 --- > "baseValue" : 0.5 176c176 < "baseValue" : 0.0 --- > "baseValue" : 1.0 179c179 < "baseValue" : 0.0 --- > "baseValue" : -0.5 191c191 < "baseValue" : 0.5 --- > "baseValue" : 0.0 194c194 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\crawlers\pulpin\poisonpulpin.monstertype 213c213 < "baseValue" : 0.5 --- > "baseValue" : 0.0 216c216 < "baseValue" : 1.0 --- > "baseValue" : 0.0 231c231 < "baseValue" : 0.0 --- > "baseValue" : 0.5 234c234 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\crawlers\snaggler\icesnaggler.monstertype 197c197 < "baseValue" : 0.0 --- > "baseValue" : 0.5 200c200 < "baseValue" : 0.0 --- > "baseValue" : 1.0 203c203 < "baseValue" : 0.5 --- > "baseValue" : 0.0 206c206 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\crawlers\tintic\electrictintic.monstertype 186c186 < "baseValue" : 0.5 --- > "baseValue" : 0.0 189c189 < "baseValue" : 1.0 --- > "baseValue" : 0.0 192c192 < "baseValue" : 0.0 --- > "baseValue" : -0.5 198c198 < "baseValue" : -0.5 --- > "baseValue" : 0.5 201c201 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\flyers\agrobat\iceagrobat.monstertype 180c180 < "baseValue" : 0.0 --- > "baseValue" : -0.5 186c186 < "baseValue" : 0.0 --- > "baseValue" : 0.5 189c189 < "baseValue" : 0.0 --- > "baseValue" : 1.0 192c192 < "baseValue" : -0.5 --- > "baseValue" : 0.0 198c198 < "baseValue" : 0.5 --- > "baseValue" : 0.0 201c201 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\flyers\batong\poisonbatong.monstertype 186c186 < "baseValue" : 0.0 --- > "baseValue" : -0.5 198c198 < "baseValue" : 0.0 --- > "baseValue" : 0.5 201c201 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\flyers\bobfae\poisonbobfae.monstertype 205c205 < "baseValue" : 0.0 --- > "baseValue" : -0.5 217c217 < "baseValue" : -0.5 --- > "baseValue" : 0.5 220c220 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\flyers\monopus\firemonopus.monstertype 178c178 < "baseValue" : 0.0 --- > "baseValue" : 0.5 181c181 < "baseValue" : 0.0 --- > "baseValue" : 1.0 187c187 < "baseValue" : 1.0 --- > "baseValue" : -0.5 190c190 < "baseValue" : -0.5 --- > "baseValue" : 0.0 monsters\flyers\paratail\poisonparatail.monstertype 170c170 < "baseValue" : 0.0 --- > "baseValue" : -0.5 188c188 < "baseValue" : 0.0 --- > "baseValue" : 0.5 191c191 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\ghosts\gosmet\firegosmet.monstertype 146c146 < "baseValue" : 0.0 --- > "baseValue" : 0.5 149c149 < "baseValue" : 0.0 --- > "baseValue" : 1.0 158c158 < "baseValue" : 0.0 --- > "baseValue" : -0.5 monsters\ghosts\ignome\electricignome.monstertype 180c180 < "baseValue" : 0.5 --- > "baseValue" : 0.0 183c183 < "baseValue" : 1.0 --- > "baseValue" : 0.0 186c186 < "baseValue" : -0.5 --- > "baseValue" : 0.0 192c192 < "baseValue" : 0.0 --- > "baseValue" : 0.5 195c195 < "baseValue" : 0.0 --- > "baseValue" : 1.0 198c198 < "baseValue" : 0.0 --- > "baseValue" : -0.5 monsters\ghosts\lumoth\firelumoth.monstertype 154c154 < "baseValue" : 0.0 --- > "baseValue" : 0.5 157c157 < "baseValue" : 0.0 --- > "baseValue" : 1.0 172c172 < "baseValue" : 0.5 --- > "baseValue" : 0.0 175c175 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\ghosts\pyromantle\poisonpyromantle.monstertype 189c189 < "baseValue" : 0.5 --- > "baseValue" : 0.0 195c195 < "baseValue" : -0.5 --- > "baseValue" : 0.0 201c201 < "baseValue" : 0.0 --- > "baseValue" : -0.5 207c207 < "baseValue" : 0.0 --- > "baseValue" : 0.5 210c210 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\ghosts\skimbus\electricskimbus.monstertype 180c180 < "baseValue" : -0.5 --- > "baseValue" : 0.0 186c186 < "baseValue" : 0.5 --- > "baseValue" : -0.5 189c189 < "baseValue" : 1.0 --- > "baseValue" : 0.0 192c192 < "baseValue" : 0.0 --- > "baseValue" : 0.5 195c195 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\ghosts\spookit\firespookit.monstertype 175c175 < "baseValue" : 0.0 --- > "baseValue" : 0.5 178c178 < "baseValue" : 0.0 --- > "baseValue" : 1.0 181c181 < "baseValue" : 0.0 --- > "baseValue" : -0.5 monsters\ghosts\squeem\firesqueem.monstertype 147c147 < "baseValue" : -0.5 --- > "baseValue" : 0.5 150c150 < "baseValue" : 0.0 --- > "baseValue" : 1.0 165c165 < "baseValue" : 0.5 --- > "baseValue" : -0.5 monsters\ghosts\wisper\firewisper.monstertype 182c182 < "baseValue" : -0.5 --- > "baseValue" : 0.5 185c185 < "baseValue" : 0.0 --- > "baseValue" : 1.0 188c188 < "baseValue" : 0.5 --- > "baseValue" : -0.5 191c191 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\anglure\electricanglure.monstertype 194c194 < "baseValue" : 0.5 --- > "baseValue" : 0.0 200c200 < "baseValue" : 0.0 --- > "baseValue" : 0.5 203c203 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\bobot\firebobot.monstertype 196c196 < "baseValue" : 0.0 --- > "baseValue" : 0.5 199c199 < "baseValue" : 0.0 --- > "baseValue" : 1.0 214c214 < "baseValue" : 0.5 --- > "baseValue" : 0.0 217c217 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\bulbop\poisonbulbop.monstertype 162c162 < "baseValue" : 0.5 --- > "baseValue" : 0.0 165c165 < "baseValue" : 1.0 --- > "baseValue" : 0.0 168c168 < "baseValue" : 0.0 --- > "baseValue" : 0.5 171c171 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\capricoat\electriccapricoat.monstertype 181c181 < "baseValue" : 0.5 --- > "baseValue" : 0.0 184c184 < "baseValue" : 1.0 --- > "baseValue" : 0.0 187c187 < "baseValue" : 0.0 --- > "baseValue" : 0.5 190c190 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\fennix\icefennix.monstertype 204c204 < "baseValue" : 0.5 --- > "baseValue" : -0.5 207c207 < "baseValue" : 1.0 --- > "baseValue" : 0.0 210c210 < "baseValue" : -0.5 --- > "baseValue" : 0.5 213c213 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\gleap\firegleap.monstertype 186a187,189 > }, > "fireStatusImmunity" : { > "baseValue" : 1.0 monsters\walkers\hypnare\icehypnare.monstertype 211c211 < "baseValue" : 0.0 --- > "baseValue" : 0.5 214c214 < "baseValue" : 0.5 --- > "baseValue" : 0.0 217c217 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\kingnutmidgeling\poisonkingnutmidgeling.monstertype 140c140 < "baseValue" : 0 --- > "baseValue" : 9 143c143 < "baseValue" : 70 --- > "baseValue" : 100 170c170 < "baseValue" : 0.5 --- > "baseValue" : 0.0 173c173 < "baseValue" : 1.0 --- > "baseValue" : 0.0 176c176 < "baseValue" : 0.0 --- > "baseValue" : 0.5 179c179 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\lilodon\firelilodon.monstertype 170c170 < "baseValue" : 0.0 --- > "baseValue" : 0.5 173c173 < "baseValue" : 0.0 --- > "baseValue" : 1.0 176c176 < "baseValue" : 0.5 --- > "baseValue" : 0.0 179c179 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\mandraflora\poisonmandraflora.monstertype 206c206 < "baseValue" : 0.5 --- > "baseValue" : 0.0 209c209 < "baseValue" : 1.0 --- > "baseValue" : 0.0 212c212 < "baseValue" : 0.0 --- > "baseValue" : 0.5 215c215 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\miasmop\icemiasmop.monstertype 205c205 < "baseValue" : 0.0 --- > "baseValue" : 0.5 208c208 < "baseValue" : 0.0 --- > "baseValue" : 1.0 217c217 < "baseValue" : 0.5 --- > "baseValue" : 0.0 220c220 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\nutmidge\poisonnutmidge.monstertype 224c224 < "baseValue" : 0.5 --- > "baseValue" : 0.0 227c227 < "baseValue" : 1.0 --- > "baseValue" : 0.0 230c230 < "baseValue" : 0.0 --- > "baseValue" : 0.5 233c233 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\nutmidgeling\poisonnutmidgeling.monstertype 170c170 < "baseValue" : 0.5 --- > "baseValue" : 0.0 173c173 < "baseValue" : 1.0 --- > "baseValue" : 0.0 176c176 < "baseValue" : 0.0 --- > "baseValue" : 0.5 179c179 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\oogler\fireoogler.monstertype 211c211 < "baseValue" : 0.0 --- > "baseValue" : 0.5 214c214 < "baseValue" : 0.0 --- > "baseValue" : 1.0 217c217 < "baseValue" : 0.5 --- > "baseValue" : 0.0 220c220 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\peblit\icepeblit.monstertype 221a222,224 > }, > "iceStatusImmunity" : { > "baseValue" : 1.0 monsters\walkers\petricub\electricpetricub.monstertype 181c181 < "baseValue" : 0.0 --- > "baseValue" : -0.5 187c187 < "baseValue" : 0.0 --- > "baseValue" : 0.5 190c190 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\pipkin\poisonpipkin.monstertype 189c189 < "baseValue" : 0.0 --- > "baseValue" : 0.5 192c192 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\quagmutt\quagmutt.monstertype 174c174 < "baseValue" : 0.5 --- > "baseValue" : 0.0 177c177 < "baseValue" : 1.0 --- > "baseValue" : 0.0 186c186 < "baseValue" : 0.0 --- > "baseValue" : 0.5 189c189 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\ringram\iceringram.monstertype 175c175 < "baseValue" : 0.0 --- > "baseValue" : -0.5 193c193 < "baseValue" : -0.5 --- > "baseValue" : 0.0 monsters\walkers\scaveran\poisonscaveran.monstertype 196c196 < "baseValue" : 0.0 --- > "baseValue" : -0.5 214c214 < "baseValue" : 0.0 --- > "baseValue" : 0.5 217c217 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\taroni\firetaroni.monstertype 102c102 < "baseValue" : -0.5 --- > "baseValue" : 0.5 105c105 < "baseValue" : 0.0 --- > "baseValue" : 1.0 120c120 < "baseValue" : 0.5 --- > "baseValue" : -0.5 123c123 < "baseValue" : 1.0 --- > "baseValue" : 0.0 monsters\walkers\toumingo\firetoumingo.monstertype 183c183 < "baseValue" : 0.0 --- > "baseValue" : 0.5 186c186 < "baseValue" : 0.0 --- > "baseValue" : 1.0 201c201 < "baseValue" : 0.0 --- > "baseValue" : -0.5 monsters\walkers\trictus\poisontrictus.monstertype 183c183 < "baseValue" : 0.5 --- > "baseValue" : -0.5 186c186 < "baseValue" : 1.0 --- > "baseValue" : 0.0 201c201 < "baseValue" : -0.5 --- > "baseValue" : 0.5 204c204 < "baseValue" : 0.0 --- > "baseValue" : 1.0 monsters\walkers\yokat\electricyokat.monstertype 203c203 < "baseValue" : -0.5 --- > "baseValue" : 0.0 215c215 < "baseValue" : 0.0 --- > "baseValue" : -0.5 npcs\outpost\captainnoble.npctype 110c110,111 < "Howdy, Officer ! How's the workload treatin' yer?" --- > "Howdy, Officer ! How's the workload treatin' yer?", > "Always keep yer head up, Officer !" objects\neon\neonhologram\neonhologram.object 18,24c18,24 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This is an impressively rendered tree... But it's unfortunate that holograms can only be a single colour.", > "avianDescription" : "A tree that hangs in the air, a formation of light frozen in space! How wonderful.", > "floranDescription" : "Floran seesss a tree, but cannot smell it. Sssuspicious.", > "glitchDescription" : "Impressed. This tree is made of light, but it has such a sense of presence...", > "humanDescription" : "Holographic trees! Who needs to go on a beachside getaway?", > "hylotlDescription" : "Artificial depictions of nature are no match for the real thing.", > "novakidDescription" : "This is a mighty neat invention!", objects\neon\neonlamppost\neonlamppost.object 14,19c14,19 < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription": "-todo-", --- > "avianDescription" : "This lamp post is rather aesthetically unpleasant, if I do say so myself.", > "floranDescription" : "Floran might be able climb post for tactical advantagesss.", > "glitchDescription" : "Concerned. If this lamp is for streetside visibility, why is it pink?", > "humanDescription" : "Yep, that's a classic street lamp alright. I don't know if the pink light helps visibility, though.", > "hylotlDescription" : "Such an inelegant design.", > "novakidDescription": "Lamp posts like this must be a common sight for city slickers!", objects\neon\neonlight\neonlight.object 13,16c13,16 < "apexDescription" : "These lights give off a cold neon hue.", < "avianDescription" : "This neon light makes my shiver, although it isn't actually cold.", < "floranDescription" : "Floran thinksss neon is okay colour. Not asss good as green or red!", < "glitchDescription" : "Intrigued. Why does this light make me feel so cold?", --- > "apexDescription" : "These lights give off a warm magenta hue.", > "avianDescription" : "This neon light reminds me of a sunset, shining through diamond clouds.", > "floranDescription" : "Pink isss a strong colour! Colour of strong and healthy flower!", > "glitchDescription" : "Calm. This light creates a pleasant atmosphere.", objects\neon\neonpeacekeeperemblem\neonpeacekeeperemblem.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription": "-todo-", --- > "apexDescription" : "This large neon sign looks particularly well-engineered.", > "avianDescription" : "This wall-mounted emblem shines with the colours of a tropical sunset!", > "floranDescription" : "Big emblem. It isss big.", > "glitchDescription" : "Impressed. This emblem glows as if it has an inner fire!", > "humanDescription" : "This is like the regular Peacekeeper emblem, but... Cooler.", > "hylotlDescription" : "This is quite a garish thing.", > "novakidDescription": "Mighty cool wall plaque!", objects\neon\neonstore\neonstore.object 31,37c31,37 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "The individual manning this stall doesn't appear to be a Glitch. Perhaps they are some other kind of automaton?", > "avianDescription" : "This store's neon aesthetic sure is intriguing!", > "floranDescription" : "Floran thinksss Floran could beat shop perssson in fistfight.", > "glitchDescription" : "Intrigued. This shopkeeper appears to be mecanical, but he does not appear to be a Glitch.", > "humanDescription" : "This guy doesn't seem to say much, but his shop sure looks pretty cool.", > "hylotlDescription" : "If this shop needs to insist it is \"cool\" then my expectations are already low.", > "novakidDescription" : "I sure would like to peruse this here store!", objects\neon\neontriangle\neontriangle.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription": "-todo-", --- > "apexDescription" : "A triangle of glass tubing, filled with a neon filament.", > "avianDescription" : "This wall light radiates with a calming glow!", > "floranDescription" : "Floran wantsss to use wall thing as throwing weapon.", > "glitchDescription" : "Curious. The design of this wall-mounted emblem is very minimalist.", > "humanDescription" : "This wall light definitely makes a room feel cool and ready for parties.", > "hylotlDescription" : "What a garish colour.", > "novakidDescription": "I hafta say, I do have a personal preference for anythin' neon and glowin'!", objects\peacekeeper\peacekeeperchair\peacekeeperchair.object 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This chair looks like it would make an effective barricade in a pinch.", > "avianDescription" : "This doesn't look like the most comfortable chair I've ever seen.", > "floranDescription" : "Floran doesssn't think Floran could lift heavy chair.", > "glitchDescription" : "Impressed. This chair looks like it could withstand several fierce blows.", > "humanDescription" : "This metal chair looks uncomfortable, but the backrest looks like it improves posture!", > "hylotlDescription" : "This chair is designed entirely with function in mind. It is rather repugnant.", > "novakidDescription" : "I could take a quick nap in this here chair, if needs be.", objects\peacekeeper\peacekeeperdesk\peacekeeperdesk.object 5c5 < "description" : "A round desk, made for the Peacekeeper's HQ.", --- > "description" : "A round desk, typically found in Peacekeeper stations.", 11,17c11,16 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This desk is of an appropriately large size.", > "avianDescription" : "Someone has kept this desk in good condition!", > "floranDescription" : "Floran can ssstand on table to gain tactical advantage.", > "glitchDescription" : "This certainly is a round desk... I'm not sure what else I can really say.", > "hylotlDescription" : "This large table is remarkably well-polished.", > "novakidDescription" : "This round table looks mighty suitable for playin' a game o' cards on.", objects\peacekeeper\peacekeeperdoor\peacekeeperdoor.object 8c8 < "description" : "-todo-", --- > "description" : "An automatic door, typically used in Peacekeeper Stations.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This automatic door is stylised with a Peacekeeper emblem.", > "avianDescription" : "This door is adorned with a proud emblem.", > "floranDescription" : "Floran sees door. Floran wantsss to walk through door.", > "glitchDescription" : "Impressed. I appreciate that this door chooses to open itself, rather than waiting to be opened.", > "humanDescription" : "Y'know, the Peacekeeper emblem sure looks like a happy face...", > "hylotlDescription" : "I have seen more elegant doors than this.", > "novakidDescription" : "This door opens itself! Mighty convenient...", objects\peacekeeper\peacekeeperfurnishings\peacekeeperfurnishings.object 8c8 < "description" : "-todo-", --- > "description" : "Fine furnishings, with a Peacekeeper twist.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This frog appears to be selling Peacekeeper furniture.", > "avianDescription" : "I suppose I could buy some Peacekeeper furniture for myself!", > "floranDescription" : "Floran wandersss why frog doesss not ssspeak.", > "glitchDescription" : "Impressed. This amphibious gent has polished his helmet to a shine!", > "humanDescription" : "I guess \"Fr├╢gg Furnishing\" must be a chain store?", > "hylotlDescription" : "This curious individual appears to be selling furniture.", > "novakidDescription" : "This looks like a mighty fine opportunity for some decoratin'!", objects\peacekeeper\peacekeeperlamppost\peacekeeperlamppost.object 13,19c13,19 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription": "-todo-", --- > "apexDescription" : "A well-made lamp post, possibly made from reinforced durasteel.", > "avianDescription" : "A rather fine looking lamp!", > "floranDescription" : "Floran has seen many tall lightsss. This is also one.", > "glitchDescription" : "Impressed. Despite first appearances, this lamp post's metal exterior is extremely durable.", > "humanDescription" : "Encroaching urbanisation isn't complete without a lamp post or two!", > "hylotlDescription" : "A rather ugly lamp post.", > "novakidDescription": "This here lamp post is mighty tall, ain't it?", objects\peacekeeper\peacekeepernotes\peacekeepernotes.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "Someone is making a break in a mystery, it appears.", > "avianDescription" : "It looks like someone is passionately trying to solve a mystery. How exciting!", > "floranDescription" : "Floran not interested enough to read notesss.", > "glitchDescription" : "Excited. These notes seem to indicate that someone is close to a breakthrough on a case!", > "humanDescription" : "You can't solve crimes without newspapers, string and notes all messily pinned to a wall!", > "hylotlDescription" : "A rather crude approach to solving mysteries, but I suppose it must be effective.", > "novakidDescription" : "Yee-haw, look's like someone's close to solvin' a big case!", objects\peacekeeper\peacekeeperpainting\peacekeeperpainting.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This is a pleasing piece of art.", > "avianDescription" : "As an Avian, I am always fond of artistic depictions of the sun.", > "floranDescription" : "Floran sees treesss. Floran approvesss.", > "glitchDescription" : "Calm. This painted scene evokes a feeling of timelessness.", > "humanDescription" : "pink sunsets and palm trees ", > "hylotlDescription" : "A rather pleasant gradient of colours.", > "novakidDescription" : "A pretty timeless scene, ain't it?", objects\peacekeeper\peacekeeperposter1\peacekeeperposter1.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This poster is a request for information on a local crime organisation.", > "avianDescription" : "This poster shows pictures of some recently seen criminals.", > "floranDescription" : "Floran uninterested in wall paper.", > "glitchDescription" : "Intrigued. This poster shows some local brigands who have so far averted justice.", > "humanDescription" : "A classic \"wanted\" poster. Apparently there are some local criminals on the run and up to no good!", > "hylotlDescription" : "Hmm - it seems that the Peacekeepers are currently tracking some local criminal who has averted justice.", > "novakidDescription" : "This poster is sayin' that there's some real varmints on the run right now.", objects\peacekeeper\peacekeeperposter2\peacekeeperposter2.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This poster is a request for information on a local crime organisation.", > "avianDescription" : "This poster shows pictures of some recently seen criminals.", > "floranDescription" : "Floran uninterested in wall paper.", > "glitchDescription" : "Intrigued. This poster shows some local brigands who have so far averted justice.", > "humanDescription" : "A classic \"wanted\" poster. Apparently there are some local criminals on the run and up to no good!", > "hylotlDescription" : "Hmm - it seems that the Peacekeepers are currently tracking some local criminal who has averted justice.", > "novakidDescription" : "This poster is sayin' that there's some real varmints on the run right now.", objects\peacekeeper\peacekeepertable\peacekeepertable.object 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This reinforced table could make for effective firefight cover in a pinch.", > "avianDescription" : "Someone has attempted to brighten up this table with a yellow stripe. I'm not sure it has succeeded.", > "floranDescription" : "Floran could put hunting trophies on table. Ussseful.", > "glitchDescription" : "Curious. I wonder if this strong table could withstand the blow of an executioner's axe?", > "humanDescription" : "I have seen many tables in my time, and this certainly is one of them.", > "hylotlDescription" : "This is a rather unaesthetically pleasing table.", > "novakidDescription" : "This table looks mighty heavy to move around a place!", objects\peacekeeper\peacekeepervendingmachine\peacekeepervendingmachine.object 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "These pastry products are so unhealthy. I should probably not have too many.", > "avianDescription" : "Donuts? How lovely!", > "floranDescription" : "Floran doessn't like any treats that aren't made of meat.", > "glitchDescription" : "Excited. Such treasures lie within!", > "humanDescription" : "Donuts! Mankind's most beloved food. There sure is a variety of them in here!", > "hylotlDescription" : "This unhealthy treats are not worth polluting my body with. Well... Maybe just one.", > "novakidDescription" : "Y'know, I ain't even sure if these are bad for the health o' someone like me.", objects\wired\standingturret\standingturret.lua 1,215c1,216 < require "/scripts/util.lua" < require "/scripts/interp.lua" < < function init() < -- Positions and angles < self.baseOffset = config.getParameter("baseOffset") < self.basePosition = vec2.add(object.position(), self.baseOffset) < self.tipOffset = config.getParameter("tipOffset") --This is offset from BASE position, not object origin < < self.rotationSpeed = util.toRadians(config.getParameter("rotationSpeed")) < self.offAngle = util.toRadians(config.getParameter("offAngle", -30)) < < -- Targeting < self.targetQueryRange = config.getParameter("targetQueryRange") < self.targetMinRange = config.getParameter("targetMinRange") < self.targetMaxRange = config.getParameter("targetMaxRange") < self.targetAngleRange = util.toRadians(config.getParameter("targetAngleRange")) < < -- Energy < storage.energy = storage.energy or 0 < self.regenBlockTimer = 0 < self.energyRegen = config.getParameter("energyRegen") < self.maxEnergy = config.getParameter("maxEnergy") < self.energyRegenBlock = config.getParameter("energyRegenBlock") < < self.energyBarOffset = config.getParameter("energyBarOffset") < self.verticalScaling = config.getParameter("verticalScaling") < animator.translateTransformationGroup("energy", self.energyBarOffset) < < -- Initialize turret < object.setInteractive(false) < < self.state = FSM:new() < self.state:set(offState) < end < < function update(dt) < self.state:update(dt) < < world.debugPoint(firePosition(), "green") < < if storage.energy == 0 then < self.blockEnergyUsage = true < elseif storage.energy == self.maxEnergy then < self.blockEnergyUsage = false < end < < if self.regenBlockTimer > 0 then < self.regenBlockTimer = math.max(0, self.regenBlockTimer - script.updateDt()) < else < storage.energy = math.min(self.maxEnergy, storage.energy + self.energyRegen * script.updateDt()) < end < < local ratio = storage.energy / self.maxEnergy < local animationState = "full" < < if ratio <= 0.75 then animationState = "high" end < if ratio <= 0.5 then animationState = "medium" end < if ratio <= 0.25 then animationState = "low" end < if ratio <= 0 then animationState = "none" end < < local scale = self.verticalScaling and {1, ratio * 11} or {ratio * 11, 1} < < animator.resetTransformationGroup("energy") < animator.scaleTransformationGroup("energy", scale) < animator.translateTransformationGroup("energy", self.energyBarOffset) < < animator.setAnimationState("energy", animationState) < end < < ---------------------------------------------------------------------------------------------------------- < -- States < < function offState() < animator.setAnimationState("attack", "dead") < animator.playSound("powerDown") < object.setAllOutputNodes(false) < < while true do < animator.rotateGroup("gun", self.offAngle) < < if active() then break end < coroutine.yield() < end < < animator.playSound("powerUp") < < self.state:set(scanState) < end < < function scanState() < animator.setAnimationState("attack", "idle") < util.wait(0.5) < animator.playSound("scan") < object.setAllOutputNodes(false) < < local timer = 0 < < local scanInterval = config.getParameter("scanInterval") < local scanAngle = util.toRadians(config.getParameter("scanAngle")) < < local scan = coroutine.wrap(function() < while true do < local target = findTarget() < if target then return self.state:set(fireState, target) end < util.wait(1.0) < end < end) < < while true do < timer = timer + script.updateDt() / scanInterval < if timer > 1 then timer = 0 end < animator.rotateGroup("gun", scanAngle * math.sin(timer * math.pi*2)) < < scan() < < if not active() then break end < coroutine.yield() < end < < self.state:set(offState) < end < < function fireState(targetId) < animator.setAnimationState("attack", "attack") < animator.playSound("foundTarget") < object.setAllOutputNodes(true) < < local maxFireAngle = util.toRadians(config.getParameter("maxFireAngle")) < local fire = coroutine.wrap(autoFire) < < while true do < if not active() then return self.state:set(offState) end < < if not world.entityExists(targetId) then break end < < local targetPosition = world.entityPosition(targetId) < local toTarget = world.distance(targetPosition, self.basePosition) < local targetDistance = world.magnitude(toTarget) < local targetAngle = math.atan(toTarget[2], object.direction() * toTarget[1]) < < if targetDistance > self.targetMaxRange or targetDistance < self.targetMinRange or world.lineTileCollision(self.basePosition, targetPosition) then break end < if math.abs(targetAngle) > self.targetAngleRange then break end < < animator.rotateGroup("gun", targetAngle) < < local rotation = animator.currentRotationAngle("gun") < if math.abs(util.angleDiff(targetAngle, rotation)) < maxFireAngle then < fire() < end < coroutine.yield() < end < < util.wait(1.0) < < self.state:set(scanState) < end < < ---------------------------------------------------------------------------------------------------------- < -- Helping functions, not states < < function consumeEnergy(amount) < if storage.energy <= 0 or self.blockEnergyUsage then return false end < storage.energy = storage.energy - amount < self.regenBlockTimer = self.energyRegenBlock < return true < end < < function active() < if object.isInputNodeConnected(0) then < return object.getInputNodeLevel(0) < end < < storage.active = storage.active ~= nil and storage.active or true < return storage.active < end < < function firePosition() < local animationPosition = vec2.div(config.getParameter("animationPosition"), 8) < local fireOffset = vec2.add(animationPosition, animator.partPoint("gun", "projectileSource")) < return vec2.add(object.position(), fireOffset) < end < < -- Coroutine < function autoFire() < local level = math.max(1.0, world.threatLevel()) < local power = config.getParameter("power", 2) < power = root.evalFunction("monsterLevelPowerMultiplier", level) * power < local fireTime = config.getParameter("fireTime", 0.1) < local projectileParameters = config.getParameter("projectileParameters", {}) < local energyUsage = config.getParameter("energyUsage") < < while true do < while not consumeEnergy(energyUsage) do coroutine.yield() end < < local rotation = animator.currentRotationAngle("gun") < local aimVector = {object.direction() * math.cos(rotation), math.sin(rotation)} < world.spawnProjectile("standardbullet", firePosition(), entity.id(), aimVector, false, projectileParameters) < animator.playSound("fire") < util.wait(fireTime) < end < end < < -- Coroutine < function findTarget() < local nearEntities = world.entityQuery(self.basePosition, self.targetQueryRange, { includedTypes = { "monster", "npc", "player" } }) < return util.find(nearEntities, function(entityId) < local targetPosition = world.entityPosition(entityId) < if not entity.isValidTarget(entityId) or world.lineTileCollision(self.basePosition, targetPosition) then return false end < < local toTarget = world.distance(targetPosition, self.basePosition) < local targetAngle = math.atan(toTarget[2], object.direction() * toTarget[1]) < return world.magnitude(toTarget) > self.targetMinRange and math.abs(targetAngle) < self.targetAngleRange < end) < end --- > require "/scripts/util.lua" > require "/scripts/interp.lua" > > function init() > -- Positions and angles > self.baseOffset = config.getParameter("baseOffset") > self.basePosition = vec2.add(object.position(), self.baseOffset) > self.tipOffset = config.getParameter("tipOffset") --This is offset from BASE position, not object origin > > self.rotationSpeed = util.toRadians(config.getParameter("rotationSpeed")) > self.offAngle = util.toRadians(config.getParameter("offAngle", -30)) > > -- Targeting > self.targetQueryRange = config.getParameter("targetQueryRange") > self.targetMinRange = config.getParameter("targetMinRange") > self.targetMaxRange = config.getParameter("targetMaxRange") > self.targetAngleRange = util.toRadians(config.getParameter("targetAngleRange")) > > -- Energy > storage.energy = storage.energy or 0 > self.regenBlockTimer = 0 > self.energyRegen = config.getParameter("energyRegen") > self.maxEnergy = config.getParameter("maxEnergy") > self.energyRegenBlock = config.getParameter("energyRegenBlock") > > self.energyBarOffset = config.getParameter("energyBarOffset") > self.verticalScaling = config.getParameter("verticalScaling") > animator.translateTransformationGroup("energy", self.energyBarOffset) > > -- Initialize turret > object.setInteractive(false) > > self.state = FSM:new() > self.state:set(offState) > end > > function update(dt) > self.state:update(dt) > > world.debugPoint(firePosition(), "green") > > if storage.energy == 0 then > self.blockEnergyUsage = true > elseif storage.energy == self.maxEnergy then > self.blockEnergyUsage = false > end > > if self.regenBlockTimer > 0 then > self.regenBlockTimer = math.max(0, self.regenBlockTimer - script.updateDt()) > else > storage.energy = math.min(self.maxEnergy, storage.energy + self.energyRegen * script.updateDt()) > end > > local ratio = storage.energy / self.maxEnergy > local animationState = "full" > > if ratio <= 0.75 then animationState = "high" end > if ratio <= 0.5 then animationState = "medium" end > if ratio <= 0.25 then animationState = "low" end > if ratio <= 0 then animationState = "none" end > > local scale = self.verticalScaling and {1, ratio * 11} or {ratio * 11, 1} > > animator.resetTransformationGroup("energy") > animator.scaleTransformationGroup("energy", scale) > animator.translateTransformationGroup("energy", self.energyBarOffset) > > animator.setAnimationState("energy", animationState) > end > > ---------------------------------------------------------------------------------------------------------- > -- States > > function offState() > animator.setAnimationState("attack", "dead") > animator.playSound("powerDown") > object.setAllOutputNodes(false) > > while true do > animator.rotateGroup("gun", self.offAngle) > > if active() then break end > coroutine.yield() > end > > animator.playSound("powerUp") > > self.state:set(scanState) > end > > function scanState() > animator.setAnimationState("attack", "idle") > util.wait(0.5) > animator.playSound("scan") > object.setAllOutputNodes(false) > > local timer = 0 > > local scanInterval = config.getParameter("scanInterval") > local scanAngle = util.toRadians(config.getParameter("scanAngle")) > > local scan = coroutine.wrap(function() > while true do > local target = findTarget() > if target then return self.state:set(fireState, target) end > util.wait(1.0) > end > end) > > while true do > timer = timer + script.updateDt() / scanInterval > if timer > 1 then timer = 0 end > animator.rotateGroup("gun", scanAngle * math.sin(timer * math.pi*2)) > > scan() > > if not active() then break end > coroutine.yield() > end > > self.state:set(offState) > end > > function fireState(targetId) > animator.setAnimationState("attack", "attack") > animator.playSound("foundTarget") > object.setAllOutputNodes(true) > > local maxFireAngle = util.toRadians(config.getParameter("maxFireAngle")) > local fire = coroutine.wrap(autoFire) > > while true do > if not active() then return self.state:set(offState) end > > if not world.entityExists(targetId) then break end > > local targetPosition = world.entityPosition(targetId) > local toTarget = world.distance(targetPosition, self.basePosition) > local targetDistance = world.magnitude(toTarget) > local targetAngle = math.atan(toTarget[2], object.direction() * toTarget[1]) > > if targetDistance > self.targetMaxRange or targetDistance < self.targetMinRange or world.lineTileCollision(self.basePosition, targetPosition) then break end > if math.abs(targetAngle) > self.targetAngleRange then break end > > animator.rotateGroup("gun", targetAngle) > > local rotation = animator.currentRotationAngle("gun") > if math.abs(util.angleDiff(targetAngle, rotation)) < maxFireAngle then > fire() > end > coroutine.yield() > end > > util.wait(1.0) > > self.state:set(scanState) > end > > ---------------------------------------------------------------------------------------------------------- > -- Helping functions, not states > > function consumeEnergy(amount) > if storage.energy <= 0 or self.blockEnergyUsage then return false end > storage.energy = storage.energy - amount > self.regenBlockTimer = self.energyRegenBlock > return true > end > > function active() > if object.isInputNodeConnected(0) then > return object.getInputNodeLevel(0) > end > > storage.active = storage.active ~= nil and storage.active or true > return storage.active > end > > function firePosition() > local animationPosition = vec2.div(config.getParameter("animationPosition"), 8) > local fireOffset = vec2.add(animationPosition, animator.partPoint("gun", "projectileSource")) > return vec2.add(object.position(), fireOffset) > end > > -- Coroutine > function autoFire() > local level = math.max(1.0, world.threatLevel()) > local power = config.getParameter("power", 2) > power = root.evalFunction("monsterLevelPowerMultiplier", level) * power > local fireTime = config.getParameter("fireTime", 0.1) > local projectileParameters = config.getParameter("projectileParameters", {}) > projectileParameters.power = power > local energyUsage = config.getParameter("energyUsage") > > while true do > while not consumeEnergy(energyUsage) do coroutine.yield() end > > local rotation = animator.currentRotationAngle("gun") > local aimVector = {object.direction() * math.cos(rotation), math.sin(rotation)} > world.spawnProjectile("standardbullet", firePosition(), entity.id(), aimVector, false, projectileParameters) > animator.playSound("fire") > util.wait(fireTime) > end > end > > -- Coroutine > function findTarget() > local nearEntities = world.entityQuery(self.basePosition, self.targetQueryRange, { includedTypes = { "monster", "npc", "player" } }) > return util.find(nearEntities, function(entityId) > local targetPosition = world.entityPosition(entityId) > if not entity.isValidTarget(entityId) or world.lineTileCollision(self.basePosition, targetPosition) then return false end > > local toTarget = world.distance(targetPosition, self.basePosition) > local targetAngle = math.atan(toTarget[2], object.direction() * toTarget[1]) > return world.magnitude(toTarget) > self.targetMinRange and math.abs(targetAngle) < self.targetAngleRange > end) > end objects\wired\standingturret\standingturret.object 1,192c1,192 < { < "objectName" : "standingturret", < "colonyTags" : ["wired","combat"], < "printable" : false, < "rarity" : "Common", < "objectType" : "container", < "price" : 150, < < "slotCount" : 0, < "uiConfig" : "/interface/turret/standingturret.config", < "frameCooldown" : 5, < "autoCloseCooldown" : 3600, < < "description" : "Turret for your protection! Can only be placed once.", < "shortdescription" : "Defense Turret", < "subtitle" : "Automatic Base Defense", < "race" : "generic", < "category" : "wire", < < "breakDropOptions" : [ < [ [ "siliconboard", 1, { } ], [ "wire", 1, { } ] ] < ], < < "apexDescription" : "Always watchful.", < "avianDescription" : "The monsters don't stand a chance, unless they can fly.", < "floranDescription" : "Effective againssst living thingsss.", < "glitchDescription" : "Cautious. Must not disrupt my brother in his vigilance.", < "humanDescription" : "An automated security system.", < "hylotlDescription" : "Looks like a turret of some sort.", < "novakidDescription" : "Looks like this thing sure could do some damage!", < < "inventoryIcon" : "icon.png", < "orientations" : [ < { < "dualImage" : "turretstand.png:bottom", < < "imagePosition" : [-16, 0], < "imageLayers" : [ { "image" : "turretstand.png:bottom" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], < "spaces" : [ < [-2, 0], [-1, 0], [0, 0], [1, 0], < [-2, 1], [-1, 1], [0, 1], [1, 1] < ], < "anchors" : [ "bottom" ], < < "animationParts" : { < "gun" : "turretgun.png", < "stand" : "turretstand.png:bottom", < "energy" : "energy.png" < }, < "animationPosition" : [0, 16], < "animationCenterLine" : 0, < < "baseOffset" : [0, 2], < "energyBarOffset" : [0.375, -1.5], < "verticalScaling" : false < }, < { < "dualImage" : "turretstand.png:top", < < "imagePosition" : [-16, -24], < "imageLayers" : [ { "image" : "turretstand.png:top" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], < "spaces" : [ < [-2, -1], [-1, -1], [0, -1], [1, -1], < [-2, 0], [-1, 0], [0, 0], [1, 0] < ], < "anchors" : [ "top" ], < < "animationParts" : { < "gun" : "turretgun.png", < "stand" : "turretstand.png:top", < "energy" : "energy.png" < }, < "animationPosition" : [0, -8], < "animationCenterLine" : 0, < < "baseOffset" : [0, -1], < "energyBarOffset" : [0.375, 1.375], < "verticalScaling" : false < }, < { < "image" : "turretstand.png:left", < < "imagePosition" : [0, 0], < "imageLayers" : [ { "image" : "turretstand.png:left" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], < "spaces" : [ < [0, 0], [1, 0], < [0, 1], [1, 1], < [0, 2], [1, 2] < ], < "anchors" : [ "left" ], < "direction" : "right", < < "animationParts" : { < "gun" : "turretgun.png", < "stand" : "turretstand.png:left", < "energy" : "energy.png" < }, < "animationPosition" : [16, 16], < < "baseOffset" : [2, 2], < "energyBarOffset" : [-1.5, -0.625], < "verticalScaling" : true < }, < { < "image" : "turretstand.png:left", < < "imagePosition" : [-24, 0], < "spaces" : [ < [-1, 0], [0, 0], < [-1, 1], [0, 1], < [-1, 2], [0, 2] < ], < "anchors" : [ "right" ], < "direction" : "left", < < "imageLayers" : [ { "image" : "turretstand.png:left" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], < "flipImages" : true, < < "animationParts" : { < "gun" : "turretgun.png", < "stand" : "turretstand.png:left", < "energy" : "energy.png" < }, < "animationPosition" : [-10, 16], < < "baseOffset" : [-1, 2], < "energyBarOffset" : [-1.5, -0.625], < "verticalScaling" : true < } < ], < < "objectWidth" : 4, < < "animation" : "standingturret.animation", < < "scripts" : [ < "/objects/wired/standingturret/standingturret.lua", < "/scripts/npcToyObject.lua", < "/scripts/stateMachine.lua", < "/scripts/util.lua", < "/scripts/vec2.lua" < ], < < "damageTeam" : { < "type" : "assistant" < }, < < "scriptDelta" : 5, < < "outputNodes" : [ [0, 0] ], < "inputNodes" : [ [0, 1] ], < < "rotationSpeed" : 25, < < "tipOffset" : [2.5, 0], < "offAngle" : -30, < < "scanInterval" : 6, < "scanAngle" : 30, < "scanRange" : 35, < < "targetQueryRange" : 35, < "targetMinRange" : 2.5, < "targetMaxRange" : 50, < "targetAngleRange" : 75, < < "maxFireAngle" : 5, < < "energyUsage" : 4, < "power" : 1, < "fireTime" : 0.1, < < "maxEnergy" : 100, < "energyRegen" : 25, < "energyRegenBlock" : 1.0, < < "npcToy" : { < "influence" : [ < "turret" < ], < "defaultReactions" : { < "turret" : [ < [1.0, "pressbutton"], < [1.0, "oh"], < [1.0, "laugh"] < ] < }, < "preciseStandPositionLeft" : [-1.0, 0.0], < "preciseStandPositionRight" : [1.0, 0.0], < "maxNpcs" : 1 < } < } --- > { > "objectName" : "standingturret", > "colonyTags" : ["wired","combat"], > "printable" : false, > "rarity" : "Common", > "objectType" : "container", > "price" : 150, > > "slotCount" : 0, > "uiConfig" : "/interface/turret/standingturret.config", > "frameCooldown" : 5, > "autoCloseCooldown" : 3600, > > "description" : "Turret for your protection! Can only be placed once.", > "shortdescription" : "Defense Turret", > "subtitle" : "Automatic Base Defense", > "race" : "generic", > "category" : "wire", > > "breakDropOptions" : [ > [ [ "siliconboard", 1, { } ], [ "wire", 1, { } ] ] > ], > > "apexDescription" : "Always watchful.", > "avianDescription" : "The monsters don't stand a chance, unless they can fly.", > "floranDescription" : "Effective againssst living thingsss.", > "glitchDescription" : "Cautious. Must not disrupt my brother in his vigilance.", > "humanDescription" : "An automated security system.", > "hylotlDescription" : "Looks like a turret of some sort.", > "novakidDescription" : "Looks like this thing sure could do some damage!", > > "inventoryIcon" : "icon.png", > "orientations" : [ > { > "dualImage" : "turretstand.png:bottom", > > "imagePosition" : [-16, 0], > "imageLayers" : [ { "image" : "turretstand.png:bottom" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], > "spaces" : [ > [-2, 0], [-1, 0], [0, 0], [1, 0], > [-2, 1], [-1, 1], [0, 1], [1, 1] > ], > "anchors" : [ "bottom" ], > > "animationParts" : { > "gun" : "turretgun.png", > "stand" : "turretstand.png:bottom", > "energy" : "energy.png" > }, > "animationPosition" : [0, 16], > "animationCenterLine" : 0, > > "baseOffset" : [0, 2], > "energyBarOffset" : [0.375, -1.5], > "verticalScaling" : false > }, > { > "dualImage" : "turretstand.png:top", > > "imagePosition" : [-16, -24], > "imageLayers" : [ { "image" : "turretstand.png:top" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], > "spaces" : [ > [-2, -1], [-1, -1], [0, -1], [1, -1], > [-2, 0], [-1, 0], [0, 0], [1, 0] > ], > "anchors" : [ "top" ], > > "animationParts" : { > "gun" : "turretgun.png", > "stand" : "turretstand.png:top", > "energy" : "energy.png" > }, > "animationPosition" : [0, -8], > "animationCenterLine" : 0, > > "baseOffset" : [0, -1], > "energyBarOffset" : [0.375, 1.375], > "verticalScaling" : false > }, > { > "image" : "turretstand.png:left", > > "imagePosition" : [0, 0], > "imageLayers" : [ { "image" : "turretstand.png:left" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], > "spaces" : [ > [0, 0], [1, 0], > [0, 1], [1, 1], > [0, 2], [1, 2] > ], > "anchors" : [ "left" ], > "direction" : "right", > > "animationParts" : { > "gun" : "turretgun.png", > "stand" : "turretstand.png:left", > "energy" : "energy.png" > }, > "animationPosition" : [16, 16], > > "baseOffset" : [2, 2], > "energyBarOffset" : [-1.5, -0.625], > "verticalScaling" : true > }, > { > "image" : "turretstand.png:left", > > "imagePosition" : [-24, 0], > "spaces" : [ > [-1, 0], [0, 0], > [-1, 1], [0, 1], > [-1, 2], [0, 2] > ], > "anchors" : [ "right" ], > "direction" : "left", > > "imageLayers" : [ { "image" : "turretstand.png:left" }, { "image" : "turretgun.png:dead", "position": [4, 12] } ], > "flipImages" : true, > > "animationParts" : { > "gun" : "turretgun.png", > "stand" : "turretstand.png:left", > "energy" : "energy.png" > }, > "animationPosition" : [-10, 16], > > "baseOffset" : [-1, 2], > "energyBarOffset" : [-1.5, -0.625], > "verticalScaling" : true > } > ], > > "objectWidth" : 4, > > "animation" : "standingturret.animation", > > "scripts" : [ > "/objects/wired/standingturret/standingturret.lua", > "/scripts/npcToyObject.lua", > "/scripts/stateMachine.lua", > "/scripts/util.lua", > "/scripts/vec2.lua" > ], > > "damageTeam" : { > "type" : "assistant" > }, > > "scriptDelta" : 5, > > "outputNodes" : [ [0, 0] ], > "inputNodes" : [ [0, 1] ], > > "rotationSpeed" : 25, > > "tipOffset" : [2.5, 0], > "offAngle" : -30, > > "scanInterval" : 6, > "scanAngle" : 30, > "scanRange" : 35, > > "targetQueryRange" : 35, > "targetMinRange" : 2.5, > "targetMaxRange" : 50, > "targetAngleRange" : 75, > > "maxFireAngle" : 5, > > "energyUsage" : 4, > "power" : 5.0, > "fireTime" : 0.1, > > "maxEnergy" : 100, > "energyRegen" : 25, > "energyRegenBlock" : 1.0, > > "npcToy" : { > "influence" : [ > "turret" > ], > "defaultReactions" : { > "turret" : [ > [1.0, "pressbutton"], > [1.0, "oh"], > [1.0, "laugh"] > ] > }, > "preciseStandPositionLeft" : [-1.0, 0.0], > "preciseStandPositionRight" : [1.0, 0.0], > "maxNpcs" : 1 > } > } projectiles\boss\swansong\ophanimspawner\ophanimspawner.lua 20c20,21 < level = world.threatLevel() --- > level = world.threatLevel(), > spawnEnergyPickup = config.getParameter("spawnEnergyPickup") quests\bounty\bounty.lua 374a375,379 > > if i > 2 and q.questId == quest.questId() then > break > end > 377c382 < if i > 2 then --- > if q.questId ~= quest.questId() then 389a395 > 396c402 < --- > quests\bounty\bountyassignment.lua 20c20,21 < --- > > self.bountyRanks = root.assetJson("/quests/bounty/assignment.config:bountyRanks") 21a23,27 > > if quest.serverUuid() ~= player.serverUuid() then > storage.bountySystem = nil > quest.setServerUuid(player.serverUuid()) > end 23c29,31 < local assignment = player.getProperty("bountyAssignment") --- > local bountyData = player.getProperty("bountyData") or {} > bountyData = bountyData[player.serverUuid()] or {} > local assignment = bountyData.assignment 31a40,41 > else > self.assignmentRank = getPlayerRank() 74a85,95 > function getPlayerRank() > local points = player.getProperty("bountyPoints") or 0 > local playerRank > for i, rank in ipairs(self.bountyRanks) do > if points >= rank.threshold then > playerRank = i > end > end > return playerRank > end > 79a101,103 > while celestial.currentSystem() == nil do > coroutine.yield() > end 81c105,106 < storage.bountySystem = findAssignmentArea(systemPosition(celestial.currentSystem()), {"whitestar"}) --- > local systemTypes = self.bountyRanks[self.assignmentRank].systemTypes > storage.bountySystem = findAssignmentArea(systemPosition(celestial.currentSystem()), systemTypes) 140c165,167 < player.setProperty("bountyStation", { --- > > local bountyStation = player.getProperty("bountyStation") or {} > bountyStation[player.serverUuid()] = { 144c171,172 < }) --- > } > player.setProperty("bountyStation", bountyStation) quests\bounty\bountyassignment.questtemplate 40c40 < "Becoming a Space Cop", // tier 1 --- > "Becoming a Peacekeeper", // tier 1 48c48 < ["Greetings, travellers! I'm looking for someone to become my ^orange;partner in crime-fighting^white;! \n\nIf you think you have what it takes, come out into space and meet me at my humble asteroid base!"], --- > ["Greetings! I'm looking for someone to become my ^orange;partner in crime-fighting^white;! \n\nIf you think you have what it takes, come out into space and meet me at my humble asteroid base!"], quests\bounty\bounty_cyberspace.questtemplate 7a8 > "hideCrossServer" : true, quests\bounty\bounty_gen.lua 47c47 < local categories = {"planet", "anomaly"} --- > local categories = {"planet"} quests\bounty\bounty_mission.questtemplate 7a8 > "hideCrossServer" : true, quests\bounty\capture_bounty.questtemplate 7a8 > "hideCrossServer" : true, 53,55d53 < "prev" : [ < "My findings have led me to believe is ." < ], 66c64 < "failure" : { --- > "failureText" : { quests\bounty\capture_ship_bounty.questtemplate 7a8 > "hideCrossServer" : true, 55,57d55 < "prev" : [ < "My findings have led me to believe is ." < ], 70c68 < "failure" : { --- > "failureText" : { quests\bounty\capture_space_bounty.questtemplate 7a8 > "hideCrossServer" : true, 55,57d55 < "prev" : [ < "My findings have led me to believe is ." < ], 67c65 < "failure" : { --- > "failureText" : { 69c67 < "--TODO-- You let them go!? How is that supposed to make the universe a safer place?" --- > "You let them go!? I gotta say, you've failed in your duties as a Peacekeeper this time, partner!" quests\bounty\clue_bounties.config 4c4 < "type" : "bounty" --- > "typeName" : "gangmember" 80,82c80,82 < "I've been found - beam me up, ! Where? To ^orange;^reset;, of course!", < "The Peacekeepers are here! I better make my way to ^orange;^reset;!", < ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" --- > "I've been found - beam me up, ! Where? To ^orange;^reset;, of course!", > "The Peacekeepers are here! I better make my way to ^orange;^reset;!", > ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" 87,89c87,89 < "I've been found - beam me out, ! Where? To ^orange;^reset;, of course!", < "I've been spotted - time to fly! I better make my way to ^orange;^reset;!", < ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" --- > "I've been found - beam me out, ! Where? To ^orange;^reset;, of course!", > "I've been spotted - time to fly! I better make my way to ^orange;^reset;!", > ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" 94,96c94,96 < "My position is compromised - beam me out, ! Where? To ^orange;^reset;, of course!", < "Alert! I've been spotted! Proceeding to ^orange;^reset;!", < ", beam me out! Take me to ^orange;^reset;!" --- > "My position is compromised - beam me out, ! Where? To ^orange;^reset;, of course!", > "Alert! I've been spotted! Proceeding to ^orange;^reset;!", > ", beam me out! Take me to ^orange;^reset;!" 101,103c101,103 < "They have found me - beam me out, ! Where? To ^orange;^reset;, of course!", < "Uh-oh, I've been spotted! better make my way to ^orange;^reset;!", < ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" --- > "They have found me - beam me out, ! Where? To ^orange;^reset;, of course!", > "Uh-oh, I've been spotted! better make my way to ^orange;^reset;!", > ", beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" 108,110c108,110 < "Time for Floran to essscape to ^orange;^reset;!", < "Floran isss going to ^orange;^reset;!", < "Floran needsss to fly to ^orange;^reset;!" --- > "Time for Floran to essscape to ^orange;^reset;!", > "Floran isss going to ^orange;^reset;!", > "Floran needsss to fly to ^orange;^reset;!" 115,117c115,117 < "Worried. I've been found - beam me out, ! Where? To ^orange;^reset;, of course!", < "Panicked. I have been spotted! better make my way to ^orange;^reset;!", < "Worried. , beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" --- > "Worried. I've been found - beam me out, ! Where? To ^orange;^reset;, of course!", > "Panicked. I have been spotted! better make my way to ^orange;^reset;!", > "Worried. , beam me out! There's a Peacekeeper on my tail! Take me to ^orange;^reset;!" 122,124c122,124 < "I ain't gettin' caught this easily - beam me out, ! Where? To ^orange;^reset;, of course!", < "Dagnabbit, I've been spotted! better make my way to ^orange;^reset;!", < ", beam me out! There's a Peacekeeper on my trail! Take me to ^orange;^reset;!" --- > "I ain't gettin' caught this easily - beam me out, ! Where? To ^orange;^reset;, of course!", > "Dagnabbit, I've been spotted! better make my way to ^orange;^reset;!", > ", beam me out! There's a Peacekeeper on my trail! Take me to ^orange;^reset;!" 129c129 < "message" : "Mighty convenient that the target told us where they're goin'! You'd better make your way on over to ^green;^reset;." --- > "message" : "Mighty convenient that the target told us where they're goin'! You'd better make your way on over to ^green;^reset;." quests\bounty\clue_items.config 633,636c633 < ] < }, < < "vaultnote" : { --- > ], quests\bounty\clue_npcs.config 24c24 < "You'll have to get past me to reach ^orange;Captain Ignoble^reset;, partn... adversary!" --- > "Don't think you can apprehend ^orange;Captain Ignoble^reset;, partn... adversary!" 31c31 < "Hngh... I knew a low-life like me could never stand against the mighty Peacekeepers! ^orange;Captain Ignoble^reset; is >!" --- > "Uh-oh, I better split! Don't even think about tracking me down to my ^orange;real hideout^reset;, Peacekeeper!" quests\bounty\cultist_mission1.questtemplate 7a8 > "hideCrossServer" : true, quests\bounty\find_clue_item.questtemplate 7a8 > "hideCrossServer" : true, 50,51c51,52 < "^green;^reset;:\nA clue I found here has led me to .\n\n", < "^green;^reset;:\nI discovered a lead here that takes me to .\n\n" --- > "^green;^reset;:\nA clue I found here has led me to .\n\n", > "^green;^reset;:\nI discovered a lead here that takes me to .\n\n" quests\bounty\find_clue_npc.questtemplate 7a8 > "hideCrossServer" : true, 50,52c51,53 < "^green;^reset;:\nA henchman I interrogated gave me the location \"\".\n\n", < "^green;^reset;:\nAfter some encouragement, a henchman gave me the location \"\".\n\n", < "^green;^reset;:\nOne of 's lackeys led me to \"\".\n\n" --- > "^green;^reset;:\nA henchman I interrogated gave me the location \"\".\n\n", > "^green;^reset;:\nAfter some encouragement, a henchman gave me the location \"\".\n\n", > "^green;^reset;:\nOne of 's lackeys led me to \"\".\n\n" quests\bounty\find_clue_object.questtemplate 7a8 > "hideCrossServer" : true, 50,53c51,54 < "^green;^reset;:\nComputer records here told me that that is .\n\n", < "^green;^reset;:\nMy master hacking skills have led me to .\n\n", < "^green;^reset;:\nMy advanced hacking skills have led me to .\n\n", < "^green;^reset;:\nCracking the criminal's secure database gave me the location \"\".\n\n" --- > "^green;^reset;:\nComputer records here told me that that is .\n\n", > "^green;^reset;:\nMy master hacking skills have led me to .\n\n", > "^green;^reset;:\nMy advanced hacking skills have led me to .\n\n", > "^green;^reset;:\nCracking the criminal's secure database gave me the location \"\".\n\n" quests\bounty\find_clue_scan.questtemplate 7a8 > "hideCrossServer" : true, 50,52c51,53 < "^green;^reset;:\nI found a DNA sample that I have traced to .\n\n", < "^green;^reset;:\nSome unexpected DNA I found is currently being traced to .\n\n", < "^green;^reset;:\nWith my detective skills, I traced a DNA sample I found to .\n\n" --- > "^green;^reset;:\nI found a DNA sample that I have traced to .\n\n", > "^green;^reset;:\nSome unexpected DNA I found is currently being traced to .\n\n", > "^green;^reset;:\nWith my detective skills, I traced a DNA sample I found to .\n\n" quests\bounty\find_space_clue_item.questtemplate 7a8 > "hideCrossServer" : true, 52,53c53,54 < "^green;^reset;:\nA clue I found out in space has led me to .\n\n", < "^green;^reset;:\nI discovered a lead in a space facility that takes me to .\n\n" --- > "^green;^reset;:\nA clue I found out in space has led me to .\n\n", > "^green;^reset;:\nI discovered a lead in a space facility that takes me to .\n\n" quests\bounty\find_space_clue_npc.questtemplate 7a8 > "hideCrossServer" : true, 52,54c53,55 < "^green;^reset;:\nA henchman I interrogated gave me the location \"\".\n\n", < "^green;^reset;:\nAfter some encouragement, a henchman gave me the location \"\".\n\n", < "^green;^reset;:\nOne of 's lackeys led me to \"\".\n\n" --- > "^green;^reset;:\nA henchman I interrogated gave me the location \"\".\n\n", > "^green;^reset;:\nAfter some encouragement, a henchman gave me the location \"\".\n\n", > "^green;^reset;:\nOne of 's lackeys led me to \"\".\n\n" quests\bounty\find_space_clue_object.questtemplate 7a8 > "hideCrossServer" : true, 52,55c53,56 < "^green;^reset;:\nComputer records here told me that that is .\n\n", < "^green;^reset;:\nMy master hacking skills have led me to .\n\n", < "^green;^reset;:\nMy advanced hacking skills have led me to .\n\n", < "^green;^reset;:\nCracking the criminal's secure database gave me the location \"\".\n\n" --- > "^green;^reset;:\nComputer records here told me that that is .\n\n", > "^green;^reset;:\nMy master hacking skills have led me to .\n\n", > "^green;^reset;:\nMy advanced hacking skills have led me to .\n\n", > "^green;^reset;:\nCracking the criminal's secure database gave me the location \"\".\n\n" quests\bounty\find_space_clue_scan.questtemplate 7a8 > "hideCrossServer" : true, 52,53c53,54 < "^green;^reset;:\nA clue I found out in space has led me to .\n\n", < "^green;^reset;:\nI discovered a lead in a space facility that takes me to .\n\n" --- > "^green;^reset;:\nA clue I found out in space has led me to .\n\n", > "^green;^reset;:\nI discovered a lead in a space facility that takes me to .\n\n" quests\bounty\find_tutorial_clues.questtemplate 7a8 > "hideCrossServer" : true, 57,58c58,59 < "^green;^reset;:\nA clue I found here has led me to .\n\n", < "^green;^reset;:\nI discovered a lead here that takes me to .\n\n" --- > "^green;^reset;:\nSeveral clues I found here have led me to .\n\n", > "^green;^reset;:\nI discovered leads here that take me to .\n\n" quests\bounty\generator.config 1144c1144,1147 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nA clue I found here gave me the vault code: .\n\n" > } 1163c1166,1169 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nA clue I found here gave me the vault code: .\n\n" > } 1179c1185,1188 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nA console here gave me the vault code: .\n\n" > } 1195c1204,1207 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nA console here gave me the vault code: .\n\n" > } 1214c1226,1229 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nAfter some persuasion, a lackey provided me with the code for the vault: .\n\n" > } 1233c1248,1251 < "password" : "previous" --- > "password" : "previous", > "text" : { > "questLog" : "^green;^reset;:\nAfter some persuasion, a lackey provided me with the code for the vault: .\n\n" > } 1283d1300 < "locationName" : "nextClue", 1294,1297c1311 < "password" : "previous", < "text" : { < "questLog" : "The code to the vault on ^green;^reset; is ^green;^reset;." < } --- > "password" : "previous" 1347d1360 < "locationName" : "nextClue", 1358,1361c1371 < "password" : "previous", < "text" : { < "questLog" : "The code to the vault on ^green;^reset; is ^green;^reset;." < } --- > "password" : "previous" 1388,1389c1398 < "spawn" : "bounty", < "location" : "clue" --- > "spawn" : "bounty" 1412d1420 < "locationName" : "nextBounty", 1423,1426c1431 < "password" : "previous", < "text" : { < "questLog" : "The code to the vault on ^green;^reset; is ^green;^reset;." < } --- > "password" : "previous" quests\bounty\kill_bounty_monster.questtemplate 7a8 > "hideCrossServer" : true, quests\bounty\scan_planets.questtemplate 7a8 > "hideCrossServer" : true, 48c49,50 < "My findings have led me to believe is ." --- > "^green;^reset;:\nScanning for the target signature led me to .\n\n", > "^green;^reset;:\nBy scanning the planets in this system, I located the target signature at .\n\n" scripts\bountygeneration.lua 7c7,9 < local assignmentLog = player.getProperty("bountyAssignmentLog") or {} --- > local bountyData = player.getProperty("bountyData") or {} > bountyData = bountyData[player.serverUuid()] or {} > local assignmentLog = bountyData.assignmentLog or {} 223a226 > seed = npcSeed, 562,571c565 < local uniqueId = sb.makeUuid() < < -- Add stagehand spawn to previous step < spawns[merge.from][rhs.locationName] = { < type = "stagehand", < location = rhs.previousLocation, < stagehandUniqueId = uniqueId < } < < -- Set location for this step to the spawned stagehand --- > -- Set location for this step to the previous location 573,574c567,569 < type = "stagehand", < stagehand = uniqueId --- > type = "previous", > previousQuest = merge.from, > previousLocation = rhs.previousLocation, 718a714,719 > elseif locationConfig.type == "previous" then > step.questParameters.locations.locations[k] = { > type = "previous", > quest = locationConfig.previousQuest, > location = locationConfig.previousLocation, > } 790a792 > seed = bounty.seed, scripts\player\playerbounty.lua 39a40,45 > > -- offer a bounty assignment quest if the player has an assignment, but not on this server > local bountyData = player.getProperty("bountyData") or {} > if player.hasAcceptedQuest("bountyassignment") and not player.hasActiveQuest("bountyassignment") and bountyData[player.serverUuid()] == nil then > player.startQuest("bountyassignment") > end stagehands\bountymanager.lua 20d19 < self.pendingLocations = self.pendingLocations or {} 32a32 > sb.logInfo("Player failed message") 42,43c42,45 < for _, playerId in ipairs(storage.questStorage[questId].players) do < self.outbox:sendMessage(playerId, questId.."keypadUnlocked", uniqueId, questId) --- > for _, questStore in pairs(storage.questStorage) do > for _, playerId in ipairs(questStore.players) do > self.outbox:sendMessage(playerId, questId.."keypadUnlocked", uniqueId, questId) > end 54a57 > self.pendingLocations = self.pendingLocations or {} 66a70 > self.pendingLocations[q.questId] = {} 213a218 > -- start spawner from another quest early 219c224 < newConfig.questId = spawnConfig.questId --- > newConfig.questId = spawnConfig.quest 221d225 < newConfig.location = spawnConfig.location or newConfig.location 225c229,236 < local locationConfig = self.questLocations[questId][spawnConfig.location] --- > local locationConfig = self.questLocations[spawnConfig.questId][spawnConfig.location] > -- spawns may use locations from the previous step > while locationConfig.type == "previous" do > locationConfig = self.questLocations[locationConfig.quest][locationConfig.location] > end > > sb.logInfo("Spawn config: %s", spawnConfig) > 239c250,253 < addScanObjectLocation = spawnConfig.location --- > addScanObjectLocation = { > questId = spawnConfig.questId, > location = spawnConfig.location > } 246c260,263 < addScanObjectLocation = spawnConfig.location --- > addScanObjectLocation = { > questId = spawnConfig.questId, > location = spawnConfig.location > } 250c267,270 < addScanObjectLocation = spawnConfig.location --- > addScanObjectLocation = { > questId = spawnConfig.questId, > location = spawnConfig.location > } 276,277c296,297 < location = addScanObjectLocation, < questId = questId, --- > location = addScanObjectLocation.location, > questId = addScanObjectLocation.questId, 372c392 < if not onQuest then --- > if contains(questStore.players, playerId) and not onQuest then 435c455 < priority = 10.0, --- > priority = -10.0, 447c467 < priority = 10.0, --- > priority = -10.0, 471a492,499 > sb.logInfo("Get location %s %s", questId, locationName) > local locationConfig = self.questLocations[questId][locationName] > while locationConfig.type == "previous" do > questId = locationConfig.quest > locationName = locationConfig.location > locationConfig = self.questLocations[questId][locationName] > end > 476c504 < if self.pendingLocations[locationName] == nil then --- > if self.pendingLocations[questId][locationName] == nil then 478c506 < self.pendingLocations[locationName] = false --- > self.pendingLocations[questId][locationName] = false 480c508 < local locationConfig = self.questLocations[questId][locationName] --- > sb.logInfo("Create location %s %s %s", questId, locationName, locationConfig.type) 490c518 < self.pendingLocations[locationName] = nil --- > self.pendingLocations[questId][locationName] = nil 493c521 < self.pendingLocations[locationName] = position --- > self.pendingLocations[questId][locationName] = position 496c524 < coroutine.yield(nil, self.pendingLocations[locationName]) --- > coroutine.yield(nil, self.pendingLocations[questId][locationName]) 523c551 < coroutine.yield(nil, self.pendingLocations[locationName]) --- > coroutine.yield(nil, self.pendingLocations[questId][locationName]) stats\effects\maxhealthboost\maxhealthboost.lua 1,11c1,15 < function init() < effect.addStatModifierGroup({{stat = "maxHealth", amount = config.getParameter("healthAmount", 0)}}) < < script.setUpdateDelta(0) < end < < function update(dt) < end < < function uninit() < end --- > function init() > effect.addStatModifierGroup({ > {stat = "maxHealth", amount = config.getParameter("healthAmount", 0)}, > {stat = "maxHealth", baseMultiplier = config.getParameter("healthBaseMultiplier", 1.0)}, > {stat = "maxHealth", effectiveMultiplier = config.getParameter("healthEffectiveMultiplier", 1.0)}, > }) > > script.setUpdateDelta(0) > end > > function update(dt) > end > > function uninit() > end tenants\other\peacekeepertenant.tenant 14c14 < "species": ["human", "apex", "avian", "floran", "glitch", "hylotl"], --- > "species": ["human", "apex", "avian", "floran", "glitch", "hylotl", "novakid"], treasure\space.treasurepools 376,378c376 < [0.50, 1], < [0.30, 2], < [0.20, 3] --- > [1.0, 1] vehicles\modularmech\mechparts_arm.config 923c923 < "damage" : 32, --- > "damage" : 38, vehicles\modularmech\modularmech.lua 557a558 > local chains = {} 566a568,571 > if self[arm.."Arm"].renderChain then > table.insert(chains, self[arm.."Arm"].chain) > end > 570a576 > vehicle.setAnimationParameter("chains", chains) vehicles\modularmech\armscripts\beamarm.lua 11a12 > self.renderChain = false 66c67 < vehicle.setAnimationParameter("chains", {self.chain}) --- > self.renderChain = true 98c99 < vehicle.setAnimationParameter("chains", {self.chain}) --- > self.renderChain = false