|
|
|
@@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
|
|
|
|
|
invisibility = INVISIBILITY_OBSERVER
|
|
|
|
|
hud_type = /datum/hud/ghost
|
|
|
|
|
var/can_reenter_corpse
|
|
|
|
|
var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by SUICIDE_REENTER_ROUND_TIMER.
|
|
|
|
|
var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit)
|
|
|
|
|
var/datum/hud/living/carbon/hud = null // hud
|
|
|
|
|
var/bootime = 0
|
|
|
|
|
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
|
|
|
|
@@ -260,18 +260,20 @@ Transfer_mind is there to check if mob is being deleted/not going to have a body
|
|
|
|
|
Works together with spawning an observer, noted above.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE)
|
|
|
|
|
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse, special) & COMPONENT_BLOCK_GHOSTING))
|
|
|
|
|
/mob/proc/ghostize(can_reenter_corpse = TRUE, special = FALSE, penalize = FALSE)
|
|
|
|
|
if(!key || cmptext(copytext(key,1,2),"@") || (!special && SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, can_reenter_corpse) & COMPONENT_BLOCK_GHOSTING))
|
|
|
|
|
return //mob has no key, is an aghost or some component hijacked.
|
|
|
|
|
stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now
|
|
|
|
|
var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc.
|
|
|
|
|
SStgui.on_transfer(src, ghost) // Transfer NanoUIs.
|
|
|
|
|
ghost.can_reenter_corpse = can_reenter_corpse
|
|
|
|
|
if(suiciding)
|
|
|
|
|
var/penalty = SUICIDE_REENTER_ROUND_TIMER
|
|
|
|
|
if(world.time < ROUNDSTART_QUITTER_TIME_LIMIT) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed.
|
|
|
|
|
penalty += ROUNDSTART_QUITTER_TIME_LIMIT - world.time
|
|
|
|
|
ghost.reenter_round_timeout = world.realtime + penalty
|
|
|
|
|
if(penalize) //penalizing them from making a ghost role / midround antag comeback right away.
|
|
|
|
|
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer)
|
|
|
|
|
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit)
|
|
|
|
|
if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed.
|
|
|
|
|
penalty += roundstart_quit_limit - world.time
|
|
|
|
|
if(penalty)
|
|
|
|
|
ghost.reenter_round_timeout = world.realtime + penalty
|
|
|
|
|
transfer_ckey(ghost, FALSE)
|
|
|
|
|
return ghost
|
|
|
|
|
|
|
|
|
@@ -287,29 +289,25 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|
|
|
|
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, (stat == DEAD) ? TRUE : FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/penalty = SUICIDE_REENTER_ROUND_TIMER
|
|
|
|
|
if(world.time < ROUNDSTART_QUITTER_TIME_LIMIT)
|
|
|
|
|
penalty += ROUNDSTART_QUITTER_TIME_LIMIT - world.time
|
|
|
|
|
// CITADEL EDIT
|
|
|
|
|
if(istype(loc, /obj/machinery/cryopod))
|
|
|
|
|
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round for the next [round(penalty/600, 600)] minutes! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
|
|
|
|
if(response != "Ghost")//darn copypaste
|
|
|
|
|
return
|
|
|
|
|
var/obj/machinery/cryopod/C = loc
|
|
|
|
|
C.despawn_occupant()
|
|
|
|
|
return
|
|
|
|
|
// END EDIT
|
|
|
|
|
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer)
|
|
|
|
|
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit)
|
|
|
|
|
if(world.time < roundstart_quit_limit)
|
|
|
|
|
penalty += roundstart_quit_limit - world.time
|
|
|
|
|
|
|
|
|
|
if(stat != DEAD)
|
|
|
|
|
succumb()
|
|
|
|
|
if(stat == DEAD)
|
|
|
|
|
ghostize(1)
|
|
|
|
|
else
|
|
|
|
|
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round for the next [round(penalty/600, 600)] minutes! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
|
|
|
|
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles for the next [round(penalty/600)] minutes" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
|
|
|
|
if(response != "Ghost")
|
|
|
|
|
return //didn't want to ghost after-all
|
|
|
|
|
ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
|
|
|
|
|
suicide_log(TRUE)
|
|
|
|
|
if(istype(loc, /obj/machinery/cryopod))
|
|
|
|
|
var/obj/machinery/cryopod/C = loc
|
|
|
|
|
C.despawn_occupant()
|
|
|
|
|
else
|
|
|
|
|
ghostize(0, penalize = TRUE) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
|
|
|
|
|
suicide_log(TRUE)
|
|
|
|
|
|
|
|
|
|
/mob/camera/verb/ghost()
|
|
|
|
|
set category = "OOC"
|
|
|
|
@@ -319,14 +317,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|
|
|
|
if(SEND_SIGNAL(src, COMSIG_MOB_GHOSTIZE, FALSE, FALSE) & COMPONENT_BLOCK_GHOSTING)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/penalty = SUICIDE_REENTER_ROUND_TIMER
|
|
|
|
|
if(world.time < ROUNDSTART_QUITTER_TIME_LIMIT)
|
|
|
|
|
penalty += ROUNDSTART_QUITTER_TIME_LIMIT - world.time
|
|
|
|
|
var/penalty = CONFIG_GET(number/suicide_reenter_round_timer)
|
|
|
|
|
var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit)
|
|
|
|
|
if(world.time < roundstart_quit_limit)
|
|
|
|
|
penalty += roundstart_quit_limit - world.time
|
|
|
|
|
|
|
|
|
|
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you won't be able to re-enter this round for the next [round(penalty/600, 600)] minutes! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
|
|
|
|
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst alive you won't be able to re-enter this round [penalty ? "or play ghost roles for the next [round(penalty/600)] minutes" : ""]! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
|
|
|
|
if(response != "Ghost")
|
|
|
|
|
return
|
|
|
|
|
ghostize(0)
|
|
|
|
|
ghostize(0, penalize = TRUE)
|
|
|
|
|
|
|
|
|
|
/mob/dead/observer/Move(NewLoc, direct)
|
|
|
|
|
if(updatedir)
|
|
|
|
|