diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm
index 8c546c9135..85eeeae876 100644
--- a/code/__defines/subsystems.dm
+++ b/code/__defines/subsystems.dm
@@ -11,3 +11,5 @@
var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_GAME, RUNLEVEL_POSTGAME)
#define RUNLEVEL_FLAG_TO_INDEX(flag) (log(2, flag) + 1) // Convert from the runlevel bitfield constants to index in runlevel_flags list
+
+#define INIT_ORDER_LIGHTING 0
\ No newline at end of file
diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm
deleted file mode 100644
index d46cab1d19..0000000000
--- a/code/controllers/Processes/lighting.dm
+++ /dev/null
@@ -1,98 +0,0 @@
-/var/lighting_overlays_initialised = FALSE
-
-/var/list/lighting_update_lights = list() // List of lighting sources queued for update.
-/var/list/lighting_update_corners = list() // List of lighting corners queued for update.
-/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update.
-
-/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated.
-/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated.
-/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated.
-
-
-/datum/controller/process/lighting
- // Queues of update counts, waiting to be rolled into stats lists
- var/list/stats_queues = list(
- "Source" = list(), "Corner" = list(), "Overlay" = list())
- // Stats lists
- var/list/stats_lists = list(
- "Source" = list(), "Corner" = list(), "Overlay" = list())
- var/update_stats_every = (1 SECONDS)
- var/next_stats_update = 0
- var/stat_updates_to_keep = 5
-
-/datum/controller/process/lighting/setup()
- name = "lighting"
-
- schedule_interval = 0 // run as fast as you possibly can
- sleep_interval = 10 // Yield every 10% of a tick
- defer_usage = 80 // Defer at 80% of a tick
- create_all_lighting_overlays()
- lighting_overlays_initialised = TRUE
-
- // Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load.
- spawn(300)
- doWork(1)
-
-/datum/controller/process/lighting/doWork(roundstart)
-
- lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated.
- lighting_update_lights = list()
- for(var/datum/light_source/L in lighting_update_lights_old)
-
- if(L.check() || L.destroyed || L.force_update)
- L.remove_lum()
- if(!L.destroyed)
- L.apply_lum()
-
- else if(L.vis_update) //We smartly update only tiles that became (in) visible to use.
- L.smart_vis_update()
-
- L.vis_update = FALSE
- L.force_update = FALSE
- L.needs_update = FALSE
-
- SCHECK
-
- lighting_update_corners_old = lighting_update_corners //Same as above.
- lighting_update_corners = list()
- for(var/A in lighting_update_corners_old)
- var/datum/lighting_corner/C = A
-
- C.update_overlays()
-
- C.needs_update = FALSE
-
- SCHECK
-
- lighting_update_overlays_old = lighting_update_overlays //Same as above.
- lighting_update_overlays = list()
-
- for(var/A in lighting_update_overlays_old)
- var/atom/movable/lighting_overlay/O = A
- O.update_overlay()
- O.needs_update = 0
- SCHECK
-
- stats_queues["Source"] += lighting_update_lights_old.len
- stats_queues["Corner"] += lighting_update_corners_old.len
- stats_queues["Overlay"] += lighting_update_overlays_old.len
-
- if(next_stats_update <= world.time)
- next_stats_update = world.time + update_stats_every
- for(var/stat_name in stats_queues)
- var/stat_sum = 0
- var/list/stats_queue = stats_queues[stat_name]
- for(var/count in stats_queue)
- stat_sum += count
- stats_queue.Cut()
-
- var/list/stats_list = stats_lists[stat_name]
- stats_list.Insert(1, stat_sum)
- if(stats_list.len > stat_updates_to_keep)
- stats_list.Cut(stats_list.len)
-
-/datum/controller/process/lighting/statProcess()
- ..()
- stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays")
- for(var/stat_type in stats_lists)
- stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]")
diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm
new file mode 100644
index 0000000000..01875cc397
--- /dev/null
+++ b/code/controllers/subsystems/lighting.dm
@@ -0,0 +1,166 @@
+/*
+** Lighting Subsystem - Process the lighting! Do it!
+*/
+
+#define SSLIGHTING_STAGE_LIGHTS 1
+#define SSLIGHTING_STAGE_CORNERS 2
+#define SSLIGHTING_STAGE_OVERLAYS 3
+#define SSLIGHTING_STAGE_DONE 4
+// This subsystem's fire() method also gets called once during Master.Initialize().
+// During this fire we need to use CHECK_TICK to sleep and continue, but in all other fires we need to use MC_CHECK_TICK to pause and return.
+// This leads us to a rather annoying little tidbit of code that I have stuffed into this macro so I don't have to see it.
+#define DUAL_TICK_CHECK if (init_tick_checks) { CHECK_TICK; } else if (MC_TICK_CHECK) { return; }
+
+// Globals
+/var/lighting_overlays_initialised = FALSE
+/var/list/lighting_update_lights = list() // List of lighting sources queued for update.
+/var/list/lighting_update_corners = list() // List of lighting corners queued for update.
+/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update.
+
+SUBSYSTEM_DEF(lighting)
+ name = "Lighting"
+ wait = 2 // Ticks, not deciseconds
+ init_order = INIT_ORDER_LIGHTING
+ flags = SS_TICKER
+
+ var/list/currentrun = list()
+ var/stage = null
+
+ var/cost_lights = 0
+ var/cost_corners = 0
+ var/cost_overlays = 0
+
+/datum/controller/subsystem/lighting/Initialize(timeofday)
+ if(!lighting_overlays_initialised)
+ // TODO - TG initializes starlight here.
+ create_all_lighting_overlays()
+ lighting_overlays_initialised = TRUE
+
+ // Pre-process lighting once before the round starts.
+ internal_process_lights(FALSE, TRUE)
+ internal_process_corners(FALSE, TRUE)
+ internal_process_overlays(FALSE, TRUE)
+ return ..()
+
+/datum/controller/subsystem/lighting/fire(resumed = FALSE)
+ var/timer
+ if(!resumed)
+ ASSERT(LAZYLEN(currentrun) == 0) // Santity checks to make sure we don't somehow have items left over from last cycle
+ ASSERT(stage == null) // Or somehow didn't finish all the steps from last cycle
+ stage = SSLIGHTING_STAGE_LIGHTS // Start with Step 1 of course
+
+ if(stage == SSLIGHTING_STAGE_LIGHTS)
+ timer = world.tick_usage
+ internal_process_lights(resumed)
+ cost_lights = MC_AVERAGE(cost_lights, TICK_DELTA_TO_MS(world.tick_usage - timer))
+ if(state != SS_RUNNING)
+ return
+ resumed = 0
+ stage = SSLIGHTING_STAGE_CORNERS
+
+ if(stage == SSLIGHTING_STAGE_CORNERS)
+ timer = world.tick_usage
+ internal_process_corners(resumed)
+ cost_corners = MC_AVERAGE(cost_corners, TICK_DELTA_TO_MS(world.tick_usage - timer))
+ if(state != SS_RUNNING)
+ return
+ resumed = 0
+ stage = SSLIGHTING_STAGE_OVERLAYS
+
+ if(stage == SSLIGHTING_STAGE_OVERLAYS)
+ timer = world.tick_usage
+ internal_process_overlays(resumed)
+ cost_overlays = MC_AVERAGE(cost_overlays, TICK_DELTA_TO_MS(world.tick_usage - timer))
+ if(state != SS_RUNNING)
+ return
+ resumed = 0
+ stage = SSLIGHTING_STAGE_DONE
+
+ // Okay, we're done! Woo! Got thru a whole air_master cycle!
+ ASSERT(LAZYLEN(currentrun) == 0) // Sanity checks to make sure there are really none left
+ ASSERT(stage == SSLIGHTING_STAGE_DONE) // And that we didn't somehow skip past the last step
+ currentrun = null
+ stage = null
+
+/datum/controller/subsystem/lighting/proc/internal_process_lights(resumed = FALSE, init_tick_checks = FALSE)
+ if (!resumed)
+ // We swap out the lists so any additions to the global list during a pause don't make things wierd.
+ src.currentrun = global.lighting_update_lights
+ global.lighting_update_lights = list()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/datum/light_source/L = currentrun[currentrun.len]
+ currentrun.len--
+
+ if(!L) continue
+ if(L.check() || L.destroyed || L.force_update)
+ L.remove_lum()
+ if(!L.destroyed)
+ L.apply_lum()
+
+ else if(L.vis_update) //We smartly update only tiles that became (in) visible to use.
+ L.smart_vis_update()
+
+ L.vis_update = FALSE
+ L.force_update = FALSE
+ L.needs_update = FALSE
+
+ DUAL_TICK_CHECK
+
+/datum/controller/subsystem/lighting/proc/internal_process_corners(resumed = FALSE, init_tick_checks = FALSE)
+ if (!resumed)
+ // We swap out the lists so any additions to the global list during a pause don't make things wierd.
+ src.currentrun = global.lighting_update_corners
+ global.lighting_update_corners = list()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/datum/lighting_corner/C = currentrun[currentrun.len]
+ currentrun.len--
+
+ if(!C) continue
+ C.update_overlays()
+ C.needs_update = FALSE
+
+ DUAL_TICK_CHECK
+
+/datum/controller/subsystem/lighting/proc/internal_process_overlays(resumed = FALSE, init_tick_checks = FALSE)
+ if (!resumed)
+ // We swap out the lists so any additions to the global list during a pause don't make things wierd.
+ src.currentrun = global.lighting_update_overlays
+ global.lighting_update_overlays = list()
+
+ //cache for sanic speed (lists are references anyways)
+ var/list/currentrun = src.currentrun
+ while(currentrun.len)
+ var/atom/movable/lighting_overlay/O = currentrun[currentrun.len]
+ currentrun.len--
+
+ if(!O) continue
+ O.update_overlay()
+ O.needs_update = FALSE
+
+ DUAL_TICK_CHECK
+
+/datum/controller/subsystem/lighting/stat_entry(msg_prefix)
+ var/list/msg = list(msg_prefix)
+ msg += "T:{"
+ msg += "S [total_lighting_sources] | "
+ msg += "C [total_lighting_corners] | "
+ msg += "O [total_lighting_overlays]"
+ msg += "}"
+ msg += "C:{"
+ msg += "S [round(cost_lights, 1)] | "
+ msg += "C [round(cost_corners, 1)] | "
+ msg += "O [round(cost_overlays, 1)]"
+ msg += "}"
+ ..(msg.Join())
+
+#undef DUAL_TICK_CHECK
+#undef SSLIGHTING_STAGE_LIGHTS
+#undef SSLIGHTING_STAGE_CORNERS
+#undef SSLIGHTING_STAGE_OVERLAYS
+#undef SSLIGHTING_STAGE_STATS
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm
index e3e401e2ff..4bb92a543e 100644
--- a/code/game/gamemodes/changeling/powers/cryo_sting.dm
+++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm
@@ -30,20 +30,4 @@
spawn(3 MINUTES)
src << "Our cryogenic string is ready to be used once more."
src.verbs |= /mob/proc/changeling_cryo_sting
- return 1
-
-/datum/reagent/cryotoxin //A much more potent version of frost oil.
- name = "Cryotoxin"
- id = "cryotoxin"
- description = "Rapidly lowers the body's internal temperature."
- reagent_state = LIQUID
- color = "#B31008"
-
-/datum/reagent/cryotoxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_DIONA)
- return
- M.bodytemperature = max(M.bodytemperature - 30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
- if(prob(3))
- M.emote("shiver")
- ..()
- return
\ No newline at end of file
+ return 1
\ No newline at end of file
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index d903499ee0..ccbbb5fea7 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -353,8 +353,8 @@ REAGENT SCANNER
/obj/item/device/slime_scanner
name = "slime scanner"
- icon_state = "adv_spectrometer"
- item_state = "analyzer"
+ icon_state = "xenobio"
+ item_state = "xenobio"
origin_tech = list(TECH_BIO = 1)
w_class = ITEMSIZE_SMALL
flags = CONDUCT
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 9364f1b859..58c5d18ea0 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -8,10 +8,6 @@
* Circular Saw
*/
-/*
- * Retractor
- */
-
/obj/item/weapon/surgical
name = "Surgical tool"
desc = "This shouldn't be here, ahelp it."
@@ -25,10 +21,13 @@
return 0
..()
+/*
+ * Retractor
+ */
+
/obj/item/weapon/surgical/retractor
name = "retractor"
desc = "Retracts stuff."
- icon = 'icons/obj/surgery.dmi'
icon_state = "retractor"
matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000)
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1)
@@ -173,3 +172,33 @@
throw_speed = 3
throw_range = 5
attack_verb = list("attacked", "hit", "bludgeoned")
+
+
+// Cyborg Tools
+
+/obj/item/weapon/surgical/retractor/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/hemostat/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/cautery/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/surgicaldrill/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/scalpel/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/circular_saw/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/bonegel/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/FixOVein/cyborg
+ toolspeed = 0.5
+
+/obj/item/weapon/surgical/bonesetter/cyborg
+ toolspeed = 0.5
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 92b05760b6..6ff7ff8f72 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -312,19 +312,19 @@
/obj/item/weapon/weldingtool/examine(mob/user)
if(..(user, 0))
if(max_fuel)
- user << text("\icon[] [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel )
+ to_chat(user, text("\icon[] The [] contains []/[] units of fuel!", src, src.name, get_fuel(),src.max_fuel ))
/obj/item/weapon/weldingtool/attackby(obj/item/W as obj, mob/living/user as mob)
if(istype(W,/obj/item/weapon/screwdriver))
if(welding)
- user << "Stop welding first!"
+ to_chat(user, "Stop welding first!")
return
status = !status
if(status)
- user << "You secure the welder."
+ to_chat(user, "You secure the welder.")
else
- user << "The welder can now be attached and modified."
+ to_chat(user, "The welder can now be attached and modified.")
src.add_fingerprint(user)
return
@@ -380,16 +380,16 @@
if (istype(O, /obj/structure/reagent_dispensers/fueltank) && get_dist(src,O) <= 1)
if(!welding && max_fuel)
O.reagents.trans_to_obj(src, max_fuel)
- user << "Welder refueled"
+ to_chat(user, "Welder refueled")
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return
else if(!welding)
- user << "[src] doesn't use fuel."
+ to_chat(user, "[src] doesn't use fuel.")
return
else
message_admins("[key_name_admin(user)] triggered a fueltank explosion with a welding tool.")
log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.")
- user << "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done."
+ to_chat(user, "You begin welding on the fueltank and with a moment of lucidity you realize, this might not have been the smartest thing you've ever done.")
var/obj/structure/reagent_dispensers/fueltank/tank = O
tank.explode()
return
@@ -429,7 +429,7 @@
return 1
else
if(M)
- M << "You need more welding fuel to complete this task."
+ to_chat(M, "You need more welding fuel to complete this task.")
update_icon()
return 0
@@ -509,7 +509,7 @@
if(set_welding && !welding)
if (get_fuel() > 0)
if(M)
- M << "You switch the [src] on."
+ to_chat(M, "You switch the [src] on.")
else if(T)
T.visible_message("\The [src] turns on.")
playsound(loc, acti_sound, 50, 1)
@@ -524,14 +524,14 @@
else
if(M)
var/msg = max_fuel ? "welding fuel" : "charge"
- M << "You need more [msg] to complete this task."
+ to_chat(M, "You need more [msg] to complete this task.")
return
//Otherwise
else if(!set_welding && welding)
if(!always_process)
processing_objects -= src
if(M)
- M << "You switch \the [src] off."
+ to_chat(M, "You switch \the [src] off.")
else if(T)
T.visible_message("\The [src] turns off.")
playsound(loc, deac_sound, 50, 1)
@@ -556,29 +556,29 @@
return
switch(safety)
if(1)
- usr << "Your eyes sting a little."
+ to_chat(usr, "Your eyes sting a little.")
E.damage += rand(1, 2)
if(E.damage > 12)
user.eye_blurry += rand(3,6)
if(0)
- usr << "Your eyes burn."
+ to_chat(usr, "Your eyes burn.")
E.damage += rand(2, 4)
if(E.damage > 10)
E.damage += rand(4,10)
if(-1)
- usr << "Your thermals intensify the welder's glow. Your eyes itch and burn severely."
+ to_chat(usr, "Your thermals intensify the welder's glow. Your eyes itch and burn severely.")
user.eye_blurry += rand(12,20)
E.damage += rand(12, 16)
if(safety<2)
if(E.damage > 10)
- user << "Your eyes are really starting to hurt. This can't be good for you!"
+ to_chat(user, "Your eyes are really starting to hurt. This can't be good for you!")
if (E.damage >= E.min_broken_damage)
- user << "You go blind!"
+ to_chat(user, "You go blind!")
user.sdisabilities |= BLIND
else if (E.damage >= E.min_bruised_damage)
- user << "You go blind!"
+ to_chat(user, "You go blind!")
user.Blind(5)
user.eye_blurry = 5
user.disabilities |= NEARSIGHTED
@@ -688,16 +688,19 @@
cell_type = null
/obj/item/weapon/weldingtool/electric/examine(mob/user)
- ..()
- if(power_supply)
- user << text("\icon[] [] has [] charge left.", src, src.name, get_fuel())
- else
- user << text("\icon[] [] has power for no power cell!", src, src.name)
+ if(get_dist(src, user) > 1)
+ to_chat(user, desc)
+ else // The << need to stay, for some reason
+ if(power_supply)
+ user << text("\icon[] The [] has [] charge left.", src, src.name, get_fuel())
+ else
+ user << text("\icon[] The [] has no power cell!", src, src.name)
/obj/item/weapon/weldingtool/electric/get_fuel()
if(use_external_power)
var/obj/item/weapon/cell/external = get_external_power_supply()
- return external.charge
+ if(external)
+ return external.charge
else if(power_supply)
return power_supply.charge
else
@@ -727,7 +730,7 @@
return 1
else
if(M)
- M << "You need more energy to complete this task."
+ to_chat(M, "You need more energy to complete this task.")
update_icon()
return 0
@@ -737,7 +740,7 @@
power_supply.update_icon()
user.put_in_hands(power_supply)
power_supply = null
- user << "You remove the cell from the [src]."
+ to_chat(user, "You remove the cell from the [src].")
setWelding(0)
update_icon()
return
@@ -752,12 +755,12 @@
user.drop_item()
W.loc = src
power_supply = W
- user << "You install a cell in \the [src]."
+ to_chat(user, "You install a cell in \the [src].")
update_icon()
else
- user << "\The [src] already has a cell."
+ to_chat(user, "\The [src] already has a cell.")
else
- user << "\The [src] cannot use that type of cell."
+ to_chat(user, "\The [src] cannot use that type of cell.")
else
..()
@@ -778,6 +781,8 @@
/obj/item/weapon/weldingtool/electric/mounted
use_external_power = 1
+/obj/item/weapon/weldingtool/electric/mounted/cyborg
+ toolspeed = 0.5
/*
* Crowbar
*/
@@ -814,7 +819,7 @@
return ..()
if(!welding)
- user << "You'll need to turn [src] on to patch the damage on [H]'s [S.name]!"
+ to_chat(user, "You'll need to turn [src] on to patch the damage on [H]'s [S.name]!")
return 1
if(S.robo_repair(15, BRUTE, "some dents", src, user))
@@ -878,9 +883,9 @@
/obj/item/weapon/combitool/examine()
..()
if(loc == usr && tools.len)
- usr << "It has the following fittings:"
+ to_chat(usr, "It has the following fittings:")
for(var/obj/item/tool in tools)
- usr << "\icon[tool] - [tool.name][tools[current_tool]==tool?" (selected)":""]"
+ to_chat(usr, "\icon[tool] - [tool.name][tools[current_tool]==tool?" (selected)":""]")
/obj/item/weapon/combitool/New()
..()
@@ -891,9 +896,9 @@
if(++current_tool > tools.len) current_tool = 1
var/obj/item/tool = tools[current_tool]
if(!tool)
- user << "You can't seem to find any fittings in \the [src]."
+ to_chat(user, "You can't seem to find any fittings in \the [src].")
else
- user << "You switch \the [src] to the [tool.name] fitting."
+ to_chat(user, "You switch \the [src] to the [tool.name] fitting.")
return 1
/obj/item/weapon/combitool/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 5738d75779..8ef63e765c 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -159,7 +159,7 @@ var/list/debug_verbs = list (
,/client/proc/hide_debug_verbs
,/client/proc/testZAScolors
,/client/proc/testZAScolors_remove
- ,/client/proc/setup_supermatter_engine
+ ,/datum/admins/proc/setup_supermatter
,/client/proc/atmos_toggle_debug
,/client/proc/spawn_tanktransferbomb
)
diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm
index 690eba9326..e02f976281 100644
--- a/code/modules/lighting/lighting_overlay.dm
+++ b/code/modules/lighting/lighting_overlay.dm
@@ -125,7 +125,7 @@
if (force)
total_lighting_overlays--
global.lighting_update_overlays -= src
- global.lighting_update_overlays_old -= src
+ LAZYREMOVE(SSlighting.currentrun, src)
var/turf/T = loc
if(istype(T))
diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm
index 981de65864..b3e3cf7aa2 100644
--- a/code/modules/lighting/lighting_setup.dm
+++ b/code/modules/lighting/lighting_setup.dm
@@ -1,6 +1,14 @@
+// Create lighting overlays on all turfs with dynamic lighting in areas with dynamic lighting.
/proc/create_all_lighting_overlays()
- for(var/zlevel = 1 to world.maxz)
- create_lighting_overlays_zlevel(zlevel)
+ for(var/area/A in world)
+ if(!A.dynamic_lighting)
+ continue
+ for(var/turf/T in A)
+ if(!T.dynamic_lighting)
+ continue
+ new /atom/movable/lighting_overlay(T, TRUE)
+ CHECK_TICK
+ CHECK_TICK
/proc/create_lighting_overlays_zlevel(var/zlevel)
ASSERT(zlevel)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 8d9becaa4b..a92a639661 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -212,19 +212,20 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src)
- src.modules += new /obj/item/weapon/surgical/scalpel(src)
- src.modules += new /obj/item/weapon/surgical/hemostat(src)
- src.modules += new /obj/item/weapon/surgical/retractor(src)
- src.modules += new /obj/item/weapon/surgical/cautery(src)
- src.modules += new /obj/item/weapon/surgical/bonegel(src)
- src.modules += new /obj/item/weapon/surgical/FixOVein(src)
- src.modules += new /obj/item/weapon/surgical/bonesetter(src)
- src.modules += new /obj/item/weapon/surgical/circular_saw(src)
- src.modules += new /obj/item/weapon/surgical/surgicaldrill(src)
+ src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/hemostat/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/retractor/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/cautery/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bonegel/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/FixOVein/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/bonesetter/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/surgicaldrill/cyborg(src)
src.modules += new /obj/item/weapon/gripper/no_use/organ(src)
src.modules += new /obj/item/weapon/gripper/medical(src)
src.modules += new /obj/item/weapon/shockpaddles/robot(src)
src.modules += new /obj/item/weapon/reagent_containers/dropper(src) // Allows surgeon borg to fix necrosis
+ src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.emag = new /obj/item/weapon/reagent_containers/spray(src)
src.emag.reagents.add_reagent("pacid", 250)
src.emag.name = "Polyacid spray"
@@ -356,7 +357,7 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/rcd/borg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
- src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
+ src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
src.modules += new /obj/item/device/pipe_painter(src)
src.modules += new /obj/item/device/floor_painter(src)
@@ -394,7 +395,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/robot/engineering/general/New()
..()
src.modules += new /obj/item/borg/sight/meson(src)
- src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
+ src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
@@ -708,13 +709,13 @@ var/global/list/robot_modules = list(
src.modules += new /obj/item/weapon/gripper/no_use/loader(src)
src.modules += new /obj/item/device/robotanalyzer(src)
src.modules += new /obj/item/weapon/card/robot(src)
- src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
+ src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
src.modules += new /obj/item/weapon/wirecutters/cyborg(src)
src.modules += new /obj/item/device/multitool(src)
- src.modules += new /obj/item/weapon/surgical/scalpel(src)
- src.modules += new /obj/item/weapon/surgical/circular_saw(src)
+ src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src)
+ src.modules += new /obj/item/weapon/surgical/circular_saw/cyborg(src)
src.modules += new /obj/item/weapon/reagent_containers/syringe(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
src.modules += new /obj/item/weapon/storage/part_replacer(src)
@@ -849,7 +850,7 @@ var/global/list/robot_modules = list(
/obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot)
..()
src.modules += new /obj/item/borg/sight/meson(src)
- src.modules += new /obj/item/weapon/weldingtool/electric/mounted(src)
+ src.modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src)
src.modules += new /obj/item/weapon/screwdriver/cyborg(src)
src.modules += new /obj/item/weapon/wrench/cyborg(src)
src.modules += new /obj/item/weapon/crowbar/cyborg(src)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index bc64f3e764..ef1d854ad3 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1020,11 +1020,18 @@
icon_state = "teshari_mushroom"
species_allowed = list("Teshari")
+
+ vox_quills_long
+ name = "Long Vox Quills"
+ icon_state = "vox_longquills"
+ species_allowed = list("Vox")
+
vox_quills_short
name = "Short Vox Quills"
icon_state = "vox_shortquills"
species_allowed = list("Vox")
+/*
vox_quills_kingly
name = "Kingly Vox Quills"
icon_state = "vox_kingly"
@@ -1034,7 +1041,7 @@
name = "Quill Mohawk"
icon_state = "vox_mohawk"
species_allowed = list("Vox")
-
+*/
/datum/sprite_accessory/facial_hair
taj_sideburns
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 7e0ee4ffb4..3f660ca164 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -284,13 +284,21 @@
/datum/reagent/frostoil/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien == IS_DIONA)
return
- M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 0)
+ M.bodytemperature = max(M.bodytemperature - 10 * TEMPERATURE_DAMAGE_COEFFICIENT, 215)
if(prob(1))
M.emote("shiver")
if(istype(M, /mob/living/simple_animal/slime))
M.bodytemperature = max(M.bodytemperature - rand(10,20), 0)
holder.remove_reagent("capsaicin", 5)
+/datum/reagent/frostoil/cryotoxin //A longer lasting version of frost oil.
+ name = "Cryotoxin"
+ id = "cryotoxin"
+ description = "Lowers the body's internal temperature."
+ reagent_state = LIQUID
+ color = "#B31008"
+ metabolism = REM * 0.5
+
/datum/reagent/capsaicin
name = "Capsaicin Oil"
id = "capsaicin"
diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/supermatter/setup_supermatter.dm
index 01aaeb0a21..559f035cb2 100644
--- a/code/modules/supermatter/setup_supermatter.dm
+++ b/code/modules/supermatter/setup_supermatter.dm
@@ -187,9 +187,15 @@
-// Tries to enable the SMES on max input/output settings. With load balancing it should be fine as long as engine outputs at least ~500kW
+// Tries to enable the SMES on max input/output settings, unless the vars are changed. THIS SHOULD NOT BE PLACED ON THE MAIN SMES OR THE ENGINE WILL OVERHEAT
/obj/effect/engine_setup/smes/
name = "SMES Marker"
+ var/target_input_level //These are in watts, the display is in kilowatts. Add three zeros to the value you want.
+ var/target_output_level //These are in watts, the display is in kilowatts. Add three zeros to the value you want.
+
+/obj/effect/engine_setup/smes/main
+ target_input_level = 750000
+ target_output_level = 750000
/obj/effect/engine_setup/smes/activate()
..()
@@ -199,8 +205,22 @@
return SETUP_WARNING
S.input_attempt = 1
S.output_attempt = 1
- S.input_level = S.input_level_max
- S.output_level = S.output_level_max
+ if(target_input_level)
+ if(target_input_level > S.input_level_max)
+ S.input_level = S.input_level_max
+ else
+ S.input_level = target_input_level
+ else
+ S.input_level = S.input_level_max
+
+ if(target_output_level)
+ if(target_output_level > S.input_level_max)
+ S.output_level = S.output_level_max
+ else
+ S.output_level = target_output_level
+ else
+ S.output_level = S.output_level_max
+
S.update_icon()
return SETUP_OK
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 19007addae..8aab6a0a46 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -127,7 +127,8 @@
// Not staying still fails you too.
if(success)
- if(!do_mob(user, M, rand(S.min_duration, S.max_duration)))
+ var/calc_duration = rand(S.min_duration, S.max_duration)
+ if(!do_mob(user, M, calc_duration * toolspeed))
success = FALSE
to_chat(user, "You must remain close to your patient to conduct surgery.")
diff --git a/html/changelogs/Belsima-Vox.yml b/html/changelogs/Belsima-Vox.yml
new file mode 100644
index 0000000000..1fd839c650
--- /dev/null
+++ b/html/changelogs/Belsima-Vox.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Belsima
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - imageadd: "Vox have been entirely resprited."
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index c19e27ca9d..40e848a1f6 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_def_vox.dmi b/icons/mob/human_races/r_def_vox.dmi
index 2024f52583..037056eef5 100644
Binary files a/icons/mob/human_races/r_def_vox.dmi and b/icons/mob/human_races/r_def_vox.dmi differ
diff --git a/icons/mob/human_races/r_def_vox_old.dmi b/icons/mob/human_races/r_def_vox_old.dmi
new file mode 100644
index 0000000000..2024f52583
Binary files /dev/null and b/icons/mob/human_races/r_def_vox_old.dmi differ
diff --git a/icons/mob/human_races/r_vox.dmi b/icons/mob/human_races/r_vox.dmi
index f212822aaf..ce5a869100 100644
Binary files a/icons/mob/human_races/r_vox.dmi and b/icons/mob/human_races/r_vox.dmi differ
diff --git a/icons/mob/human_races/r_vox_old.dmi b/icons/mob/human_races/r_vox_old.dmi
new file mode 100644
index 0000000000..f212822aaf
Binary files /dev/null and b/icons/mob/human_races/r_vox_old.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index d03cdfca7c..578418352b 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 4a833d744c..5728f1ddf7 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi
index c81f6217a2..384fc15d99 100644
Binary files a/icons/mob/species/vox/eyes.dmi and b/icons/mob/species/vox/eyes.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index 6f272f4d1d..884dfea1f7 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/masks.dmi b/icons/mob/species/vox/masks.dmi
index 58bb8f7f20..6afaa10c22 100644
Binary files a/icons/mob/species/vox/masks.dmi and b/icons/mob/species/vox/masks.dmi differ
diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi
index a5a271f7cb..5bdbcefc54 100644
Binary files a/icons/mob/species/vox/shoes.dmi and b/icons/mob/species/vox/shoes.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 9692c5d111..abca19cc65 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi
index 515595633f..46fe74d39c 100644
Binary files a/icons/mob/species/vox/uniform.dmi and b/icons/mob/species/vox/uniform.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 9d6aee99c4..db0bb55a1f 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 1fbe315f26..b60a19ee63 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -9557,7 +9557,7 @@
"dBO" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_waste)
"dBP" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_waste)
"dBQ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_waste)
-"dBR" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/turf/simulated/floor/plating,/area/engineering/engine_smes)
+"dBR" = (/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/structure/cable,/obj/effect/engine_setup/smes/main,/turf/simulated/floor/plating,/area/engineering/engine_smes)
"dBS" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/power/terminal{dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/button/remote/airlock{id = "engine_electrical_maintenance"; name = "Door Bolt Control"; pixel_x = 26; pixel_y = 0; req_access = list(10); specialfunctions = 4},/turf/simulated/floor/tiled,/area/engineering/engine_smes)
"dBT" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"dBU" = (/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -9624,7 +9624,7 @@
"dDd" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDe" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/alarm/nobreach{dir = 2; pixel_y = 22},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDf" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow,/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Output"; name_tag = "Engine Output"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dDg" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006; input_attempt = 1; input_level = 100000; output_level = 200000; RCon_tag = "Engine - Core"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dDg" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/power/smes/buildable{charge = 2e+006; input_attempt = 1; input_level = 100000; output_level = 200000; RCon_tag = "Engine - Core"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/engine_setup/smes,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDh" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDi" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dDj" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9696,22 +9696,22 @@
"dEx" = (/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/engineering/aft_hallway)
"dEy" = (/turf/simulated/floor,/area/shuttle/constructionsite/station)
"dEz" = (/obj/structure/closet/crate,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station)
-"dEA" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEA" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
-"dEC" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEC" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dED" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"dEE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/engine_room)
"dEF" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEG" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEH" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dEI" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
-"dEJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
+"dEI" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
+"dEJ" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"dEK" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dEL" = (/obj/machinery/atmospherics/valve/digital{dir = 4; name = "Emergency Cooling Valve 1"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEN" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
-"dEO" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
-"dEP" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
+"dEO" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
+"dEP" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"dEQ" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 5},/turf/space,/area/space)
"dER" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/space,/area/space)
"dES" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -9745,7 +9745,7 @@
"dFu" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFw" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
-"dFx" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dFx" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/engine_setup/pump_max,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFz" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/space,/area/space)
"dFA" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/camera/network/northern_star{c_tag = "DOCK - Dock 1 End"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "trade_shuttle_dock_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -9762,8 +9762,8 @@
"dFL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/cee,/turf/simulated/floor/plating,/area/maintenance/starboardsolar)
"dFM" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/aft_hallway)
"dFN" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
-"dFO" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor,/area/engineering/engine_room)
-"dFP" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor,/area/engineering/engine_room)
+"dFO" = (/obj/machinery/atmospherics/binary/pump,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
+"dFP" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/portable_atmospherics/canister/empty,/obj/effect/engine_setup/empty_canister,/turf/simulated/floor,/area/engineering/engine_room)
"dFQ" = (/obj/machinery/atmospherics/pipe/cap/visible,/turf/simulated/floor,/area/engineering/engine_room)
"dFR" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dFS" = (/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9812,7 +9812,7 @@
"dGJ" = (/turf/space,/area/shuttle/administration/station)
"dGK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/starboard)
"dGL" = (/obj/machinery/light{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
-"dGM" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/engineering/engine_room)
+"dGM" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"dGN" = (/obj/machinery/atmospherics/unary/heat_exchanger{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"dGO" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dGP" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9828,7 +9828,7 @@
"dGZ" = (/obj/machinery/atmospherics/unary/heat_exchanger,/turf/simulated/floor,/area/engineering/engine_room)
"dHa" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
-"dHc" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
+"dHc" = (/obj/machinery/power/supermatter{layer = 4},/obj/machinery/mass_driver{id = "enginecore"},/obj/effect/engine_setup/core,/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
"dHd" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"dHe" = (/obj/machinery/power/generator{anchored = 1; dir = 4},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dHf" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 6},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -10111,10 +10111,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndz
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxdAXdDUdDUdDUdAXdADdDVdDWdDXdDYdDZdEadEbdEcdEddEedEddEddEddEddEddEfdEgdDrdDrdADdCGdCHdDvdDsdCHdCJaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadprdiQdpsdptdpudiRdiRdiRdiRdiRdiQdiQdEhdEidEidiQdiQaaaaaaaaaaaaaaaaaadkbdkbdkbdkbdkbaaaaaaaaaaaaaaaaaadiWdiWdEjdEjdEkdiWdiWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadjddjddEldEmdEmdjddjdaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdjidjidEndEodEpdjiaafaaidAPdCQdEqdCQdAPdCSdErdCSdAPaaiaaiaafaafaafaafdEsdEtdEudEvdEwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidExdBJdEydEydEzdBJdADdDVdDWdEAdEBdECdEDdEEdEEdEFdEGdEHdEIdEJdEKdELdEMdENdEOdEPdADdEQdCHdDtdDudCHdERaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaadjVdESdETdEUdjVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkcdEVdEWdEXdkcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkidEYdEZdFadkiaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdFbdFcdFddFedFfdkoaaiaaiaaidCQdFgdCQaaadCSdFhdCSaaiaaiaaiaaiaaiaaiabxabxdFidFjdFiaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkaaaaaadFkaaaaaaaaadFkaaaaaaaaaaaaaaadFkaaaaaaaaadFkaaaaaadFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiduodAWdAXdBJdAXdAWdADdDVdDWdFldFmdFndDVdDVdDVdFodFpdFqdFrdFrdFsdFtdFudFvdFwdFxdFydFzdCIdDvdDsdCIdDtaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadledFAdDAdFBdleaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnQdFCdDDdFDdnQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnVdFEdDKdFFdnVaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdFGdFHdFIdFJdFKdnZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaaaaaaaaaaeaaeaaadFidFLdFiaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkaaaaaaaaadFkdFkdFkdFkdFkdFkdFkaaaaaaaaadFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFMduodExabxdExduodADdFNdDWdFOdFPdFQdDVdFRdFSdFTdFUdFVdFWdFXdFYdFZdGadGbdGcdGddGedFzdCHdDtdDudCHdERaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGfdmbdGgdGhdljaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdGidGjdrrdGkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGldrwdGmdGndlpaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdrCdrDdGodrDdrDdGpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaadGqdGrdGqaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkaaaaaaaaadFkdFkdFkdFkdFkdFkdFkaaaaaaaaadFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFMduodExabxdExduodADdFNdDWdFPdFOdFQdDVdFRdFSdFTdFUdFVdFWdFXdFYdFZdGadGbdGcdGddGedFzdCHdDtdDudCHdERaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGfdmbdGgdGhdljaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdGidGjdrrdGkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGldrwdGmdGndlpaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdrCdrDdGodrDdrDdGpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaadGqdGrdGqaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaadFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaidGsaaiaaidADdGtdFldGudGvdGwdDVdGxdADdGydGzdGAdADdGBdGCdGDdGEdGFdGGdGHdADdCGdCHdDvdDsdCHdCJaccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIaaaaaaaaaaaadGIdGIdGIdGIdGIaaaaaaaaaaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaeaaeaaaaaaaaaaaadGKaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaadFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaidADdGLdDVdGMdGNdGNdDVdGOdGPdGQdGRdGSdGPdGTdGUdFtdFudGVdGWdGXdADdDsdCIdDtdDudCIdDvaccaaaaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIaaaaaadGIdGIdGIdGIdGIdGIaaaaaaaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaadGYaaaaaaaaaaaaaaaaaeaaeaaaaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaadADdDVdDVdFPdGZdGZdDVdGOdHadHbdHcdHddHadGTdGOdFZdHedGbdHfdHgdADdCGdCHdDvdDsdCHdCJaccaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaccaccdAGaaeaaeaaeaaedGYaaeaaeaaeaaeaaeaazaccaccaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaadADdDVdDVdFOdGZdGZdDVdGOdHadHbdHcdHddHadGTdGOdFZdHedGbdHfdHgdADdCGdCHdDvdDsdCHdCJaccaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaccaccdAGaaeaaeaaeaaedGYaaeaaeaaeaaeaaeaazaccaccaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaadADdADdDVdHhdGvdGvdHidGOdHjdHkdHldHmdHjdHndHodHpdHqdHrdHsdADdADdEQdCHdDtdDudCHdERaccaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaeaaaaaeaaaaaaaaadGYaaaaaeaaeaaaaaaaaaaaaaccaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadAGaaaaaaaaadADdADdHtdHudHtdHtdADdADdADdHvdADdADdADdADdADdHwdADdADdADaaedDudCIdDvdDsdCIdDtaccaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaadHxdHxdHxdHxdHxaaedGYaaedHxdHxdHxdHxdHxaaaaccaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadzndzndzndzndzndzndzndzndzndzndzndzndzndzndznaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkdFkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaccaaaaaaaaaaaadHydHydHydHyaaeaaedHzaaadHzaaeaaaaaeaaaaaaaaeaaaaaaaaedEQdCHdDtdDudCHdERaccaaaaaaaaaaaaaaaaaaaaadGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIdGIaaaaaaaaadGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJdGJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXdwXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaedHAdHBdHBdHBdHBdHCdHDdHCdHEdHEdHEdHEdHFaaeaccaaaaaaaaaaaaaaaaaadvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedvedveaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm
index 5650ad5554..40f3d4ef40 100644
--- a/maps/southern_cross/southern_cross_defines.dm
+++ b/maps/southern_cross/southern_cross_defines.dm
@@ -149,4 +149,11 @@
..()
teleport_x = src.x
teleport_y = 2
- teleport_z = Z_LEVEL_SURFACE
\ No newline at end of file
+ teleport_z = Z_LEVEL_SURFACE
+
+/datum/planet/sif
+ expected_z_levels = list(
+ Z_LEVEL_SURFACE,
+ Z_LEVEL_SURFACE_MINE,
+ Z_LEVEL_SURFACE_WILD
+ )
\ No newline at end of file
diff --git a/polaris.dme b/polaris.dme
index 35278a892c..df0a5c9089 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -155,7 +155,6 @@
#include "code\controllers\Processes\event.dm"
#include "code\controllers\Processes\game_master.dm"
#include "code\controllers\Processes\inactivity.dm"
-#include "code\controllers\Processes\lighting.dm"
#include "code\controllers\Processes\machinery.dm"
#include "code\controllers\Processes\mob.dm"
#include "code\controllers\Processes\nanoui.dm"
@@ -173,6 +172,7 @@
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\controllers\subsystems\creation.dm"
#include "code\controllers\subsystems\garbage.dm"
+#include "code\controllers\subsystems\lighting.dm"
#include "code\datums\ai_law_sets.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\browser.dm"
@@ -2265,7 +2265,6 @@
#include "interface\interface.dm"
#include "interface\skin.dmf"
#include "maps\northern_star\northern_star.dm"
-#include "maps\northern_star\northern_star_defines.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\cave_submaps\cave.dm"
#include "maps\submaps\space_submaps\space.dm"