FILES ----- dungeons\missions\cultistmissions\cultistmission1.json monsters\boss\ophanim\ophanim.monstertype monsters\boss\swansong\swansong.lua monsters\boss\swansong\swansong.monstertype [NEW] objects\cultist\cultistairlockdoor\cultistairlockbossdoor.object objects\mission\bossdoor\bossdoor.lua quests\bounty\assignment.config stats\effects\maxhealthboost\maxhealthreduction.statuseffect tilesets\packed\objects-by-category\decorative.json tilesets\packed\objects-by-category\door.json tilesets\packed\objects-by-category\other.json tilesets\packed\objects-by-colonytag\commerce.json tilesets\packed\objects-by-colonytag\cultist.json tilesets\packed\objects-by-colonytag\door.json tilesets\packed\objects-by-colonytag\peacekeeper.json tilesets\packed\objects-by-race\generic.json tilesets\packed\objects-by-race\human.json vehicles\dropship\dropship.animation vehicles\modularmech\mechparts_arm.config DIFFS ----- dungeons\missions\cultistmissions\cultistmission1.json [TMX file differences are left out for huge size.] monsters\boss\ophanim\ophanim.monstertype 70c70 < "baseValue" : 500 --- > "baseValue" : 350 monsters\boss\swansong\swansong.lua 34c34 < local range = 10 + (#self.ophanims % 3) * 11 --- > local range = 10 + (#self.ophanims % 3) * 11.5 129d128 < table.insert(self.targets, damageSource.sourceId) 369a369,392 > -- first do each attack once, with an ophanim wave between each > local attacks = { > rocketSwarmAttack(attackConfig.rocketSwarm), > deathLaserAttack(attackConfig.deathLaser), > coroutine.create(function() > for i = 1, 4 do > await(meleeSequenceAttack(attackConfig.melee)) > end > end) > } > for _, attack in ipairs(attacks) do > await(attack) > > await(activateGravity(attackConfig.activateGravity)) > > await(spawnOphanimsAttack(attackConfig.spawnOphanims)) > for i = 1, 2 do > await(hoverFireAttack(attackConfig.hoverFire)) > end > > await(deactivateGravity()) > end > > -- then do two attacks between each wave, repeating 747,751c770,771 < await(flyTo(storage.spawnPosition)) < < for i = 1, 2 do < animator.playSound("toggleGravityWarning") < await(delay(1.0)) --- > if math.abs(world.distance(mcontroller.position(), storage.spawnPosition)[1]) > 20 then > await(flyTo(storage.spawnPosition)) 753a774,776 > animator.playSound("toggleGravityWarning") > await(delay(1.0)) > 774,777c797,798 < for i = 1, 2 do < animator.playSound("toggleGravityWarning") < await(delay(1.0)) < end --- > animator.playSound("toggleGravityWarning") > await(delay(1.0)) monsters\boss\swansong\swansong.monstertype 216c216 < "baseValue" : 8000 --- > "baseValue" : 6000 objects\mission\bossdoor\bossdoor.lua 1,83c1,117 < require "/scripts/rect.lua" < require "/scripts/util.lua" < < function init() < setupMaterialSpaces() < < self.open = false < < object.setInteractive(true) < < object.setMaterialSpaces(self.closedMaterialSpaces) < animator.setAnimationState("doorState", "closed") < physics.setForceEnabled("right", false) < physics.setForceEnabled("left", false) < < self.playerQueryArea = config.getParameter("playerQueryArea") < if object.direction() < 0 then < self.playerQueryArea = rect.flipX(self.playerQueryArea) < end < self.playerQueryArea = rect.translate(self.playerQueryArea, entity.position()) < < self.closeTime = config.getParameter("closeTime", 0.5) < self.timer = 0 < < self.cooldownTime = config.getParameter("cooldownTime", 1.0) < self.cooldownTimer = 0 < end < < function onInteraction(args) < -- Only allow opening from behind the door < if self.cooldownTimer == 0 and args.source[1] * object.direction() < 0 then < openDoor() < end < end < < function queryPlayers(area) < return world.entityQuery(rect.ll(area), rect.ur(area), { includedTypes = { "player" } }) < end < < function update(dt) < if self.open then < self.cooldownTimer = self.cooldownTime < self.timer = math.max(self.timer - script.updateDt(), 0) < < if self.timer == 0 then < local players = queryPlayers(self.playerQueryArea) < < if #players == 0 then < closeDoor() < end < end < else < self.cooldownTimer = math.max(self.cooldownTimer - dt, 0) < end < end < < function openDoor() < object.setMaterialSpaces(self.openMaterialSpaces) < animator.setAnimationState("doorState", "open") < animator.playSound("open") < physics.setForceEnabled(object.direction() > 0 and "right" or "left", true) < self.timer = self.closeTime < self.open = true < end < < function closeDoor() < object.setMaterialSpaces(self.closedMaterialSpaces) < animator.setAnimationState("doorState", "closed") < animator.playSound("close") < physics.setForceEnabled(object.direction() > 0 and "right" or "left", false) < self.open = false < end < < function setupMaterialSpaces() < self.closedMaterialSpaces = config.getParameter("closedMaterialSpaces") < if not self.closedMaterialSpaces then < self.closedMaterialSpaces = {} < for i, space in ipairs(object.spaces()) do < table.insert(self.closedMaterialSpaces, {space, "metamaterial:objectsolid"}) < end < end < self.openMaterialSpaces = config.getParameter("openMaterialSpaces", {}) < end --- > require "/scripts/rect.lua" > require "/scripts/util.lua" > > function init() > setupMaterialSpaces() > > self.open = false > > object.setInteractive(true) > > object.setMaterialSpaces(self.closedMaterialSpaces) > animator.setAnimationState("doorState", "closed") > physics.setForceEnabled("right", false) > physics.setForceEnabled("left", false) > > self.playerQueryArea = config.getParameter("playerQueryArea") > if object.direction() < 0 then > self.playerQueryArea = rect.flipX(self.playerQueryArea) > end > self.playerQueryArea = rect.translate(self.playerQueryArea, entity.position()) > > self.closeTime = config.getParameter("closeTime", 0.5) > self.timer = 0 > > self.cooldownTime = config.getParameter("cooldownTime", 1.0) > self.cooldownTimer = 0 > > updateInteractive() > end > > function onInteraction(args) > -- Only allow opening from behind the door > if self.cooldownTimer == 0 and args.source[1] * object.direction() < 0 then > openDoor() > end > end > > function queryPlayers(area) > return world.entityQuery(rect.ll(area), rect.ur(area), { includedTypes = { "player" } }) > end > > function update(dt) > if self.open and not isInputNodeConnected(0) then > self.cooldownTimer = self.cooldownTime > self.timer = math.max(self.timer - script.updateDt(), 0) > > if self.timer == 0 then > local players = queryPlayers(self.playerQueryArea) > > if #players == 0 then > closeDoor() > end > end > else > self.cooldownTimer = math.max(self.cooldownTimer - dt, 0) > end > end > > function onNodeConnectionChange(args) > updateInteractive() > updateWires() > if isInputNodeConnected(0) then > onInputNodeChange({ level = object.getInputNodeLevel(0) }) > end > end > > function isInputNodeConnected(i) > return object.inputNodeCount() > i and object.isInputNodeConnected(i) > end > > function updateInteractive() > object.setInteractive(config.getParameter("interactive", true) and not isInputNodeConnected(0)) > end > > function updateWires() > setupMaterialSpaces() > object.setMaterialSpaces(storage.state and self.openMaterialSpaces or self.closedMaterialSpaces) > object.setAllOutputNodes(storage.state) > end > > function onInputNodeChange(args) > if args.level then > openDoor(storage.doorDirection) > else > closeDoor() > end > end > > function openDoor() > object.setMaterialSpaces(self.openMaterialSpaces) > animator.setAnimationState("doorState", "open") > animator.playSound("open") > physics.setForceEnabled(object.direction() > 0 and "right" or "left", true) > self.timer = self.closeTime > self.open = true > updateInteractive() > end > > function closeDoor() > object.setMaterialSpaces(self.closedMaterialSpaces) > animator.setAnimationState("doorState", "closed") > animator.playSound("close") > physics.setForceEnabled(object.direction() > 0 and "right" or "left", false) > self.open = false > updateInteractive() > end > > function setupMaterialSpaces() > self.closedMaterialSpaces = config.getParameter("closedMaterialSpaces") > if not self.closedMaterialSpaces then > self.closedMaterialSpaces = {} > for i, space in ipairs(object.spaces()) do > table.insert(self.closedMaterialSpaces, {space, "metamaterial:objectsolid"}) > end > end > self.openMaterialSpaces = config.getParameter("openMaterialSpaces", {}) > end quests\bounty\assignment.config 74c74 < "threshold" : 1830, --- > "threshold" : 1600, stats\effects\maxhealthboost\maxhealthreduction.statuseffect 4c4 < "healthEffectiveMultiplier" : 0.15 --- > "healthEffectiveMultiplier" : 0.25 tilesets\packed\objects-by-category\decorative.json 4079c4079 < "//description" : "A round desk, made for the Peacekeeper's HQ.", --- > "//description" : "A round desk, typically found in Peacekeeper stations.", tilesets\packed\objects-by-category\door.json 7c7 < "tilecount" : 131, --- > "tilecount" : 132, 299c299 < "//description" : "-todo-", --- > "//description" : "An automatic door, typically used in Peacekeeper Stations.", 333a334,342 > "131" : { > "//description" : "A crudely-made airlock door.", > "//name" : "cultistairlockbossdoor", > "//shortdescription" : "Cultist Airlock Door", > "imagePositionX" : "-8", > "imagePositionY" : "0", > "object" : "cultistairlockbossdoor", > "tilesetDirection" : "right" > }, 1235a1245,1247 > }, > "131" : { > "image" : "../../../../../tiled/packed/objects/cultistairlockbossdoor.png" tilesets\packed\objects-by-category\other.json 1753c1753 < "//description" : "-todo-", --- > "//description" : "Fine furnishings, with a Peacekeeper twist.", 1771c1771 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 1779c1779 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 1803c1803 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 1811c1811 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", tilesets\packed\objects-by-colonytag\commerce.json 487c487 < "//description" : "-todo-", --- > "//description" : "Fine furnishings, with a Peacekeeper twist.", 522c522 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 530c530 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 564c564 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 572c572 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", tilesets\packed\objects-by-colonytag\cultist.json 7c7 < "tilecount" : 8, --- > "tilecount" : 9, 80a81,89 > }, > "8" : { > "//description" : "A crudely-made airlock door.", > "//name" : "cultistairlockbossdoor", > "//shortdescription" : "Cultist Airlock Door", > "imagePositionX" : "-8", > "imagePositionY" : "0", > "object" : "cultistairlockbossdoor", > "tilesetDirection" : "right" 106a116,118 > }, > "8" : { > "image" : "../../../../../tiled/packed/objects/cultistairlockbossdoor.png" tilesets\packed\objects-by-colonytag\door.json 7c7 < "tilecount" : 122, --- > "tilecount" : 123, 208c208 < "//description" : "-todo-", --- > "//description" : "An automatic door, typically used in Peacekeeper Stations.", 242a243,251 > "122" : { > "//description" : "A crudely-made airlock door.", > "//name" : "cultistairlockbossdoor", > "//shortdescription" : "Cultist Airlock Door", > "imagePositionX" : "-8", > "imagePositionY" : "0", > "object" : "cultistairlockbossdoor", > "tilesetDirection" : "right" > }, 1163a1173,1175 > }, > "122" : { > "image" : "../../../../../tiled/packed/objects/cultistairlockbossdoor.png" tilesets\packed\objects-by-colonytag\peacekeeper.json 7c7 < "tilecount" : 22, --- > "tilecount" : 23, 11c11 < "//description" : "-todo-", --- > "//description" : "An automatic door, typically used in Peacekeeper Stations.", 47c47 < "//description" : "-todo-", --- > "//description" : "Fine furnishings, with a Peacekeeper twist.", 83c83 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 91c91 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 125c125 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 133c133 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 139a140,148 > "22" : { > "//description" : "This wall ornament glows with a bold magenta light.", > "//name" : "neonpeacekeeperemblem", > "//shortdescription" : "Neon Peacekeeper Emblem", > "imagePositionX" : "-16", > "imagePositionY" : "-16", > "object" : "neonpeacekeeperemblem", > "tilesetDirection" : "right" > }, 141c150 < "//description" : "A round desk, made for the Peacekeeper's HQ.", --- > "//description" : "A round desk, typically found in Peacekeeper stations.", 243a253,255 > }, > "22" : { > "image" : "../../../../../tiled/packed/objects/neonpeacekeeperemblem.png" tilesets\packed\objects-by-race\generic.json 8727c8727 < "//description" : "-todo-", --- > "//description" : "An automatic door, typically used in Peacekeeper Stations.", 8763c8763 < "//description" : "A round desk, made for the Peacekeeper's HQ.", --- > "//description" : "A round desk, typically found in Peacekeeper stations.", 8855c8855 < "//description" : "-todo-", --- > "//description" : "Fine furnishings, with a Peacekeeper twist.", 9021c9021 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 9029c9029 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 9212c9212 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", 9220c9220 < "//description" : "-todo-", --- > "//description" : "A store for Peacekeeper supplies.", tilesets\packed\objects-by-race\human.json 7c7 < "tilecount" : 287, --- > "tilecount" : 288, 1792a1793,1801 > "287" : { > "//description" : "A crudely-made airlock door.", > "//name" : "cultistairlockbossdoor", > "//shortdescription" : "Cultist Airlock Door", > "imagePositionX" : "-8", > "imagePositionY" : "0", > "object" : "cultistairlockbossdoor", > "tilesetDirection" : "right" > }, 3095a3105,3107 > }, > "287" : { > "image" : "../../../../../tiled/packed/objects/cultistairlockbossdoor.png" vehicles\dropship\dropship.animation 245c245 < "offset" : [0.0, -3.5], --- > "offset" : [0.125, -3.25], vehicles\modularmech\mechparts_arm.config 1239c1239 < "power" : 285, --- > "power" : 195,