diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm
index e4680171208..d20f61df1f3 100644
--- a/_maps/RandomZLevels/centcomAway.dmm
+++ b/_maps/RandomZLevels/centcomAway.dmm
@@ -345,7 +345,7 @@
"gG" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 1; icon_state = "comfychair_beige"},/turf/simulated/floor/plasteel{icon_state = "floor"},/area/awaymission/centcomAway/general)
"gH" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/fancy/carpet,/area/awaymission/centcomAway/courtroom)
"gI" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
-"gJ" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
+"gJ" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"gK" = (/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"gL" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access_txt = "103"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"gM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/general)
@@ -409,7 +409,7 @@
"hS" = (/obj/structure/table/wood,/obj/item/weapon/paper_bin,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"hT" = (/obj/structure/table/wood,/turf/simulated/floor/wood,/area/awaymission/centcomAway/courtroom)
"hU" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/awaymission/centcomAway/hangar)
-"hV" = (/obj/structure/crematorium,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
+"hV" = (/obj/structure/bodycontainer/crematorium,/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"hW" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/general)
"hX" = (/obj/machinery/crema_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor/plasteel{icon_state = "engine"},/area/awaymission/centcomAway/general)
"hY" = (/obj/structure/closet/secure_closet/injection,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/centcomAway/courtroom)
diff --git a/_maps/RandomZLevels/stationCollision.dmm b/_maps/RandomZLevels/stationCollision.dmm
index 0a25b1f52dd..4d1cbd867aa 100644
--- a/_maps/RandomZLevels/stationCollision.dmm
+++ b/_maps/RandomZLevels/stationCollision.dmm
@@ -559,7 +559,7 @@
"kM" = (/obj/structure/sink/kitchen{pixel_y = 32},/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"kN" = (/obj/item/weapon/melee/energy/sword/saber/red,/obj/item/clothing/shoes/syndigaloshes,/obj/item/clothing/under/syndicate,/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/weapon/paper/sc_safehint_paper_hydro,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"kO" = (/obj/machinery/hydroponics,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
-"kP" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/southblock)
+"kP" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/southblock)
"kQ" = (/obj/machinery/vending/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/southblock)
"kR" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 1},/area/awaymission/southblock)
"kS" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet{pixel_x = 2; pixel_y = 2},/obj/item/weapon/paper/pamphlet{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/plasteel{tag = "icon-warningcorner (WEST)"; icon_state = "warningcorner"; dir = 8},/area/awaymission/gateroom)
@@ -570,7 +570,7 @@
"kX" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock)
"kY" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock)
"kZ" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock)
-"la" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/awaymission/southblock)
+"la" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/awaymission/southblock)
"lb" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/awaymission/southblock)
"lc" = (/turf/simulated/floor/plasteel{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/awaymission/southblock)
"ld" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 4},/area/awaymission/southblock)
diff --git a/_maps/map_files/Asteroidstation/Asteroidstation.dmm b/_maps/map_files/Asteroidstation/Asteroidstation.dmm
index 40ff181066b..96338fdbc7d 100644
--- a/_maps/map_files/Asteroidstation/Asteroidstation.dmm
+++ b/_maps/map_files/Asteroidstation/Asteroidstation.dmm
@@ -4251,7 +4251,7 @@
"bDM" = (/obj/machinery/door_control{dir = 2; id = "Mechbay"; name = "Mech Bay Door Control"; pixel_x = -24; pixel_y = 0; req_access_txt = "29"},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bDN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"bDO" = (/turf/simulated/floor/plasteel,/area/assembly/chargebay)
-"bDP" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/assembly/assembly_line)
+"bDP" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/assembly/assembly_line)
"bDQ" = (/obj/machinery/camera{c_tag = "Robotics Morgue"; dir = 2; network = list("SS13","RD")},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/assembly/assembly_line)
"bDR" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/assembly/assembly_line)
"bDS" = (/obj/machinery/door/window/southleft{name = "Robotics Deliveries"; req_access_txt = "29"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/assembly/assembly_line)
@@ -5438,7 +5438,7 @@
"caD" = (/obj/structure/cable/cyan{tag = "icon-1-2"; icon_state = "1-2"},/obj/structure/cable/cyan{tag = "icon-1-4"; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/asteroidstation/medbay)
"caE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/cyan{tag = "icon-2-8"; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asteroidstation/medbay)
"caF" = (/obj/machinery/power/apc{dir = 1; name = "Genetics Research APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable/cyan{tag = "icon-0-2"; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/genetics)
-"caG" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"caG" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"caH" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"caI" = (/obj/machinery/camera{c_tag = "Medbay Morgue"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"caJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
@@ -5586,7 +5586,7 @@
"cdv" = (/obj/item/clothing/head/ushanka,/obj/item/clothing/under/soviet,/turf/simulated/floor/plating,/area/hallway/primary/aft{name = "Aft Hallway"})
"cdw" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka,/obj/item/toy/snappop,/turf/simulated/floor/plating,/area/hallway/primary/aft{name = "Aft Hallway"})
"cdx" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/bodybags{pixel_x = 3; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
-"cdy" = (/obj/structure/crematorium,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"cdy" = (/obj/structure/bodycontainer/crematorium,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cdz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cdA" = (/obj/structure/closet/wardrobe/chaplain_black,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cdB" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -5683,7 +5683,7 @@
"cfo" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/disposalpipe/segment,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 4},/area/hallway/primary/aft{name = "Aft Hallway"})
"cfp" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/hallway/primary/aft{name = "Aft Hallway"})
"cfq" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plating,/area/hallway/primary/aft{name = "Aft Hallway"})
-"cfr" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
+"cfr" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cfs" = (/obj/machinery/camera{c_tag = "Chapel Crematorium"; dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cft" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
"cfu" = (/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/obj/item/weapon/storage/fancy/crayons,/obj/structure/table/wood,/turf/simulated/floor/fancy/carpet,/area/chapel/main)
diff --git a/_maps/map_files/Asteroidstation/z6.dmm b/_maps/map_files/Asteroidstation/z6.dmm
index 8ca97b0aa8c..f8b85b35692 100644
--- a/_maps/map_files/Asteroidstation/z6.dmm
+++ b/_maps/map_files/Asteroidstation/z6.dmm
@@ -249,7 +249,7 @@
"eO" = (/turf/simulated/floor/airless{icon_state = "damaged4"},/area/space)
"eP" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/derelict/arrival)
"eQ" = (/obj/machinery/door/morgue{name = "coffin storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
-"eR" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
+"eR" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
"eS" = (/obj/structure/table,/turf/simulated/floor/airless{icon_state = "white"},/area/derelict/medical)
"eT" = (/turf/simulated/floor/airless{icon_state = "white"},/area/space)
"eU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "damaged2"},/area/derelict/hallway/primary)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 2c83d827d2b..b87ff8b21a2 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1738,7 +1738,7 @@
"aHv" = (/obj/structure/stool/bed/chair/office/dark,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
"aHw" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/library)
"aHx" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/library)
-"aHy" = (/obj/structure/crematorium,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"aHy" = (/obj/structure/bodycontainer/crematorium,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"aHz" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"aHA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"aHB" = (/obj/effect/landmark/start{name = "Chaplain"},/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
@@ -1968,7 +1968,7 @@
"aLR" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/wood,/area/library)
"aLS" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/wood,/area/library)
"aLT" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/wood,/area/library)
-"aLU" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
+"aLU" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"aLV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/office)
"aLW" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"aLX" = (/obj/machinery/camera{c_tag = "Chapel North"; dir = 2; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/chapel/main)
@@ -3102,8 +3102,8 @@
"bhH" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/medical)
"bhI" = (/turf/simulated/floor/plasteel,/area/security/checkpoint/medical)
"bhJ" = (/obj/machinery/computer/secure_data,/obj/item/device/radio/intercom{pixel_x = 25},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/medical)
-"bhK" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
-"bhL" = (/obj/structure/morgue,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"bhK" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"bhL" = (/obj/structure/bodycontainer/morgue,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bhM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bhN" = (/turf/simulated/floor/plating,/area/storage/emergency)
"bhO" = (/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor/plating,/area/storage/emergency)
@@ -3251,7 +3251,7 @@
"bkA" = (/obj/machinery/power/apc{dir = 8; name = "Medbay Security APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/checkpoint/medical)
"bkB" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel,/area/security/checkpoint/medical)
"bkC" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/checkpoint/medical)
-"bkD" = (/obj/structure/morgue,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
+"bkD" = (/obj/structure/bodycontainer/morgue,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bkE" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{tag = "icon-manifold-b-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bkF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/morgue)
"bkG" = (/obj/machinery/mech_bay_recharge_port,/obj/structure/cable,/turf/simulated/floor/plating,/area/assembly/chargebay)
diff --git a/_maps/map_files/generic/z4.dmm b/_maps/map_files/generic/z4.dmm
index 0b6b03799ea..982f946219b 100644
--- a/_maps/map_files/generic/z4.dmm
+++ b/_maps/map_files/generic/z4.dmm
@@ -352,7 +352,7 @@
"gN" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel,/area/derelict/arrival)
"gO" = (/obj/structure/stool/bed/chair{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel,/area/derelict/arrival)
"gP" = (/obj/machinery/door/morgue{name = "coffin storage"; req_access_txt = "22"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
-"gQ" = (/obj/structure/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
+"gQ" = (/obj/structure/bodycontainer/morgue,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/derelict/medical/chapel)
"gR" = (/obj/structure/table,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless{icon_state = "white"},/area/derelict/medical)
"gS" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/space)
"gT" = (/obj/structure/window/reinforced,/turf/simulated/floor/airless{icon_state = "white"},/area/space)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index f07deae0109..fd314a167c3 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -1,40 +1,108 @@
/* Morgue stuff
* Contains:
* Morgue
- * Morgue trays
- * Creamatorium
- * Creamatorium trays
+ * Morgue tray
+ * Crematorium
+ * Crematorium tray
+ * Crematorium button
*/
/*
- * Morgue
+ * Bodycontainer
+ * Parent class for morgue and crematorium
+ * For overriding only
*/
-
-/obj/structure/morgue
- name = "Morgue"
- desc = "Used to keep bodies in until someone fetches them."
+/obj/structure/bodycontainer
icon = 'icons/obj/stationobjs.dmi'
icon_state = "morgue1"
density = 1
- var/obj/structure/m_tray/connected = null
anchored = 1.0
-/obj/structure/morgue/New()
- connected = new(src)
- connected.connected = src
+ var/obj/structure/tray/connected = null
+ var/locked = 0
+ var/opendir = SOUTH
+
+/obj/structure/bodycontainer/New()
..()
-/obj/structure/morgue/Destroy()
+/obj/structure/bodycontainer/Destroy()
open()
if(connected)
qdel(connected)
connected = null
..()
-/obj/structure/morgue/on_log()
+/obj/structure/bodycontainer/on_log()
update_icon()
-/obj/structure/morgue/update_icon()
+/obj/structure/bodycontainer/update_icon()
+ return
+
+/obj/structure/bodycontainer/alter_health()
+ return src.loc
+
+/obj/structure/bodycontainer/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/structure/bodycontainer/attack_hand(mob/user as mob)
+ if(locked)
+ user << "It's locked."
+ return
+ if(!connected)
+ user << "That doesn't appear to have a tray."
+ return
+ if(connected.loc == src)
+ open()
+ else
+ close()
+ add_fingerprint(user)
+
+/obj/structure/bodycontainer/attackby(P as obj, mob/user as mob)
+ if (istype(P, /obj/item/weapon/pen))
+ var/t = input(user, "What would you like the label to be?", text("[]", name), null) as text
+ if (user.get_active_hand() != P)
+ return
+ if ((!in_range(src, usr) && src.loc != user))
+ return
+ t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
+ if (t)
+ name = text("[]- '[]'", initial(name), t)
+ else
+ name = initial(name)
+ add_fingerprint(user)
+
+/obj/structure/bodycontainer/container_resist()
+ open()
+
+/obj/structure/bodycontainer/proc/open()
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ var/turf/T = get_step(src, opendir)
+ for(var/atom/movable/A in src)
+ A.loc = T
+ update_icon()
+
+/obj/structure/bodycontainer/proc/close()
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ for(var/atom/movable/A in connected.loc)
+ if(!A.anchored || A == connected)
+ A.loc = src
+ update_icon()
+
+/*
+ * Morgue
+ */
+/obj/structure/bodycontainer/morgue
+ name = "morgue"
+ desc = "Used to keep bodies in until someone fetches them."
+ icon_state = "morgue1"
+ opendir = EAST
+
+/obj/structure/bodycontainer/morgue/New()
+ connected = new/obj/structure/tray/m_tray(src)
+ connected.connected = src
+ ..()
+
+/obj/structure/bodycontainer/morgue/update_icon()
if (!connected || connected.loc != src) //open or the tray broke off somehow
src.icon_state = "morgue0"
else
@@ -55,128 +123,29 @@
src.icon_state = "morgue4"//clone that mofo
break
-/obj/structure/morgue/alter_health()
- return src.loc
-
-/obj/structure/morgue/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/structure/morgue/attack_hand(mob/user as mob)
- if(!connected)
- user << "That doesn't appear to have a tray."
- return
- if(connected.loc == src)
- open()
- else
- close()
- add_fingerprint(user)
-
-/obj/structure/morgue/attackby(P as obj, mob/user as mob)
- if (istype(P, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if (user.get_active_hand() != P)
- return
- if ((!in_range(src, usr) && src.loc != user))
- return
- t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
- if (t)
- src.name = text("Morgue- '[]'", t)
- else
- src.name = "Morgue"
- add_fingerprint(user)
-
-/obj/structure/morgue/container_resist()
- open()
-
-/obj/structure/morgue/proc/open()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- var/turf/T = get_step(src, EAST)
- for(var/atom/movable/A in src)
- A.loc = T
- update_icon()
-
-/obj/structure/morgue/proc/close()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- for(var/atom/movable/A in connected.loc)
- if(!A.anchored || A == connected)
- A.loc = src
- update_icon()
-
-
-/*
- * Morgue tray
- */
-/obj/structure/m_tray
- name = "morgue tray"
- desc = "Apply corpse before closing."
- icon = 'icons/obj/stationobjs.dmi'
- icon_state = "morguet"
- density = 1
- layer = 2.0
- var/obj/structure/morgue/connected = null
- anchored = 1.0
- throwpass = 1
-
-/obj/structure/m_tray/Destroy()
- if(connected)
- connected.connected = null
- connected.update_icon()
- connected = null
- ..()
-
-/obj/structure/m_tray/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/structure/m_tray/attack_hand(mob/user as mob)
- if (src.connected)
- connected.close()
- add_fingerprint(user)
- else
- user << "That's not connected to anything."
-
-/obj/structure/m_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
- if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
- return
- if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
- return
- if (!ismob(user) || user.stat || user.lying || user.stunned)
- return
- O.loc = src.loc
- if (user != O)
- for(var/mob/B in viewers(user, 3))
- B.show_message("[user] stuffs [O] into [src]!", 1)
- return
-
-
/*
* Crematorium
*/
-
-/obj/structure/crematorium
+var/global/list/crematoriums = new/list()
+/obj/structure/bodycontainer/crematorium
name = "crematorium"
desc = "A human incinerator. Works well on barbeque nights."
- icon = 'icons/obj/stationobjs.dmi'
icon_state = "crema1"
- density = 1
- var/obj/structure/c_tray/connected = null
- anchored = 1.0
- var/cremating = 0
+ opendir = SOUTH
var/id = 1
- var/locked = 0
-/obj/structure/crematorium/New()
- connected = new(src)
+/obj/structure/bodycontainer/crematorium/Destroy()
+ crematoriums.Remove(src)
+ ..()
+
+/obj/structure/bodycontainer/crematorium/New()
+ connected = new/obj/structure/tray/c_tray(src)
connected.connected = src
+
+ crematoriums.Add(src)
..()
-/obj/structure/crematorium/Destroy()
- open()
- if(connected)
- qdel(connected)
- connected = null
- ..()
-
-/obj/structure/crematorium/update_icon()
+/obj/structure/bodycontainer/crematorium/update_icon()
if(!connected || connected.loc != src)
icon_state = "crema0"
else
@@ -186,51 +155,13 @@
else
src.icon_state = "crema1"
- if(cremating)
+ if(locked)
src.icon_state = "crema_active"
return
-
-/obj/structure/crematorium/alter_health()
- return src.loc
-
-/obj/structure/crematorium/attack_paw(mob/user as mob)
- return src.attack_hand(user)
-
-/obj/structure/crematorium/attack_hand(mob/user as mob)
- if (cremating || locked)
- user << "It's locked."
- return
- if (!connected)
- user << "That doesn't appear to have a tray."
- return
- if(connected.loc == src)
- open()
- else
- close()
- add_fingerprint(user)
-
-/obj/structure/crematorium/attackby(P as obj, mob/user as mob)
- if (istype(P, /obj/item/weapon/pen))
- var/t = input(user, "What would you like the label to be?", text("[]", src.name), null) as text
- if (user.get_active_hand() != P)
- return
- if ((!in_range(src, usr) > 1 && src.loc != user))
- return
- t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
- if (t)
- src.name = text("Crematorium- '[]'", t)
- else
- src.name = "Crematorium"
- src.add_fingerprint(user)
- return
-
-/obj/structure/crematorium/container_resist()
- open()
-
-/obj/structure/crematorium/proc/cremate(mob/user as mob)
- if(cremating)
+/obj/structure/bodycontainer/crematorium/proc/cremate(mob/user as mob)
+ if(locked)
return //don't let you cremate something twice or w/e
if(contents.len <= 1)
@@ -240,7 +171,6 @@
else
audible_message("You hear a roar as the crematorium activates.")
- cremating = 1
locked = 1
update_icon()
@@ -261,57 +191,62 @@
new /obj/effect/decal/cleanable/ash(src)
sleep(30)
- cremating = 0
locked = 0
update_icon()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
-
-/obj/structure/crematorium/proc/open()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- var/turf/T = get_step(src, SOUTH)
- for(var/atom/movable/A in src)
- A.loc = T
- update_icon()
-
-/obj/structure/crematorium/proc/close()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- for(var/atom/movable/A in connected.loc)
- if(!A.anchored || A == connected)
- A.loc = src
- update_icon()
+ playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people
/*
- * Crematorium tray
+Crematorium Switch
+*/
+/obj/machinery/crema_switch/attack_hand(mob/user as mob)
+ if(src.allowed(usr))
+ for (var/obj/structure/bodycontainer/crematorium/C in crematoriums)
+ if (C.id != id)
+ continue
+
+ C.cremate(user)
+ else
+ usr << "Access denied."
+ return
+
+/obj/machinery/crema_switch/attackby(obj/item/W as obj, mob/user as mob)
+ if(W.GetID())
+ attack_hand(user)
+ else
+ return ..()
+
+
+/*
+ * Generic Tray
+ * Parent class for morguetray and crematoriumtray
+ * For overriding only
*/
-/obj/structure/c_tray
- name = "crematorium tray"
- desc = "Apply body before burning."
+/obj/structure/tray
icon = 'icons/obj/stationobjs.dmi'
- icon_state = "cremat"
density = 1
- layer = 2.0
- var/obj/structure/crematorium/connected = null
+ layer = 2.9
+ var/obj/structure/bodycontainer/connected = null
anchored = 1.0
throwpass = 1
-/obj/structure/c_tray/Destroy()
+/obj/structure/tray/Destroy()
if(connected)
connected.connected = null
connected.update_icon()
connected = null
..()
-/obj/structure/c_tray/attack_paw(mob/user as mob)
+/obj/structure/tray/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/obj/structure/c_tray/attack_hand(mob/user as mob)
+/obj/structure/tray/attack_hand(mob/user as mob)
if (src.connected)
connected.close()
add_fingerprint(user)
else
user << "That's not connected to anything."
-/obj/structure/c_tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+/obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
if ((!( istype(O, /atom/movable) ) || O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src) || user.contents.Find(O)))
return
if (!ismob(O) && !istype(O, /obj/structure/closet/body_bag))
@@ -325,13 +260,19 @@
//Foreach goto(99)
return
-/obj/machinery/crema_switch/attack_hand(mob/user as mob)
- if(src.allowed(usr))
- for (var/obj/structure/crematorium/C in world)
- if (C.id == id)
- if (!C.cremating)
- C.cremate(user)
- else
- usr << "Access denied."
- return
+/*
+ * Crematorium tray
+ */
+/obj/structure/tray/c_tray
+ name = "crematorium tray"
+ desc = "Apply body before burning."
+ icon_state = "cremat"
+
+/*
+ * Morgue tray
+ */
+/obj/structure/tray/m_tray
+ name = "morgue tray"
+ desc = "Apply corpse before closing."
+ icon_state = "morguet"