FILES ----- cinematics\peacekeeper\peacekeeper.cinematic [NEW] cinematics\prison\BG.png [NEW] cinematics\prison\BG_1.png [NEW] cinematics\prison\BG_2.png [NEW] cinematics\prison\BG_3.png [NEW] cinematics\prison\esther.frames [NEW] cinematics\prison\esther.png [NEW] cinematics\prison\prison.cinematic dungeons\microdungeons\bounty\minor_spawn.json [NEW] dungeons\microdungeons\bounty\minor_spawn_underground.dungeon [NEW] dungeons\microdungeons\bounty\minor_spawn_underground.json dungeons\space\peacekeeperstation\station5_entrance1.json dungeons\space\peacekeeperstation\station5_entrance2.json dungeons\space\peacekeeperstation\station5_entrance3.json dungeons\space\peacekeeperstation\station5_middle3.json effects\rockettrail.effectsource interface\cockpit\cockpitutil.lua interface\scripted\bountyboard\bountyboardgui.lua interface\scripted\bountyboard\poster_large_7CBAF4.png interface\scripted\bountyboard\poster_large_BCE68A.png interface\scripted\bountyboard\poster_large_C4D993.png interface\scripted\bountyboard\poster_large_F77EC8.png interface\scripted\bountyboard\poster_large_FBBC64.png interface\scripted\bountyboard\poster_large_FBBC65.png interface\scripted\bountyboard\poster_small_7CBAF4.png interface\scripted\bountyboard\poster_small_F77EC8.png interface\scripted\bountyboard\title_1.png interface\scripted\bountyboard\title_10.png interface\scripted\bountyboard\title_11.png interface\scripted\bountyboard\title_12.png interface\scripted\bountyboard\title_13.png interface\scripted\bountyboard\title_2.png interface\scripted\bountyboard\title_3.png interface\scripted\bountyboard\title_4.png interface\scripted\bountyboard\title_5.png interface\scripted\bountyboard\title_6.png interface\scripted\bountyboard\title_7.png interface\scripted\bountyboard\title_8.png interface\scripted\bountyboard\title_9.png items\active\effects\chain.lua [NEW] items\active\weapons\melee\broadsword\gangbroadsword\1.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\10.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\2.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\3.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\4.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\5.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\6.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\7.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\8.png [NEW] items\active\weapons\melee\broadsword\gangbroadsword\9.png [NEW] items\active\weapons\npc\npcgangbroadsword.activeitem items\active\weapons\ranged\gunfire.lua [NEW] items\active\weapons\ranged\unrand\gluesprayer\gluesprayer.png [NEW] items\active\weapons\ranged\unrand\gluesprayer\gluesprayerfullbright.png [NEW] items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.activeitem [NEW] items\active\weapons\ranged\unrand\neolaserlauncher\neolaserlauncher.animation [NEW] items\active\weapons\ranged\unrand\neomagnum\muzzleflash.frames [NEW] items\active\weapons\ranged\unrand\neomagnum\muzzleflash.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum.activeitem [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum.animation [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum1.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum2.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum2fullbright.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum3.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum3fullbright.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum4.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum4fullbright.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum5.png [NEW] items\active\weapons\ranged\unrand\neomagnum\neomagnum5fullbright.png [NEW] items\active\weapons\ranged\unrand\neopistol\neopistol.activeitem [NEW] items\active\weapons\ranged\unrand\neopistol\neopistol.animation [NEW] items\active\weapons\ranged\unrand\neopistol\neopistol.png [NEW] items\active\weapons\ranged\unrand\neopistol\neopistolfullbright.png [NEW] items\active\weapons\ranged\unrand\neopistol\neopistol_l6.png [NEW] items\active\weapons\ranged\unrand\neopistol\neopistol_l6fullbright.png [NEW] items\active\weapons\ranged\unrand\neopistol\npcneopistol.activeitem [NEW] items\active\weapons\ranged\unrand\neoshotgun\muzzleflash.frames [NEW] items\active\weapons\ranged\unrand\neoshotgun\neoshotgun.activeitem [NEW] items\active\weapons\ranged\unrand\neoshotgun\neoshotgun.animation [NEW] items\active\weapons\ranged\unrand\neoshotgun\npcneoshotgun.activeitem [NEW] items\active\weapons\ranged\unrand\neotommygun\bullet.png [NEW] items\active\weapons\ranged\unrand\neotommygun\muzzleflash.frames [NEW] items\active\weapons\ranged\unrand\neotommygun\muzzleflash.png [NEW] items\active\weapons\ranged\unrand\neotommygun\neotommygun.activeitem [NEW] items\active\weapons\ranged\unrand\neotommygun\neotommygun.animation [NEW] items\active\weapons\ranged\unrand\neotommygun\npcneotommygun.activeitem [NEW] items\active\weapons\ranged\unrand\neouzi\neouzi.activeitem [NEW] items\active\weapons\ranged\unrand\neouzi\neouzi.animation [NEW] items\active\weapons\ranged\unrand\neouzi\neouzi.png [NEW] items\active\weapons\ranged\unrand\neouzi\neouzifullbright.png [NEW] items\active\weapons\ranged\unrand\neouzi\neouzi_l6.png [NEW] items\active\weapons\ranged\unrand\neouzi\neouzi_l6fullbright.png [NEW] items\active\weapons\ranged\unrand\neouzi\npcneouzi.activeitem [NEW] items\armors\decorative\costumes\shirt\BSleeve.png [NEW] items\armors\decorative\costumes\shirt\chestf.png [NEW] items\armors\decorative\costumes\shirt\chestm.png [NEW] items\armors\decorative\costumes\shirt\FSleeve.png [NEW] items\armors\decorative\costumes\shirt\icons.png [NEW] items\armors\decorative\costumes\shirt\shirt.chest [NEW] items\armors\decorative\hats\peacekeeper\icons.png [NEW] items\armors\other\peacekeeper\head.png items\armors\other\peacekeeper\Icons.png [NEW] items\armors\other\peacekeeper\mask.png items\armors\other\peacekeeper\peacekeeper.chest [NEW] items\armors\other\peacekeeper\peacekeeper.head items\armors\other\peacekeeper\peacekeeper.legs [NEW] monsters\boss\swansong\noxcapture.animation [NEW] monsters\boss\swansong\noxcapture.frames [NEW] monsters\boss\swansong\noxcapture.lua [NEW] monsters\boss\swansong\noxcapture.monstertype [NEW] monsters\boss\swansong\noxcapture.png monsters\boss\swansong\swansong.animation monsters\boss\swansong\swansong.lua monsters\boss\swansong\swansong.monstertype [NEW] monsters\boss\swansong\particles\orangeshrapnel1.particle [NEW] monsters\boss\swansong\particles\orangeshrapnel1.png [NEW] monsters\boss\swansong\particles\orangeshrapnel2.particle [NEW] monsters\boss\swansong\particles\orangeshrapnel2.png [NEW] monsters\boss\swansong\particles\orangeshrapnel3.particle [NEW] monsters\boss\swansong\particles\orangeshrapnel3.png [NEW] monsters\boss\swansong\particles\orangeshrapnel4.particle [NEW] monsters\boss\swansong\particles\orangeshrapnel4.png [NEW] monsters\boss\swansong\particles\shrapnel1.particle [NEW] monsters\boss\swansong\particles\shrapnel1.png [NEW] monsters\boss\swansong\particles\shrapnel2.particle [NEW] monsters\boss\swansong\particles\shrapnel2.png [NEW] monsters\boss\swansong\particles\shrapnel3.particle [NEW] monsters\boss\swansong\particles\shrapnel3.png [NEW] monsters\boss\swansong\particles\shrapnel4.particle [NEW] monsters\boss\swansong\particles\shrapnel4.png [NEW] monsters\boss\swansong\particles\shrapnel5.particle [NEW] monsters\boss\swansong\particles\shrapnel5.png [NEW] monsters\ghosts\peacekeeperdrone\peacekeeperdrone.png [NEW] monsters\ghosts\peacekeeperdrone\peacekeeperdronelit.png [NEW] music\housecleaning.ogg npcs\friendlyguard.npctype npcs\bounty\bountytarget.npctype npcs\bounty\gangmember.npctype npcs\space\peacekeepervillager.npctype npcs\tenants\chefmerchanttenant.npctype [NEW] npcs\tenants\office.npctype [NEW] npcs\tenants\peacekeepertenant.npctype objects\cultist\cultistairlockdoor\cultistairlockdoor.png objects\cultist\cultistairlockhatch\cultistairlockhatchicon.png objects\human\bunkerdesk\bunkerdeskleft.png objects\human\bunkerdesk\bunkerdeskright.png objects\office\officecomputer\officecomputer.object objects\office\officedesk\officedesk.object objects\office\officelamp\officelamp.object objects\office\officenoticeboard\officenoticeboard.object objects\office\officescanner\officescanner.object objects\office\officeserver\officeserver.object objects\office\officestapler\officestapler.object objects\office\officetable\officetable.object objects\outpost\outpostpeacekeeperposter\outpostpeacekeeperposter.object objects\space\industrialbed\industrialbedcover.png objects\themed\egyptian\egyptianbed\egyptianbed.object objects\themed\egyptian\egyptianchair\egyptianchair.object objects\themed\egyptian\egyptiancrest\egyptiancrest.object objects\themed\egyptian\egyptianpillar\egyptianpillar.object objects\themed\egyptian\egyptianstatuette\egyptianstatuette.object objects\themed\egyptian\egyptiantable\egyptiantable.object particles\tinyrockettrail.particle projectiles\boss\swansong\swansongdashswoosh\swansongdashswoosh.png projectiles\boss\swansong\swansongrocket\swansongrocket.lua projectiles\boss\swansong\swansongslashswoosh\swansongslashswoosh.png projectiles\boss\swansong\swansongslashswoosh\swansongslashswoosh.projectile [NEW] projectiles\guns\bullets\neomagnumbullet\icon.png [NEW] projectiles\guns\bullets\neomagnumbullet\neomagnumbullet.frames [NEW] projectiles\guns\bullets\neomagnumbullet\neomagnumbullet.png [NEW] projectiles\guns\bullets\neomagnumbullet\neomagnumbullet.projectile [NEW] projectiles\guns\bullets\neoshotgunbullet\icon.png [NEW] projectiles\guns\bullets\neoshotgunbullet\neoshotgunbullet.frames [NEW] projectiles\guns\bullets\neoshotgunbullet\neoshotgunbullet.png [NEW] projectiles\guns\bullets\neoshotgunbullet\neoshotgunbullet.projectile [NEW] projectiles\guns\bullets\neotommygunbullet\icon.png [NEW] projectiles\guns\bullets\neotommygunbullet\neotommygunbullet.frames [NEW] projectiles\guns\bullets\neotommygunbullet\neotommygunbullet.png [NEW] projectiles\guns\bullets\neotommygunbullet\neotommygunbullet.projectile [NEW] projectiles\npcs\dronecannon\dronecannon.frames [NEW] projectiles\npcs\dronecannon\dronecannon.png [NEW] projectiles\npcs\dronecannon\dronecannon.projectile [NEW] projectiles\npcs\dronecannon\dronecannonflame.frames [NEW] projectiles\npcs\dronecannon\dronecannonflame.png [NEW] projectiles\npcs\dronecannon\dronecannonflame.projectile [NEW] projectiles\npcs\dronecannon\icon.png projectiles\npcs\pulsecannon\pulsecannon.projectile quests\bounty\bounty.lua quests\bounty\clue_items.config quests\bounty\clue_objects.config quests\bounty\cultist_mission1.questtemplate quests\bounty\generator.config [NEW] recipes\peacekeeperstore\peacekeeperhead.recipe [NEW] recipes\peacekeeperstore\riotshield.recipe scripts\bountygeneration.lua stats\effects\capturebeamout\capturebeamout.animation stats\effects\capturebeamout\capturebeamout.lua stats\effects\capturebeamout\capturebeamout.statuseffect stats\effects\doomed\l6doomed.statuseffect [NEW] tenants\other\office.tenant [NEW] tenants\other\peacekeepertenant.tenant treasure\common.treasurepools DIFFS ----- cinematics\peacekeeper\peacekeeper.cinematic 32c32 < "timecode" : 36, --- > "timecode" : 40, 36c36 < "timecode" : 36.5, --- > "timecode" : 40.5, 86c86 < "timecode" : 36, --- > "timecode" : 40, 91c91 < "timecode" : 36.5, --- > "timecode" : 40.5, 136c136 < "endTime" : 10.0, --- > "endTime" : 7.5, 173,174c173,174 < "startTime" : 10.0, < "endTime" : 18.0, --- > "startTime" : 7.5, > "endTime" : 15.0, 201c201 < "timecode" : 2.5, --- > "timecode" : 3.3, 210c210 < "startTime" : 18.0, --- > "startTime" : 15.0, 275c275 < "timecode" : 2.5, --- > "timecode" : 2, 285c285 < "endTime" : 40.0, --- > "endTime" : 42.0, 312c312 < "timecode" : 2.5, --- > "timecode" : 2, 313a314,323 > "textPercentage" : 0.65 > }, > { > "timecode" : 4, > "frame" : 12, > "textPercentage" : 0.65 > }, > { > "timecode" : 4.75, > "frame" : 18, 321,322c331,332 < "startTime" : 40.0, < "endTime" : 48.0, --- > "startTime" : 42.0, > "endTime" : 50.0, 349c359 < "timecode" : 2.5, --- > "timecode" : 3.5, 359,360c369,370 < "startTime" : 38, < "endTime" : 70, --- > "startTime" : 42, > "endTime" : 76, 380c390 < "timecode" : 30, --- > "timecode" : 28, 384c394 < "timecode" : 32, --- > "timecode" : 30, 393,394c403,404 < "startTime" : 48.0, < "endTime" : 56.0, --- > "startTime" : 50.0, > "endTime" : 57.0, 421c431 < "timecode" : 2.5, --- > "timecode" : 3.5, 430,431c440,441 < "startTime" : 56, < "endTime" : 70, --- > "startTime" : 57, > "endTime" : 78, 469c479 < "startTime" : 56.0, --- > "startTime" : 57.0, 497c507 < "timecode" : 3, --- > "timecode" : 4, 535c545 < "timecode" : 2.5, --- > "timecode" : 3.5, 545c555 < "endTime" : 83, --- > "endTime" : 90, 564c574 < "timecode" : 36, --- > "timecode" : 30, 568c578 < "timecode" : 36.5, --- > "timecode" : 32, 638c648 < "timecode" : 2.5, --- > "timecode" : 3, 676c686 < "timecode" : 2.5, --- > "timecode" : 3.5, 695,696c705,706 < "timecode" : 10.25, < "endTimecode" : 12.5, --- > "timecode" : 7.75, > "endTimecode" : 10.75, 701,702c711,712 < "timecode" : 18.25, < "endTimecode" : 20, --- > "timecode" : 15.25, > "endTimecode" : 17, 708c718 < "endTimecode" : 26.5, --- > "endTimecode" : 26, 714c724,730 < "endTimecode" : 32.5, --- > "endTimecode" : 32, > "loops" : -1, > "resource" : "/sfx/interface/aichatter1_loop.ogg" > }, > { > "timecode" : 34, > "endTimecode" : 34.7, 719,720c735,736 < "timecode" : 40.25, < "endTimecode" : 42.5, --- > "timecode" : 42.25, > "endTimecode" : 45.25, 725,726c741,742 < "timecode" : 48.25, < "endTimecode" : 50.5, --- > "timecode" : 50.25, > "endTimecode" : 53.5, 731,732c747,748 < "timecode" : 56.25, < "endTimecode" : 58.75, --- > "timecode" : 57.25, > "endTimecode" : 60.5, 738c754 < "endTimecode" : 67.5, --- > "endTimecode" : 68.5, 744c760 < "endTimecode" : 75.5, --- > "endTimecode" : 76, 750c766 < "endTimecode" : 85.5, --- > "endTimecode" : 86.5, 776c792 < "resource" : "/music/i-was-the-sun.ogg" --- > "resource" : "/music/housecleaning.ogg" dungeons\microdungeons\bounty\minor_spawn.json [TMX file differences are left out for huge size.] dungeons\space\peacekeeperstation\station5_entrance1.json [TMX file differences are left out for huge size.] dungeons\space\peacekeeperstation\station5_entrance2.json [TMX file differences are left out for huge size.] dungeons\space\peacekeeperstation\station5_entrance3.json [TMX file differences are left out for huge size.] dungeons\space\peacekeeperstation\station5_middle3.json [TMX file differences are left out for huge size.] effects\rockettrail.effectsource 4c4 < "duration" : 0.03, --- > "duration" : 0.06, interface\cockpit\cockpitutil.lua 39,40c39,42 < objectOrbits[uuid] = object.orbit < table.insert(locations, {"object", uuid}) --- > if object.orbit then > objectPositions[uuid] = celestial.orbitPosition(object.orbit) > table.insert(locations, {"object", uuid}) > end interface\scripted\bountyboard\bountyboardgui.lua 284a285,287 > if be.cinematic then > self.triggerCinematic = be.cinematic > end 302c305 < if newRankPoints > 0 and playerRank < #self.bountyRanks then --- > if newRankPoints > 0 then 667a671,674 > if self.triggerCinematic then > player.playCinematic(self.triggerCinematic) > self.triggerCinematic = nil > end items\active\effects\chain.lua 5a6 > localAnimator.clearLightSources() 110c111,112 < --- > > local segmentPos = vec2.add(currentBaseOffset, thisOffset) 116c118 < position = vec2.add(currentBaseOffset, thisOffset), --- > position = segmentPos, 120a123,128 > if chain.light then > localAnimator.addLightSource({ > position = segmentPos, > color = chain.light, > }) > end items\active\weapons\ranged\gunfire.lua 1,148c1,148 < require "/scripts/util.lua" < require "/scripts/interp.lua" < < -- Base gun fire ability < GunFire = WeaponAbility:new() < < function GunFire:init() < self.weapon:setStance(self.stances.idle) < < self.cooldownTimer = self.fireTime < < self.weapon.onLeaveAbility = function() < self.weapon:setStance(self.stances.idle) < end < end < < function GunFire:update(dt, fireMode, shiftHeld) < WeaponAbility.update(self, dt, fireMode, shiftHeld) < < self.cooldownTimer = math.max(0, self.cooldownTimer - self.dt) < < if animator.animationState("firing") ~= "fire" then < animator.setLightActive("muzzleFlash", false) < end < < if self.fireMode == (self.activatingFireMode or self.abilitySlot) < and not self.weapon.currentAbility < and self.cooldownTimer == 0 < and not status.resourceLocked("energy") < and not world.lineTileCollision(mcontroller.position(), self:firePosition()) then < < if self.fireType == "auto" and status.overConsumeResource("energy", self:energyPerShot()) then < self:setState(self.auto) < elseif self.fireType == "burst" then < self:setState(self.burst) < end < end < end < < function GunFire:auto() < self.weapon:setStance(self.stances.fire) < < self:fireProjectile() < self:muzzleFlash() < < if self.stances.fire.duration then < util.wait(self.stances.fire.duration) < end < < self.cooldownTimer = self.fireTime < self:setState(self.cooldown) < end < < function GunFire:burst() < self.weapon:setStance(self.stances.fire) < < local shots = self.burstCount < while shots > 0 and status.overConsumeResource("energy", self:energyPerShot()) do < self:fireProjectile() < self:muzzleFlash() < shots = shots - 1 < < self.weapon.relativeWeaponRotation = util.toRadians(interp.linear(1 - shots / self.burstCount, 0, self.stances.fire.weaponRotation)) < self.weapon.relativeArmRotation = util.toRadians(interp.linear(1 - shots / self.burstCount, 0, self.stances.fire.armRotation)) < < util.wait(self.burstTime) < end < < self.cooldownTimer = (self.fireTime - self.burstTime) * self.burstCount < end < < function GunFire:cooldown() < self.weapon:setStance(self.stances.cooldown) < self.weapon:updateAim() < < local progress = 0 < util.wait(self.stances.cooldown.duration, function() < local from = self.stances.cooldown.weaponOffset or {0,0} < local to = self.stances.idle.weaponOffset or {0,0} < self.weapon.weaponOffset = {interp.linear(progress, from[1], to[1]), interp.linear(progress, from[2], to[2])} < < self.weapon.relativeWeaponRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.weaponRotation, self.stances.idle.weaponRotation)) < self.weapon.relativeArmRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.armRotation, self.stances.idle.armRotation)) < < progress = math.min(1.0, progress + (self.dt / self.stances.cooldown.duration)) < end) < end < < function GunFire:muzzleFlash() < animator.setPartTag("muzzleFlash", "variant", math.random(1, 3)) < animator.setAnimationState("firing", "fire") < animator.burstParticleEmitter("muzzleFlash") < animator.playSound("fire") < < animator.setLightActive("muzzleFlash", true) < end < < function GunFire:fireProjectile(projectileType, projectileParams, inaccuracy, firePosition, projectileCount) < local params = sb.jsonMerge(self.projectileParameters, projectileParams or {}) < params.power = self:damagePerShot() < params.powerMultiplier = activeItem.ownerPowerMultiplier() < params.speed = util.randomInRange(params.speed) < < if not projectileType then < projectileType = self.projectileType < end < if type(projectileType) == "table" then < projectileType = projectileType[math.random(#projectileType)] < end < < local projectileId = 0 < for i = 1, (projectileCount or self.projectileCount) do < if params.timeToLive then < params.timeToLive = util.randomInRange(params.timeToLive) < end < < projectileId = world.spawnProjectile( < projectileType, < firePosition or self:firePosition(), < activeItem.ownerEntityId(), < self:aimVector(inaccuracy or self.inaccuracy), < false, < params < ) < end < return projectileId < end < < function GunFire:firePosition() < return vec2.add(mcontroller.position(), activeItem.handPosition(self.weapon.muzzleOffset)) < end < < function GunFire:aimVector(inaccuracy) < local aimVector = vec2.rotate({1, 0}, self.weapon.aimAngle + sb.nrand(inaccuracy, 0)) < aimVector[1] = aimVector[1] * mcontroller.facingDirection() < return aimVector < end < < function GunFire:energyPerShot() < return self.energyUsage * self.fireTime * (self.energyUsageMultiplier or 1.0) < end < < function GunFire:damagePerShot() < return (self.baseDamage or (self.baseDps * self.fireTime)) * (self.baseDamageMultiplier or 1.0) * config.getParameter("damageLevelMultiplier") / self.projectileCount < end < < function GunFire:uninit() < end --- > require "/scripts/util.lua" > require "/scripts/interp.lua" > > -- Base gun fire ability > GunFire = WeaponAbility:new() > > function GunFire:init() > self.weapon:setStance(self.stances.idle) > > self.cooldownTimer = self.fireTime > > self.weapon.onLeaveAbility = function() > self.weapon:setStance(self.stances.idle) > end > end > > function GunFire:update(dt, fireMode, shiftHeld) > WeaponAbility.update(self, dt, fireMode, shiftHeld) > > self.cooldownTimer = math.max(0, self.cooldownTimer - self.dt) > > if animator.animationState("firing") ~= "fire" then > animator.setLightActive("muzzleFlash", false) > end > > if self.fireMode == (self.activatingFireMode or self.abilitySlot) > and not self.weapon.currentAbility > and self.cooldownTimer == 0 > and not status.resourceLocked("energy") > and not world.lineTileCollision(mcontroller.position(), self:firePosition()) then > > if self.fireType == "auto" and status.overConsumeResource("energy", self:energyPerShot()) then > self:setState(self.auto) > elseif self.fireType == "burst" then > self:setState(self.burst) > end > end > end > > function GunFire:auto() > self.weapon:setStance(self.stances.fire) > > self:fireProjectile() > self:muzzleFlash() > > if self.stances.fire.duration then > util.wait(self.stances.fire.duration) > end > > self.cooldownTimer = self.fireTime > self:setState(self.cooldown) > end > > function GunFire:burst() > self.weapon:setStance(self.stances.fire) > > local shots = self.burstCount > while shots > 0 and status.overConsumeResource("energy", self:energyPerShot()) do > self:fireProjectile() > self:muzzleFlash() > shots = shots - 1 > > self.weapon.relativeWeaponRotation = util.toRadians(interp.linear(1 - shots / self.burstCount, 0, self.stances.fire.weaponRotation)) > self.weapon.relativeArmRotation = util.toRadians(interp.linear(1 - shots / self.burstCount, 0, self.stances.fire.armRotation)) > > util.wait(self.burstTime) > end > > self.cooldownTimer = (self.fireTime - self.burstTime) * self.burstCount > end > > function GunFire:cooldown() > self.weapon:setStance(self.stances.cooldown) > self.weapon:updateAim() > > local progress = 0 > util.wait(self.stances.cooldown.duration, function() > local from = self.stances.cooldown.weaponOffset or {0,0} > local to = self.stances.idle.weaponOffset or {0,0} > self.weapon.weaponOffset = {interp.linear(progress, from[1], to[1]), interp.linear(progress, from[2], to[2])} > > self.weapon.relativeWeaponRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.weaponRotation, self.stances.idle.weaponRotation)) > self.weapon.relativeArmRotation = util.toRadians(interp.linear(progress, self.stances.cooldown.armRotation, self.stances.idle.armRotation)) > > progress = math.min(1.0, progress + (self.dt / self.stances.cooldown.duration)) > end) > end > > function GunFire:muzzleFlash() > animator.setPartTag("muzzleFlash", "variant", math.random(1, self.muzzleFlashVariants or 3)) > animator.setAnimationState("firing", "fire") > animator.burstParticleEmitter("muzzleFlash") > animator.playSound("fire") > > animator.setLightActive("muzzleFlash", true) > end > > function GunFire:fireProjectile(projectileType, projectileParams, inaccuracy, firePosition, projectileCount) > local params = sb.jsonMerge(self.projectileParameters, projectileParams or {}) > params.power = self:damagePerShot() > params.powerMultiplier = activeItem.ownerPowerMultiplier() > params.speed = util.randomInRange(params.speed) > > if not projectileType then > projectileType = self.projectileType > end > if type(projectileType) == "table" then > projectileType = projectileType[math.random(#projectileType)] > end > > local projectileId = 0 > for i = 1, (projectileCount or self.projectileCount) do > if params.timeToLive then > params.timeToLive = util.randomInRange(params.timeToLive) > end > > projectileId = world.spawnProjectile( > projectileType, > firePosition or self:firePosition(), > activeItem.ownerEntityId(), > self:aimVector(inaccuracy or self.inaccuracy), > false, > params > ) > end > return projectileId > end > > function GunFire:firePosition() > return vec2.add(mcontroller.position(), activeItem.handPosition(self.weapon.muzzleOffset)) > end > > function GunFire:aimVector(inaccuracy) > local aimVector = vec2.rotate({1, 0}, self.weapon.aimAngle + sb.nrand(inaccuracy, 0)) > aimVector[1] = aimVector[1] * mcontroller.facingDirection() > return aimVector > end > > function GunFire:energyPerShot() > return self.energyUsage * self.fireTime * (self.energyUsageMultiplier or 1.0) > end > > function GunFire:damagePerShot() > return (self.baseDamage or (self.baseDps * self.fireTime)) * (self.baseDamageMultiplier or 1.0) * config.getParameter("damageLevelMultiplier") / self.projectileCount > end > > function GunFire:uninit() > end items\armors\other\peacekeeper\peacekeeper.chest 8c8 < "description" : "Standard issue uniform for all members of the Terrene peacekeeper.", --- > "description" : "Standard issue uniform for all Peacekeepers.", items\armors\other\peacekeeper\peacekeeper.legs 8c8 < "description" : "Standard issue uniform for all members of the Terrene peacekeeper.", --- > "description" : "Standard issue uniform for all Peacekeepers.", monsters\boss\swansong\swansong.animation 676a677 > "anchorPart" : "body", 691a693,703 > {"particle" : "shrapnel1", "count" : 5}, > {"particle" : "shrapnel2", "count" : 5}, > {"particle" : "shrapnel3", "count" : 5}, > {"particle" : "shrapnel4", "count" : 5}, > {"particle" : "shrapnel5", "count" : 5} > ] > }, > "lhburst" : { > "offsetRegion" : [-1.0, 1.0, 1.0, 3.0], > "anchorPart" : "lefthand", > "particles" : [ 694,739c706,709 < "type" : "textured", < "image" : "/monsters/boss/swansong/shrapnel1.png", < "initialVelocity" : [0.0, 0.0], < "finalVelocity" : [0.0, 0.0], < "approach" : [10, 10], < "timeToLive" : 2.0, < "layer" : "middle", < "collidesForeground" : true, < "variance" : { < "initialVelocity" : [20, 20], < "rotation" : 180, < "angularVelocity" : 180, < "timeToLive" : 1.0 < } < }, < "count" : 5 < }, < { < "particle" : { < "type" : "textured", < "image" : "/monsters/boss/swansong/shrapnel2.png", < "initialVelocity" : [0.0, 0.0], < "finalVelocity" : [0.0, 0.0], < "approach" : [10, 10], < "timeToLive" : 2.0, < "layer" : "middle", < "collidesForeground" : true, < "variance" : { < "initialVelocity" : [20, 20], < "rotation" : 180, < "angularVelocity" : 180, < "timeToLive" : 1.0 < } < }, < "count" : 5 < }, < { < "particle" : { < "type" : "textured", < "image" : "/monsters/boss/swansong/shrapnel3.png", < "initialVelocity" : [0.0, 0.0], < "finalVelocity" : [0.0, 0.0], < "approach" : [10, 10], < "timeToLive" : 2.0, < "layer" : "middle", < "collidesForeground" : true, --- > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "approach" : [0.5, 0.5], > "timeToLive" : 0.85, 741,744c711,712 < "initialVelocity" : [20, 20], < "rotation" : 180, < "angularVelocity" : 180, < "timeToLive" : 1.0 --- > "initialVelocity" : [1, 1], > "rotation" : 180 747c715 < "count" : 5 --- > "count" : 10 748a717,727 > {"particle" : "shrapnel1", "count" : 2}, > {"particle" : "shrapnel2", "count" : 2}, > {"particle" : "shrapnel3", "count" : 2}, > {"particle" : "shrapnel4", "count" : 2}, > {"particle" : "shrapnel5", "count" : 2} > ] > }, > "rhburst" : { > "offsetRegion" : [-1.0, -1.0, 1.0, 1.0], > "anchorPart" : "righthand", > "particles" : [ 751,758c730,733 < "type" : "textured", < "image" : "/monsters/boss/swansong/shrapnel4.png", < "initialVelocity" : [0.0, 0.0], < "finalVelocity" : [0.0, 0.0], < "approach" : [10, 10], < "timeToLive" : 2.0, < "layer" : "middle", < "collidesForeground" : true, --- > "type" : "animated", > "animation" : "/animations/dust2/dust2.animation", > "approach" : [0.5, 0.5], > "timeToLive" : 0.85, 760,763c735,736 < "initialVelocity" : [20, 20], < "rotation" : 180, < "angularVelocity" : 180, < "timeToLive" : 1.0 --- > "initialVelocity" : [1, 1], > "rotation" : 180 766c739 < "count" : 5 --- > "count" : 10 767a741,752 > {"particle" : "shrapnel1", "count" : 2}, > {"particle" : "shrapnel2", "count" : 2}, > {"particle" : "shrapnel3", "count" : 2}, > {"particle" : "shrapnel4", "count" : 2}, > {"particle" : "shrapnel5", "count" : 2} > ] > }, > "smoke" : { > "offsetRegion" : [-1.5, -3.0, 1.5, 3.0], > "emissionRate" : 10.0, > "anchorPart" : "body", > "particles" : [ 770,775c755,759 < "type" : "textured", < "image" : "/monsters/boss/swansong/shrapnel5.png", < "initialVelocity" : [0.0, 0.0], < "finalVelocity" : [0.0, 0.0], < "approach" : [10, 10], < "timeToLive" : 2.0, --- > "type" : "animated", > "animation" : "/animations/dusttest/dusttest.animation", > "approach" : [5.0, 5.0], > "finalVelocity" : [0.0, 5.0], > "timeToLive" : 0.85, 777d760 < "collidesForeground" : true, 779,782c762,764 < "initialVelocity" : [20, 20], < "rotation" : 180, < "angularVelocity" : 180, < "timeToLive" : 1.0 --- > "position" : [2.0, 2.0], > "initialVelocity" : [1, 1], > "rotation" : 180 784,785c766 < }, < "count" : 5 --- > } 786a768,777 > ] > }, > "deathBurst" : { > "offsetRegion" : [-1.5, -3.0, 1.5, 3.0], > "anchorPart" : "body", > "particles" : [ > {"particle" : "orangeshrapnel1", "count" : 8}, > {"particle" : "orangeshrapnel2", "count" : 8}, > {"particle" : "orangeshrapnel3", "count" : 8}, > {"particle" : "orangeshrapnel4", "count" : 8} monsters\boss\swansong\swansong.lua 124,126c124 < for _,playerId in ipairs(world.players()) do < world.sendEntityMessage(playerId, "swansongDead") < end --- > world.spawnMonster("noxcapture", mcontroller.position()) 261a260,271 > -- predicts the direction the target will be in in `time` seconds > -- trackRange optionally gives an optimal range for the prediction > function anglePrediction(targetId, time, trackRange) > local targetVelocity = world.entityVelocity(targetId) > local toTarget = world.distance(world.entityPosition(targetId), mcontroller.position()) > > local trackRange = trackRange or vec2.mag(toTarget) > local perpendicular = vec2.rotate(vec2.norm(toTarget), math.pi / 2) > local angularVel = vec2.dot(perpendicular, vec2.norm(targetVelocity)) * (vec2.mag(targetVelocity) / trackRange) > return vec2.angle(toTarget) + angularVel * time > end > 294c304,313 < await(spawnAnimation()) --- > await(select( > spawnAnimation(), > function() > while true do > status.addEphemeralEffect("invulnerable") > coroutine.yield() > end > end > )) > status.removeEphemeralEffect("invulnerable") 296a316,318 > status.setResourcePercentage("health", 1.0) > await(delay(1.0)) > 315a338,339 > monster.setDamageOnTouch(true) > 351c375 < --- > 355c379 < --- > 357d380 < self.shouldDie = true 362a386,438 > > resetAttacks() > > self.lefthand.lock, self.righthand.lock, self.body.lock = true, true, true > animator.burstParticleEmitter("burst") > animator.setParticleEmitterActive("shock", true) > animator.setParticleEmitterActive("smoke", true) > > await(delay(2.0)) > > await(blinkDash(storage.spawnPosition, 0.0, {body = "final", wings = "broken", lefthand = "idle", righthand = "idle"})) > > await(select( > function() > while true do > mcontroller.controlApproachVelocity({0.0, -50.0}, 2) > coroutine.yield() > end > end, > function() > await(join( > moveLeftHand(self.lhorig.anchor, self.lhorig.angle, self.lhorig.distance, 0.2), > moveRightHand(self.rhorig.anchor, self.rhorig.angle, self.rhorig.distance, 0.2) > )) > > while true do > self.lefthand.angle = util.lerp(0.025, self.lefthand.angle, util.toRadians(90)) > self.righthand.angle = util.lerp(0.025, self.righthand.angle, util.toRadians(90)) > self.body.angle = util.lerp(0.025, self.body.angle, util.toRadians(-70)) > coroutine.yield() > end > end, > function() > await(delay(2.5)) > animator.burstParticleEmitter("rhburst") > animator.setAnimationState("righthand", "invisible") > > await(delay(0.5)) > animator.burstParticleEmitter("lhburst") > animator.setAnimationState("lefthand", "invisible") > > await(delay(1.5)) > animator.burstParticleEmitter("burst") > animator.burstParticleEmitter("deathBurst") > animator.setAnimationState("body", "invisible") > animator.setAnimationState("wings", "invisible") > animator.setParticleEmitterActive("shock", false) > animator.setParticleEmitterActive("smoke", false) > world.setDungeonGravity(0, 50) > self.shouldDie = true > end > )) > 512,513c588 < -- resets the boss back to its original idle state < resetBoss = async(function() --- > function resetAttacks() 529a605,607 > > animator.setAnimationState("chargeswoosh", "inactive") > end 530a609,612 > -- resets the boss back to its original idle state > resetBoss = async(function() > resetAttacks() > monster.setDamageOnTouch(false) 551d632 < animator.setAnimationState("chargeswoosh", "inactive") 568a650,662 > await(delay(2.0)) > > local dialog = config.getParameter("openingDialog") > local dialogTime = config.getParameter("dialogTime") > local portrait = config.getParameter("chatPortrait") > local waitTime = dialogTime / #dialog - 1 > for i, line in ipairs(dialog) do > monster.sayPortrait(line, portrait) > if i < #dialog then > await(delay(waitTime)) > end > end > 861c955 < targetAngle = vec2.angle(toTarget) --- > targetAngle = anglePrediction(self.target, 1.0, 35) 1136,1148d1229 < trackingHandBeam = async(function(hand) < local targetVelocity = world.entityVelocity(self.target) < local toTarget = world.distance(world.entityPosition(self.target), mcontroller.position()) < < -- get the angular velocity for the target at a projected trackRange < -- if the target is at a lower range they can outrun the motion prediction < local trackRange = 35 < local perpendicular = vec2.rotate(vec2.norm(toTarget), math.pi / 2) < local angularVel = vec2.dot(perpendicular, vec2.norm(targetVelocity)) * (vec2.mag(targetVelocity) / trackRange) < < await(handBeam(hand, vec2.angle(toTarget) + angularVel * 1.0, setDamagePartActive)) < end) < 1164c1245 < await(trackingHandBeam("left")) --- > await(handBeam("left", anglePrediction(self.target, 1.0, 35), setDamagePartActive)) 1170c1251 < await(trackingHandBeam("right")) --- > await(handBeam("right", anglePrediction(self.target, 1.0, 35), setDamagePartActive)) monsters\boss\swansong\swansong.monstertype 19a20,29 > > > "dialogTime" : 28.0, > "chatPortrait" : "/interface/chatbubbles/nox.png", > "openingDialog" : [ > "I knew you'd come. We have unfinished business, after all.", > "What do I have left to fight for? My quest failed... My ideology was weak.", > "And yet I'm too ashamed to give myself up, and I'm too stubborn to die.", > "So... Care for one last dance, \"Protector\"?" > ], 169,170c179,181 < "poly" : [ [-5, -13.5], [5, -13.5], [5, 5], [-5, 5] ], < "damage" : 20, --- > "poly" : [ [2, 4], [2, -4], [-2, -4], [-2, 4] ], > "damage" : 10, > "knockback" : 50, 251c262 < "mouthOffset" : [0, 0], --- > "mouthOffset" : [4, 4], npcs\friendlyguard.npctype 102,103c102,103 < // -todo < "There is virtue in living to protect others." --- > "Howdy there!", > "Howdy!" npcs\bounty\bountytarget.npctype 71,75c71,72 < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcneoshotgun", > "npcneotommygun" 83,93c80,81 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcneoshotgun", > "npcneotommygun" 101,111c89,90 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcneoshotgun", > "npcneotommygun" 122,132c101,102 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcneoshotgun", > "npcneotommygun" 143,153c113,114 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcneoshotgun", > "npcneotommygun" npcs\bounty\gangmember.npctype 26,36c26,27 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcgangbroadsword", > "npcneopistol" 44,54c35,36 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcgangbroadsword", > "npcneopistol" 62,72c44,47 < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcgangbroadsword", > "npcgangbroadsword", > "npcneopistol", > "npcneouzi" 80,93c55,58 < "npcpetcapturepod" < ], < "sheathedprimary" : [ < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcgangbroadsword", > "npcgangbroadsword", > "npcneopistol", > "npcneouzi" 101,114c66,69 < "npcpetcapturepod" < ], < "sheathedprimary" : [ < "npcdagger", < "npcaxe", < "npcshortsword", < "npcbroadsword", < "npchammer", < "npcspear", < "npcassaultrifle", < "npcpistol", < "npcmachinepistol", < "npcshotgun", < "npcsniperrifle" --- > "npcgangbroadsword", > "npcgangbroadsword", > "npcneopistol", > "npcneouzi" npcs\space\peacekeepervillager.npctype 26a27,45 > }, > { > "chest" : [ { "name" : "peacekeeperchest", "parameters" : { "colorIndex" : [0] } } ], > "legs" : [ { "name" : "peacekeeperpants", "parameters" : { "colorIndex" : [0] } } ], > "primary" : [ "" ], > "sheathedprimary" : [ "npcpistol" ] > }, > { > "chest" : [ { "name" : "peacekeeperchest", "parameters" : { "colorIndex" : [0] } } ], > "legs" : [ { "name" : "peacekeeperpants", "parameters" : { "colorIndex" : [0] } } ], > "primary" : [ "" ], > "sheathedprimary" : [ "npcpistol" ] > }, > { > "head" : [ { "name" : "peacekeeperhead", "parameters" : { "colorIndex" : [0] } } ], > "chest" : [ { "name" : "peacekeeperchest", "parameters" : { "colorIndex" : [0] } } ], > "legs" : [ { "name" : "peacekeeperpants", "parameters" : { "colorIndex" : [0] } } ], > "primary" : [ "" ], > "sheathedprimary" : [ "npcpistol" ] npcs\tenants\chefmerchanttenant.npctype 3a4 > "dropPools" : [], objects\office\officecomputer\officecomputer.object 5c5 < "description" : "-todo-", --- > "description" : "An early-model personal computer from Earth.", 19,25c19,25 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "Hard to believe this old computer is still working.", > "avianDescription" : "Looks like an early model Earth computer.", > "floranDescription" : "This old machine is ssstill running sssomehow.", > "glitchDescription" : "Amused. Early computer processors required extremely large housings.", > "humanDescription" : "It's hard to believe humans once spent hours starting at machines like this.", > "hylotlDescription" : "The design is very basic, but it's a real historical artifact.", > "novakidDescription" : "Wonder if there's any card games on this ol' machine.", 82c82 < "preciseStandPositionLeft" : [-0.5, 0.0], --- > "preciseStandPositionLeft" : [-1.5, 0.0], objects\office\officedesk\officedesk.object 7c7 < "description" : "-todo-", --- > "description" : "A simple desk made from wood and metal.", 14,20c14,20 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "A plain metal desk with a wood surface.", > "avianDescription" : "A very plain looking metal desk.", > "floranDescription" : "A desssk made of wood and metal.", > "glitchDescription" : "Unimpressed. This desk has a very basic design.", > "humanDescription" : "A basic desk, looks like it belongs in an office.", > "hylotlDescription" : "This desk isn't pretty, but it's functional.", > "novakidDescription" : "Just an 'ol desk with a couple metal drawers.", objects\office\officelamp\officelamp.object 8c8 < "description" : "-todo-", --- > "description" : "A small lamp with an adjustable head.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This small lamp is very solidly made.", > "avianDescription" : "This lamp is made to sit on a desk.", > "floranDescription" : "Sssmall light can be placed anywhere.", > "glitchDescription" : "Interested. This small lamp can be pointed in any direction.", > "humanDescription" : "A small lamp designed to be placed on a desk.", > "hylotlDescription" : "This reading lamp is simple but works very well.", > "novakidDescription" : "Just a small lamp for readin'.", objects\office\officenoticeboard\officenoticeboard.object 3c3 < "colonyTags" : ["office","pretty"], --- > "colonyTags" : ["office"], 9c9 < "description" : "-todo-", --- > "description" : "A hanging board with papers tacked on it.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "There are various small bits of information attached to this board.", > "avianDescription" : "A board filled with seemingly unimportant information.", > "floranDescription" : "A board filled with coloured papersss.", > "glitchDescription" : "Confused. There are scattered pieces of information on this board, it may have been important to someone.", > "humanDescription" : "This looks like a good place to post a reminder.", > "hylotlDescription" : "The arrangement of these papers looks almost artistic.", > "novakidDescription" : "Looks t'me like a notice board.", objects\office\officescanner\officescanner.object 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This machine says multi-function, but I don't understand what it does.", > "avianDescription" : "This large machine must be very powerful - it says all-in-one.", > "floranDescription" : "Big machine makesss funny noisesss.", > "glitchDescription" : "Fascinated. This machine has ports designed to connect to an ancient human communication network.", > "humanDescription" : "The display on this machine says paper jam.", > "hylotlDescription" : "There are so many buttons on this machine!", > "novakidDescription" : "This thing looks complicated - I can't figure out what it's all about.", objects\office\officeserver\officeserver.object 3c3 < "colonyTags" : ["office"], --- > "colonyTags" : ["office", "electronic"], 8c8 < "description" : "-todo-", --- > "description" : "A large computer server rack.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This computer is connected to a mess of unlabeled wires...", > "avianDescription" : "This computer is bigger than I am!", > "floranDescription" : "Floran likesss all these componentsss jammed together.", > "glitchDescription" : "Amused. Computers were once large enough to require dedicated rooms.", > "humanDescription" : "A giant server rack with a bunch of old computers.", > "hylotlDescription" : "There's nothing aesthetically pleasing about this at all.", > "novakidDescription" : "Must be the biggest computer I ever seen.", objects\office\officestapler\officestapler.object 7c7 < "description" : "-todo-", --- > "description" : "A bright red stapler.", 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "Bright red, I like this thing.", > "avianDescription" : "The colour of this stapler makes it easy to identify.", > "floranDescription" : "Floran likesss red ssstapler.", > "glitchDescription" : "Approving. This red stapler is a perfectly designed tool.", > "humanDescription" : "This stapler is in excellent condition, clearly it was well cared for.", > "hylotlDescription" : "It feels like this stapler was important to someone.", > "novakidDescription" : "This stapler's just the right size to fit in your hand.", objects\office\officetable\officetable.object 7c7 < "description" : "-todo-", --- > "description" : "A wooden table with metal legs.", 11,17c11,17 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "A basic table with metal legs.", > "avianDescription" : "This table isn't very fancy, but it works.", > "floranDescription" : "Thisss table has a wood sssurface.", > "glitchDescription" : "Uninterested. This table is a simple wood surface with metal legs.", > "humanDescription" : "Just a simple table made from metal.", > "hylotlDescription" : "A very basic table with no frills or decoration.", > "novakidDescription" : "A nice table, I could rest my boots up on this for a bit.", objects\outpost\outpostpeacekeeperposter\outpostpeacekeeperposter.object 8c8 < "shortdescription" : "Outpost Peacekeeper Poster", --- > "shortdescription" : "Peacekeeper Poster", objects\themed\egyptian\egyptianbed\egyptianbed.object 3c3 < "colonyTags" : ["misc","egyptian"], --- > "colonyTags" : ["egyptian"], 6c6 < "description" : "-todo-", --- > "description" : "A lavishly decorated bed designed for lounging.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This bed seems better suited for lounging then for sleeping.", > "avianDescription" : "This bed looks somewhat similar to an Avian style.", > "floranDescription" : "Ssshiny bed looks sssoft.", > "glitchDescription" : "Relieved. This bed looks perfect for resting on.", > "humanDescription" : "This bed looks like it belongs in a museum.", > "hylotlDescription" : "This bed was clearly made by a master craftsman.", > "novakidDescription" : "Bit fancy for my taste - but it'll do!", objects\themed\egyptian\egyptianchair\egyptianchair.object 3c3 < "colonyTags" : ["misc","egyptian"], --- > "colonyTags" : ["egyptian"], 6c6 < "description" : "-todo-", --- > "description" : "A golden chair decorated with symbols.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "There are some strange symbols engraved on this chair.", > "avianDescription" : "This chair looks very impressive.", > "floranDescription" : "Metal chair could use some sssoft skinsss.", > "glitchDescription" : "Interested. This chair slightly resembles a throne in a Glitch castle.", > "humanDescription" : "Seems like this chair wouldn't be very comfortable.", > "hylotlDescription" : "This chair seems almost too nice to sit on.", > "novakidDescription" : "A fella'd feel real important sittin' on this chair.", objects\themed\egyptian\egyptiancrest\egyptiancrest.object 3c3 < "colonyTags" : ["egyptian","pretty"], --- > "colonyTags" : ["pretty","egyptian"], 8c8 < "description" : "-todo-", --- > "description" : "A decorative crest with colourful wings", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "Strong bold colours - I like it.", > "avianDescription" : "This isn't Avian, but it really speaks to me!", > "floranDescription" : "Giant wingsss - a bird like this would mean a great hunt.", > "glitchDescription" : "Observant. These are not real wings, but a detailed artistic depiction.", > "humanDescription" : "A crest with brightly coloured wings.", > "hylotlDescription" : "This crest is powerful and striking.", > "novakidDescription" : "Think it's art - looks t'me like giant wings.", objects\themed\egyptian\egyptianpillar\egyptianpillar.object 3c3 < "colonyTags" : ["commerce","egyptian"], --- > "colonyTags" : ["egyptian"], 6c6 < "description" : "-todo-", --- > "description" : "An ornamental pillar decorated with gold.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "This pillar clearly prioritizes form over function.", > "avianDescription" : "This pillar looks like it belongs in a temple.", > "floranDescription" : "A tall pillar covered in metalsss.", > "glitchDescription" : "Curious. This pillar appears to be purely decorative, and not load bearing.", > "humanDescription" : "This fancy pillar looks heavy.", > "hylotlDescription" : "A fine example of decorative ancient art.", > "novakidDescription" : "Looks like it's from some sorta palace or somethin'.", objects\themed\egyptian\egyptianstatuette\egyptianstatuette.object 6c6 < "description" : "-todo-", --- > "description" : "A delicately decorated statue of a small creature.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "It looks like this statue is decorated with real gold.", > "avianDescription" : "The creature this statue depicts makes me uneasy.", > "floranDescription" : "Ssstatue of tasssty looking creature.", > "glitchDescription" : "Curious. The creator of this statue must have admired this creature.", > "humanDescription" : "This statue shows lots of respect for this animal.", > "hylotlDescription" : "The fine detail in this statue is impressive!", > "novakidDescription" : "Well, ain't that a fancy lookin' critter.", objects\themed\egyptian\egyptiantable\egyptiantable.object 6c6 < "description" : "-todo-", --- > "description" : "A heavy table made from wood and gold.", 12,18c12,18 < "apexDescription" : "-todo-", < "avianDescription" : "-todo-", < "floranDescription" : "-todo-", < "glitchDescription" : "-todo-", < "humanDescription" : "-todo-", < "hylotlDescription" : "-todo-", < "novakidDescription" : "-todo-", --- > "apexDescription" : "The surface of this table looks very solidly constructed.", > "avianDescription" : "This table is clearly intended for an important purpose.", > "floranDescription" : "Thisss table looks heavy.", > "glitchDescription" : "Confused. It seems the metal on this table serves no functional purpose.", > "humanDescription" : "Seems like this table isn't solid good, it's just been covered in a thin layer.", > "hylotlDescription" : "This table has been carefully decorated.", > "novakidDescription" : "Nice big table, plenty of space for a card game.", particles\tinyrockettrail.particle 11c11 < "timeToLive" : 1.5, --- > "timeToLive" : 1.0, projectiles\boss\swansong\swansongrocket\swansongrocket.lua 52c52 < mcontroller.approachVelocity(vec2.mul(vec2.norm(toApproach), speed), 30) --- > mcontroller.approachVelocity(vec2.mul(vec2.norm(toApproach), speed), 20) projectiles\boss\swansong\swansongslashswoosh\swansongslashswoosh.projectile 7c7 < "damagePoly" : [ [112, 7], [104, 34], [80, 53], [10, 66], [-35, 68], [-72, 58], [28, -62], [104, -34], [112, -7] ], --- > "damagePoly" : [ [94, 5], [88, 20], [64, 43], [10, 64], [-35, 68], [-80, 60], [14, -61], [72, -38], [94, -5] ], projectiles\npcs\pulsecannon\pulsecannon.projectile 8c8 < "lightColor" : [0, 0, 73], --- > "lightColor" : [249, 21, 207], quests\bounty\bounty.lua 403a404 > thisQuestEvents.cinematic = config.getParameter("bountyCinematic") quests\bounty\clue_items.config 377c377 < "Greetins! it is I, ! I have a message for you, Peacekeeper...", --- > "Greetings! it is I, ! I have a message for you, Peacekeeper...", quests\bounty\clue_objects.config 298c298 < "dialog" : ">HIDEOUT_SYSTEM_LOCATION: ^green;^reset;", --- > "dialog" : ">HIDEOUT_SYSTEM LOCATION: ^green;^reset;", quests\bounty\cultist_mission1.questtemplate 45a46,47 > "bountyCinematic" : "/cinematics/prison/prison.cinematic", > quests\bounty\generator.config 375,376c375 < "scan", < "decoy" --- > "scan" scripts\bountygeneration.lua 168a169,174 > if gang then > gang = { > name = gang.name, > hat = gang.hat > } > end 173,177c179 < gang = { < name = gang.name, < hat = gang.hat, < colorIndex = colorIndex, < }, --- > gang = gang, stats\effects\capturebeamout\capturebeamout.animation 10c10 < "cycle" : 1.0, --- > "cycle" : 1.5, stats\effects\capturebeamout\capturebeamout.lua 5c5 < self.triggerTimer = 1.0 --- > self.triggerTimer = 1.5 stats\effects\capturebeamout\capturebeamout.statuseffect 4c4 < "defaultDuration" : 1.1, --- > "defaultDuration" : 2.0, stats\effects\doomed\l6doomed.statuseffect 1,20c1,21 < { < "name" : "l6doomed", < < "effectConfig" : { < "activateDelay" : 0.1, < "deactivateDelay" : 0.1, < "triggerDamageThreshold" : 10, < "explosionDamageAmount" : 130 < }, < "defaultDuration" : 7, < < "scripts" : [ < "doomed.lua" < ], < < "animationConfig" : "doomed.animation", < < "label" : "Doomed", < "icon" : "/interface/statuses/doomed.png" < } --- > { > "name" : "l6doomed", > "blockingStat" : "specialStatusImmunity", > > "effectConfig" : { > "activateDelay" : 0.1, > "deactivateDelay" : 0.1, > "triggerDamageThreshold" : 10, > "explosionDamageAmount" : 130 > }, > "defaultDuration" : 7, > > "scripts" : [ > "doomed.lua" > ], > > "animationConfig" : "doomed.animation", > > "label" : "Doomed", > "icon" : "/interface/statuses/doomed.png" > } treasure\common.treasurepools 1462c1462,1463 < {"weight" : 0.0001, "item" : [ "pharaohhead", 1]} --- > {"weight" : 0.0001, "item" : [ "pharaohhead", 1]}, > {"weight" : 0.0001, "item" : [ "shirtchest", 1]}