diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 338293fa588..e66e228e64f 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -12,21 +12,33 @@
/obj/structure/morgue
name = "morgue"
- desc = "Used to keep bodies in untill someone fetches them."
+ desc = "Used to keep bodies in until someone fetches them."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "morgue1"
density = 1
var/obj/structure/m_tray/connected = null
anchored = 1.0
-/obj/structure/morgue/on_log()
- update()
+/obj/structure/morgue/New()
+ connected = new(src)
+ connected.connected = src
+ ..()
-/obj/structure/morgue/proc/update()
- if (src.connected)
+/obj/structure/morgue/Destroy()
+ open()
+ if(connected)
+ qdel(connected)
+ connected = null
+ ..()
+
+/obj/structure/morgue/on_log()
+ update_icon()
+
+/obj/structure/morgue/update_icon()
+ if (!connected || connected.loc != src) //open or the tray broke off somehow
src.icon_state = "morgue0"
else
- if(!src.contents.len)
+ if(src.contents.len == 1) //empty except for the tray
src.icon_state = "morgue1"
else
@@ -43,31 +55,6 @@
src.icon_state = "morgue4"//clone that mofo
break
-
-/obj/structure/morgue/ex_act(severity)
- switch(severity)
- if(1.0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- if(2.0)
- if (prob(50))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- if(3.0)
- if (prob(5))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- return
-
/obj/structure/morgue/alter_health()
return src.loc
@@ -75,31 +62,14 @@
return src.attack_hand(user)
/obj/structure/morgue/attack_hand(mob/user as mob)
- if (src.connected)
- for(var/atom/movable/A as mob|obj in src.connected.loc)
- if (!( A.anchored ))
- A.loc = src
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- //src.connected = null
- qdel(src.connected)
+ if(!connected)
+ user << "That doesn't appear to have a tray."
+ return
+ if(connected.loc == src)
+ open()
else
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- src.connected = new /obj/structure/m_tray( src.loc )
- step(src.connected, EAST)
- src.connected.layer = OBJ_LAYER
- var/turf/T = get_step(src, EAST)
- if (T.contents.Find(src.connected))
- src.connected.connected = src
- src.icon_state = "morgue0"
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.connected.loc
- src.connected.icon_state = "morguet"
- else
- //src.connected = null
- qdel(src.connected)
- src.add_fingerprint(user)
- update()
- return
+ close()
+ add_fingerprint(user)
/obj/structure/morgue/attackby(P as obj, mob/user as mob)
if (istype(P, /obj/item/weapon/pen))
@@ -113,25 +83,24 @@
src.name = text("Morgue- '[]'", t)
else
src.name = "Morgue"
- src.add_fingerprint(user)
- return
+ add_fingerprint(user)
/obj/structure/morgue/container_resist()
- src.connected = new /obj/structure/m_tray( src.loc )
- step(src.connected, EAST)
- src.connected.layer = OBJ_LAYER
+ open()
+
+/obj/structure/morgue/proc/open()
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
var/turf/T = get_step(src, EAST)
- if (T.contents.Find(src.connected))
- src.connected.connected = src
- src.icon_state = "morgue0"
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.connected.loc
- //Foreach goto(106)
- src.connected.icon_state = "morguet"
- else
- //src.connected = null
- qdel(src.connected)
- return
+ 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()
/*
@@ -148,22 +117,22 @@
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)
- for(var/atom/movable/A as mob|obj in src.loc)
- if (!( A.anchored ))
- A.loc = src.connected
- //Foreach goto(26)
- src.connected.connected = null
- src.connected.update()
+ connected.close()
add_fingerprint(user)
- //SN src = null
- qdel(src)
- return
- return
+ 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)))
@@ -196,12 +165,24 @@
var/id = 1
var/locked = 0
-/obj/structure/crematorium/proc/update()
- if (src.connected)
- src.icon_state = "crema0"
+/obj/structure/crematorium/New()
+ connected = new(src)
+ connected.connected = src
+ ..()
+
+/obj/structure/crematorium/Destroy()
+ open()
+ if(connected)
+ qdel(connected)
+ connected = null
+ ..()
+
+/obj/structure/crematorium/update_icon()
+ if(!connected || connected.loc != src)
+ icon_state = "crema0"
else
- if(src.contents.len)
+ if(src.contents.len > 1)
src.icon_state = "crema2"
else
src.icon_state = "crema1"
@@ -212,31 +193,6 @@
return
-
-/obj/structure/crematorium/ex_act(severity)
- switch(severity)
- if(1.0)
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- if(2.0)
- if (prob(50))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- if(3.0)
- if (prob(5))
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.loc
- ex_act(severity)
- qdel(src)
- return
- return
-
/obj/structure/crematorium/alter_health()
return src.loc
@@ -244,39 +200,17 @@
return src.attack_hand(user)
/obj/structure/crematorium/attack_hand(mob/user as mob)
-// if (cremating) AWW MAN! THIS WOULD BE SO MUCH MORE FUN ... TO WATCH
-// user.show_message("\red Uh-oh, that was a bad idea.", 1)
-// //usr << "Uh-oh, that was a bad idea."
-// src:loc:poison += 20000000
-// src:loc:firelevel = src:loc:poison
-// return
- if (cremating)
- usr << "\red It's locked."
+ if (cremating || locked)
+ user << "\red It's locked."
return
- if ((src.connected) && (src.locked == 0))
- for(var/atom/movable/A as mob|obj in src.connected.loc)
- if (!( A.anchored ))
- A.loc = src
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- //src.connected = null
- qdel(src.connected)
- else if (src.locked == 0)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- src.connected = new /obj/structure/c_tray( src.loc )
- step(src.connected, SOUTH)
- src.connected.layer = OBJ_LAYER
- var/turf/T = get_step(src, SOUTH)
- if (T.contents.Find(src.connected))
- src.connected.connected = src
- src.icon_state = "crema0"
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.connected.loc
- src.connected.icon_state = "cremat"
- else
- //src.connected = null
- qdel(src.connected)
- src.add_fingerprint(user)
- update()
+ 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))
@@ -294,30 +228,13 @@
return
/obj/structure/crematorium/container_resist()
- src.connected = new /obj/structure/c_tray( src.loc )
- step(src.connected, SOUTH)
- src.connected.layer = OBJ_LAYER
- var/turf/T = get_step(src, SOUTH)
- if (T.contents.Find(src.connected))
- src.connected.connected = src
- src.icon_state = "crema0"
- for(var/atom/movable/A as mob|obj in src)
- A.loc = src.connected.loc
- //Foreach goto(106)
- src.connected.icon_state = "cremat"
- else
- //src.connected = null
- qdel(src.connected)
- return
+ open()
-/obj/structure/crematorium/proc/cremate(atom/A, mob/user as mob)
-// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm
-// if(var/on == 1)
-// return
+/obj/structure/crematorium/proc/cremate(mob/user as mob)
if(cremating)
return //don't let you cremate something twice or w/e
- if(contents.len <= 0)
+ if(contents.len <= 1)
for (var/mob/M in viewers(src))
M.show_message("\red You hear a hollow crackle.", 1)
return
@@ -332,30 +249,43 @@
cremating = 1
locked = 1
- update()
+ update_icon()
for(var/mob/living/M in contents)
if (M.stat!=2)
M.emote("scream")
//Logging for this causes runtimes resulting in the cremator locking up. Commenting it out until that's figured out.
//M.attack_log += "\[[time_stamp()]\] Has been cremated by [user]/[user.ckey]" //No point in this when the mob's about to be deleted
- //user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
- //log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]")
+ user.attack_log +="\[[time_stamp()]\] Cremated [M]/[M.ckey]"
+ log_attack("\[[time_stamp()]\] [user]/[user.ckey] cremated [M]/[M.ckey]")
M.death(1)
M.ghostize()
qdel(M)
for(var/obj/O in contents) //obj instead of obj/item so that bodybags and ashes get destroyed. We dont want tons and tons of ash piling up
- qdel(O)
+ if(O != connected) //Creamtorium does not burn hot enough to destroy the tray
+ qdel(O)
new /obj/effect/decal/cleanable/ash(src)
sleep(30)
cremating = 0
locked = 0
- update()
+ update_icon()
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- return
+/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()
/*
* Crematorium tray
@@ -371,22 +301,22 @@
anchored = 1.0
throwpass = 1
+/obj/structure/c_tray/Destroy()
+ if(connected)
+ connected.connected = null
+ connected.update_icon()
+ connected = null
+ ..()
+
/obj/structure/c_tray/attack_paw(mob/user as mob)
return src.attack_hand(user)
/obj/structure/c_tray/attack_hand(mob/user as mob)
if (src.connected)
- for(var/atom/movable/A as mob|obj in src.loc)
- if (!( A.anchored ))
- A.loc = src.connected
- //Foreach goto(26)
- src.connected.connected = null
- src.connected.update()
+ connected.close()
add_fingerprint(user)
- //SN src = null
- qdel(src)
- return
- return
+ else
+ user << "That's not connected to anything."
/obj/structure/c_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)))