mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-06 15:02:29 +00:00
Fixes revive() working on brainless carbons, making them die right away. It now only heals the body but doesn't actually make the mob alive again. Fixes dead mob put into closet and then revived not seeing the closet vision overlay. Fixes brain mob's emp_damage never decreasing when stat == DEAD. Fixes posibrain's brainmob starting dead. Fixes ai fixing not clearing the blind overlay properly. Fireball projectile no longer explodes on the firer when there's a body on their tile. The fireball's range() code now only checks the two tiles on its front left and front right for mobs to hit. Remove some update_vision_overlays() (now unused) that I forgot to remove. Using a staff oh healing on a corpse with a damaged brain organ will revive the mob and heal the brain organ.
283 lines
7.1 KiB
Plaintext
283 lines
7.1 KiB
Plaintext
/* Morgue stuff
|
|
* Contains:
|
|
* Morgue
|
|
* Morgue tray
|
|
* Crematorium
|
|
* Crematorium tray
|
|
* Crematorium button
|
|
*/
|
|
|
|
/*
|
|
* Bodycontainer
|
|
* Parent class for morgue and crematorium
|
|
* For overriding only
|
|
*/
|
|
/obj/structure/bodycontainer
|
|
icon = 'icons/obj/stationobjs.dmi'
|
|
icon_state = "morgue1"
|
|
density = 1
|
|
anchored = 1
|
|
|
|
var/obj/structure/tray/connected = null
|
|
var/locked = 0
|
|
var/opendir = SOUTH
|
|
|
|
/obj/structure/bodycontainer/New()
|
|
..()
|
|
|
|
/obj/structure/bodycontainer/Destroy()
|
|
open()
|
|
if(connected)
|
|
qdel(connected)
|
|
connected = null
|
|
return ..()
|
|
|
|
/obj/structure/bodycontainer/on_log()
|
|
update_icon()
|
|
|
|
/obj/structure/bodycontainer/update_icon()
|
|
return
|
|
|
|
/obj/structure/bodycontainer/alter_health()
|
|
return src.loc
|
|
|
|
/obj/structure/bodycontainer/relaymove(mob/user)
|
|
if(user.stat || !isturf(loc))
|
|
return
|
|
open()
|
|
|
|
/obj/structure/bodycontainer/attack_paw(mob/user)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/structure/bodycontainer/attack_hand(mob/user)
|
|
if(locked)
|
|
user << "<span class='danger'>It's locked.</span>"
|
|
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(obj/P, mob/user, params)
|
|
if (istype(P, /obj/item/weapon/pen))
|
|
var/t = stripped_input(user, "What would you like the label to be?", text("[]", name), null)
|
|
if (user.get_active_hand() != P)
|
|
return
|
|
if ((!in_range(src, usr) && src.loc != user))
|
|
return
|
|
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/AM in src)
|
|
AM.forceMove(T)
|
|
update_icon()
|
|
|
|
/obj/structure/bodycontainer/proc/close()
|
|
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
|
for(var/atom/movable/AM in connected.loc)
|
|
if(!AM.anchored || AM == connected)
|
|
AM.forceMove(src)
|
|
update_icon()
|
|
|
|
/obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user)
|
|
if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS)))
|
|
user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2)
|
|
/*
|
|
* 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 tray is gone.
|
|
icon_state = "morgue0"
|
|
else
|
|
if(contents.len == 1) // Empty
|
|
icon_state = "morgue1"
|
|
else
|
|
icon_state = "morgue2" // Dead, brainded mob.
|
|
var/list/compiled = recursive_mob_check(src, 0, 0) // Search for mobs in all contents.
|
|
if(!length(compiled)) // No mobs?
|
|
icon_state = "morgue3"
|
|
return
|
|
for(var/mob/living/M in compiled)
|
|
if(M.client)
|
|
icon_state = "morgue4" // Cloneable
|
|
break
|
|
|
|
/*
|
|
* Crematorium
|
|
*/
|
|
var/global/list/crematoriums = new/list()
|
|
/obj/structure/bodycontainer/crematorium
|
|
name = "crematorium"
|
|
desc = "A human incinerator. Works well on barbeque nights."
|
|
icon_state = "crema1"
|
|
opendir = SOUTH
|
|
var/id = 1
|
|
|
|
/obj/structure/bodycontainer/crematorium/Destroy()
|
|
crematoriums.Remove(src)
|
|
return ..()
|
|
|
|
/obj/structure/bodycontainer/crematorium/New()
|
|
connected = new/obj/structure/tray/c_tray(src)
|
|
connected.connected = src
|
|
|
|
crematoriums.Add(src)
|
|
..()
|
|
|
|
/obj/structure/bodycontainer/crematorium/update_icon()
|
|
if(!connected || connected.loc != src)
|
|
icon_state = "crema0"
|
|
else
|
|
|
|
if(src.contents.len > 1)
|
|
src.icon_state = "crema2"
|
|
else
|
|
src.icon_state = "crema1"
|
|
|
|
if(locked)
|
|
src.icon_state = "crema_active"
|
|
|
|
return
|
|
|
|
/obj/structure/bodycontainer/crematorium/proc/cremate(mob/user)
|
|
if(locked)
|
|
return //don't let you cremate something twice or w/e
|
|
|
|
if(contents.len <= 1)
|
|
audible_message("<span class='italics'>You hear a hollow crackle.</span>")
|
|
return
|
|
|
|
else
|
|
audible_message("<span class='italics'>You hear a roar as the crematorium activates.</span>")
|
|
|
|
locked = 1
|
|
update_icon()
|
|
|
|
for(var/mob/living/M in contents)
|
|
if (M.stat != DEAD)
|
|
M.emote("scream")
|
|
if(user)
|
|
user.attack_log +="\[[time_stamp()]\] Cremated <b>[M]/[M.ckey]</b>"
|
|
log_attack("\[[time_stamp()]\] <b>[user]/[user.ckey]</b> cremated <b>[M]/[M.ckey]</b>")
|
|
else
|
|
log_attack("\[[time_stamp()]\] <b>UNKNOWN</b> cremated <b>[M]/[M.ckey]</b>")
|
|
M.death(1)
|
|
if(M) //some animals get automatically deleted on death.
|
|
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
|
|
if(O != connected) //Creamtorium does not burn hot enough to destroy the tray
|
|
qdel(O)
|
|
|
|
new /obj/effect/decal/cleanable/ash(src)
|
|
sleep(30)
|
|
locked = 0
|
|
update_icon()
|
|
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) //you horrible people
|
|
|
|
|
|
/*
|
|
* Generic Tray
|
|
* Parent class for morguetray and crematoriumtray
|
|
* For overriding only
|
|
*/
|
|
/obj/structure/tray
|
|
icon = 'icons/obj/stationobjs.dmi'
|
|
density = 1
|
|
layer = 2.9
|
|
var/obj/structure/bodycontainer/connected = null
|
|
anchored = 1
|
|
pass_flags = LETPASSTHROW
|
|
|
|
/obj/structure/tray/Destroy()
|
|
if(connected)
|
|
connected.connected = null
|
|
connected.update_icon()
|
|
connected = null
|
|
return ..()
|
|
|
|
/obj/structure/tray/attack_paw(mob/user)
|
|
return src.attack_hand(user)
|
|
|
|
/obj/structure/tray/attack_hand(mob/user)
|
|
if (src.connected)
|
|
connected.close()
|
|
add_fingerprint(user)
|
|
else
|
|
user << "<span class='warning'>That's not connected to anything!</span>"
|
|
|
|
/obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user)
|
|
if(!istype(O, /atom/movable) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user)
|
|
return
|
|
if(!ismob(O))
|
|
if(!istype(O, /obj/structure/closet/body_bag))
|
|
return
|
|
else
|
|
var/mob/M = O
|
|
if(M.buckled)
|
|
return
|
|
if(!ismob(user) || user.lying || user.incapacitated())
|
|
return
|
|
O.loc = src.loc
|
|
if (user != O)
|
|
visible_message("<span class='warning'>[user] stuffs [O] into [src].</span>")
|
|
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"
|
|
|
|
/obj/structure/tray/m_tray/CanPass(atom/movable/mover, turf/target, height=0)
|
|
if(height == 0)
|
|
return 1
|
|
|
|
if(istype(mover) && mover.checkpass(PASSTABLE))
|
|
return 1
|
|
if(locate(/obj/structure/table) in get_turf(mover))
|
|
return 1
|
|
else
|
|
return 0
|
|
|
|
/obj/structure/tray/m_tray/CanAStarPass(ID, dir, caller)
|
|
. = !density
|
|
if(ismovableatom(caller))
|
|
var/atom/movable/mover = caller
|
|
. = . || mover.checkpass(PASSTABLE)
|