Admin tool, the life candle! (#23955)

* Admin tool, the life candle!

🆑 coiax
add: Added an admin only tool, the life candle. Touch the candle, and
when you die, you'll respawn shortly afterwards. Touch it again to stop.
Used for testing, thunderdome brawls and good old fashioned memery.
/🆑

Requested.

* Bug fixes

* Moves life_candle.dm
This commit is contained in:
coiax
2017-02-13 08:12:13 +00:00
committed by oranges
parent 89f09dfd6a
commit 70e66069b8
6 changed files with 107 additions and 5 deletions
@@ -0,0 +1,90 @@
/obj/structure/life_candle
name = "life candle"
desc = "You are dead. Insert quarter to continue."
icon = 'icons/obj/candle.dmi'
icon_state = "candle1"
var/icon_state_active = "candle1_lit"
var/icon_state_inactive = "candle1"
anchored = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
var/lit_luminosity = 2
var/list/datum/mind/linked_minds = list()
// If the body is destroyed, what do we spawn for them
var/mob_type = /mob/living/carbon/human
// If the respawned person is given a specific outfit
var/datum/outfit/outfit
// How long until we respawn them after their death.
var/respawn_time = 50
var/respawn_sound = 'sound/magic/Staff_animation.ogg'
/obj/structure/life_candle/attack_hand(mob/user)
if(!user.mind)
return
if(user.mind in linked_minds)
user.visible_message("<span class='notice'>[user] reaches out and pinches the flame of [src].</span>", "<span class='warning'>You sever the connection between yourself and [src].</span>")
linked_minds -= user.mind
else
user.visible_message("<span class='notice'>[user] touches [src]. It seems to respond to their presence!</span>", "<span class='warning'>You create a connection between you and [src].</span>")
linked_minds |= user.mind
update_icon()
float(linked_minds.len)
if(linked_minds.len)
START_PROCESSING(SSobj, src)
SetLuminosity(lit_luminosity)
else
STOP_PROCESSING(SSobj, src)
SetLuminosity(0)
/obj/structure/life_candle/update_icon()
if(linked_minds.len)
icon_state = icon_state_active
else
icon_state = icon_state_inactive
/obj/structure/life_candle/examine(mob/user)
. = ..()
if(linked_minds.len)
user << "[src] is active, and linked to [linked_minds.len] souls."
else
user << "It is static, still, unmoving."
/obj/structure/life_candle/process()
if(!linked_minds.len)
STOP_PROCESSING(SSobj, src)
return
for(var/m in linked_minds)
var/datum/mind/mind = m
if(!mind.current || (mind.current && mind.current.stat == DEAD))
addtimer(CALLBACK(src, .proc/respawn, mind), respawn_time, TIMER_UNIQUE)
/obj/structure/life_candle/proc/respawn(datum/mind/mind)
var/turf/T = get_turf(src)
var/mob/living/body
if(mind.current)
if(mind.current.stat != DEAD)
return
else
body = mind.current
if(!body)
body = new mob_type(T)
var/mob/ghostie = mind.get_ghost(TRUE)
if(ghostie.client && ghostie.client.prefs)
ghostie.client.prefs.copy_to(body)
mind.transfer_to(body)
else
body.forceMove(T)
body.revive(1,1)
mind.grab_ghost(TRUE)
body.flash_act()
if(ishuman(body) && istype(outfit))
outfit.equip(body)
playsound(T, respawn_sound, 50, 1)