FILES ----- biomes\surface\cyberspace.biome collections\actionfigures.collection collections\monsters.collection collections\raremonsters.collection dialog\peacekeeperconverse.config [NEW] dungeons\microdungeons\bounty\underground_fuel_depot.dungeon [NEW] dungeons\microdungeons\bounty\underground_fuel_depot_1.json [NEW] dungeons\microdungeons\bounty\underground_fuel_depot_2.json [NEW] dungeons\microdungeons\bounty\underground_fuel_depot_3.json dungeons\microdungeons\bounty\vault_3.json dungeons\missions\cultistmissions\cultistmission1.json dungeons\other\cyberspace\cyberdungeon_middle_1.json dungeons\other\cyberspace\cyberdungeon_middle_2.json dungeons\other\cyberspace\start_cyberspace.json [NEW] interface\chatbubbles\noxcapture.png interface\cockpit\cockpit.lua interface\confirmation\teleportconfirmation.config interface\scripted\bountyboard\bountyboardgui.config interface\scripted\bountyboard\bountyboardgui.lua items\active\weapons\ranged\unrand\neolaserlauncher\beam.png items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem items\armors\decorative\costumes\betty\pants.png monsters\boss\swansong\noxcapture.monstertype monsters\boss\swansong\swansong.monstertype [NEW] monsters\flyers\cosmicintruder\cosmicintruder.animation [NEW] monsters\flyers\cosmicintruder\cosmicintruder.monstertype [NEW] monsters\flyers\cosmicintruder\body\body.monsterpart [NEW] monsters\flyers\cosmicintruder\body\cosmicintruder.png [NEW] monsters\flyers\cosmicintruder\body\cosmicintruder_fullbright.png [NEW] monsters\flyers\cosmicintruder\body\default.frames monsters\flyers\scandroid\cultistscandroid.monstertype [NEW] monsters\ghosts\gosmet\firegosmet.animation [NEW] monsters\ghosts\gosmet\firegosmet.monstertype [NEW] monsters\ghosts\gosmet\body\body.monsterpart [NEW] monsters\ghosts\gosmet\body\default.frames [NEW] monsters\ghosts\gosmet\body\firebody.monsterpart [NEW] monsters\ghosts\gosmet\body\firegosmet.png [NEW] monsters\ghosts\gosmet\body\Gosmet.png [NEW] names\pets.namesource names\profanityfilter.config npcs\story\tonauacoid.config [NEW] objects\actionfigure\cosmicintruder\cosmicintruderaf.frames [NEW] objects\actionfigure\cosmicintruder\cosmicintruderaf.object [NEW] objects\actionfigure\cosmicintruder\cosmicintruderaf.png [NEW] objects\actionfigure\swansong\swansongaf.frames [NEW] objects\actionfigure\swansong\swansongaf.object [NEW] objects\actionfigure\swansong\swansongaf.png [NEW] objects\actionfigure\swansong\swansongaficon.png objects\actionfigure\triplod\triplodAF.object objects\cultist\cultistbannerlarge\cultistbannerlarge.object objects\outpost\bountyboard\bountyboard.lua [NEW] particles\sportscardownthrust.particle quests\bounty\bounty.lua quests\bounty\bountyassignment.lua quests\bounty\bountyassignment.questtemplate [NEW] quests\bounty\bounty_cyberspace.questtemplate quests\bounty\bounty_mission.questtemplate quests\bounty\bounty_monsters.config quests\bounty\capture_bounty.questtemplate quests\bounty\capture_ship_bounty.questtemplate quests\bounty\clue_scans.config quests\bounty\dungeons.config quests\bounty\generator.config [NEW] quests\bounty\monsternamegen.config quests\bounty\pre_bounty.questtemplate quests\bounty\pre_bounty_capstone.questtemplate quests\bounty\stages.lua scripts\bountygeneration.lua spawntypes\uniques.spawntypes stagehands\bountymanager.lua tiles\platforms\polygonplatform.material tiles\platforms\polygonplatform.png treasure\monster.treasurepools vehicles\sportscar\sportscar.animation vehicles\sportscar\sportscar.lua [NEW] vehicles\sportscar\sportscar.png vehicles\sportscar\sportscar.vehicle DIFFS ----- biomes\surface\cyberspace.biome 14a15,25 > "spawnProfile" : { > "groups" : [ > { > "select" : 1, > "pool" : [ > [ 1, "cosmicintruder" ] > ] > } > ] > }, > collections\actionfigures.collection 236a237,240 > "cosmicintruderaf" : { > "order" : 58, > "item" : "cosmicintruderaf" > }, 240c244 < "order" : 58, --- > "order" : 59, 244c248 < "order" : 59, --- > "order" : 60, 248c252 < "order" : 60, --- > "order" : 61, 252c256 < "order" : 61, --- > "order" : 62, 256c260 < "order" : 62, --- > "order" : 63, 260c264 < "order" : 63, --- > "order" : 64, 264c268 < "order" : 64, --- > "order" : 65, 268c272 < "order" : 65, --- > "order" : 66, 272c276 < "order" : 66, --- > "order" : 67, 276c280 < "order" : 67, --- > "order" : 68, 277a282,285 > }, > "swansongaf" : { > "order" : 69, > "item" : "swansongaf" collections\monsters.collection 175c175 < "icon" : "/monsters/ghosts/gosmet/gosmet.png:fly.1" --- > "icon" : "/monsters/ghosts/gosmet/body/gosmet.png:fly.1" 300a301,305 > }, > "cosmicintruder" : { > "order" : 60, > "monsterType" : "cosmicintruder", > "icon" : "/monsters/flyers/cosmicintruder/body/cosmicintruder.png:fly.1" collections\raremonsters.collection 127c127 < "firebobot" : { --- > "cultistscandroid" : { 128a129,133 > "monsterType" : "cultistscandroid", > "icon" : "/monsters/flyers/scandroid/body/cultistscandroid.png:idle.1" > }, > "firebobot" : { > "order" : 26, 133c138 < "order" : 26, --- > "order" : 27, 138c143 < "order" : 27, --- > "order" : 28, 143c148 < "order" : 28, --- > "order" : 29, 148c153 < "order" : 29, --- > "order" : 30, 153c158 < "order" : 30, --- > "order" : 31, 158c163 < "order" : 31, --- > "order" : 32, 163c168 < "order" : 32, --- > "order" : 33, 166a172,176 > "firegosmet" : { > "order" : 34, > "monsterType" : "firegosmet", > "icon" : "/monsters/ghosts/gosmet/body/firegosmet.png:fly.1" > }, 168c178 < "order" : 33, --- > "order" : 35, 173c183 < "order" : 34, --- > "order" : 36, 178c188 < "order" : 35, --- > "order" : 37, 183c193 < "order" : 36, --- > "order" : 38, 188c198 < "order" : 37, --- > "order" : 39, 193c203 < "order" : 38, --- > "order" : 40, 198c208 < "order" : 39, --- > "order" : 41, 203c213 < "order" : 40, --- > "order" : 42, 208c218 < "order" : 41, --- > "order" : 43, 213c223 < "order" : 42, --- > "order" : 44, 218c228 < "order" : 43, --- > "order" : 45, 223c233 < "order" : 44, --- > "order" : 46, 228c238 < "order" : 45, --- > "order" : 47, 233c243 < "order" : 46, --- > "order" : 48, 238c248 < "order" : 47, --- > "order" : 49, 243c253 < "order" : 48, --- > "order" : 50, 248c258 < "order" : 49, --- > "order" : 51, 253c263 < "order" : 50, --- > "order" : 52, 258c268 < "order" : 51, --- > "order" : 53, 263c273 < "order" : 52, --- > "order" : 54, 268c278 < "order" : 53, --- > "order" : 55, 273c283 < "order" : 54, --- > "order" : 56, 278c288 < "order" : 55, --- > "order" : 57, dialog\peacekeeperconverse.config 12c12 < "Captain Noble has me working on finding some new cases for you, Officer !", --- > "Captain Noble has me working on finding some new cases for you, Officer !", 15c15 < "Without a Matter Manipulator, there's only so much field work I can do. Not like you, Officer !", --- > "Without a Matter Manipulator, there's only so much field work I can do. Not like you, Officer !", 55c55 < "Floran isss working hard to find new cassses for Officer !" --- > "Floran isss working hard to find new cassses for Officer !" dungeons\microdungeons\bounty\vault_3.json [TMX file differences are left out for huge size.] dungeons\missions\cultistmissions\cultistmission1.json [TMX file differences are left out for huge size.] dungeons\other\cyberspace\cyberdungeon_middle_1.json [TMX file differences are left out for huge size.] dungeons\other\cyberspace\cyberdungeon_middle_2.json [TMX file differences are left out for huge size.] dungeons\other\cyberspace\start_cyberspace.json [TMX file differences are left out for huge size.] interface\cockpit\cockpit.lua 128c128 < if player.getProperty("lastBountyAssignment") or player.getProperty("bountyAssignment") then --- > if player.getProperty("bountyStation") then 131d130 < 218,224c217,224 < local lastAssignment = player.getProperty("lastBountyAssignment") < local system < if not player.hasActiveQuest("bountyassignment") and lastAssignment ~= nil then < system = lastAssignment < else < local assignment = player.getProperty("bountyAssignment") < system = assignment.system --- > local bountyStation = player.getProperty("bountyStation") > local system, target > if bountyStation.system then > system = bountyStation.system > > if bountyStation.uuid then > target = {"object", bountyStation.uuid} > end 226c226 < self.focus = {system = system, target = nil} --- > self.focus = {system = system, target = target} 569c569,574 < if player.isMapped(self.focus.system) then --- > local viewSystem = player.isMapped(self.focus.system) and self.focus.target ~= nil > if viewSystem and self.focus.target[1] == "object" then > local mappedObjects = player.mappedObjects(self.focus.system) > viewSystem = mappedObjects[self.focus.target[2]] ~= nil > end > if viewSystem then 908c913 < else --- > elseif mappedObjects[self.focus.target[2]] ~= nil then 1040c1045 < if selection and selection[1] == "object" then --- > if selection and selection[1] == "object" and (isCurrent or mappedObjects[uuid] ~= nil) then interface\confirmation\teleportconfirmation.config 168c168 < "message" : "\n\nThis console will teleport you to the target's hideout.", --- > "message" : "\nThis console will teleport you to the target's hideout.", 169a170,178 > "cancelCaption" : "Not now" > }, > "cyberspace" : { > "paneLayout" : "/interface/windowconfig/simpleconfirmation.config:paneLayout", > "icon" : "/interface/warping/icon.png", > "title" : "Teleport Confirmation", > "subtitle" : "Cyberspace Terminal", > "message" : "\nThis terminal is connected to a criminal network.\n\nAre you ready to hack into cyberspace?", > "okCaption" : "Hack", interface\scripted\bountyboard\bountyboardgui.config 267c267 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 284c284 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 301c301 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 311c311 < "threshold" : 790, --- > "threshold" : 700, 318c318 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 335c335 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 359c359 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 377c377 < "minor" : ["minorMonster", "minorPlanet", "minorSpace"], --- > "minor" : ["minorMonster", "minorMonster", "minorPlanet", "minorSpace"], 459a460,480 > "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", interface\scripted\bountyboard\bountyboardgui.lua 146c146 < generator.targetPortrait = p.portrait --- > generator.targetPortrait = posterPortrait(p) 182a183 > world.sendEntityMessage(pane.sourceEntity(), "registerQuest", p.arc.quests[1].questId, p.worlds) 211a213,217 > local jumpsToRefuel = 0 > if self.assignment then > jumpsToRefuel = self.assignment.jumpsToRefuel or 0 > end > 218c224 < newSystem = findSystem(newPosition, rankInfo.systemTypes) --- > newSystem = findAssignmentArea(newPosition, rankInfo.systemTypes) 253a260,261 > self.assignment.jumpsToRefuel = jumpsToRefuel > 284a293,294 > > local boardStationUuid = util.await(world.sendEntityMessage(pane.sourceEntity(), "stationUuid")):result() 286a297 > uuid = boardStationUuid, 294,295d304 < player.setProperty("newBountyEvents", {}) < 309a319 > 313,314c323,348 < elseif p.category == "major" and needFinalAssignment(assignmentRank) then < needNewAssignment = true --- > elseif p.category == "major" then > needNewAssignment = needFinalAssignment(assignmentRank) > end > > if p.category == "capstone" or p.category == "major" then > local systems = {} > for _, w in ipairs(p.worlds) do > local s = coordinateSystem(w) > if not contains(systems, s) then > table.insert(systems, s) > end > end > local toRefuel = self.assignment.jumpsToRefuel or 0 > -- subtract one jump per system, plus one jump back to the station > self.assignment.jumpsToRefuel = toRefuel - (#systems + 1) > end > end > > if p.questConfig.endStep == "fuel_bounty" then > if be.status == "Captured" then > -- if the player completed the bounty they must have visited the fuel depot > self.assignment.jumpsToRefuel = 20 > else > -- player might have visited the fuel depot to grab the fuel then abandoned the quest, > -- so don't immediately offer a new fuel bounty > self.assignment.jumpsToRefuel = 5 340,346d373 < if newMoney > 0 then < player.giveItem({"money", newMoney}) < end < if newCredits > 0 then < player.giveItem({"peacecredit", newCredits}) < end < 351d377 < player.setProperty("bountyPoints", self.playerRankPoints) 356d381 < saveBountyData() 375a401,408 > > if newMoney > 0 then > player.giveItem({"money", newMoney}) > end > if newCredits > 0 then > player.giveItem({"peacecredit", newCredits}) > end > player.setProperty("newBountyEvents", {}) 399d431 < portrait = p.portrait, 402a435 > questConfig = p.questConfig, 413a447 > world.sendEntityMessage(pane.sourceEntity(), "setStationUuid", self.bountyStation.uuid) 456c490 < replaceInData(poster.widgetConfig, nil, "", poster.portrait) --- > replaceInData(poster.widgetConfig, nil, "", posterPortrait(poster)) 476c510 < --- > 497a532,561 > local tags = {} > for tagName, tagPool in pairs(bountyConfig.randomTags) do > tags[tagName] = util.randomChoice(self.posterTags[tagPool]) > end > tags.targetName = target.name > > local poster = { > seed = seed, > level = level, > posterType = bountyConfig.poster, > tags = tags, > slot = slot, > category = category, > questConfig = bountyConfig.questConfig, > target = target, > arc = nil, > accepted = false > } > > return poster > end > > function posterPortrait(poster) > local target, level, seed = poster.target, poster.level, poster.seed > > local colorIndex = nil > if target.gang ~= nil then > colorIndex = target.gang.colorIndex > end > 502c566 < if gang then --- > if target.gang then 504c568 < {name = gang.hat, parameters = {colorIndex = colorIndex} } --- > {name = target.gang.hat, parameters = {colorIndex = colorIndex} } 543,563c607 < local tags = {} < for tagName, tagPool in pairs(bountyConfig.randomTags) do < tags[tagName] = util.randomChoice(self.posterTags[tagPool]) < end < tags.targetName = target.name < < local poster = { < seed = seed, < level = level, < posterType = bountyConfig.poster, < tags = tags, < portrait = portrait, < slot = slot, < category = category, < questConfig = bountyConfig.questConfig, < target = target, < arc = nil, < accepted = false < } < < return poster --- > return portrait 569,574c613,616 < local excludeWorldTypes = { < "moon", < "barren", < "magma" < } < local newWorlds = findWorlds(systemPosition(self.assignment.system), self.bountyRanks[self.assignment.rank].systemTypes, excludeWorldTypes, 30, 4) --- > local pos = systemPosition(self.assignment.system) > local systemTypes = self.bountyRanks[self.assignment.rank].systemTypes > -- be cautious and allow finding the worlds in a very large area so this doesn't fail > local newWorlds = findWorlds(pos, systemTypes, 1000000) 693a736,739 > local refuel = self.assignment.jumpsToRefuel or 0 > if targetCategory == "minorSpecial" and refuel <= 0 then > bountyType = "fuel_bounty" > end 823d868 < world.sendEntityMessage(pane.sourceEntity(), "registerQuest", p.arc.quests[1].questId, p.worlds) 832c877 < local nameStr, statusStr, moneyStr, rankStr = "", "", "", "" --- > local nameStr, statusStr, moneyStr, rankStr, creditsStr = "", "", "", "", "" items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem 42,43c42,43 < "baseDps" : 15, < "energyUsage" : 150, --- > "baseDps" : 7.5, > "energyUsage" : 100, monsters\boss\swansong\noxcapture.monstertype 19c19 < "chatPortrait" : "/interface/chatbubbles/nox.png", --- > "chatPortrait" : "/interface/chatbubbles/noxcapture.png", monsters\boss\swansong\swansong.monstertype 10c10 < "dropPools" : [ ], --- > "dropPools" : [ "swansongTreasure" ], monsters\flyers\scandroid\cultistscandroid.monstertype 4c4 < "description" : "The Scandroid is on an endless search. No one knows what for.", --- > "description" : "This Scandroid has been repurposed by the Occasus Cult.", names\profanityfilter.config 255c255,256 < "crqb" --- > "crqb", > "tlcfl" npcs\story\tonauacoid.config 96,97c96,97 < "standingPoly" : [ [0.5625, 1.9375], [1.0625, 1.4375], [1.0625, -2.5625], [0.5625, -3.0625], [-0.5625, -3.0625], [-1.0625, -2.5625], [-1.0625, 1.4375], [-0.5625, 1.9375] ], < "crouchingPoly" : [ [0.5625, 1.9375], [1.0625, 1.4375], [1.0625, -2.5625], [0.5625, -3.0625], [-0.5625, -3.0625], [-1.0625, -2.5625], [-1.0625, 1.4375], [-0.5625, 1.9375] ], --- > "standingPoly" : [ [0.5625, 1.9375], [1.0, 1.4375], [1.0, -2.5625], [0.5625, -3.0625], [-0.5625, -3.0625], [-1.0, -2.5625], [-1.0, 1.4375], [-0.5625, 1.9375] ], > "crouchingPoly" : [ [0.5625, 1.9375], [1.0, 1.4375], [1.0, -2.5625], [0.5625, -3.0625], [-0.5625, -3.0625], [-1.0, -2.5625], [-1.0, 1.4375], [-0.5625, 1.9375] ], objects\actionfigure\triplod\triplodAF.object 6c6 < --- > "collectablesOnPickup" : { "actionfigures" : "triplodaf" }, objects\cultist\cultistbannerlarge\cultistbannerlarge.object 5c5 < "description" : "A worn wall banner, spraypainted with the Ocassus cult emblem.", --- > "description" : "A worn wall banner, spraypainted with the Occasus cult emblem.", objects\outpost\bountyboard\bountyboard.lua 11a12 > storage.stationUuid = storage.stationUuid or nil 59a61,69 > end > end) > > message.setHandler("stationUuid", function(_, _) > return storage.stationUuid > end) > message.setHandler("setStationUuid", function(_, _, stationUuid) > if storage.stationUuid == nil then > storage.stationUuid = stationUuid quests\bounty\bounty.lua 257a258,261 > -- local failureText = config.getParameter("generatedText.failure") > -- if failureText then > -- quest.setCompletionText(failureText) > -- end 411c415,416 < message.text = text --- > local tags = util.generateTextTags(quest.parameters().text.tags) > message.text = sb.replaceTags(text, tags) quests\bounty\bountyassignment.lua 75a76,79 > local searchText = config.getParameter("descriptions.searching") > quest.setObjectiveList({ > {string.format(searchText, systemName), false} > }) 77c81 < storage.bountySystem = findSystem(systemPosition(celestial.currentSystem()), {"whitestar"}) --- > storage.bountySystem = findAssignmentArea(systemPosition(celestial.currentSystem()), {"whitestar"}) 137a142 > uuid = stationUuid, quests\bounty\bountyassignment.questtemplate 6a7 > "prerequisites" : [ "shiprepair" ], 18a20 > "searching" : "Searching for ^orange;Peacekeeper Station^reset;...", quests\bounty\bounty_mission.questtemplate 44c44 < "^orange;Investigate computers^reset; for clues" --- > "^orange;Search^reset; for clues" 70c70 < "--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\bounty_monsters.config 2c2 < "nameSource" : "/quests/generated/petnames.config:names", --- > "nameSource" : "/quests/bounty/monsternamegen.config:names", 210a211,214 > "portraitScale" : 1 > }, > "firegosmet" : { > "portraitCenter" : [-0.6, 0.5], quests\bounty\capture_bounty.questtemplate 68c68 < "--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\capture_ship_bounty.questtemplate 72c72 < "--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_scans.config 12c12 < "message" : "Your ^orange;Matter Manipulator^white; has a lock on ! Their signature trae leads to a planet in . Head on over to !" --- > "message" : "Your ^orange;Matter Manipulator^white; has a lock on ! Their signature trace leads to a planet in . Head on over to !" 33c33 < "message" : "Your ^orange;Matter Manipulator^white; has a lock on ! Their signature trae leads to a planet in . Head on over to !" --- > "message" : "Your ^orange;Matter Manipulator^white; has a lock on ! Their signature trace leads to a planet in . Head on over to !" quests\bounty\dungeons.config 3,7c3,70 < "default" : [ "safehouse", "vault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty", "undergroundtutorialclues", "undergroundtutorialbounty" ], < "ocean" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty", "undergroundtutorialclues", "undergroundtutorialbounty" ], < "toxic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty", "undergroundtutorialclues", "undergroundtutorialbounty" ], < "arctic" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty", "undergroundtutorialclues", "undergroundtutorialbounty" ], < "magma" : [ "safehouse", "vault", "boat", "boatvault", "undergroundsafehouse", "undergroundvault", "minor_spawn", "tutorialclues", "tutorialbounty", "undergroundtutorialclues", "undergroundtutorialbounty" ] --- > "default" : [ > "safehouse", > "vault", > "undergroundsafehouse", > "undergroundvault", > "minor_spawn", > "tutorialclues", > "tutorialbounty", > "undergroundtutorialclues", > "undergroundtutorialbounty", > "fuel_depot" > ], > "ocean" : [ > "safehouse", > "vault", > "boat", > "boatvault", > "undergroundsafehouse", > "undergroundvault", > "minor_spawn", > "tutorialclues", > "tutorialbounty", > "undergroundtutorialclues", > "undergroundtutorialbounty", > "fuel_depot" > ], > "toxic" : [ > "safehouse", > "vault", > "boat", > "boatvault", > "undergroundsafehouse", > "undergroundvault", > "minor_spawn", > "tutorialclues", > "tutorialbounty", > "undergroundtutorialclues", > "undergroundtutorialbounty", > "fuel_depot" > ], > "arctic" : [ > "safehouse", > "vault", > "boat", > "boatvault", > "undergroundsafehouse", > "undergroundvault", > "minor_spawn", > "tutorialclues", > "tutorialbounty", > "undergroundtutorialclues", > "undergroundtutorialbounty", > "fuel_depot" > ], > "magma" : [ > "safehouse", > "vault", > "boat", > "boatvault", > "undergroundsafehouse", > "undergroundvault", > "minor_spawn", > "tutorialclues", > "tutorialbounty", > "undergroundtutorialclues", > "undergroundtutorialbounty", > "fuel_depot" > ] 57a121,124 > }, > "fuel_depot" : { > "type" : "surface", > "tags" : [ "fuel_bounty" ] quests\bounty\generator.config 2c2,9 < "systemCount" : 3, --- > "assignmentMinSystems" : 4, > "assignmentMinWorlds" : 30, > "assignmentMaxSize" : 90, > "excludePlanetTypes" : [ > "barren", > "moon", > "magma" > ], 37c44 < "quest" : "bounty_mission", --- > "quest" : "bounty_cyberspace", 84a92,123 > "fuel_bounty" : { > "category" : "planet", > "quest" : "capture_bounty", > "questParameters" : {}, > > "coordinate" : { > "type" : "world", > "questParameter" : "world" > }, > > "locations" : { > "bounty" : { > "type" : "dungeon", > "position" : "surface", > "tags" : [ "fuel_bounty" ] > } > }, > > "spawns" : { > "bounty" : { > "location" : "bounty", > "type" : "bounty" > }, > "gang" : { > "location" : "bounty", > "type" : "npc", > "gangMember" : true, > "multiple" : true > } > } > }, > 651d689 < "weight" : 0.00000000000000001, 1014a1053,1062 > "clueType" : "spaceClue" > }, > > "next" : { > "step" : "find_space_clue_item" > } > }, > > { > "prev" : { 1065a1114,1116 > "coordinate" : { > "prevSystem" : true > }, 1081a1133,1135 > "coordinate" : { > "prevSystem" : true > }, 1094a1149,1151 > "coordinate" : { > "prevSystem" : true > }, 1107a1165,1167 > "coordinate" : { > "prevSystem" : true > }, 1123a1184,1186 > "coordinate" : { > "prevSystem" : true > }, 1139a1203,1205 > "coordinate" : { > "prevSystem" : true > }, 1174,1178d1239 < "coordinate" : { < "type" : "previous", < "questParameter" : "world" < }, < 1243,1247d1303 < "coordinate" : { < "type" : "previous", < "questParameter" : "world" < }, < 1313,1317d1368 < "coordinate" : { < "type" : "previous", < "questParameter" : "world" < }, < quests\bounty\pre_bounty.questtemplate 2a3 > "mainQuest" : true, quests\bounty\pre_bounty_capstone.questtemplate 2a3 > "mainQuest" : true, quests\bounty\stages.lua 95d94 < playBountyMusic() 104a104 > playBountyMusic() 153d152 < playBountyMusic() 158a158 > playBountyMusic() 209d208 < playBountyMusic() 214a214 > playBountyMusic() 271d270 < playBountyMusic() 281a281 > playBountyMusic() 317d316 < playBountyMusic() 326a326 > playBountyMusic() 504d503 < playBountyMusic() 510a510 > playBountyMusic() 618d617 < playBountyMusic() 645a645 > playBountyMusic() scripts\bountygeneration.lua 5,7c5,7 < function findSystem(position, includedTypes, exclude, minCount, rand) < exclude = exclude or {} < minCount = minCount or 1 --- > function findAssignmentArea(fromPosition, systemTypes, rand) > local maxSize = root.assetJson("/quests/bounty/generator.config:assignmentMaxSize") > local assignmentLog = player.getProperty("bountyAssignmentLog") or {} 9,10d8 < local size = {25, 25} < local region = rect.withCenter(position, size) 12,19c10,37 < local systems = {} < while #systems < minCount do < systems = util.filter(celestialWrap.scanSystems(region, includedTypes), function(s) < return not contains(exclude, s) < end) < size = vec2.mul(size, math.sqrt(2)) < region = rect.withCenter(position, size) < end --- > local worlds, systems > local distance = 0 > local startAngle = rand:randf() * math.pi * 2 > local angleStep = math.pi * 2 / 8 > while true do > local dir = math.random() > 0.5 and 1 or -1 > for i = 0, 7 do > if distance > 0 or i == 0 then > local newPosition = vec2.add(fromPosition, vec2.withAngle(startAngle + (i * dir * angleStep), distance)) > worlds, systems = findWorlds(newPosition, systemTypes, maxSize) > > if worlds ~= nil then > local previouslyAssigned = false > for _, s in ipairs(systems) do > if contains(assignmentLog, s) then > previouslyAssigned = true > end > end > if not previouslyAssigned then > local avgPos = vec2.div(util.fold(util.map(systems, systemPosition), {0, 0}, vec2.add), #systems) > table.sort(systems, function(a, b) > return vec2.mag(vec2.sub(systemPosition(a), avgPos)) < vec2.mag(vec2.sub(systemPosition(b), avgPos)) > end) > return systems[1], worlds, systems > end > end > end > end 21c39,42 < return util.randomFromList(systems, rand) --- > distance = maxSize > fromPosition = vec2.add(fromPosition, vec2.withAngle(startAngle, distance)) > coroutine.yield() > end 24c45,49 < function findWorlds(position, systemTypes, exclude, minWorlds, minSystems) --- > function findWorlds(startPosition, systemTypes, maxSize) > local position = startPosition > local config = root.assetJson("/quests/bounty/generator.config") > local minWorlds, minSystems, excludePlanets = config.assignmentMinWorlds, config.assignmentMinSystems, config.excludePlanetTypes > 26c51,52 < local size = {25, 25} --- > maxSize = maxSize or 100 > local size = {10, 10} 37c63 < if visitable and not contains(exclude, visitable.typeName) then --- > if visitable and not contains(excludePlanets, visitable.typeName) then 42a69,73 > if size[1] > maxSize then > sb.logInfo("%s worlds, %s systems, found at %s", #worlds, #systems, position) > return nil, systems > end > 53a85,88 > if #systems > 0 and not compare(position, startPosition) then > position = systemPosition(systems[1]) > sb.logInfo("Look around star at %s", position) > end 586c621,631 < local world = table.remove(planetPool, 1) --- > local worldIndex = 1 > if coordinateConfig.prevSystem then > local s = coordinateSystem(coordinates[lastQuestId]) > for i, w in ipairs(planetPool) do > if compare(coordinateSystem(w), s) then > worldIndex = i > break > end > end > end > local world = table.remove(planetPool, worldIndex) 598,604c643,661 < local world < local excludeSystems = util.map(usedCoordinates, coordinateSystem) < repeat < world = table.remove(planetPool, 1) < until world == nil or not contains(excludeSystems, coordinateSystem(world)) < if world == nil then < error("Not enough worlds in the planet pool to use for system") --- > local system > if coordinateConfig.prevSystem then > system = coordinateSystem(coordinates[lastQuestId]) > for i, w in ipairs(planetPool) do > if compare(coordinateSystem(w), s) then > worldIndex = i > break > end > end > else > local world > local excludeSystems = util.map(usedCoordinates, coordinateSystem) > repeat > world = table.remove(planetPool, 1) > until world == nil or not contains(excludeSystems, coordinateSystem(world)) > if world == nil then > error("Not enough worlds in the planet pool to use for system") > end > system = coordinateSystem(world) 606c663 < local system = coordinateSystem(world) --- > spawntypes\uniques.spawntypes 17c17,20 < "monsterType" : "gleap", --- > "monsterType" : [ > [0.99, "gleap"], > [0.01, "firegleap"] > ], 32c35,38 < "monsterType" : "nutmidge", --- > "monsterType" : [ > [0.99, "nutmidge"], > [0.01, "poisonnutmidge"] > ], 47c53,56 < "monsterType" : "poptop", --- > "monsterType" : [ > [0.99, "poptop"], > [0.01, "albinopoptop"] > ], 66c75,78 < "monsterType" : "hypnare", --- > "monsterType" : [ > [0.99, "hypnare"], > [0.01, "icehypnare"] > ], 83c95,98 < "monsterType" : "sporgus", --- > "monsterType" : [ > [0.99, "sporgus"], > [0.01, "poisonsporgus"] > ], 101c116,119 < "monsterType" : "toumingo", --- > "monsterType" : [ > [0.99, "toumingo"], > [0.01, "firetoumingo"] > ], 119c137,140 < "monsterType" : "taroni", --- > "monsterType" : [ > [0.99, "taroni"], > [0.01, "firetaroni"] > ], 137c158,161 < "monsterType" : "oogler", --- > "monsterType" : [ > [0.99, "oogler"], > [0.01, "fireoogler"] > ], 155c179,182 < "monsterType" : "ringram", --- > "monsterType" : [ > [0.99, "ringram"], > [0.01, "iceringram"] > ], 171c198,201 < "monsterType" : "capricoat", --- > "monsterType" : [ > [0.99, "capricoat"], > [0.01, "electriccapricoat"] > ], 189c219,222 < "monsterType" : "anglure", --- > "monsterType" : [ > [0.99, "anglure"], > [0.01, "electricanglure"] > ], 207c240,243 < "monsterType" : "quagmutt", --- > "monsterType" : [ > [0.99, "quagmutt"], > [0.01, "electricquagmutt"] > ], 223c259,262 < "monsterType" : "pteropod", --- > "monsterType" : [ > [0.99, "pteropod"], > [0.01, "firepteropod"] > ], 241c280,283 < "monsterType" : "mandraflora", --- > "monsterType" : [ > [0.99, "mandraflora"], > [0.01, "poisonmandraflora"] > ], 257c299,302 < "monsterType" : "bulbop", --- > "monsterType" : [ > [0.99, "bulbop"], > [0.01, "poisonbulbop"] > ], 275c320,323 < "monsterType" : "yokat", --- > "monsterType" : [ > [0.99, "yokat"], > [0.01, "electricyokat"] > ], 293c341,344 < "monsterType" : "hemogoblin", --- > "monsterType" : [ > [0.99, "hemogoblin"], > [0.01, "electrichemogoblin"] > ], 311c362,365 < "monsterType" : "pipkin", --- > "monsterType" : [ > [0.99, "pipkin"], > [0.01, "poisonpipkin"] > ], 327c381,384 < "monsterType" : "lumoth", --- > "monsterType" : [ > [0.99, "lumoth"], > [0.01, "firelumoth"] > ], 345c402,405 < "monsterType" : "narfin", --- > "monsterType" : [ > [0.99, "narfin"], > [0.01, "icenarfin"] > ], 363c423,426 < "monsterType" : "orbide", --- > "monsterType" : [ > [0.99, "orbide"], > [0.01, "iceorbide"] > ], 381c444,447 < "monsterType" : "snaunt", --- > "monsterType" : [ > [0.99, "snaunt"], > [0.01, "electricsnaunt"] > ], 397c463,466 < "monsterType" : "peblit", --- > "monsterType" : [ > [0.99, "peblit"], > [0.01, "icepeblit"] > ], 413c482,485 < "monsterType" : "crustoise", --- > "monsterType" : [ > [0.99, "crustoise"], > [0.01, "icecrustoise"] > ], 429c501,504 < "monsterType" : "iguarmor", --- > "monsterType" : [ > [0.99, "iguarmor"], > [0.01, "iceiguarmor"] > ], 445c520,523 < "monsterType" : "bobfae", --- > "monsterType" : [ > [0.99, "bobfae"], > [0.01, "poisonbobfae"] > ], 461c539,542 < "monsterType" : "batong", --- > "monsterType" : [ > [0.99, "batong"], > [0.01, "poisonbatong"] > ], 477c558,561 < "monsterType" : "scaveran", --- > "monsterType" : [ > [0.99, "scaveran"], > [0.01, "poisonscaveran"] > ], 493c577,580 < "monsterType" : "crutter", --- > "monsterType" : [ > [0.99, "crutter"], > [0.01, "electriccrutter"] > ], 509c596,599 < "monsterType" : "spookit", --- > "monsterType" : [ > [0.99, "spookit"], > [0.01, "firespookit"] > ], 525c615,618 < "monsterType" : "voltip", --- > "monsterType" : [ > [0.99, "voltip"], > [0.01, "electricvoltip"] > ], 541c634,637 < "monsterType" : "fennix", --- > "monsterType" : [ > [0.99, "fennix"], > [0.01, "icefennix"] > ], 557c653,656 < "monsterType" : "ignome", --- > "monsterType" : [ > [0.99, "ignome"], > [0.01, "electricignome"] > ], 573c672,675 < "monsterType" : "bobot", --- > "monsterType" : [ > [0.99, "bobot"], > [0.01, "firebobot"] > ], 589c691,694 < "monsterType" : "lilodon", --- > "monsterType" : [ > [0.99, "lilodon"], > [0.01, "firelilodon"] > ], 605c710,713 < "monsterType" : "monopus", --- > "monsterType" : [ > [0.99, "monopus"], > [0.01, "firemonopus"] > ], 621c729,732 < "monsterType" : "snaggler", --- > "monsterType" : [ > [0.99, "snaggler"], > [0.01, "icesnaggler"] > ], 638c749,752 < "monsterType" : "snuffish", --- > "monsterType" : [ > [0.99, "snuffish"], > [0.01, "poisonsnuffish"] > ], 654c768,771 < "monsterType" : "crabcano", --- > "monsterType" : [ > [0.99, "crabcano"], > [0.01, "icecrabcano"] > ], 670c787,790 < "monsterType" : "smoglin", --- > "monsterType" : [ > [0.99, "smoglin"], > [0.01, "poisonsmoglin"] > ], 686c806,809 < "monsterType" : "paratail", --- > "monsterType" : [ > [0.99, "paratail"], > [0.01, "poisonparatail"] > ], 702c825,828 < "monsterType" : "tintic", --- > "monsterType" : [ > [0.99, "tintic"], > [0.01, "electrictintic"] > ], 718c844,847 < "monsterType" : "wisper", --- > "monsterType" : [ > [0.99, "wisper"], > [0.01, "firewisper"] > ], 734c863,866 < "monsterType" : "skimbus", --- > "monsterType" : [ > [0.99, "skimbus"], > [0.01, "electricskimbus"] > ], 750c882,885 < "monsterType" : "skimbus", --- > "monsterType" : [ > [0.99, "skimbus"], > [0.01, "electricskimbus"] > ], 766c901,904 < "monsterType" : "pulpin", --- > "monsterType" : [ > [0.99, "pulpin"], > [0.01, "poisonpulpin"] > ], 782c920,923 < "monsterType" : "scandroid", --- > "monsterType" : [ > [0.99, "scandroid"], > [0.01, "cultistscandroid"] > ], 798c939,942 < "monsterType" : "squeem", --- > "monsterType" : [ > [0.99, "squeem"], > [0.01, "firesqueem"] > ], 814c958,961 < "monsterType" : "adultpoptop", --- > "monsterType" : [ > [0.99, "adultpoptop"], > [0.01, "albinoadultpoptop"] > ], 830c977,980 < "monsterType" : "oculob", --- > "monsterType" : [ > [0.99, "oculob"], > [0.01, "fireoculob"] > ], 846c996,999 < "monsterType" : "agrobat", --- > "monsterType" : [ > [0.99, "agrobat"], > [0.01, "iceagrobat"] > ], 862c1015,1018 < "monsterType" : "petricub", --- > "monsterType" : [ > [0.99, "petricub"], > [0.01, "electricpetricub"] > ], 878c1034,1037 < "monsterType" : "pyromantle", --- > "monsterType" : [ > [0.99, "pyromantle"], > [0.01, "poisonpyromantle"] > ], 894c1053,1056 < "monsterType" : "miasmop", --- > "monsterType" : [ > [0.99, "miasmop"], > [0.01, "icemiasmop"] > ], 910c1072,1075 < "monsterType" : "trictus", --- > "monsterType" : [ > [0.99, "trictus"], > [0.01, "poisontrictus"] > ], 1116a1282,1299 > "monsterParameters" : { > "aggressive" : true > } > }, > > { > "name" : "cosmicintruder", > > "spawnParameters" : { > "area" : "air", > "region" : "all", > "time" : "all" > }, > "groupSize" : [1, 1], > "spawnChance" : 0.01, > "monsterType" : [ > [1, "cosmicintruder"] > ], stagehands\bountymanager.lua 220c220 < newConfig.questId = spawnConfig.quest --- > newConfig.questId = spawnConfig.questId 340d339 < sb.logInfo("%s %s", self.worldId, coordinateWorldId(world.coordinate)) tiles\platforms\polygonplatform.material 20c20 < "multiColored" : false, --- > "multiColored" : true, treasure\monster.treasurepools 603,605c603,619 < {"weight" : 0.799, "pool" : "basicMonsterTreasure"}, < {"weight" : 0.200, "item" : "sharpenedclaw"}, < {"weight" : 0.001, "item" : "paraspriteaf"} --- > {"weight" : 0.79, "pool" : "basicMonsterTreasure"}, > {"weight" : 0.20, "item" : "sharpenedclaw"}, > {"weight" : 0.01, "item" : "paraspriteaf"} > ], > "poolRounds" : [ > [0.20, 0], > [0.80, 1] > ], > "allowDuplication" : false > }] > ], > > "cosmicintruderTreasure" : [ > [1, { > "pool" : [ > {"weight" : 0.999, "pool" : "basicMonsterTreasure"}, > {"weight" : 0.001, "item" : "cosmicintruderaf"} 2026a2041,2052 > ], > "poolRounds" : [ > [1, 1] > ] > } ] > ], > > "swansongTreasure" : [ > [1, { > "pool" : [ > {"weight" : 0.95, "pool" : "chestMoney"}, > {"weight" : 0.05, "item" : "swansongaf"} vehicles\sportscar\sportscar.animation 2,5d1 < "globalTagDefaults" : { < "colour" : "" < }, < 8,9d3 < < 13d6 < 19,20c12 < }, < --- > }, 26,27c18 < }, < --- > }, 29d19 < 35,36c25 < }, < --- > }, 42,43c31 < }, < --- > }, 45,97d32 < < } < }, < < < "onfire" : { < "default" : "off", < "states" : { < "off" : {}, < < "on" : { < "frames" : 6, < "cycle" : 0.5, < "mode" : "loop" < } < < } < }, < < "rearThruster" : { < "default" : "off", < "states" : { < "off" : {}, < < "on" : { < "frames" : 1, < "cycle" : 0.125, < "mode" : "loop" < } < < } < }, < < "bottomThruster" : { < "default" : "off", < "states" : { < "off" : {}, < < "on" : { < "frames" : 1, < "cycle" : 0.125, < "mode" : "loop" < } < < } < }, < < "headlights" : { < "default" : "off", < "states" : { < "off" : {}, < < "on" : {} 100,101d34 < < 105,151c38 < < < "background" : { < "properties" : { < "centered" : true, < "zLevel" : -1, < "transformationGroups" : ["flip", "rotation"] < }, < < "partStates" : { < "movement" : { < < "warpInPart1" : { < "properties" : {} < }, < < "warpInPart2" : { < "properties" : { < "image" : "jeepbackground.png:move." < } < }, < < "idle" : { < "properties" : { < "image" : "jeepbackground.png:move." < } < }, < < "warpOutPart1" : { < "properties" : { < "image" : "jeepbackground.png:move." < } < }, < < "warpOutPart2" : { < "properties" : {} < }, < < "invisible" : { < "properties" : {} < } < < } < } < }, < < "foreground" : { --- > "body" : { 156,157c43 < "drivingSeatPosition" : [0, 1.5], < "passengerSeatPosition" : [-2, 1.5] --- > "drivingSeatPosition" : [0.0, 0.0] 159d44 < 161d45 < 163,173d46 < < "warpInPart1" : { < "properties" : { < "image" : "" < } < }, < "warpInPart2" : { < "properties" : { < "image" : "jeepforeground.png:move." < } < }, 176c49 < "image" : "jeepforeground.png:move." --- > "image" : "sportscar.png:move." 179,189d51 < < "warpOutPart1" : { < "properties" : { < "image" : "jeepforeground.png:move." < } < }, < < "warpOutPart2" : { < "properties" : {} < }, < 196,197c58 < < "warp" : { --- > "bodyfullbright" : { 199,202c60,62 < "centered" : true, < "zLevel" : 3, < "fullbright" : true, < "transformationGroups" : ["flip", "rotation"] --- > "zLevel" : 2, > "anchorPart" : "body", > "fullbright" : true 204d63 < 206d64 < 208,220d65 < < "warpInPart1" : { < "properties" : { < "image" : "hoverbikewarp.png:warpInPart1." < } < }, < "warpInPart2" : { < "properties" : { < "image" : "hoverbikewarp.png:warpInPart2." < } < }, < < 222,226d66 < "properties" : {} < }, < < < "warpOutPart1" : { 228c68 < "image" : "hoverbikewarp.png:warpOutPart1." --- > "image" : "sportscarfullbright.png:move." 231,237d70 < "warpOutPart2" : { < "properties" : { < "image" : "hoverbikewarp.png:warpOutPart2." < } < }, < < 241,288d73 < < } < } < }, < < < "lights" : { < "properties" : { < "centered" : true, < "zLevel" : 2, < "fullbright" : true, < "transformationGroups" : ["flip", "rotation"] < }, < < "partStates" : { < < "headlights" : { < < "off" : { < "properties" : { < } < }, < < "on" : { < "properties" : { < "image" : "jeepheadlights.png:headlights.", < "offset" : [2.94, -0.17 ] < } < } < } < } < }, < < "fire" : { < "properties" : { < "centered" : true, < "zLevel" : 2, < "fullbright" : true, < "transformationGroups" : ["flip", "rotation"] < }, < < "partStates" : { < "onfire" : { < "on" : { < "properties" : { < "image" : "hoverbikefire.png:burn." < } < } 292d76 < 304,330c88,95 < < "rearThrusterIdle" : { < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 5.0, < "offsetRegion" : [ -5, 0.5, -5, 1.5], < "particles" : [] < }, < < "rearThrusterDrive" : { < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 20.0, < "offsetRegion" : [-2, -0.5, 2, -0.5], < "particles" : [{ "particle" : "dirtspray"}] < }, < < "ventralThrusterIdle" : { < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 5.0, < "offsetRegion" : [-0.5, -1.5, 0.5, -1.55], < "particles" : [] < }, < "ventralThrusterJump" : { < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 15.0, < "burstCount" : 2, < "offsetRegion" : [-0.5, -1.5, 0.5, -1.55], < "particles" : [] --- > "thruster" : { > "active" : true, > "offsetRegion" : [-2.0, -1.0, 3.5, -1.0], > "anchorPart" : "body", > "emissionRate" : 50.0, > "particles" : [ > {"particle" : "sportscardownthrust"} > ] 332,333d96 < < 335c98 < "transformationGroups" : ["flip", "rotation"], --- > "anchorPart" : "body", 338c101,103 < "particles" : [{ "particle" : "burningvehiclesmokefront"}] --- > "particles" : [ > { "particle" : "burningvehiclesmokefront"} > ] 340d104 < 342,343d105 < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 0.0, 345,349c107,114 < "particles" : [ { "particle" : "burningdust"}, < { "particle" : "campfireflames"}, < { "particle" : "fireshard"}, < { "particle" : "burningvehiclesmokeback"}] < --- > "anchorPart" : "body", > "emissionRate" : 0.0, > "particles" : [ > { "particle" : "burningdust"}, > { "particle" : "campfireflames"}, > { "particle" : "fireshard"}, > { "particle" : "burningvehiclesmokeback"} > ] 351d115 < 353,355d116 < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 0.0, < "burstCount" : 5, 357,358c118,140 < "particles" : [{ "particle" : "burningvehiclesmokefront"}, < { "particle" : "fireshard"}] --- > "anchorPart" : "body", > "burstCount" : 5, > "particles" : [ > { "particle" : "burningvehiclesmokefront"}, > { "particle" : "fireshard"} > ] > }, > "damageShards" : { > "offsetRegion" : [-3, -1.5, 3, 1], > "anchorPart" : "body", > "burstCount" : 30, > "particles" : [ > { "particle" : "hoverbikeredshard"}, > { "particle" : "fireshard"} > ] > }, > "wreckage" : { > "anchorPart" : "body", > "burstCount" : 30.0, > "particles" : [ > { "particle" : "hoverbikeredshard"}, > { "particle" : "fireshard"} > ] 363,376c145,149 < "dashboardGlow" : { < "active" : false, < "transformationGroups" : ["flip", "rotation"], < "position" : [2.0, 0.5], < "color" : [120, 80, 0], < "pointLight" : true, < "pointAngle" : 140, < "pointBeam" : 5 < }, < "headlightBeam" : { < "active" : false, < "transformationGroups" : ["flip", "rotation"], < "position" : [4.5, 0.0], < "color" : [250, 250, 200], --- > "neonglow" : { > "active" : true, > "anchorPart" : "body", > "position" : [0.0, -1.0], > "color" : [249, 21, 207], 378,379c151,152 < "pointAngle" : -5, < "pointBeam" : 5 --- > "pointAngle" : -90, > "pointBeam" : 0.5 384,414c157,183 < "collisionNotification" : [ "/sfx/tech/hoverbike_bump1.ogg", < "/sfx/tech/hoverbike_bump2.ogg", < "/sfx/tech/hoverbike_bump3.ogg" ], < < "collisionDamage" : ["/sfx/melee/bite_robotic1.ogg"], < < < "changeDamageState" : [ "/sfx/gun/grenadeblast_small_fire1.ogg", < "/sfx/gun/grenadeblast_small_fire2.ogg", < "/sfx/gun/grenadeblast_small_fire3.ogg" ], < < "explode" : [ "/sfx/gun/grenadeblast_small_fire1.ogg", < "/sfx/gun/grenadeblast_small_fire2.ogg", < "/sfx/gun/grenadeblast_small_fire3.ogg" ], < < < "engineStart" : ["/sfx/tools/teleport_up.ogg"], < < "engineLoop" : ["/sfx/tech/hoverbike_drive_loop.ogg"], < < "engineStartDamaged" : ["/sfx/tools/teleport_up.ogg"], < < "engineLoopDamaged" : ["/sfx/tech/hoverbike_idle_loop.ogg"], < < "damageIntermittent" : [ "/sfx/gun/grenadeblast_small_fire1.ogg", < "/sfx/gun/grenadeblast_small_fire2.ogg", < "/sfx/gun/grenadeblast_small_fire3.ogg" ], < < "hornLoop" : ["/sfx/tech/honk.ogg"], < "headlightSwitchOn" : ["/sfx/objects/floodlights_on.ogg"], < "headlightSwitchOff" : ["/sfx/objects/floodlights_off.ogg"], --- > "collisionNotification" : [ > "/sfx/tech/hoverbike_bump1.ogg", > "/sfx/tech/hoverbike_bump2.ogg", > "/sfx/tech/hoverbike_bump3.ogg" > ], > "collisionDamage" : [ "/sfx/melee/bite_robotic1.ogg" ], > "changeDamageState" : [ > "/sfx/gun/grenadeblast_small_fire1.ogg", > "/sfx/gun/grenadeblast_small_fire2.ogg", > "/sfx/gun/grenadeblast_small_fire3.ogg" > ], > > "explode" : [ > "/sfx/gun/grenadeblast_small_fire1.ogg", > "/sfx/gun/grenadeblast_small_fire2.ogg", > "/sfx/gun/grenadeblast_small_fire3.ogg" > ], > > "engineStart" : [ "/sfx/tools/teleport_up.ogg" ], > "engineLoop" : [ "/sfx/tech/hoverbike_drive_loop.ogg" ], > "engineStartDamaged" : [ "/sfx/tools/teleport_up.ogg" ], > "engineLoopDamaged" : [ "/sfx/tech/hoverbike_idle_loop.ogg" ], > "damageIntermittent" : [ > "/sfx/gun/grenadeblast_small_fire1.ogg", > "/sfx/gun/grenadeblast_small_fire2.ogg", > "/sfx/gun/grenadeblast_small_fire3.ogg" > ], 416c185 < "returnvehicle" : ["/sfx/tech/vehicle_disappear1.ogg"] --- > "returnvehicle" : [ "/sfx/tech/vehicle_disappear1.ogg" ] vehicles\sportscar\sportscar.lua 13,15c13,15 < self.nearGroundDistance = config.getParameter("nearGroundDistance") < self.jumpVelocity = config.getParameter("jumpVelocity") < self.jumpTimeout = config.getParameter("jumpTimeout") --- > self.zeroGTargetVelocity = config.getParameter("zeroGTargetVelocity") > self.zeroGSpinRate = config.getParameter("zeroGSpinRate") > self.spinFriction = config.getParameter("spinFriction") 20a21 > self.zeroGMovementSettings = config.getParameter("zeroGMovementSettings") 39d39 < 54,58d53 < < self.damageStatePassengerDances = config.getParameter("damageStatePassengerDances") < self.damageStatePassengerEmotes = config.getParameter("damageStatePassengerEmotes") < self.damageStateDriverEmotes = config.getParameter("damageStateDriverEmotes") < 63d57 < 67d60 < self.jumpTimer = 0 71,72c64 < < self.damageEmoteTimer = 0.0 --- > self.spin = 0 79,91d70 < --initial state < self.headlightCanToggle = true < self.headlightsOn = false < self.hornPlaying = false < < animator.setGlobalTag("rearThrusterFrame", 1) < animator.setGlobalTag("bottomThrusterFrame", 1) < < animator.setAnimationState("rearThruster", "off") < animator.setAnimationState("bottomThruster", "off") < < animator.setAnimationState("headlights", "off") < 115d93 < switchHeadLights(1, 1, false) 135d112 < --lock it solid whilst spawning/despawning 149,150c126,130 < move() < controls() --- > if mcontroller.zeroG() then > moveZeroG() > else > move() > end 155,156d134 < updatePassengers(healthFactor) < 161,189d138 < --make the driver and passenger dance and emote according to the damage state of the vehicle < function updatePassengers(healthFactor) < if healthFactor > 0 then < local maxDamageState = #self.damageStatePassengerDances < local damageStateIndex = maxDamageState < damageStateIndex = (maxDamageState - math.ceil(healthFactor * maxDamageState)) + 1 < < local dance = self.damageStatePassengerDances[damageStateIndex] < if (dance ~= "") then < vehicle.setLoungeDance("passengerSeat",dance) < end < < --if we have a scared face on because of taking damage < if self.damageEmoteTimer > 0 then < self.damageEmoteTimer = self.damageEmoteTimer - script.updateDt() < else < maxDamageState = #self.damageStatePassengerEmotes < damageStateIndex = maxDamageState < damageStateIndex = (maxDamageState - math.ceil(healthFactor * maxDamageState)) + 1 < vehicle.setLoungeEmote("passengerSeat", self.damageStatePassengerEmotes[damageStateIndex]) < < maxDamageState = #self.damageStateDriverEmotes < damageStateIndex = maxDamageState < damageStateIndex = (maxDamageState - math.ceil(healthFactor * maxDamageState)) + 1 < vehicle.setLoungeEmote("drivingSeat", self.damageStateDriverEmotes[damageStateIndex]) < end < end < end < 223,225d171 < local rearThrusterFrame = 0 < local ventralThrusterFrame = 0 < 228,236d173 < if (self.engineVolume == self.engineIdleVolume) then < animator.setParticleEmitterActive("rearThrusterIdle", true) < animator.setParticleEmitterActive("rearThrusterDrive", false) < else < animator.setParticleEmitterActive("rearThrusterIdle", false) < animator.setParticleEmitterActive("rearThrusterDrive", true) < rearThrusterFrame = 3 < end < 244,248d180 < animator.setParticleEmitterActive("ventralThrusterIdle", false) < animator.setParticleEmitterActive("ventralThrusterJump", true) < animator.burstParticleEmitter("ventralThrusterJump") < ventralThrusterFrame = 3 < 253d184 < ventralThrusterFrame = 3 255,257d185 < animator.setParticleEmitterActive("ventralThrusterIdle", true) < animator.setParticleEmitterActive("ventralThrusterJump", false) < 263,273d190 < < animator.setAnimationState("rearThruster", "on") < animator.setAnimationState("bottomThruster", "on") < else < animator.setParticleEmitterActive("rearThrusterIdle", false) < animator.setParticleEmitterActive("rearThrusterDrive", false) < animator.setParticleEmitterActive("ventralThrusterIdle", false) < animator.setParticleEmitterActive("ventralThrusterJump", false) < < animator.setAnimationState("rearThruster", "off") < animator.setAnimationState("bottomThruster", "off") 289,292d205 < self.damageEmoteTimer = config.getParameter("damageEmoteTime") < < local BackfireMomentum = {0, self.jumpVelocity * 0.5} < mcontroller.addMomentum(BackfireMomentum) 298,303d210 < < rearThrusterFrame = rearThrusterFrame + math.random(3) < animator.setGlobalTag("rearThrusterFrame", rearThrusterFrame) < < ventralThrusterFrame = ventralThrusterFrame + math.random(3) < animator.setGlobalTag("bottomThrusterFrame", ventralThrusterFrame) 306,307c213 < function updateVisualEffects(currentHealth, damage, headlights) < --- > function updateVisualEffects(currentHealth, damage) 332,333d237 < switchHeadLights(previousDamageStateIndex, damageStateIndex, headlights) < 349,354d252 < < if (self.onFireThreshold and newHealthFactor < self.onFireThreshold) then < animator.setAnimationState("onfire", "on") < else < animator.setAnimationState("onfire", "off") < end 358,385d255 < animator.setAnimationState("onfire", "off") < end < end < < function switchHeadLights(oldIndex, newIndex, activate) < if (activate ~= self.headlightsOn or oldIndex ~= newIndex) then < local listOfLists = config.getParameter("lightsInDamageState") < < if (listOfLists ~= nil) then < if (oldIndex ~= newIndex) then < local listToSwitchOff = listOfLists[oldIndex] < for i, name in ipairs(listToSwitchOff) do < animator.setLightActive(name, false) < end < end < < local listToSwitchOn = listOfLists[newIndex] < for i, name in ipairs(listToSwitchOn) do < animator.setLightActive(name, activate) < end < end < self.headlightsOn = activate < < if (self.headlightsOn) then < animator.setAnimationState("headlights", "on") < else < animator.setAnimationState("headlights", "off") < end 389,395d258 < function setDamageEmotes() < local damageTakenEmote = config.getParameter("damageTakenEmote") < self.damageEmoteTimer = config.getParameter("damageEmoteTime") < vehicle.setLoungeEmote("drivingSeat", damageTakenEmote) < vehicle.setLoungeEmote("passengerSeat", damageTakenEmote) < end < 403c266 < return --- > return {} 406,408c269 < setDamageEmotes() < < updateVisualEffects(storage.health, damage, self.headlightsOn) --- > updateVisualEffects(storage.health, damage) 431a293,325 > function moveZeroG() > local dt = script.updateDt() > if self.spin > 0 then > self.spin = math.max(0, self.spin - self.spinFriction * dt) > else > self.spin = math.min(0, self.spin + self.spinFriction * dt) > end > > self.angle = self.angle + self.spin * dt > > mcontroller.resetParameters(self.movementSettings) > mcontroller.applyParameters(self.zeroGMovementSettings) > > local controlDirection = 0 > if vehicle.controlHeld("drivingSeat", "right") then > controlDirection = controlDirection + 1 > end > if vehicle.controlHeld("drivingSeat", "left") then > controlDirection = controlDirection - 1 > end > > if controlDirection ~= 0 then > self.spin = self.spin - self.zeroGSpinRate * controlDirection * dt > self.facingDirection = controlDirection > > local boostVec = vec2.mul(vec2.withAngle(self.angle, self.zeroGTargetVelocity), controlDirection) > mcontroller.approachVelocity(boostVec, self.horizontalControlForce) > > self.enginePitch = self.engineRevPitch; > self.engineVolume = self.engineRevVolume; > end > end > 432a327,328 > self.spin = 0 > 434d329 < local nearGround = groundDistance < self.nearGroundDistance 443,445c338,340 < if groundDistance <= self.hoverTargetDistance then < mcontroller.approachYVelocity((self.hoverTargetDistance - groundDistance) * self.hoverVelocityFactor, self.hoverControlForce) < end --- > end > if groundDistance <= self.hoverTargetDistance then > mcontroller.approachYVelocity((self.hoverTargetDistance - groundDistance) * self.hoverVelocityFactor, self.hoverControlForce) 449a345 > self.facingDirection = -1 453,454d348 < < self.facingDirection = -1 458a353 > self.facingDirection = 1 462,463d356 < < self.facingDirection = 1 486,497d378 < if nearGround then < if self.jumpTimer <= 0 and vehicle.controlHeld("drivingSeat", "jump") then < mcontroller.setYVelocity(self.jumpVelocity) < self.jumpTimer = self.jumpTimeout < self.revEngine = true; < else < self.jumpTimer = self.jumpTimer - script.updateDt() < end < else < self.jumpTimer = self.jumpTimeout < end < 501,530d381 < function controls() < if (vehicle.controlHeld("drivingSeat", "PrimaryFire")) then < if (self.headlightCanToggle) then < updateVisualEffects(storage.health, 0, (not self.headlightsOn)) < < if (self.headlightsOn) then < animator.playSound("headlightSwitchOn") < else < animator.playSound("headlightSwitchOff") < end < < self.headlightCanToggle = false < end < else < self.headlightCanToggle = true; < end < < if (vehicle.controlHeld("drivingSeat", "AltFire")) then < if not self.hornPlaying then < animator.playSound("hornLoop", -1) < self.hornPlaying = true; < end < else < if self.hornPlaying then < animator.stopAllSounds("hornLoop") < self.hornPlaying = false; < end < end < end < 542,549d392 < if animator.animationState("onfire") == "on" then < setDamageEmotes() < < local damageThisFrame = self.damagePerSecondWhenOnFire * script.updateDt() < updateVisualEffects(storage.health, damageThisFrame, self.headlightsOn) < storage.health = storage.health - damageThisFrame < end < 590d432 < setDamageEmotes() 592c434 < updateVisualEffects(storage.health, self.terrainCollisionDamage, self.headlightsOn) --- > updateVisualEffects(storage.health, self.terrainCollisionDamage) vehicles\sportscar\sportscar.vehicle 3c3 < "script" : "/vehicles/sportscar/sportscar.lua", --- > "script" : "sportscar.lua", 10,42d9 < < "animationCustom" : { < < "globalTagDefaults" : { < "colour" : "red" < }, < < < "particleEmitters" : { < "damageShards" : { < "transformationGroups" : ["flip", "rotation"], < "emissionRate" : 0.0, < "burstCount" : 30, < "offsetRegion" : [-3, -1.5, 3, 1], < "particles" : [{ "particle" : "hoverbikeredshard"}, < { "particle" : "fireshard"}] < }, < < "wreckage" : { < "transformationGroups" : ["flip", "rotation"], < "active" : false, < "emissionRate" : 0.0, < "particles" : [ < { "particle" : "hoverbikeredwreck1"}, < { "particle" : "hoverbikeredwreck2"}, < { "particle" : "hoverbikewreck3"}, < { "particle" : "hoverbikeredwreck4"}, < { "particle" : "hoverbikewreck5"}, < { "particle" : "hoverbikeredwreck6"}] < } < } < }, < 45c12 < "part" : "foreground", --- > "part" : "body", 47c14,15 < "orientation" : "sit", --- > "orientation" : "lay", > "directives" : "?multiply=00000000", 50,58c18,19 < "dance" : "warmhands" < }, < "passengerSeat" : { < "part" : "foreground", < "partAnchor" : "passengerSeatPosition", < "orientation" : "sit", < "statusEffects" : ["maxprotection"], < "emote" : "neutral", < "dance" : "typing" --- > "dance" : "warmhands", > "cameraFocus" : true 63c24 < --- > 65c26 < "angleApproachFactor" : 2, --- > "angleApproachFactor" : 0.01, 67,68c28,29 < "maxAngle" : 15, < "hoverTargetDistance" : 0.4, --- > "maxAngle" : 20, > "hoverTargetDistance" : 1.5, 71,76c32,36 < "targetHorizontalVelocity" : 20, < "horizontalControlForce" : 1000, < < "nearGroundDistance" : 4, < "jumpVelocity" : 0, < "jumpTimeout" : 0.25, --- > "targetHorizontalVelocity" : 30, > "horizontalControlForce" : 120, > "zeroGTargetVelocity" : 40, > "zeroGSpinRate" : 4, > "spinFriction" : 0.1, 83d42 < 85d43 < 88,90d45 < < < 94,101d48 < < "lightsInDamageState" : [ < ["headlightBeam","dashboardGlow"], < ["headlightBeam","dashboardGlow"], < ["headlightBeam","dashboardGlow"], < ["headlightBeam"] < ], < 106d52 < 119,120d64 < < 138c82,85 < [-1.0, 0.0] --- > [-3.0, 0.0], > [-4.0, 0.0], > [-5.0, 0.0], > [-6.0, 0.0] 142c89,92 < [1.0, 0.0] --- > [3.0, 0.0], > [4.0, 0.0], > [5.0, 0.0], > [6.0, 0.0] 146c96,100 < [0.0, -1.0] --- > [-4.0, -1.0], > [-2.0, -1.0], > [0.0, -1.0], > [2.0, -1.0], > [4.0, -1.0] 152c106 < "airFriction" : 1, --- > "airFriction" : 2, 163c117 < } --- > }, 164a119,124 > "zeroGMovementSettings" : { > "collisionPoly" : [[-4.0, 0.5], [-2.0, -1.5], [2.0, -1.5], [4.0, 0.5]], > "mass" : 4, > "airFriction" : 0.1, > "collisionEnabled" : true > }