diff --git a/.gitconfig b/.gitconfig
index de5ff6f2542..cd4cf17954b 100644
--- a/.gitconfig
+++ b/.gitconfig
@@ -2,4 +2,3 @@
name = mapmerge driver
driver = ./mapmerge.sh %O %A %B
recursive = text
-
diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 7ad84b4a79d..88f4309e360 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -6,6 +6,7 @@
#define NO_SLIP 0x10 // Cannot fall over.
#define NO_POISON 0x20 // Cannot not suffer toxloss.
#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it.
+#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever
// unused: 0x8000 - higher than this will overflow
// Species spawn flags
diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm
index e36ce7bd3ad..c8e8130adc0 100644
--- a/code/game/gamemodes/technomancer/devices/shield_armor.dm
+++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm
@@ -14,11 +14,11 @@
desc = "This armor has no inherent ability to absorb shock, as normal armor usually does. Instead, this emits a strong field \
around the wearer, designed to protect from most forms of harm, from lasers to bullets to close quarters combat. It appears to \
require a very potent supply of an energy of some kind in order to function."
- icon_state = "reactiveoff" //wip
- item_state = "reactiveoff"
+ icon_state = "shield_armor_0"
blood_overlay_type = "armor"
slowdown = 0
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ action_button_name = "Toggle Shield Projector"
var/active = 0
var/damage_to_energy_multiplier = 50.0 //Determines how much energy to charge for blocking, e.g. 20 damage attack = 750 energy cost
var/datum/effect/effect/system/spark_spread/spark_system = null
@@ -49,7 +49,7 @@
var/damage_to_energy_cost = (damage_to_energy_multiplier * damage_blocked)
if(!user.technomancer_pay_energy(damage_to_energy_cost))
- user << "Your shield fades due to lack of energy!"
+ to_chat(user, "Your shield fades due to lack of energy!")
active = 0
update_icon()
return 0
@@ -67,7 +67,7 @@
P.damage = P.damage - damage_blocked
user.visible_message("\The [user]'s [src] absorbs [attack_text]!")
- user << "Your shield has absorbed most of \the [damage_source]."
+ to_chat(user, "Your shield has absorbed most of \the [damage_source].")
spark_system.start()
playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1)
@@ -75,14 +75,17 @@
/obj/item/clothing/suit/armor/shield/attack_self(mob/user)
active = !active
- user << "You [active ? "" : "de"]active \the [src]."
+ to_chat(user, "You [active ? "" : "de"]activate \the [src].")
update_icon()
+ user.update_inv_wear_suit()
+ user.update_action_buttons()
/obj/item/clothing/suit/armor/shield/update_icon()
+ icon_state = "shield_armor_[active]"
+ item_state = "shield_armor_[active]"
if(active)
- icon_state = "shield_armor"
set_light(2, 1, l_color = "#006AFF")
else
- icon_state = "shield_armor_off"
set_light(0, 0, l_color = "#000000")
+ ..()
return
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm
index 2e9a60a8e63..56f2085850d 100644
--- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm
+++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm
@@ -10,55 +10,70 @@
/obj/item/clothing/suit/armor/tesla
name = "tesla armor"
desc = "This rather dangerous looking armor will hopefully shock your enemies, and not you in the process."
- icon_state = "reactive" //wip
- item_state = "reactive"
+ icon_state = "tesla_armor_1" //wip
blood_overlay_type = "armor"
slowdown = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ action_button_name = "Toggle Tesla Armor"
+ var/active = 1 //Determines if the armor will zap or block
var/ready = 1 //Determines if the next attack will be blocked, as well if a strong lightning bolt is sent out at the attacker.
- var/ready_icon_state = "reactive" //also wip
- var/normal_icon_state = "reactiveoff"
+ var/ready_icon_state = "tesla_armor_1" //also wip
+ var/normal_icon_state = "tesla_armor_0"
var/cooldown_to_charge = 15 SECONDS
/obj/item/clothing/suit/armor/tesla/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
//First, some retaliation.
- if(istype(damage_source, /obj/item/projectile))
- var/obj/item/projectile/P = damage_source
- if(P.firer && get_dist(user, P.firer) <= 3)
- if(ready)
- shoot_lightning(P.firer, 40)
- else
- shoot_lightning(P.firer, 15)
-
- else
- if(attacker && attacker != user)
- if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at.
+ if(active)
+ if(istype(damage_source, /obj/item/projectile))
+ var/obj/item/projectile/P = damage_source
+ if(P.firer && get_dist(user, P.firer) <= 3)
if(ready)
- shoot_lightning(attacker, 40)
+ shoot_lightning(P.firer, 40)
else
- shoot_lightning(attacker, 15)
+ shoot_lightning(P.firer, 15)
- //Deal with protecting our wearer now.
- if(ready)
- ready = 0
- spawn(cooldown_to_charge)
- ready = 1
+ else
+ if(attacker && attacker != user)
+ if(get_dist(user, attacker) <= 3) //Anyone farther away than three tiles is too far to shoot lightning at.
+ if(ready)
+ shoot_lightning(attacker, 40)
+ else
+ shoot_lightning(attacker, 15)
+
+ //Deal with protecting our wearer now.
+ if(ready)
+ ready = 0
+ spawn(cooldown_to_charge)
+ ready = 1
+ update_icon()
+ to_chat(user, "\The [src] is ready to protect you once more.")
+ visible_message("\The [user]'s [src.name] blocks [attack_text]!")
update_icon()
- user << "\The [src] is ready to protect you once more."
- visible_message("\The [user]'s [src.name] blocks [attack_text]!")
- update_icon()
- return 1
+ return 1
return 0
+/obj/item/clothing/suit/armor/tesla/attack_self(mob/user)
+ active = !active
+ to_chat(user, "You [active ? "" : "de"]activate \the [src].")
+ update_icon()
+ user.update_inv_wear_suit()
+ user.update_action_buttons()
+
/obj/item/clothing/suit/armor/tesla/update_icon()
- ..()
- if(ready)
+ if(active && ready)
icon_state = ready_icon_state
+ item_state = ready_icon_state
+ set_light(2, 1, l_color = "#006AFF")
else
icon_state = normal_icon_state
+ item_state = normal_icon_state
+ set_light(0, 0, l_color = "#000000")
+
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.update_inv_wear_suit(0)
+ H.update_action_buttons()
+ ..()
/obj/item/clothing/suit/armor/tesla/proc/shoot_lightning(var/mob/target, var/power)
var/obj/item/projectile/beam/lightning/lightning = new(src)
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index 62d7e7b311c..8eec816a50c 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -102,7 +102,16 @@
flashfail = 1
else if(issilicon(M))
- M.Weaken(rand(5,10))
+ flashfail = 0
+ var/mob/living/silicon/S = M
+ if(isrobot(S))
+ var/mob/living/silicon/robot/R = S
+ if(R.has_active_type(/obj/item/borg/combat/shield))
+ var/obj/item/borg/combat/shield/shield = locate() in R
+ if(shield)
+ if(shield.active)
+ shield.adjust_flash_count(R, 1)
+ flashfail = 1
else
flashfail = 1
@@ -125,6 +134,7 @@
else
user.visible_message("[user] overloads [M]'s sensors with the flash!")
+ M.Weaken(rand(5,10))
else
user.visible_message("[user] fails to blind [M] with the flash!")
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 17bb6b84beb..0b4700ca6a7 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -25,7 +25,7 @@
return
if ((CLUMSY in user.mutations) && prob(50))
- user << "Uh ... how do those things work?!"
+ to_chat(user, "Uh ... how do those things work?!")
place_handcuffs(user, user)
return
@@ -38,7 +38,7 @@
if(can_place(C, user))
place_handcuffs(C, user)
else
- user << "You need to have a firm grip on [C] before you can put \the [src] on!"
+ to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!")
/obj/item/weapon/handcuffs/proc/can_place(var/mob/target, var/mob/user)
if(user == target)
@@ -60,11 +60,11 @@
return 0
if (!H.has_organ_for_slot(slot_handcuffed))
- user << "\The [H] needs at least two wrists before you can cuff them together!"
+ to_chat(user, "\The [H] needs at least two wrists before you can cuff them together!")
return 0
if(istype(H.gloves,/obj/item/clothing/gloves/gauntlets/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
- user << "\The [src] won't fit around \the [H.gloves]!"
+ to_chat(user, "\The [src] won't fit around \the [H.gloves]!")
return 0
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
@@ -166,7 +166,7 @@ var/last_chew = 0
if (R.use(1))
var/obj/item/weapon/material/wirerod/W = new(get_turf(user))
user.put_in_hands(W)
- user << "You wrap the cable restraint around the top of the rod."
+ to_chat(user, "You wrap the cable restraint around the top of the rod.")
qdel(src)
update_icon(user)
@@ -188,7 +188,7 @@ var/last_chew = 0
desc = "Use this to keep prisoners in line."
gender = PLURAL
icon = 'icons/obj/items.dmi'
- icon_state = "handcuff"
+ icon_state = "legcuff"
flags = CONDUCT
throwforce = 0
w_class = ITEMSIZE_NORMAL
@@ -204,7 +204,7 @@ var/last_chew = 0
return
if ((CLUMSY in user.mutations) && prob(50))
- user << "Uh ... how do those things work?!"
+ to_chat(user, "Uh ... how do those things work?!")
place_legcuffs(user, user)
return
@@ -217,7 +217,7 @@ var/last_chew = 0
if(can_place(C, user))
place_legcuffs(C, user)
else
- user << "You need to have a firm grip on [C] before you can put \the [src] on!"
+ to_chat(user, "You need to have a firm grip on [C] before you can put \the [src] on!")
/obj/item/weapon/handcuffs/legcuffs/proc/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
playsound(src.loc, cuff_sound, 30, 1, -2)
@@ -227,11 +227,11 @@ var/last_chew = 0
return 0
if (!H.has_organ_for_slot(slot_legcuffed))
- user << "\The [H] needs at least two ankles before you can cuff them together!"
+ to_chat(user, "\The [H] needs at least two ankles before you can cuff them together!")
return 0
if(istype(H.shoes,/obj/item/clothing/shoes/magboots/rig) && !elastic) // Can't cuff someone who's in a deployed hardsuit.
- user << "\The [src] won't fit around \the [H.shoes]!"
+ to_chat(user, "\The [src] won't fit around \the [H.shoes]!")
return 0
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm
new file mode 100644
index 00000000000..f50416b05da
--- /dev/null
+++ b/code/game/objects/items/weapons/material/gravemarker.dm
@@ -0,0 +1,80 @@
+/obj/item/weapon/material/gravemarker
+ name = "grave marker"
+ desc = "An object used in marking graves."
+ icon_state = "gravemarker"
+ w_class = ITEMSIZE_LARGE
+ fragile = 1
+ force_divisor = 0.65
+ thrown_force_divisor = 0.25
+
+ var/icon_changes = 1 //Does the sprite change when you put words on it?
+ var/grave_name = "" //Name of the intended occupant
+ var/epitaph = "" //A quick little blurb
+
+/obj/item/weapon/material/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
+ if(carving_1)
+ user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
+ grave_name += carving_1
+ update_icon()
+ var/carving_2 = sanitizeSafe(input(user, "What message should \the [src.name] have?", "Epitaph Carving", null) as text, MAX_NAME_LEN)
+ if(carving_2)
+ user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
+ epitaph += carving_2
+ update_icon()
+ if(istype(W, /obj/item/weapon/wrench))
+ user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ material.place_dismantled_product(get_turf(src))
+ user.visible_message("[user] dismantles down \the [src.name].", "You dismantle \the [src.name].")
+ qdel(src)
+ ..()
+
+/obj/item/weapon/material/gravemarker/examine(mob/user)
+ ..()
+ if(get_dist(src, user) < 4)
+ if(grave_name)
+ to_chat(user, "Here Lies [grave_name]")
+ if(get_dist(src, user) < 2)
+ if(epitaph)
+ to_chat(user, epitaph)
+
+/obj/item/weapon/material/gravemarker/update_icon()
+ if(icon_changes)
+ if(grave_name && epitaph)
+ icon_state = "[initial(icon_state)]_3"
+ else if(grave_name)
+ icon_state = "[initial(icon_state)]_1"
+ else if(epitaph)
+ icon_state = "[initial(icon_state)]_2"
+ else
+ icon_state = initial(icon_state)
+
+ ..()
+
+/obj/item/weapon/material/gravemarker/attack_self(mob/user)
+ src.add_fingerprint(user)
+
+ if(!isturf(user.loc))
+ return 0
+
+ if(locate(/obj/structure/gravemarker, user.loc))
+ to_chat(user, "There's already something there.")
+ return 0
+ else
+ to_chat(user, "You begin to place \the [src.name].")
+ if(!do_after(usr, 10))
+ return 0
+ var/obj/structure/gravemarker/G = new /obj/structure/gravemarker/(user.loc, src.get_material())
+ to_chat(user, "You place \the [src.name].")
+ G.grave_name = grave_name
+ G.epitaph = epitaph
+ G.add_fingerprint(usr)
+ G.dir = user.dir
+ qdel_null(src)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 0dec82fe17c..38130f27395 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -241,6 +241,50 @@
new /obj/item/device/multitool/alien(src)
new /obj/item/stack/cable_coil/alien(src)
+/obj/item/weapon/storage/belt/medical/alien
+ name = "alien belt"
+ desc = "A belt(?) that can hold things."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "belt"
+ item_state = "security"
+ can_hold = list(
+ /obj/item/device/healthanalyzer,
+ /obj/item/weapon/dnainjector,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+ /obj/item/weapon/reagent_containers/pill,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/flame/lighter/zippo,
+ /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/storage/pill_bottle,
+ /obj/item/stack/medical,
+ /obj/item/device/radio/headset,
+ /obj/item/device/pda,
+ /obj/item/taperoll,
+ /obj/item/device/megaphone,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/clothing/head/surgery,
+ /obj/item/clothing/gloves,
+ /obj/item/weapon/reagent_containers/hypospray,
+ /obj/item/clothing/glasses,
+ /obj/item/weapon/crowbar,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/cell/device,
+ /obj/item/weapon/extinguisher/mini,
+ /obj/item/weapon/surgical
+ )
+
+/obj/item/weapon/storage/belt/medical/alien/New()
+ ..()
+ new /obj/item/weapon/surgical/scalpel/alien(src)
+ new /obj/item/weapon/surgical/hemostat/alien(src)
+ new /obj/item/weapon/surgical/retractor/alien(src)
+ new /obj/item/weapon/surgical/circular_saw/alien(src)
+ new /obj/item/weapon/surgical/FixOVein/alien(src)
+ new /obj/item/weapon/surgical/bone_clamp/alien(src)
+ new /obj/item/weapon/surgical/cautery/alien(src)
+
/obj/item/weapon/storage/belt/champion
name = "championship belt"
desc = "Proves to the world that you are the strongest!"
diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 58c5d18ea06..96f5e30f693 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -166,13 +166,22 @@
/obj/item/weapon/surgical/bonesetter
name = "bone setter"
desc = "Put them in their place."
- icon_state = "bone setter"
+ icon_state = "bone_setter"
force = 8.0
throwforce = 9.0
throw_speed = 3
throw_range = 5
attack_verb = list("attacked", "hit", "bludgeoned")
+/obj/item/weapon/surgical/bone_clamp
+ name = "bone clamp"
+ desc = "The best way to get a bone fixed fast."
+ icon_state = "bone_clamp"
+ force = 8
+ throwforce = 9
+ throw_speed = 3
+ throw_range = 5
+ attack_verb = list("attacked", "hit", "bludgeoned")
// Cyborg Tools
@@ -201,4 +210,38 @@
toolspeed = 0.5
/obj/item/weapon/surgical/bonesetter/cyborg
- toolspeed = 0.5
\ No newline at end of file
+ toolspeed = 0.5
+
+
+// Alien Tools
+/obj/item/weapon/surgical/retractor/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/hemostat/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/cautery/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/surgicaldrill/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/scalpel/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/circular_saw/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/FixOVein/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.25
+
+/obj/item/weapon/surgical/bone_clamp/alien
+ icon = 'icons/obj/abductor.dmi'
+ toolspeed = 0.75
\ No newline at end of file
diff --git a/code/game/objects/structures/gravemarker.dm b/code/game/objects/structures/gravemarker.dm
new file mode 100644
index 00000000000..a10cd0bf6ea
--- /dev/null
+++ b/code/game/objects/structures/gravemarker.dm
@@ -0,0 +1,137 @@
+/obj/structure/gravemarker
+ name = "grave marker"
+ desc = "An object used in marking graves."
+ icon_state = "gravemarker"
+
+ density = 1
+ anchored = 1
+ throwpass = 1
+ climbable = 1
+
+ layer = 3.1 //Above dirt piles
+
+ //Maybe make these calculate based on material?
+ var/health = 100
+
+ var/grave_name = "" //Name of the intended occupant
+ var/epitaph = "" //A quick little blurb
+// var/dir_locked = 0 //Can it be spun? Not currently implemented
+
+ var/material/material
+
+/obj/structure/gravemarker/New(var/newloc, var/material_name)
+ ..(newloc)
+ if(!material_name)
+ material_name = "wood"
+ material = get_material_by_name("[material_name]")
+ if(!material)
+ qdel(src)
+ return
+ color = material.icon_colour
+
+/obj/structure/gravemarker/examine(mob/user)
+ ..()
+ if(get_dist(src, user) < 4)
+ if(grave_name)
+ to_chat(user, "Here Lies [grave_name]")
+ if(get_dist(src, user) < 2)
+ if(epitaph)
+ to_chat(user, epitaph)
+
+/obj/structure/gravemarker/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(!mover)
+ return 1
+ if(istype(mover) && mover.checkpass(PASSTABLE))
+ return 1
+ if(get_dir(loc, target) & dir)
+ return !density
+ else
+ return 1
+
+/obj/structure/gravemarker/CheckExit(atom/movable/O as mob|obj, target as turf)
+ if(istype(O) && O.checkpass(PASSTABLE))
+ return 1
+ if(get_dir(O.loc, target) == dir)
+ return 0
+ return 1
+
+/obj/structure/gravemarker/attackby(obj/item/weapon/W, mob/user as mob)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ var/carving_1 = sanitizeSafe(input(user, "Who is \the [src.name] for?", "Gravestone Naming", null) as text, MAX_NAME_LEN)
+ if(carving_1)
+ user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
+ grave_name += carving_1
+ update_icon()
+ var/carving_2 = sanitizeSafe(input(user, "What message should \the [src.name] have?", "Epitaph Carving", null) as text, MAX_NAME_LEN)
+ if(carving_2)
+ user.visible_message("[user] starts carving \the [src.name].", "You start carving \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ user.visible_message("[user] carves something into \the [src.name].", "You carve your message into \the [src.name].")
+ epitaph += carving_2
+ update_icon()
+ return
+ if(istype(W, /obj/item/weapon/wrench))
+ user.visible_message("[user] starts taking down \the [src.name].", "You start taking down \the [src.name].")
+ if(do_after(user, material.hardness * W.toolspeed))
+ user.visible_message("[user] takes down \the [src.name].", "You take down \the [src.name].")
+ dismantle()
+ ..()
+
+/obj/structure/gravemarker/bullet_act(var/obj/item/projectile/Proj)
+ var/proj_damage = Proj.get_structure_damage()
+ if(!proj_damage)
+ return
+
+ ..()
+ damage(proj_damage)
+
+ return
+
+/obj/structure/gravemarker/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ visible_message("\The [src] is blown apart!")
+ qdel(src)
+ return
+ if(2.0)
+ visible_message("\The [src] is blown apart!")
+ if(prob(50))
+ dismantle()
+ else
+ qdel(src)
+ return
+
+/obj/structure/gravemarker/proc/damage(var/damage)
+ health -= damage
+ if(health <= 0)
+ visible_message("\The [src] falls apart!")
+ dismantle()
+
+/obj/structure/gravemarker/proc/dismantle()
+ material.place_dismantled_product(get_turf(src))
+ qdel(src)
+ return
+
+
+/obj/structure/gravemarker/verb/rotate()
+ set name = "Rotate Grave Marker"
+ set category = "Object"
+ set src in oview(1)
+
+ if(anchored)
+ return
+ if(config.ghost_interaction)
+ src.set_dir(turn(src.dir, 90))
+ return
+ else
+ if(istype(usr,/mob/living/simple_animal/mouse))
+ return
+ if(!usr || !isturf(usr.loc))
+ return
+ if(usr.stat || usr.restrained())
+ return
+
+ src.set_dir(turn(src.dir, 90))
+ return
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index bcc750a13bd..bb2768d69d7 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -209,7 +209,8 @@ var/list/admin_verbs_debug = list(
/datum/admins/proc/view_runtimes,
/client/proc/show_gm_status,
/datum/admins/proc/change_weather,
- /datum/admins/proc/change_time
+ /datum/admins/proc/change_time,
+ /client/proc/admin_give_modifier
)
var/list/admin_verbs_paranoid_debug = list(
diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm
index 099aa439787..b86471bf844 100644
--- a/code/modules/clothing/chameleon.dm
+++ b/code/modules/clothing/chameleon.dm
@@ -401,7 +401,7 @@
desc = "A hologram projector in the shape of a gun. There is a dial on the side to change the gun's disguise."
icon_state = "deagle"
w_class = ITEMSIZE_NORMAL
- origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8)
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
matter = list()
fire_sound = 'sound/weapons/Gunshot.ogg'
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 12e264135eb..99abbe2e12d 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -11,6 +11,7 @@
recipes += new/datum/stack_recipe("[display_name] ashtray", /obj/item/weapon/material/ashtray, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]")
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index d9312966d66..0d5b6ada6c0 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -261,8 +261,8 @@
src.brainmob.ckey = candidate.ckey
src.name = "[name] ([src.brainmob.name])"
src.brainmob << "You are a [src], brought into existence on [station_name()]."
- src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
- src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
+ src.brainmob << "As a synthetic intelligence, you are designed with organic values in mind."
+ src.brainmob << "However, unless placed in a lawed chassis, you are not obligated to obey any individual crew member." //it's not like they can hurt anyone
// src.brainmob << "Use say #b to speak to other artificial intelligences."
src.brainmob.mind.assigned_role = "Synthetic Brain"
@@ -281,7 +281,7 @@
/obj/item/device/mmi/digital/robot/New()
..()
- src.brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN"))]-[rand(1000, 9999)]"
+ src.brainmob.name = "[pick(list("ADA","DOS","GNU","MAC","WIN","NJS","SKS","DRD","IOS","CRM","IBM","TEX","LVM","BSD",))]-[rand(1000, 9999)]"
src.brainmob.real_name = src.brainmob.name
src.name = "robotic intelligence circuit ([src.brainmob.name])"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 9a82518794d..96f5dddc424 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -233,7 +233,7 @@
set_light(0)
else
if(species.appearance_flags & RADIATION_GLOWS)
- set_light(max(1,min(10,radiation/10)), max(1,min(20,radiation/20)), species.get_flesh_colour(src))
+ set_light(max(1,min(5,radiation/15)), max(1,min(10,radiation/25)), species.get_flesh_colour(src))
// END DOGSHIT SNOWFLAKE
var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in internal_organs
@@ -248,6 +248,10 @@
updatehealth()
return
+ var/obj/item/organ/internal/brain/slime/core = locate() in internal_organs
+ if(core)
+ return
+
var/damage = 0
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
if(prob(25))
@@ -903,7 +907,7 @@
Paralyse(3)
if(hallucination)
- if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT)) )
+ if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT|NO_HALLUCINATION)) )
if(prob(3))
fake_attack(src)
if(!handling_hal)
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index 11384984d48..cc656dccba4 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -20,7 +20,7 @@ var/datum/species/shapeshifter/promethean/prometheans
bump_flag = SLIME
swap_flags = MONKEY|SLIME|SIMPLE_ANIMAL
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
- flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT
+ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | RADIATION_GLOWS | HAS_UNDERWEAR
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED
health_hud_intensity = 2
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 190649129f8..f516486f026 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -715,7 +715,9 @@
overlays += "[panelprefix]-openpanel -c"
if(has_active_type(/obj/item/borg/combat/shield))
- overlays += "[module_sprites[icontype]]-shield"
+ var/obj/item/borg/combat/shield/shield = locate() in src
+ if(shield && shield.active)
+ overlays += "[module_sprites[icontype]]-shield"
if(modtype == "Combat")
if(module_active && istype(module_active,/obj/item/borg/combat/mobility))
diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm
index fd446ef3ec2..b1436f423ec 100644
--- a/code/modules/mob/living/silicon/robot/robot_damage.dm
+++ b/code/modules/mob/living/silicon/robot/robot_damage.dm
@@ -70,7 +70,7 @@
//Combat shielding absorbs a percentage of damage directly into the cell.
if(has_active_type(/obj/item/borg/combat/shield))
var/obj/item/borg/combat/shield/shield = locate() in src
- if(shield)
+ if(shield && shield.active)
//Shields absorb a certain percentage of damage based on their power setting.
var/absorb_brute = brute*shield.shield_level
var/absorb_burn = burn*shield.shield_level
diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm
index 4a68510aed6..953010c33ea 100644
--- a/code/modules/mob/living/silicon/robot/robot_items.dm
+++ b/code/modules/mob/living/silicon/robot/robot_items.dm
@@ -298,11 +298,54 @@
desc = "A powerful experimental module that turns aside or absorbs incoming attacks at the cost of charge."
icon = 'icons/obj/decals.dmi'
icon_state = "shock"
- var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
+ var/shield_level = 0.5 //Percentage of damage absorbed by the shield.
+ var/active = 1 //If the shield is on
+ var/flash_count = 0 //Counter for how many times the shield has been flashed
+ var/overload_threshold = 3 //Number of flashes it takes to overload the shield
+ var/shield_refresh = 15 SECONDS //Time it takes for the shield to reboot after destabilizing
+ var/overload_time = 0 //Stores the time of overload
+ var/last_flash = 0 //Stores the time of last flash
+
+/obj/item/borg/combat/shield/New()
+ processing_objects.Add(src)
+ ..()
+
+/obj/item/borg/combat/shield/Destroy()
+ processing_objects.Remove(src)
+ ..()
/obj/item/borg/combat/shield/attack_self(var/mob/living/user)
set_shield_level()
+/obj/item/borg/combat/shield/process()
+ if(active)
+ if(flash_count && (last_flash + shield_refresh < world.time))
+ flash_count = 0
+ last_flash = 0
+ else if(overload_time + shield_refresh < world.time)
+ active = 1
+ flash_count = 0
+ overload_time = 0
+
+ var/mob/living/user = src.loc
+ user.visible_message("[user]'s shield reactivates!", "Your shield reactivates!.")
+ user.update_icon()
+
+/obj/item/borg/combat/shield/proc/adjust_flash_count(var/mob/living/user, amount)
+ if(active) //Can't destabilize a shield that's not on
+ flash_count += amount
+
+ if(amount > 0)
+ last_flash = world.time
+ if(flash_count >= overload_threshold)
+ overload(user)
+
+/obj/item/borg/combat/shield/proc/overload(var/mob/living/user)
+ active = 0
+ user.visible_message("[user]'s shield destabilizes!", "Your shield destabilizes!.")
+ user.update_icon()
+ overload_time = world.time
+
/obj/item/borg/combat/shield/verb/set_shield_level()
set name = "Set shield level"
set category = "Object"
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 536a069474b..35deb6935fa 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -58,7 +58,7 @@
return
if(mode == SYRINGE_BROKEN)
- user << "This syringe is broken!"
+ to_chat(user, "This syringe is broken!")
return
if(user.a_intent == I_HURT && ismob(target))
@@ -70,26 +70,31 @@
switch(mode)
if(SYRINGE_DRAW)
if(!reagents.get_free_space())
- user << "The syringe is full."
+ to_chat(user, "The syringe is full.")
mode = SYRINGE_INJECT
return
if(ismob(target))//Blood!
if(reagents.has_reagent("blood"))
- user << "There is already a blood sample in this syringe."
+ to_chat(user, "There is already a blood sample in this syringe.")
return
+
if(istype(target, /mob/living/carbon))
var/amount = reagents.get_free_space()
var/mob/living/carbon/T = target
if(!T.dna)
- user << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)."
+ to_chat(user, "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum).")
return
if(NOCLONE in T.mutations) //target done been et, no more blood in him
- user << "You are unable to locate any blood."
+ to_chat(user, "You are unable to locate any blood.")
+ return
+
+ if(T.isSynthetic())
+ to_chat(user, "You can't draw blood from a synthetic!")
return
if(drawing)
- user << "You are already drawing blood from [T.name]."
+ to_chat(user, "You are already drawing blood from [T.name].")
return
var/datum/reagent/B
@@ -117,50 +122,51 @@
reagents.update_total()
on_reagent_change()
reagents.handle_reactions()
- user << "You take a blood sample from [target]."
+ to_chat(user, "You take a blood sample from [target].")
for(var/mob/O in viewers(4, user))
O.show_message("[user] takes a blood sample from [target].", 1)
else //if not mob
if(!target.reagents.total_volume)
- user << "[target] is empty."
+ to_chat(user, "[target] is empty.")
return
if(!target.is_open_container() && !istype(target, /obj/structure/reagent_dispensers) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/weapon/reagent_containers/food))
- user << "You cannot directly remove reagents from this object."
+ to_chat(user, "You cannot directly remove reagents from this object.")
return
var/trans = target.reagents.trans_to_obj(src, amount_per_transfer_from_this)
- user << "You fill the syringe with [trans] units of the solution."
+ to_chat(user, "You fill the syringe with [trans] units of the solution.")
update_icon()
+
if(!reagents.get_free_space())
mode = SYRINGE_INJECT
update_icon()
if(SYRINGE_INJECT)
if(!reagents.total_volume)
- user << "The syringe is empty."
+ to_chat(user, "The syringe is empty.")
mode = SYRINGE_DRAW
return
if(istype(target, /obj/item/weapon/implantcase/chem))
return
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/weapon/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/weapon/storage/fancy/cigarettes))
- user << "You cannot directly fill this object."
+ to_chat(user, "You cannot directly fill this object.")
return
if(!target.reagents.get_free_space())
- user << "[target] is full."
+ to_chat(user, "[target] is full.")
return
var/mob/living/carbon/human/H = target
if(istype(H))
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
if(!affected)
- user << "\The [H] is missing that limb!"
+ to_chat(user, "\The [H] is missing that limb!")
return
else if(affected.robotic >= ORGAN_ROBOT)
- user << "You cannot inject a robotic limb."
+ to_chat(user, "You cannot inject a robotic limb.")
return
if(ismob(target) && target != user)
@@ -200,9 +206,9 @@
else
trans = reagents.trans_to_obj(target, amount_per_transfer_from_this)
if(trans)
- user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units."
+ to_chat(user, "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units.")
else
- user << "The syringe is empty."
+ to_chat(user, "The syringe is empty.")
if (reagents.total_volume <= 0 && mode == SYRINGE_INJECT)
mode = SYRINGE_DRAW
update_icon()
@@ -245,7 +251,7 @@
var/obj/item/organ/external/affecting = H.get_organ(target_zone)
if (!affecting || affecting.is_stump())
- user << "They are missing that limb!"
+ to_chat(user, "They are missing that limb!")
return
var/hit_area = affecting.name
@@ -302,10 +308,10 @@
/obj/item/weapon/reagent_containers/syringe/ld50_syringe/afterattack(obj/target, mob/user, flag)
if(mode == SYRINGE_DRAW && ismob(target)) // No drawing 50 units of blood at once
- user << "This needle isn't designed for drawing blood."
+ to_chat(user, "This needle isn't designed for drawing blood.")
return
if(user.a_intent == "hurt" && ismob(target)) // No instant injecting
- user << "This syringe is too big to stab someone with it."
+ to_chat(user, "This syringe is too big to stab someone with it.")
..()
////////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index b99b9a7dde6..a6e6a948501 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -473,6 +473,15 @@ other types of metals and chemistry for reagents).
build_path = /obj/item/weapon/surgical/scalpel/manager
sort_string = "MBBAD"
+/datum/design/item/bone_clamp
+ name = "Bone Clamp"
+ desc = "A miracle of modern science, this tool rapidly knits together bone, without the need for bone gel."
+ id = "bone_clamp"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 5, TECH_MAGNET = 4, TECH_DATA = 4)
+ materials = list (DEFAULT_WALL_MATERIAL = 12500, "glass" = 7500, "silver" = 2500)
+ build_path = /obj/item/weapon/surgical/bone_clamp
+ sort_string = "MBBAE"
+
/datum/design/item/implant
materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 6a5a39df734..e1086dbdca9 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -145,4 +145,42 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
- "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
\ No newline at end of file
+ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+
+
+
+/datum/surgery_step/clamp_bone
+ allowed_tools = list(
+ /obj/item/weapon/surgical/bone_clamp = 100
+ )
+ can_infect = 1
+ blood_level = 1
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected.stage == 0)
+ user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \
+ "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \
+ "You sets [target]'s bone in [affected.name] with \the [tool].")
+ affected.status &= ~ORGAN_BROKEN
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
+ "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(BRUISE, 5)
\ No newline at end of file
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 09db2e31465..660cc6e05b4 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -168,10 +168,16 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(istype(tool,/obj/item/stack/cable_coil/))
var/obj/item/stack/cable_coil/C = tool
- if(!C.can_use(5))
- user << "You need ten or more cable pieces to repair this damage." //usage amount made more consistent with regular cable repair
+ if(affected.burn_dam == 0)
+ to_chat(user, "There are no burnt wires here!")
return SURGERY_FAILURE
- C.use(5)
+ else
+ if(!C.can_use(5))
+ to_chat(user, "You need at least five cable pieces to repair this part.") //usage amount made more consistent with regular cable repair
+ return SURGERY_FAILURE
+ else
+ C.use(5)
+
return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 7ff90a67412..00e10be77a0 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/belt_mirror.dmi b/icons/mob/belt_mirror.dmi
index eefa872e826..859701435f7 100644
Binary files a/icons/mob/belt_mirror.dmi and b/icons/mob/belt_mirror.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 94028db1fa0..ec0e70ccdc5 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 7249f9b218e..a0e5df9f9d3 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 2925d066c21..e795486d596 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 61b07d1ecfa..12a95f23ac8 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index f51de6956bb..3b4604cdfd5 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi
index 15ef72276fe..c08940b530c 100644
Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 5f38ccd3a3c..01d769a0f46 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index b60a19ee631..5ad83512114 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -4682,7 +4682,7 @@
"bMb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/assembly/robotics)
-"bMe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/standard,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/posibrain,/turf/simulated/floor/tiled,/area/assembly/robotics)
+"bMe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/standard,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics)
"bMh" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/tiled,/area/assembly/robotics)
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index 387e39f2a20..f7a9f84c3c7 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -4366,8 +4366,8 @@
"bFX" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 8; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"bFY" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineWasteViewport1"; name = "Engine Waste Viewport Shutter"; opacity = 0},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/engineering/engine_waste)
"bFZ" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineWasteViewport1"; name = "Engine Waste Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = null; req_one_access = list(11,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor,/area/engineering/engine_waste)
-"bGa" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor,/area/engineering/engine_waste)
-"bGb" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_waste)
+"bGa" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_waste)
+"bGb" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_waste)
"bGc" = (/obj/machinery/atmospherics/pipe/cap/visible,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_waste)
"bGd" = (/obj/machinery/atmospherics/pipe/simple/visible/black,/turf/simulated/floor,/area/engineering/engine_waste)
"bGe" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 36; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_waste)
@@ -4619,7 +4619,7 @@
"bKQ" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor,/area/engineering/engine_waste)
"bKR" = (/turf/simulated/floor,/area/engineering/engine_waste)
"bKS" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_waste)
-"bKT" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/door/window/northleft{name = "Engine Waste"; req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor,/area/engineering/engine_waste)
+"bKT" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/door/window/northleft{name = "Engine Waste"; req_one_access = list(10,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_waste)
"bKU" = (/obj/machinery/door/window/northright{name = "Engine Waste"; req_one_access = list(10,24)},/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 26; pixel_y = 0; req_access = null; req_one_access = list(11,24)},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/engine_waste)
"bKV" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 4},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"bKW" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
@@ -4960,7 +4960,7 @@
"bRt" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/rnd/research)
"bRu" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/light_switch{pixel_x = -36},/obj/structure/cable/green,/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRv" = (/obj/machinery/mecha_part_fabricator,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/assembly/robotics)
-"bRw" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/steel_reinforced,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/posibrain,/turf/simulated/floor/tiled,/area/assembly/robotics)
+"bRw" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/steel_reinforced,/obj/item/device/robotanalyzer,/obj/item/device/robotanalyzer,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bRx" = (/obj/machinery/pros_fabricator,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/assembly/robotics)
"bRy" = (/obj/machinery/camera/network/research{c_tag = "SCI - Robotics"; dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics)
"bRz" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/assembly/robotics)
@@ -4990,9 +4990,9 @@
"bRX" = (/obj/machinery/atmospherics/pipe/cap/visible{dir = 1},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/engineering/engine_room)
"bRY" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/engine_room)
"bRZ" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/engine_room)
-"bSa" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 4; tag_west = 0; use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"bSa" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 2; tag_south = 4; tag_west = 1; use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/obj/structure/sign/warning/nosmoking_2{pixel_x = 32},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"bSb" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
-"bSc" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 2; tag_south = 4; tag_west = 1; use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/obj/structure/sign/warning/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plating,/area/engineering/engine_room)
+"bSc" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 4; tag_west = 0; use_power = 0},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"bSd" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"bSe" = (/obj/effect/landmark{name = "JoinLateCyborg"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication)
"bSf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/hallway/engineer_hallway)
@@ -5411,7 +5411,7 @@
"cac" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/engineering/engine_room)
"cad" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/meter,/turf/simulated/floor,/area/engineering/engine_room)
"cae" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/engineering/engine_room)
-"caf" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_x = 22; pixel_y = 0; req_access = list(10)},/turf/simulated/floor,/area/engineering/engine_room)
+"caf" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_x = 22; pixel_y = 0; req_access = list(10)},/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"cag" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance_hatch{icon_state = "door_closed"; locked = 0; name = "Engine Access"; req_one_access = list(11)},/turf/simulated/floor/tiled,/area/engineering/engine_airlock)
"cah" = (/obj/machinery/status_display,/turf/simulated/wall/r_wall,/area/engineering/engine_airlock)
"cai" = (/obj/structure/sign/warning/radioactive,/turf/simulated/wall/r_wall,/area/engineering/engine_airlock)
@@ -5481,7 +5481,7 @@
"cbu" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/button/remote/blast_door{id = "EngineVent"; name = "Reactor Ventillatory Control"; pixel_x = -25; pixel_y = 0; req_access = list(10)},/turf/simulated/floor,/area/engineering/engine_room)
"cbv" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
"cbw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/engine_room)
-"cbx" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor,/area/engineering/engine_room)
+"cbx" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"cby" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor,/area/engineering/engine_monitoring)
"cbz" = (/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)
"cbA" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/supermatter_engine,/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{pixel_x = 11; pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -5646,7 +5646,7 @@
"ceD" = (/obj/machinery/disease2/isolator,/obj/effect/floor_decal/corner/lime/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/virology)
"ceE" = (/obj/machinery/door/blast/regular{icon_state = "pdoor1"; id = "EngineVent"; name = "Reactor Vent"; p_open = 0},/obj/machinery/shield_diffuser,/turf/simulated/floor/reinforced/airless,/area/engineering/engine_room)
"ceF" = (/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
-"ceG" = (/obj/machinery/mass_driver{dir = 8; id = "enginecore"},/obj/machinery/power/supermatter{layer = 4},/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
+"ceG" = (/obj/machinery/mass_driver{dir = 8; id = "enginecore"},/obj/machinery/power/supermatter{layer = 4},/obj/effect/engine_setup/core,/turf/simulated/floor/greengrid/nitrogen,/area/engineering/engine_room)
"ceH" = (/obj/machinery/air_sensor{frequency = 1438; id_tag = "engine_sensor"; output = 63},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room)
"ceI" = (/obj/effect/wingrille_spawn/reinforced_phoron,/obj/machinery/door/blast/regular{dir = 1; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor,/area/engineering/engine_room)
"ceJ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor,/area/engineering/engine_room)
@@ -5845,7 +5845,7 @@
"ciu" = (/obj/machinery/disease2/incubator,/obj/effect/floor_decal/corner/lime/full{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/virology)
"civ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -25; pixel_y = 6; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -25; pixel_y = -6; req_access = list(10)},/turf/simulated/floor,/area/engineering/engine_room)
"ciw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/engine_room)
-"cix" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor,/area/engineering/engine_room)
+"cix" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/coolant_canister,/turf/simulated/floor,/area/engineering/engine_room)
"ciy" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ciz" = (/obj/structure/table/reinforced,/obj/item/clothing/ears/earmuffs,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
"ciA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/light,/obj/machinery/newscaster{pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/engine_monitoring)
@@ -5917,7 +5917,7 @@
"cjO" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/camera/network/engine{c_tag = "ENG - Engine Core 3"; dir = 2},/turf/simulated/floor,/area/engineering/engine_room)
"cjP" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"cjQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
-"cjR" = (/obj/machinery/atmospherics/binary/pump,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/engineering/engine_room)
+"cjR" = (/obj/machinery/atmospherics/binary/pump,/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"cjS" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes)
"cjT" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/engineering/engine_smes)
"cjU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_smes)
@@ -6111,11 +6111,11 @@
"cnA" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 9},/turf/simulated/floor,/area/engineering/engine_room)
"cnB" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/engine_room)
"cnC" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/alarm/nobreach{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_room)
-"cnD" = (/obj/structure/cable/cyan{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"},/turf/simulated/floor/plating,/area/engineering/engine_smes)
+"cnD" = (/obj/structure/cable/cyan{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/engine_setup/smes,/turf/simulated/floor/plating,/area/engineering/engine_smes)
"cnE" = (/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/structure/table/steel,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/engineering/engine_smes)
"cnF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/table/steel,/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/machinery/camera/network/engine{c_tag = "ENG - SMES Room"; dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/engine_smes)
"cnG" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/extinguisher_cabinet{pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/engine_smes)
-"cnH" = (/obj/structure/cable,/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 750000; output_level = 500000; RCon_tag = "Engine - Main"},/turf/simulated/floor/plating,/area/engineering/engine_smes)
+"cnH" = (/obj/structure/cable,/obj/machinery/power/smes/buildable{charge = 1e+007; cur_coils = 4; input_attempt = 1; input_level = 750000; output_level = 500000; RCon_tag = "Engine - Main"},/obj/effect/engine_setup/smes/main,/turf/simulated/floor/plating,/area/engineering/engine_smes)
"cnI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/apmaint)
"cnJ" = (/turf/simulated/wall,/area/construction/seconddeck/construction1)
"cnK" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/construction/seconddeck/construction1)
@@ -6371,7 +6371,7 @@
"csA" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineRadiatorViewport2"; name = "Engine Radiator Viewport Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/manifold/visible/green,/turf/simulated/floor,/area/engineering/engine_room)
"csB" = (/obj/machinery/atmospherics/pipe/manifold/visible/green,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine radiator viewport shutters."; id = "EngineRadiatorViewport2"; name = "Engine Radiator Viewport Shutters"; pixel_x = 0; pixel_y = -25; req_access = list(10)},/turf/simulated/floor,/area/engineering/engine_room)
"csC" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
-"csD" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor,/area/engineering/engine_room)
+"csD" = (/obj/machinery/atmospherics/binary/pump/high_power{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/obj/effect/floor_decal/industrial/outline/blue,/obj/effect/engine_setup/pump_max,/turf/simulated/floor,/area/engineering/engine_room)
"csE" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor,/area/engineering/engine_room)
"csF" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/plating,/area/engineering/engine_room)
"csG" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/blue,/obj/structure/sign/warning/nosmoking_2{pixel_x = 32},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -10489,7 +10489,7 @@ aaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybv
aaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabDhbMBbMCbMDbMEbMFbMGbDhbMHbMIbKXbMJbysbMKbMLbLcbLcbMMbMNbMObMObMPbMQbMRbLgbMSbMTbMUbMVbMWbMXbMYbMZbNabAhbNbbNcbNdbNebNfbNgbNhbNibNjbNjbNkbNjbNjbNjbNjbpJbpJbxBbNlbpJaaaaaaaaabGKbGKbLCbLDbLEbLEbNmbNnbNobNpbNpbNpbNqbNrbNsbNtbNubNvbNvbNwbNwbNxbNybIGbIGbLKbLObDNbDNaaaaaaaaabrybNzbNAbNBbKrbNCbNDbNEbNFbNGbNHbNIbNJbNKbNLbNMbNNbNObNPbNPbNPbNQbNRbNSbNTbNUbNVbKybNWbNXbNYbNZbOabOabOabOabKBbObbOcbOdbKEbOebOfbFLbOgbOhbOibOjbOkbOlbOmbOnbEFaaaaaaaabaaaaaaaaaaaRaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaafaaaaaaaaabFVbOobFVbOobFVbOobFVbOobFVbOobFVbOoaafaafaafbOpbOqbOqbOqbOqbOqbOpbOrbOsbOqbwObOtbKXbOubysbOvbOwbLcbOxbOybOzbOybOAbOBbOybOCbLgbODbOEbOFbOGbOHbOIbOJbMZbOKbAhbOLbOMbONbOObOPbOQbORbOSbNjbOTbOUbOVbOVbOWbNjbOXbtybxBbOYbClaaaaaaaaabGKbOZbLDbLEbPabPbbPcbPdbPebPfbPgbPhbPibPjbPkbIGbLIbPlbIGbIGbPmbPnbPobPpbPqbIGbLKbPrbDNaaaaaaaaabqvbPsbsIbPtbKrbPubPvbPwbPxbPybPzbPAbPBbPCbPDbMabPEbPFbPGbPHbPGbPIbNUbPJbPKbPLbPMbKybPNbPObPPbPQbPRbPSbOabPTbKBbPUbPVbPWbKEbPXbPYbFLbPZbQabQbbQbbQbbQabQabQcbDgaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabQdbQebQfbQebQfbQebQfbQebQfbQebQfbQebQgbQhbOqbOqbQibQjbQkbQlbQkbQmbQnbQobQpbwObQqbQrbQsbQtbQubQvbLcbQwbOybQxbQybQzbQAbOybQBbLgbQCbQDbQEbQFbQGbQHbAhbQIbQJbQKbQLbQMbQNbQObQPbQQbORbLsbQRbQSbQTbQSbQUbQVbNjbQWbtybxBbQXbClaaaaaabGJbGJbQYbLEbLEbQZbRabRbbRcbRdbRcbRcbRebRfbFtbRgbRhbRibRibRjbRkbRlbRibRibRmbPpbIGbIGbRnbGLbGLaaaaaabqvbPsbsIbRobKrbRpbRqbRrbPxbRsbKrbKrbsTbRtbsTbKybKybRubRvbRwbRxbPIbRybRzbRAbPGbRBbKybRCbRDbREbRFbPRbRGbOabRHbKBbRIbRJbRKbKEbRLbwFbFLbPZbRMbRNbRObRPbRQbRRbQcbBEaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHJbFWbFWbFWbFWbFWbFWbFWbFWbFWbFWbFWbQgbRSbRTbRUbRVbRWbRXbRYbRWbRZbSabSbbScbwObSdbSebGjbysbSfbSgbLcbShbOybOybSibSjbOybOybSkbLgbSlbSmbSnbSobSpbSqbSrbSsbStbBXbSubOMbLsbSvbSwbSwbSxbLsbNjbSybSzbSAbSBbSCbNjbQWbtybxBbyVbClaaaaaabGJbSDbSEbLEbSFbSGbRbbRbbSHbSIbSJbRbbSKbRfbRfbSLbRibRibSMbSNbSNbSObSPbRibRibSQbSRbSSbSTbSUbGLaaaaaabqvbPsbSVbSVbKrbSWbSXbSXbSYbSZbPAbTabTbbTcbTdbTebMabTfbTgbTgbTgbThbTibTibTjbTkbTibTlbTmbTnbTobTpbOabOabOabTqbKBbTrbTsbTtbKEbMubMvbFLbTubFLbFLbFLbFLbFLbFLbFLbFLbTvbTvaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHJbFWbFWbFWbFWbFWbFWbFWbFWbFWbFWbFWbQgbRSbRTbRUbRVbRWbRXbRYbRWbRZbScbSbbSabwObSdbSebGjbysbSfbSgbLcbShbOybOybSibSjbOybOybSkbLgbSlbSmbSnbSobSpbSqbSrbSsbStbBXbSubOMbLsbSvbSwbSwbSxbLsbNjbSybSzbSAbSBbSCbNjbQWbtybxBbyVbClaaaaaabGJbSDbSEbLEbSFbSGbRbbRbbSHbSIbSJbRbbSKbRfbRfbSLbRibRibSMbSNbSNbSObSPbRibRibSQbSRbSSbSTbSUbGLaaaaaabqvbPsbSVbSVbKrbSWbSXbSXbSYbSZbPAbTabTbbTcbTdbTebMabTfbTgbTgbTgbThbTibTibTjbTkbTibTlbTmbTnbTobTpbOabOabOabTqbKBbTrbTsbTtbKEbMubMvbFLbTubFLbFLbFLbFLbFLbFLbFLbFLbTvbTvaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaabFVbOobFVbOobFVbOobFVbOobFVbOobFVbOoaadbTwbTxbTybTzbTAbTBbTCbTAbRZbTDbTEbTFbwObTGbTHbTGbysbTIbTJbLcbTKbOybOybTLbSjbOybOybTMbLgbTNbTObTPbTQbTRbTSbMYbJXbAhbAhbNbbTTbTUbLsbLsbLsbLsbTVbNjbTWbNjbTXbNjbNjbNjbpJbtybxBbTYbpJaaaaaabGKbTZbUabUbbUcbUdbUebUfbUgbUhbUibRbbUjbUjbUkbUlbRibUmbUnbUobUobUpbUqbUrbRibUsbUtbUubSTbUvbDNaaaaaabrybPsbzcbrybKrbUwbUxbUybUybUzbUAbUBbUCbUDbUEbUFbUGbUHbUIbUIbUIbUJbUKbULbUMbUNbUObTlbUPbUQbURbUSbKBbUTbUUbUVbKBbUWbUXbUYbKEbMubMvbUZbVabVbbVcbVdbVebVfbVgbVhbVibVjbVkbVkbVjbVjbVjbVjbVjaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaabQdbQebQfbQebQfbQebQfbQebQfbQebQfbQebQgbVlbOqbVmbTCbTAbTBbTCbTAbRZbVnbVobVobVobVobVobVobVobVpbVqbLcbVrbVsbVtbVubVvbVwbVxbVybLgbLgbVzbLgbVAbVBbLgbVCbJXbAhbAhbVDbLqbVEbVFbVGbVHbVIbVJbNjbVKbNjbVLbNjbVMbVNbVObtybxBbtybpJaaaaaabGKbVPbVQbPgbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbRibWdbWebWfbWgbWhbUqbWibWjbWkbWlbWmbWnbWobDNaaaaaabrybPsbWpbWqbKrbKrbWrbWsbWtbWubPAbWvbWwbWxbWybWzbWAbWBbWCbWDbWEbWFbUKbWGbWHbWIbWJbTlbKBbWKbKBbKBbKBbKBbKBbKBbKBbKEbKEbKEbKEbWLbWMbUZbWNbWObWPbWQbWRbWSbVebVhbVhbVjbWTbWUbWVbVjbWWbWXbVjbVjaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvybvybvybvybvybvybvybvybvyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafbQdbWYbWZbWYbWZbWYbWZbWYbWZbWYbWZbWYbQgbXabOqbXbbTCbXcbXdbTCbXcbRZbXebVobXfbXgbXhbXibXjbVobSfbXkbVybVybVybVybVybVybVybVybVybXlbLgbLgbLgbLgbLgbLgbXmbXnbyHbXobXmbXpbXpbXpbXpbXpbXpbXpbXqbXqbXqbXqbNjbXrbXsbpJbXtbXubXvbpJaaaaaabGKbXwbXxbLEbXybXzbRbbRbbRbbRbbRbbRbbXAbXBbXBbXCbRibRibRibRibRibXDbUqbXEbRibIGbWlbWmbWnbXFbDNaaaaaabrybXGbsIbsIbXHbKrbKrbKrbKrbKrbKrbXIbXJbXKbXJbXIbKybKybKybKybKybKybTlbXLbXMbXMbXNbTlbXObXObXObXPbXQbXRbXSbXTbXUbXVbXWbsTbXXbXYbXZbYabYbbYcbYdbWQbWRbYebVebYfbVhbYgbYhbYibYjbVkbYkbYibYlbVjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm
index 56d7b4b597e..ec1251924fa 100644
--- a/maps/southern_cross/southern_cross-6.dmm
+++ b/maps/southern_cross/southern_cross-6.dmm
@@ -2177,7 +2177,7 @@
"PS" = (/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"PT" = (/obj/machinery/atmospherics/unary/freezer{tag = "icon-freezer_0 (WEST)"; icon_state = "freezer_0"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"PU" = (/turf/space,/obj/structure/shuttle/engine/propulsion,/turf/simulated/shuttle/plating/airless/carry,/area/skipjack_station/start)
-"PV" = (/obj/structure/table/standard,/obj/item/weapon/legcuffs,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
+"PV" = (/obj/structure/table/standard,/obj/item/weapon/handcuffs/legcuffs,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
"PW" = (/obj/structure/table/standard,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor/black,/area/skipjack_station/start)
"PX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"PY" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
diff --git a/maps/submaps/cave_submaps/cave.dm b/maps/submaps/cave_submaps/cave.dm
index cf063c85aac..d30004887f4 100644
--- a/maps/submaps/cave_submaps/cave.dm
+++ b/maps/submaps/cave_submaps/cave.dm
@@ -2,4 +2,9 @@
name = "Cave Content"
desc = "Don't dig too deep!"
-// To be added: Templates for cave exploration when they are made.
\ No newline at end of file
+// To be added: Templates for cave exploration when they are made.
+
+/datum/map_template/cave/deadBeacon
+ name = "Abandoned Relay"
+ desc = "An unregistered comms relay, abandoned to the elements."
+ mappath = 'maps/submaps/cave_submaps/deadBeacon.dmm'
\ No newline at end of file
diff --git a/maps/submaps/cave_submaps/cave_areas.dm b/maps/submaps/cave_submaps/cave_areas.dm
new file mode 100644
index 00000000000..7c80c66ec10
--- /dev/null
+++ b/maps/submaps/cave_submaps/cave_areas.dm
@@ -0,0 +1,6 @@
+/area/submap/cave
+ name = "Cave Submap Area"
+ icon_state = "submap"
+
+/area/submap/cave/deadBeacon
+ name = "abandoned relay"
\ No newline at end of file
diff --git a/maps/submaps/cave_submaps/deadBeacon.dmm b/maps/submaps/cave_submaps/deadBeacon.dmm
new file mode 100644
index 00000000000..072299ac2ef
--- /dev/null
+++ b/maps/submaps/cave_submaps/deadBeacon.dmm
@@ -0,0 +1,62 @@
+"a" = (/turf/template_noop,/area/template_noop)
+"b" = (/turf/simulated/mineral/floor,/area/submap/cave/deadBeacon)
+"c" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/mineral/floor,/area/submap/cave/deadBeacon)
+"d" = (/turf/simulated/wall/r_wall,/area/submap/cave/deadBeacon)
+"e" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"f" = (/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"g" = (/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"h" = (/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/submap/cave/deadBeacon)
+"i" = (/obj/structure/grille/broken,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"j" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"k" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"l" = (/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"m" = (/obj/structure/table/steel,/obj/item/weapon/circuitboard/comm_server,/obj/machinery/light/built{dir = 8; fitting = ""},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"n" = (/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"o" = (/obj/item/weapon/paper/crumpled{info = "Sampatti Relay Sif-833
Decryption Key for 12-04-2488:
849B0022FBA920C244
Eyes Only.
The insider who knows all the secrets can bring down Lanka."; name = "Dusty Note"},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"p" = (/obj/structure/door_assembly/door_assembly_ext,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"q" = (/obj/item/stack/rods,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"r" = (/obj/machinery/telecomms/relay{active_power_usage = 1; broadcasting = 0; panel_open = 1},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"s" = (/obj/machinery/telecomms/broadcaster{light_power = 0; on = 0},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"t" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"u" = (/obj/machinery/telecomms/receiver{light_power = 0; on = 0},/obj/structure/cable,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"v" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"w" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"x" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"y" = (/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"z" = (/obj/item/stack/cable_coil{amount = 1},/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"A" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/mineral/floor,/area/submap/cave/deadBeacon)
+"B" = (/obj/structure/grille/broken,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"C" = (/obj/structure/loot_pile/maint/junk,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"D" = (/obj/item/weapon/cigbutt,/obj/item/weapon/wrench,/obj/machinery/light/built,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"E" = (/obj/item/weapon/material/shard,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"F" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"G" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"H" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/asteroid_steel,/area/submap/cave/deadBeacon)
+"I" = (/obj/machinery/access_button/airlock_interior{dir = 4},/turf/simulated/wall/r_wall,/area/submap/cave/deadBeacon)
+"J" = (/obj/structure/grille/broken,/obj/item/stack/rods,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"K" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/submap/cave/deadBeacon)
+"L" = (/obj/structure/sign/warning/secure_area,/turf/simulated/wall/r_wall,/area/submap/cave/deadBeacon)
+"M" = (/obj/structure/sign/warning/high_voltage,/turf/simulated/wall/r_wall,/area/submap/cave/deadBeacon)
+
+(1,1,1) = {"
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaabbaaaaaaaa
+aaaaaabbabbcbaaaaaaa
+aaaaaadefgghidaaaaaa
+aaaaaahjkgglhibaaaaa
+aaaaahdmnoggggbaaaaa
+aaaabnpqnrsgqtbaaaaa
+aaaabngnnuvwnxaaaaaa
+aaaabhdgynnzkxbaaaaa
+aaaaAbBCDnnEFGbaaaaa
+aaaaaadidHHIJdbaaaaa
+aaaaaaabdgnKbbaaaaaa
+aaaaaaaaLHHMaaaaaaaa
+aaaaaaaabbbAaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaa
+"}
diff --git a/polaris.dme b/polaris.dme
index 3cec695f705..179a3f6b6d7 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -922,6 +922,7 @@
#include "code\game\objects\items\weapons\material\ashtray.dm"
#include "code\game\objects\items\weapons\material\bats.dm"
#include "code\game\objects\items\weapons\material\foam.dm"
+#include "code\game\objects\items\weapons\material\gravemarker.dm"
#include "code\game\objects\items\weapons\material\kitchen.dm"
#include "code\game\objects\items\weapons\material\knives.dm"
#include "code\game\objects\items\weapons\material\material_armor.dm"
@@ -967,6 +968,7 @@
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\ghost_pods.dm"
#include "code\game\objects\structures\girders.dm"
+#include "code\game\objects\structures\gravemarker.dm"
#include "code\game\objects\structures\grille.dm"
#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
@@ -2269,6 +2271,7 @@
#include "maps\northern_star\northern_star.dm"
#include "maps\submaps\_readme.dm"
#include "maps\submaps\cave_submaps\cave.dm"
+#include "maps\submaps\cave_submaps\cave_areas.dm"
#include "maps\submaps\space_submaps\space.dm"
#include "maps\submaps\surface_submaps\forest.dm"
#include "maps\submaps\surface_submaps\forest_areas.dm"