FILES ----- instance_worlds.config system_objects.config ai\missionpenguin2.aimission behaviors\monsters\boss\guardian\spawnminiongroup.behavior behaviors\nodes\guardian.nodes behaviors\nodes\movement.nodes interface\cockpit\cockpit.config interface\cockpit\cockpit.lua interface\cockpit\cockpitview.lua interface\cockpit\objectinfobody.png [NEW] interface\cockpit\zoombutton.frames [NEW] interface\cockpit\zoombutton.png interface\expandstation\expandstation.config interface\expandstation\expandstation.lua interface\placestation\placestation.lua monsters\space\heavydrone\heavydrone.animation monsters\space\heavydrone\heavydrone.lua objects\playerstation\expansionslot\expansionslot.animation objects\playerstation\expansionslot\expansionslot.lua projectiles\npcs\firelasershot\firelasershot.projectile projectiles\uniquemonster\twigunbullet\twigunbullet.projectile scripts\drawingutil.lua scripts\util.lua scripts\actions\container.lua scripts\actions\flying.lua scripts\actions\math.lua scripts\actions\monster.lua scripts\actions\movement.lua scripts\actions\boss\guardian.lua [NEW] sfx\gun\mech_energyrifle_fire1.ogg [NEW] sfx\gun\mech_energyrifle_fire2.ogg [NEW] sfx\gun\mech_heatrifle_fire1.ogg sfx\melee\mech_drill_winddown2.ogg [NEW] stats\effects\statusimmunity\statusimmunity.lua [NEW] stats\effects\statusimmunity\statusimmunity.statuseffect vehicles\modularmech\mechparts_arm.config vehicles\modularmech\modularmech.vehicle DIFFS ----- instance_worlds.config 1045a1046,1076 > "penguinship" : { > "type" : "FloatingDungeon", > "dungeonWorld" : "penguinship", > "beamUpRule" : "Anywhere", > "disableDeathDrops" : true, > > "tempWorldDeleteTime" : 600000, > > "skyParameters" : { > "dayLength" : 10000, > "surfaceLevel" : 1000, > "spaceLevel" : 3000, > "seed" : -5288806180628666923, > > "skyType" : "barren", > "skyColoring" : { > "mainColor" : [200, 200, 255], > > "morningColors" : [[200, 200, 255], [200, 200, 255]], > "dayColors" : [[200, 200, 255], [200, 200, 255]], > "eveningColors" : [[200, 200, 255], [200, 200, 255]], > "nightColors" : [[200, 200, 255], [200, 200, 255]], > > "morningLightColor" : [120, 120, 120], > "dayLightColor" : [120, 120, 120], > "eveningLightColor" : [120, 120, 120], > "nightLightColor" : [120, 120, 120] > } > } > }, > system_objects.config 24c24,26 < "bookmarkIcon" : "spacestation" --- > "bookmarkIcon" : "spacestation", > > "hostile" : false 48c50,52 < "bookmarkIcon" : "spacestation" --- > "bookmarkIcon" : "spacestation", > > "hostile" : false 72c76,78 < "bookmarkIcon" : "spacestation" --- > "bookmarkIcon" : "spacestation", > > "hostile" : false 96c102,104 < "bookmarkIcon" : "spacestation" --- > "bookmarkIcon" : "spacestation", > > "hostile" : false 120c128,130 < "bookmarkIcon" : "spacestation" --- > "bookmarkIcon" : "spacestation", > > "hostile" : false 140c150,152 < "description" : "Whoever's flying this ship, we shouldn't get close without being prepared for a fight." --- > "description" : "Whoever's flying this ship, we shouldn't get close without being prepared for a fight.", > > "hostile" : true 159c171,173 < "description" : "Whoever's flying this ship, we shouldn't get close without being prepared for a fight." --- > "description" : "Whoever's flying this ship, we shouldn't get close without being prepared for a fight.", > > "hostile" : true 178c192,194 < "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit." --- > "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit.", > > "hostile" : false 197c213,215 < "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit." --- > "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit.", > > "hostile" : false 216c234,236 < "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit." --- > "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit.", > > "hostile" : false 235c255,257 < "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit." --- > "description" : "This ship acknowledges our communications and her captain cordially invites us to pay a visit.", > > "hostile" : false 257c279,281 < "description" : "Celestial interference prevents a detailed scan, but there are anomalous energy readings here that warrant investigation." --- > "description" : "Celestial interference prevents a detailed scan, but there are anomalous energy readings here that warrant investigation.", > > "hostile" : true ai\missionpenguin2.aimission 12c12 < "text" : "Biggy the armourer requires your help.", --- > "text" : "The penguin scientist Dr. Akaggy requires your help testing a new weapon.", behaviors\monsters\boss\guardian\spawnminiongroup.behavior 15,16c15,16 < "spawnMin": "self", < "spawnMax": "self", --- > "spawnMin": null, > "spawnMax": null, 69c69 < "list": {"value": "allMinions"}, --- > "list": {"key": "allMinions"}, 255c255 < "list": {"value": "newMinions"}, --- > "list": {"key": "newMinions"}, 323c323 < } \ No newline at end of file --- > } behaviors\nodes\guardian.nodes 75c75 < "maxLength": {"type": "number", "value": 50}, --- > "maxLength": {"type": "number", "value": null}, 116c116 < } \ No newline at end of file --- > } behaviors\nodes\movement.nodes 90c90 < "position": {"type": "position", "value": "target"}, --- > "position": {"type": "position", "value": null}, 411c411 < } \ No newline at end of file --- > } interface\cockpit\cockpit.config 13c13,14 < "captureMouseEvents" : true --- > "captureMouseEvents" : true, > "captureKeyboardEvents" : true 438a440,450 > "zoomOut" : { > "zlevel" : 10, > "type" : "button", > "base" : "/interface/cockpit/zoombutton.png:inactive", > "hover" : "/interface/cockpit/zoombutton.png:hover", > "pressed" : "/interface/cockpit/zoombutton.png:inactive", > "position" : [4, 26], > "pressedOffset" : [0, 0], > "callback" : "zoomOut" > }, > 503c515 < "size" : [128, 96], --- > "size" : [128, 116], 509c521 < "size" : [128, 96], // Height is header + footer, body height is added dynamically --- > "size" : [128, 116], // Height is header + footer, body height is added dynamically 520c532 < "size" : [126, 70], --- > "size" : [126, 90], 527c539 < "position" : [63, 74], --- > "position" : [63, 94], 532c544 < "position" : [2, 69], --- > "position" : [2, 89], 537a550,557 > "threat" : { > "type" : "label", > "position" : [2, 16], > "wrapWidth" : 122, > "color" : [200, 200, 200], > "vAnchor" : "bottom", > "value" : "REQUIRES MECH TO DEPLOY" > }, 758a779,803 > }, > > "remoteTitle" : { > "type" : "label", > "visible" : false, > "position" : [198, 30], > "hAnchor" : "mid", > "vAnchor" : "bottom", > "width" : 120, > "value" : "REMOTE SYSTEM VIEW", > "color" : "green", > "fontSize" : 12, > "mouseTransparent" : true > }, > "remoteDescription" : { > "type" : "label", > "visible" : false, > "position" : [198, 22], > "hAnchor" : "mid", > "vAnchor" : "bottom", > "width" : 120, > "value" : "UNMAPPED CELESTIAL OBJECTS UNAVAILABLE", > "color" : "green", > "fontSize" : 8, > "mouseTransparent" : true 777a823 > "zoomOut", 811c857 < "height" : 96, --- > "height" : 116, 1331c1377 < --- > 1344c1390,1416 < } --- > }, > > "objectMinThreat" : 3, > "objectThreatColors" : { > "unavailable" : [213, 50, 0], > "hostile" : [ > [0, 165, 213], // T3 > [140, 213, 0 ], // T4 > [213, 140, 0], // T5 > [180, 50, 0] // T6 > ], > "friendly" : [0, 213, 50] > }, > > "threatTextPrefix" : "^white;Threat: ^reset;", > "objectThreatText" : { > "unavailable" : "REQUIRES MECH TO DEPLOY", > "hostile" : [ > "Low", // T3 > "Moderate", // T4 > "Dangerous", // T5 > "Extreme" // T6 > ], > "friendly" : "None" > }, > > "universeScrollSpeed" : 50 interface\cockpit\cockpit.lua 14a15,21 > self.input = { > up = false, > left = false, > down = false, > right = false > } > self.zoomOut = false 55a63,74 > function canvasKeyEvent(key, isDown) > if key == 65 then > self.input.up = isDown > elseif key == 43 then > self.input.left = isDown > elseif key == 61 then > self.input.down = isDown > elseif key == 46 then > self.input.right = isDown > end > end > 85a105 > self.zoomOut = false 167a188,191 > function zoomOut() > self.zoomOut = true > end > 398a423,426 > widget.setVisible("zoomOut", false) > widget.setVisible("remoteTitle", false) > widget.setVisible("remoteDescription", false) > 436a465,466 > widget.setVisible("zoomOut", false) > 446a477,478 > local scrollSpeed = config.getParameter("universeScrollSpeed") > 482a515,531 > else > -- if not dragging allow keyboard scrolling > local dir = {0, 0} > if self.input.up then > dir[2] = dir[2] + 1 > end > if self.input.down then > dir[2] = dir[2] - 1 > end > if self.input.left then > dir[1] = dir[1] - 1 > end > if self.input.right then > dir[1] = dir[1] + 1 > end > local position = vec2.add(View.universeCamera.position, vec2.mul(vec2.norm(dir), scrollSpeed * script.updateDt())) > View:setCamera("universe", position, "universe") 666a716,717 > widget.setVisible("zoomOut", false) > 686,687c737,744 < if not warpIn and compare(toSystem, celestial.currentSystem()) then < View.drawShip = true --- > local isCurrent = compare(toSystem, celestial.currentSystem()) > if isCurrent then > if not warpIn then > View.drawShip = true > end > else > widget.setVisible("remoteTitle", true) > widget.setVisible("remoteDescription", true) 693d749 < 715a772,773 > widget.setVisible("zoomOut", true) > 790c848,852 < local zoomOut = vec2.mag(View:toSystem(View:mousePosition())) > (View.settings.viewRadius + 10) / View.systemCamera.scale --- > if self.zoomOut then > return self.state:set(systemUniverseTransition, system) > end > > local zoomOut = vec2.mag(View:toSystem(View:mousePosition())) - 20 > (View.settings.viewRadius) / View.systemCamera.scale 918a981,982 > widget.setVisible("zoomOut", false) > 960a1025,1026 > widget.setVisible("zoomOut", true) > 1004a1071,1074 > if self.zoomOut then > return self.state:set(planetSystemTransition, planet) > end > 1011c1081 < local zoomOut = planetDistance(planet, View:toSystem(View:mousePosition())) > (View.settings.viewRadius + 10) / View.systemCamera.scale --- > local zoomOut = planetDistance(planet, View:toSystem(View:mousePosition())) - 20 > (View.settings.viewRadius) / View.systemCamera.scale 1094a1165,1166 > widget.setVisible("zoomOut", false) > interface\cockpit\cockpitview.lua 90c90 < for _,uuid in pairs(celestial.systemPlayerShips()) do --- > for _,uuid in pairs(celestial.playerShips()) do 92c92 < position = celestial.systemPlayerShipPosition(uuid), --- > position = celestial.playerShipPosition(uuid), 200a201,204 > local destination = celestial.shipDestination() > if destination and playerPosition then > self.player.direction = vec2.norm(vec2.sub(celestial.systemPosition(destination), playerPosition)) > end 223c227 < local newShips = celestial.systemPlayerShips() --- > local newShips = celestial.playerShips() 228c232 < position = celestial.systemPlayerShipPosition(uuid), --- > position = celestial.playerShipPosition(uuid), 247c251 < local position = celestial.objectPosition(uuid) or celestial.systemPlayerShipPosition(uuid) --- > local position = celestial.objectPosition(uuid) or celestial.playerShipPosition(uuid) 507a512 > local hostile = false 510a516,534 > hostile = object.parameters.hostile or false > end > > local colors = config.getParameter("objectThreatColors") > local threatText = config.getParameter("objectThreatText") > if player.canDeploy() then > if hostile then > local systemParameters = celestial.planetParameters(system) > local minThreat = config.getParameter("objectMinThreat") > local threatLevel = systemParameters.spaceThreatLevel or minThreat > widget.setFontColor("objectinfo.inner.threat", colors.hostile[threatLevel - minThreat + 1]) > widget.setText("objectinfo.inner.threat", string.format("%s%s", config.getParameter("threatTextPrefix"), threatText.hostile[threatLevel - minThreat + 1])) > else > widget.setFontColor("objectinfo.inner.threat", colors.friendly) > widget.setText("objectinfo.inner.threat", string.format("%s%s", config.getParameter("threatTextPrefix"), threatText.friendly)) > end > else > widget.setFontColor("objectinfo.inner.threat", colors.unavailable) > widget.setText("objectinfo.inner.threat", threatText.unavailable) 735c759 < util.clamp(position[2], min[2], max[2]) --- > util.clamp(position[2], min[2], max[2]) interface\expandstation\expandstation.config 148c148,149 < "unplaceable" : "No valid anchor" --- > "unplaceable" : "No valid anchor", > "blocked" : "Part blocked by entity" 149a151 > "errorSound" : "/sfx/interface/clickon_error.ogg", interface\expandstation\expandstation.lua 19a20,21 > self.blockedTimer = 0 > 43a46,54 > > if self.blockedTimer > 0 then > self.blockedTimer = math.max(self.blockedTimer - script.updateDt(), 0.0) > if self.blockedTimer > 0 then > widget.setText("warning", config.getParameter("warningMessages.blocked")) > else > itemSelected() > end > end 140a152 > self.blockedTimer = 0 186,187c198,199 < callback = function(res) < if res then --- > callback = function(res, reason) > if res[1] then 212a225,227 > elseif res[2] == "blocked" then > pane.playSound(config.getParameter("errorSound")) > self.blockedTimer = 2.0 interface\placestation\placestation.lua 141c141 < widget.setVisible("coordinateLabel", true); --- > widget.setVisible("coordinateLabel", true); 189c189 < local orbit = vec2.mag(celestial.systemObjectPosition(uuid)) --- > local orbit = vec2.mag(celestial.objectPosition(uuid)) 306c306 < if uuid and celestial.systemObjectPosition(uuid) ~= nil then --- > if uuid and celestial.objectPosition(uuid) ~= nil then 318c318 < if uuid and celestial.systemObjectPosition(uuid) ~= nil then --- > if uuid and celestial.objectPosition(uuid) ~= nil then 376c376 < local position = celestial.systemObjectPosition(uuid) --- > local position = celestial.objectPosition(uuid) monsters\space\heavydrone\heavydrone.animation 323c323,324 < "deathPuff" : [ "/sfx/npc/enemydeathpuff.ogg" ] --- > "deathPuff" : [ "/sfx/npc/enemydeathpuff.ogg" ], > "fire" : [ "/sfx/gun/twigun_shot1.ogg", "/sfx/gun/twigun_shot2.ogg", "/sfx/gun/twigun_shot3.ogg" ] monsters\space\heavydrone\heavydrone.lua 175a176 > animator.playSound("fire") objects\playerstation\expansionslot\expansionslot.animation 59a60,63 > }, > > "sounds" : { > "interactError" : [ "/sfx/interface/clickon_error.ogg" ] objects\playerstation\expansionslot\expansionslot.lua 1a2 > require "/scripts/rect.lua" 21c22,26 < return world.sendEntityMessage(console, "lockPartPlacement", entity.id(), partConfig.parts[partName], tilePos):result() --- > if checkClear(partConfig.parts[partName]) then > return {world.sendEntityMessage(console, "lockPartPlacement", entity.id(), partConfig.parts[partName], tilePos):result(), nil} > else > return {false, "blocked"} > end 35a41,42 > > script.setUpdateDelta(10) 53a61,74 > function checkClear(part) > local grid = getGrid() > for _,tile in pairs(partTiles(part, worldToTile(grid, self.expandPosition))) do > local min = vec2.sub(tileWorldPos(grid, tile), vec2.div(grid.tileBorder, 2.0)) > local max = vec2.add(min, vec2.add(grid.tileSize, grid.tileBorder)) > > local entities = world.entityQuery(min, max, {includedTypes = {"npc", "player", "monster"}}) > if #entities > 0 then > return false > end > end > return true > end > 90,91c111,117 < function onInteraction() < return {config.getParameter("interactAction"), config.getParameter("interactData")} --- > function onInteraction(args) > -- don't allow interaction from the expand direction > if vec2.dot(args.source, self.expandDirection) < 0 then > return {config.getParameter("interactAction"), config.getParameter("interactData")} > else > animator.playSound("interactError") > end projectiles\npcs\firelasershot\firelasershot.projectile 11c11 < "damageKind" : "slash" --- > "damageKind" : "plasma" projectiles\uniquemonster\twigunbullet\twigunbullet.projectile 14c14 < "damageKind" : "slash", --- > "damageKind" : "plasma", scripts\drawingutil.lua 0a1,3 > require "/scripts/vec2.lua" > require "/scripts/poly.lua" > scripts\util.lua 511,519d510 < function parseArgs(args, defaults) < for k,v in pairs(defaults) do < if args[k] == nil then < error(string.format("No default set for arg %s in: args: %s defaults: %s", k, args, defaults)) < end < end < return args < end < scripts\actions\container.lua 6,11d5 < args = parseArgs(args, { < entity = nil, < itemName = nil, < amount = 1, < parameters = {} < }) scripts\actions\flying.lua 11,12c11 < < if not args.keepGroundDistance or not keepCeilingDistance or not args.maxXVelocity or not args.maxYVelocity then return false end --- > if not args.keepGroundDistance or not args.keepCeilingDistance or not args.maxXVelocity or not args.maxYVelocity then return false end scripts\actions\math.lua 103c103 < local ratio --- > local ratio = args.ratio scripts\actions\monster.lua 59,63d58 < args = parseArgs(args, { < angle = 0, < vector = nil < }) < scripts\actions\movement.lua 350,354d349 < args = parseArgs(args, { < position = "target", < tolerance = 1 < }) < scripts\actions\boss\guardian.lua 8a9,11 > local spawnMin = args.spawnMin or mcontroller.position() > local spawnMax = args.spawnMin or mcontroller.position() > vehicles\modularmech\mechparts_arm.config 141c141 < "Fire" : ["/sfx/gun/pulsecannon_blast1.ogg"] --- > "Fire" : ["/sfx/gun/mech_heatrifle_fire1.ogg"] 209c209 < "Fire" : ["/sfx/gun/pulsecannon_blast1.ogg"] --- > "Fire" : ["/sfx/gun/mech_energyrifle_fire1.ogg"] vehicles\modularmech\modularmech.vehicle 118a119 > "statusimmunity",