From edf506db5b76bd2d91b769d0922be2580a6b4a44 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sat, 7 Feb 2026 23:41:34 -0500 Subject: [PATCH 1/7] fix radiation going outside of engineering --- code/modules/power/supermatter/nupermatter.dm | 4 ++++ code/modules/power/supermatter/nupermatter_radiation.dm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/power/supermatter/nupermatter.dm b/code/modules/power/supermatter/nupermatter.dm index 66e130a97adf..77b78136cdd9 100644 --- a/code/modules/power/supermatter/nupermatter.dm +++ b/code/modules/power/supermatter/nupermatter.dm @@ -37,6 +37,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) ///Higher == more overall power var/reaction_power_modifier = 1.1 + /// Controls the turf range of radiation + var/radiation_range = 8 ///Controls how much power is produced by each collector in range - this is the main parameter for tweaking SM balance, as it basically controls how the power variable relates to the rest of the game. var/power_factor = 1.0 ///Affects how fast the supermatter power decays @@ -556,6 +558,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) pull_time = 150 explosion_power = 3 + radiation_range = 4 + /obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements return diff --git a/code/modules/power/supermatter/nupermatter_radiation.dm b/code/modules/power/supermatter/nupermatter_radiation.dm index f489eae8eced..9039af536523 100644 --- a/code/modules/power/supermatter/nupermatter_radiation.dm +++ b/code/modules/power/supermatter/nupermatter_radiation.dm @@ -49,7 +49,7 @@ radiation_pulse( src, - max_range = 8, + max_range = radiation_range, threshold = threshold, chance = chance * 100, ) From 7348c0033e4bbf3a107314bf16caeedc3ddf7c03 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 02:18:46 -0500 Subject: [PATCH 2/7] atlas has a cargo shuttle now. fixes radio bugs. --- _maps/atlas.json | 3 +- _maps/map_files/Atlas/atlas.dmm | 27 +-- _maps/shuttles/cargo_atlas.dmm | 185 ++++++++++++++++++ code/controllers/subsystem/packetnets.dm | 2 +- code/datums/chatmessage.dm | 4 + code/datums/shuttles.dm | 4 + code/game/machinery/announcement_system.dm | 2 +- .../items/devices/radio/encryptionkey.dm | 12 ++ .../objects/items/devices/radio/headset.dm | 5 +- .../game/objects/items/devices/radio/radio.dm | 11 ++ code/modules/cargo/orderconsole.dm | 2 +- 11 files changed, 241 insertions(+), 16 deletions(-) create mode 100644 _maps/shuttles/cargo_atlas.dmm diff --git a/_maps/atlas.json b/_maps/atlas.json index 675af6ca22b8..bf77ba15ebc0 100644 --- a/_maps/atlas.json +++ b/_maps/atlas.json @@ -11,7 +11,8 @@ } ], "shuttles": { - "emergency": "emergency_goon" + "emergency": "emergency_goon", + "cargo": "cargo_atlas" }, "disable_headset_common": true } diff --git a/_maps/map_files/Atlas/atlas.dmm b/_maps/map_files/Atlas/atlas.dmm index 7b0e33e24256..fc644c612c11 100644 --- a/_maps/map_files/Atlas/atlas.dmm +++ b/_maps/map_files/Atlas/atlas.dmm @@ -2356,7 +2356,6 @@ /obj/structure/cable/yellow{ icon_state = "12" }, -/obj/machinery/light/small/maintenance/directional/south, /obj/structure/cable/yellow{ icon_state = "10" }, @@ -5096,7 +5095,7 @@ "fqF" = ( /obj/effect/turf_decal/bot, /obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron/white/white_large, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "fqW" = ( /obj/effect/turf_decal/tile/neutral{ @@ -7826,10 +7825,6 @@ }, /turf/open/floor/iron/ported/techfloor, /area/station/service/hydroponics) -"hVY" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/white, -/area/station/maintenance/starboard/greater) "hWJ" = ( /obj/structure/table/wood/fancy, /obj/item/flashlight/lamp/green{ @@ -17481,7 +17476,7 @@ "rxO" = ( /obj/structure/closet/l3closet/virology, /obj/effect/turf_decal/bot, -/turf/open/floor/iron/white/white_large, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "ryP" = ( /obj/structure/cable/yellow{ @@ -19656,6 +19651,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"tOk" = ( +/obj/docking_port/stationary{ + name = "Cargo Bay"; + width = 12; + height = 7; + id = "supply_home"; + dwidth = 6 + }, +/turf/open/space/basic, +/area/space/nearstation) "tOv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19723,7 +19728,7 @@ "tQN" = ( /obj/effect/turf_decal/bot, /obj/effect/spawner/random/structure/crate_loot, -/turf/open/floor/iron/white/white_large, +/turf/open/floor/plating, /area/station/maintenance/starboard/greater) "tRt" = ( /obj/structure/overfloor_catwalk/iron_dark, @@ -45376,7 +45381,7 @@ bSM rQm rQm dpx -vBF +gUm gUm sGj dwn @@ -53304,7 +53309,7 @@ vOe vOe vOe vOe -qkY +tOk sKQ uEr uEr @@ -57463,7 +57468,7 @@ mkE nxZ iMn rxO -hVY +oDB vPR jiE rmv diff --git a/_maps/shuttles/cargo_atlas.dmm b/_maps/shuttles/cargo_atlas.dmm new file mode 100644 index 000000000000..ce4ff1f340e9 --- /dev/null +++ b/_maps/shuttles/cargo_atlas.dmm @@ -0,0 +1,185 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/closed/wall/mineral/titanium, +/area/shuttle/supply) +"e" = ( +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"f" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor2"; + name = "supply dock loading door" + }, +/turf/open/floor/plating, +/area/shuttle/supply) +"g" = ( +/obj/docking_port/mobile/supply{ + dwidth = 6 + }, +/obj/machinery/door/airlock/titanium{ + name = "Supply Shuttle Airlock"; + req_access_txt = "31" + }, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"h" = ( +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor2"; + name = "Loading Doors"; + pixel_y = 8 + }, +/obj/machinery/button/door/directional/east{ + id = "QMLoaddoor"; + name = "Loading Doors"; + pixel_y = -8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"j" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/machinery/door/poddoor{ + id = "QMLoaddoor"; + name = "supply dock loading door" + }, +/turf/open/floor/plating, +/area/shuttle/supply) +"l" = ( +/turf/closed/wall/mineral/titanium/interior, +/area/shuttle/supply) +"q" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/shuttle/engine/heater, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"s" = ( +/turf/template_noop, +/area/template_noop) +"t" = ( +/obj/structure/shuttle/engine/propulsion/burst/left, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"u" = ( +/obj/structure/shuttle/engine/propulsion, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"v" = ( +/obj/structure/shuttle/engine/propulsion/burst/right, +/turf/open/floor/plating/airless, +/area/shuttle/supply) +"w" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) +"x" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/mineral/titanium/blue, +/area/shuttle/supply) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +s +"} +(2,1,1) = {" +b +e +e +e +e +x +e +e +e +l +b +t +"} +(3,1,1) = {" +b +e +e +e +e +e +e +e +e +e +q +u +"} +(4,1,1) = {" +b +w +e +e +e +e +e +e +e +e +q +u +"} +(5,1,1) = {" +b +e +e +e +e +e +e +e +e +e +q +u +"} +(6,1,1) = {" +b +e +e +e +e +e +h +e +e +l +b +v +"} +(7,1,1) = {" +b +b +b +f +b +g +b +j +b +b +b +s +"} diff --git a/code/controllers/subsystem/packetnets.dm b/code/controllers/subsystem/packetnets.dm index 003904ec63e6..7f1e23a1eb60 100644 --- a/code/controllers/subsystem/packetnets.dm +++ b/code/controllers/subsystem/packetnets.dm @@ -88,7 +88,7 @@ SUBSYSTEM_DEF(packets) gprs_broadcast_packet = random_string(rand(16,32), GLOB.hex_characters) pda_exploitable_register = pick_list(PACKET_STRING_FILE, "packet_field_names") - virtual_radio = new /obj/item/radio/headset/silicon/ai + virtual_radio = new /obj/item/radio/internal . = ..() /datum/controller/subsystem/packets/Recover() diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index 46b6d7a16ebe..43ea2b2c01b7 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -167,6 +167,9 @@ message_loc = isturf(target) ? target : get_atom_on_turf(target) + if(isnull(message_loc)) + qdel(src) + return // Build message image message = new /image{ @@ -216,6 +219,7 @@ //if(ismob(message_loc)) // If this proc starts getting $$$, re-add this check var/turf/message_turf = get_turf(message_loc) var/list/turfs2check = block(locate(max(message_turf.x-4, 1), message_turf.y, message_turf.z), locate(min(message_turf.x+4, world.maxx), message_turf.y, message_turf.z)) - message_turf + for(var/turf/T as anything in turfs2check) var/mob/living/L = locate() in T if(!isnull(L)) diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 7834f21f06cf..0a6a25841f96 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -562,6 +562,10 @@ suffix = "atlas" name = "mining shuttle (Atlas)" +/datum/map_template/shuttle/cargo/atlas + suffix = "atlas" + name = "cargo ferry (Atlas)" + /datum/map_template/shuttle/mining/delta suffix = "delta" name = "mining shuttle (Delta)" diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index b3ce1a8b03fd..fccd27a2a229 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = ..() GLOB.announcement_systems |= src // Voice Radio makes me cry. - radio = new /obj/item/radio/headset/silicon/ai(src) + radio = new /obj/item/radio/internal(src) // We don't need to be *present* on the frequency, just be able to send packets on it. common_freq = SSpackets.return_frequency(FREQ_COMMON) update_appearance() diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 28cefba0144f..10cbe51e42f6 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -111,5 +111,17 @@ /obj/item/encryptionkey/ai //ported from NT, this goes 'inside' the AI. channels = list(RADIO_CHANNEL_FEDERATION = 1, RADIO_CHANNEL_SECURITY = 1, RADIO_CHANNEL_ENGINEERING = 1, RADIO_CHANNEL_SCIENCE = 1, RADIO_CHANNEL_MEDICAL = 1, RADIO_CHANNEL_SUPPLY = 1, RADIO_CHANNEL_SERVICE = 1, RADIO_CHANNEL_AI_PRIVATE = 1) +/obj/item/encryptionkey/all_station + channels = list( + RADIO_CHANNEL_FEDERATION = 1, + RADIO_CHANNEL_SECURITY = 1, + RADIO_CHANNEL_ENGINEERING = 1, + RADIO_CHANNEL_SCIENCE = 1, + RADIO_CHANNEL_MEDICAL = 1, + RADIO_CHANNEL_SUPPLY = 1, + RADIO_CHANNEL_SERVICE = 1, + RADIO_CHANNEL_AI_PRIVATE = 1 + ) + /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index bf7b6fa00994..27395e44e439 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -278,9 +278,12 @@ TYPEINFO_DEF(/obj/item/radio/headset) /obj/item/radio/headset/silicon/ai name = "\proper Integrated Subspace Transceiver " - keyslot2 = new /obj/item/encryptionkey/ai command = TRUE +/obj/item/radio/headset/silicon/ai/Initialize(mapload) + keyslot2 = new /obj/item/encryptionkey/ai(src) + . = ..() + /obj/item/radio/headset/screwdriver_act(mob/living/user, obj/item/tool) user.set_machine(src) if(keyslot || keyslot2) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 913a06b5c3f2..2a49c6f70e5a 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -346,6 +346,9 @@ TYPEINFO_DEF(/obj/item/radio) /obj/item/radio/proc/backup_transmission(datum/signal/subspace/vocal/signal) var/turf/T = get_turf(src) + if(!T) + return + if (signal.data["done"] && (T.z in signal.levels)) return @@ -596,3 +599,11 @@ TYPEINFO_DEF(/obj/item/radio) /obj/item/radio/off // Station bounced radios, their only difference is spawning with the speakers off, this was made to help the lag. dog_fashion = /datum/dog_fashion/back should_be_listening = FALSE + +/// An internal type to give to machines, please stop giving machines the AI's headset. +/obj/item/radio/internal + command = TRUE + +/obj/item/radio/internal/Initialize(mapload) + keyslot = new /obj/item/encryptionkey/all_station(src) + . = ..() diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 99b1606750fd..bf40c485e293 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -51,7 +51,7 @@ /obj/machinery/computer/cargo/Initialize(mapload) . = ..() - radio = new /obj/item/radio/headset/headset_cargo(src) + radio = new /obj/item/radio/internal(src) /obj/machinery/computer/cargo/Destroy() QDEL_NULL(radio) From d1e7e34f9b12466cedfed59af7ff415c930bb85e Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 03:58:29 -0500 Subject: [PATCH 3/7] minor atlas shuttle issue --- _maps/shuttles/arrival_atlas.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/shuttles/arrival_atlas.dmm b/_maps/shuttles/arrival_atlas.dmm index 2f5faac7e149..dc69bd390b60 100644 --- a/_maps/shuttles/arrival_atlas.dmm +++ b/_maps/shuttles/arrival_atlas.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/open/space/basic, +/turf/template_noop, /area/template_noop) "b" = ( /obj/structure/chair/comfy/shuttle{ From dc14a7a14ebc93b09af4f257ca1b2033d2c28a58 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 04:50:02 -0500 Subject: [PATCH 4/7] Rewrite shuttle code a bit --- code/modules/power/gravitygenerator.dm | 2 +- code/modules/shuttle/docking.dm | 28 ++++++-- code/modules/shuttle/on_move.dm | 89 ++++++++++++++++++-------- 3 files changed, 89 insertions(+), 30 deletions(-) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 99d105185aa2..dbe146fd6ffe 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -433,7 +433,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) disable() investigate_log("was turned off by blackout event or a gravity anomaly detonation.", INVESTIGATE_GRAVITY) -/obj/machinery/gravity_generator/main/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/machinery/gravity_generator/main/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() disable() diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index f585adf74fb5..1f12449b7fba 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -131,13 +131,13 @@ return DOCKING_NULL_SOURCE var/area/old_area = oldT.loc - var/move_mode = old_area.beforeShuttleMove(shuttle_areas) //areas + var/move_mode = old_area.hypotheticalShuttleMove(shuttle_areas) //areas for(var/atom/movable/moving_atom as anything in oldT.contents) CHECK_TICK if(moving_atom.loc != oldT) //fix for multi-tile objects continue - move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode, src) //atoms + move_mode = moving_atom.hypotheticalShuttleMove(newT, rotation, move_mode, src) //atoms move_mode = oldT.fromShuttleMove(newT, move_mode) //turfs move_mode = newT.toShuttleMove(oldT, move_mode, src) //turfs @@ -148,6 +148,27 @@ old_turfs[oldT] = move_mode /obj/docking_port/mobile/proc/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area) + // Pre-movement actions. + for(var/i in 1 to old_turfs.len) + var/turf/oldT = old_turfs[i] + var/turf/newT = new_turfs[i] + var/move_mode = old_turfs[oldT] + + // beforeShuttleMove() calls + if(move_mode & MOVE_TURF) + oldT.beforeShuttleMove(newT, movement_force, movement_direction) + + if(move_mode & MOVE_AREA) + var/area/shuttle_area = oldT.loc + shuttle_area.beforeShuttleMove(oldT, newT, underlying_old_area) + + if(move_mode & MOVE_CONTENTS) + for(var/atom/movable/moving_atom as anything in oldT) + if(moving_atom.loc != oldT) //fix for multi-tile objects + continue + moving_atom.beforeShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src, rotation) + + // Perform movement. for(var/i in 1 to old_turfs.len) var/turf/oldT = old_turfs[i] var/turf/newT = new_turfs[i] @@ -161,8 +182,7 @@ shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas if(move_mode & MOVE_CONTENTS) - for(var/k in oldT) - var/atom/movable/moving_atom = k + for(var/atom/movable/moving_atom as anything in oldT) if(moving_atom.loc != oldT) //fix for multi-tile objects continue moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index cf58607e1d70..a59fcf3bed52 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -43,6 +43,10 @@ All ShuttleMove procs go here else qdel(thing) +/// This proc is called on all moving atoms, before onShuttleMove() is called. +/turf/proc/beforeShuttleMove(turf/newT, list/movement_force, move_dir) + return + // Called on the old turf to move the turf data /turf/proc/onShuttleMove(turf/newT, list/movement_force, move_dir) if(newT == src) // In case of in place shuttle rotation shenanigans. @@ -90,12 +94,17 @@ All ShuttleMove procs go here ///////////////////////////////////////////////////////////////////////////////////// -// Called on every atom in shuttle turf contents before anything has been moved -// returns the new move_mode (based on the old) -// WARNING: Do not leave turf contents in beforeShuttleMove or dock() will runtime -/atom/movable/proc/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +// Called on every area and movable (NOT turfs!) within a shuttle's rectangular bounding box. +// It does not mean the atom is actually within the shuttle. +// Returns the new move_mode (based on the old) +// WARNING: Do not leave turf contents in hypotheticalShuttleMove or dock() will runtime +/atom/movable/proc/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) return move_mode +/// This proc is called on all moving atoms, before ANYTHING has moved. Movement will occur immediately following. +/atom/movable/proc/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) + return + /// Called on atoms to move the atom to the new location /atom/movable/proc/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) if(newT == oldT) // In case of in place shuttle rotation shenanigans. @@ -136,12 +145,16 @@ All ShuttleMove procs go here ///////////////////////////////////////////////////////////////////////////////////// -// Called on areas before anything has been moved -// returns the new move_mode (based on the old) -/area/proc/beforeShuttleMove(list/shuttle_areas) - if(!shuttle_areas[src]) - return NONE - return MOVE_AREA +// Called on every area and movable (NOT turfs!) within a shuttle's rectangular bounding box. It does not mean the atom is actually within the shuttle. +// Returns the initial move_mode. +/area/proc/hypotheticalShuttleMove(list/shuttle_areas) + if(shuttle_areas[src]) + return MOVE_AREA + return NONE + +/// This proc is called on all moving atoms, before onShuttleMove() is called. +/area/proc/beforeShuttleMove(turf/oldT, turf/newT, area/underlying_old_area) + return // Called on areas to move their turf between areas /area/proc/onShuttleMove(turf/oldT, turf/newT, area/underlying_old_area) @@ -171,20 +184,43 @@ All ShuttleMove procs go here /************************************Machinery move procs************************************/ -/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/machinery/door/airlock/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) . = ..() - for(var/obj/machinery/door/airlock/other_airlock in range(2, src)) // includes src, extended because some escape pods have 1 plating turf exposed to space + var/area/my_area = get_area(src) + + // This would be way, way easier if shuttle doors were their own type or were in some other way distinguishable from normal doors. + var/is_spacebound_airlock = FALSE + for(var/turf/T as anything in get_adjacent_open_turfs(src)) + if(T.loc != my_area) + is_spacebound_airlock = TRUE + break + + for(var/obj/machinery/door/airlock/other_airlock in orange(2, src)) //extended because some escape pods have 1 plating turf exposed to space other_airlock.shuttledocked = FALSE other_airlock.air_tight = TRUE + + // Handle non-shuttle airlocks closing too. + if(get_area(other_airlock) != my_area) + spawn(-1) + other_airlock.close(FALSE, TRUE) + + // Close external airlocks. + if(is_spacebound_airlock) + air_tight = TRUE + shuttledocked = FALSE spawn(-1) - if((other_airlock.close(FALSE, TRUE) || other_airlock.density) && other_airlock == src && moving_dock.bolt_doors) // force crush - if(locate(/turf/open/space) in orange(1, other_airlock)) - other_airlock.bolt() + close(FALSE, TRUE) + if(moving_dock.bolt_doors) + bolt() /obj/machinery/door/airlock/onShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock) . = ..() + // Unbolt airlocks at the destination. if(istype(old_dock, /obj/docking_port/stationary/transit) && locked && moving_dock.bolt_doors) - unbolt() + for(var/obj/machinery/door/airlock/other_airlock in orange(1, src)) + if(get_area(other_airlock) != get_area(src)) + unbolt() + break /obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() @@ -195,11 +231,14 @@ All ShuttleMove procs go here shuttledocked = TRUE other_airlock.shuttledocked = TRUE -/obj/machinery/camera/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/machinery/camera/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS - GLOB.cameranet.removeCamera(src) + +/obj/machinery/camera/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) + . = ..() + GLOB.cameranet.removeCamera(src) /obj/machinery/camera/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation) . = ..() @@ -247,7 +286,7 @@ All ShuttleMove procs go here // atmos_init() calls update_appearance(), so we don't need to call it update_appearance() -/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/machinery/navbeacon/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) . = ..() GLOB.navbeacons["[z]"] -= src GLOB.deliverybeacons -= src @@ -307,17 +346,17 @@ All ShuttleMove procs go here /************************************Structure move procs************************************/ -/obj/structure/grille/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/structure/grille/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS -/obj/structure/lattice/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/structure/lattice/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS -/obj/structure/cable/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/structure/cable/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) . = ..() cut_cable_from_powernet(FALSE) var/clockwise_rotation_amount = round(rotation / 90) @@ -327,12 +366,12 @@ All ShuttleMove procs go here . = ..() propagate_if_no_network() -/obj/structure/shuttle/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/structure/shuttle/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(. & MOVE_AREA) . |= MOVE_CONTENTS -/obj/structure/ladder/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/structure/ladder/beforeShuttleMove(turf/newT, turf/oldT, list/movement_force, move_dir, obj/docking_port/stationary/old_dock, obj/docking_port/mobile/moving_dock, rotation) . = ..() if (!(resistance_flags & INDESTRUCTIBLE)) disconnect() @@ -350,7 +389,7 @@ All ShuttleMove procs go here /************************************Misc move procs************************************/ -/obj/docking_port/mobile/beforeShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) +/obj/docking_port/mobile/hypotheticalShuttleMove(turf/newT, rotation, move_mode, obj/docking_port/mobile/moving_dock) . = ..() if(moving_dock == src) . |= MOVE_CONTENTS From a2aa41382df87e3b8582f24e2793918057217438 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 05:22:52 -0500 Subject: [PATCH 5/7] give atlas cross linkage --- _maps/atlas.json | 3 ++- code/controllers/subsystem/mapping.dm | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/_maps/atlas.json b/_maps/atlas.json index bf77ba15ebc0..1d22bea18a57 100644 --- a/_maps/atlas.json +++ b/_maps/atlas.json @@ -7,7 +7,8 @@ "run_mapping_tests": true, "traits": [ { - "Gravity": 1 + "Gravity": 1, + "Linkage": "Cross" } ], "shuttles": { diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 0463353178aa..855cb335468a 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -317,10 +317,12 @@ Used by the AI doomsday and the self-destruct nuke. if (!length(traits)) // null or empty - default for (var/i in 1 to total_z) traits += list(default_traits) + else if (total_z != traits.len) // mismatch INIT_ANNOUNCE("WARNING: [traits.len] trait sets specified for [total_z] z-levels in [path]!") if (total_z < traits.len) // ignore extra traits traits.Cut(total_z + 1) + while (total_z > traits.len) // fall back to defaults on extra levels traits += list(default_traits) From e0ad5c2d5c6b34f34d9df1035f1ac014367c9247 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 17:56:43 -0500 Subject: [PATCH 6/7] fix mining magnet --- _maps/map_files/Atlas/atlas.dmm | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/_maps/map_files/Atlas/atlas.dmm b/_maps/map_files/Atlas/atlas.dmm index fc644c612c11..76aed1e1e0e5 100644 --- a/_maps/map_files/Atlas/atlas.dmm +++ b/_maps/map_files/Atlas/atlas.dmm @@ -7212,14 +7212,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"hwF" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/west{ - name = "cargo camera"; - network = list("Cargo") - }, -/turf/open/space/basic, -/area/space/nearstation) "hwP" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -21473,8 +21465,8 @@ /area/station/medical/medbay) "vFe" = ( /obj/machinery/asteroid_magnet{ - center_x = 87; - center_y = 94; + center_x = 94; + center_y = 89; area_size = 6 }, /obj/effect/turf_decal/delivery, @@ -22657,14 +22649,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"wMi" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/camera/autoname/directional/east{ - name = "cargo camera"; - network = list("Cargo") - }, -/turf/open/space/basic, -/area/space/nearstation) "wMC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46181,7 +46165,7 @@ xvH xvH xvH xvH -wMi +xvH xvH xvH xvH @@ -46438,7 +46422,7 @@ xvH xvH xvH xvH -wvh +xvH xvH xvH xvH @@ -47991,7 +47975,7 @@ xvH gDJ gDJ gDJ -xvH +vaQ gDJ gDJ vOe @@ -48505,7 +48489,7 @@ xvH gDJ gDJ gDJ -xvH +vaQ gDJ gDJ vOe @@ -50036,7 +50020,7 @@ xvH xvH xvH xvH -wvh +xvH xvH xvH xvH @@ -50293,7 +50277,7 @@ xvH xvH xvH xvH -hwF +xvH xvH xvH xvH From 51c5d9bf65342f004babe4593084e605b3b5bd77 Mon Sep 17 00:00:00 2001 From: Kapu1178 <75460809+Kapu1178@users.noreply.github.com> Date: Sun, 15 Feb 2026 18:16:19 -0500 Subject: [PATCH 7/7] space proof the mining suit --- code/modules/mod/mod_theme.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 4a1dfd36e180..018bf9b7941a 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -410,8 +410,6 @@ default_skin = "mining" armor = list(BLUNT = 30, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 30, BIO = 100, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF|LAVA_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY - 5 charge_drain = DEFAULT_CHARGE_DRAIN * 2 allowed_suit_storage = list(