Recovered Crew | Medical+Cargo Respawns (#87072)

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
This commit is contained in:
Time-Green
2024-10-26 09:36:57 +02:00
committed by GitHub
co-authored by MrMelbert _0Steven SmArtKar
parent 95cc258845
commit d170a410d4
45 changed files with 950 additions and 72 deletions
@@ -0,0 +1,119 @@
/// Proc ghosts to enter the body when it get's revived
/datum/component/ghostrole_on_revive
/// If revived and no ghosts, just die again?
var/refuse_revival_if_failed
/// Callback for when the mob is revived and has their body occupied by a ghost
var/datum/callback/on_succesful_revive
/datum/component/ghostrole_on_revive/Initialize(refuse_revival_if_failed, on_succesful_revive)
. = ..()
src.refuse_revival_if_failed = refuse_revival_if_failed
src.on_succesful_revive = on_succesful_revive
ADD_TRAIT(parent, TRAIT_GHOSTROLE_ON_REVIVE, REF(src)) //for adding an alternate examination
if(ismob(parent))
prepare_mob(parent)
return
if(!istype(parent, /obj/item/organ/internal/brain))
return COMPONENT_INCOMPATIBLE
var/obj/item/organ/internal/brain/brein = parent
if(brein.owner)
prepare_mob(brein.owner)
else
prepare_brain(brein)
/// Give the appropriate signals, and watch for organ removal
/datum/component/ghostrole_on_revive/proc/prepare_mob(mob/living/liver)
RegisterSignal(liver, COMSIG_LIVING_REVIVE, PROC_REF(on_revive))
ADD_TRAIT(liver, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
liver.med_hud_set_status()
if(iscarbon(liver))
var/mob/living/carbon/carbon = liver
var/obj/item/organ/brain = carbon.get_organ_by_type(/obj/item/organ/internal/brain)
if(brain)
RegisterSignal(brain, COMSIG_ORGAN_REMOVED, PROC_REF(on_remove))
/datum/component/ghostrole_on_revive/proc/on_remove(obj/item/organ/brain, mob/living/old_owner)
SIGNAL_HANDLER
REMOVE_TRAIT(old_owner, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
// we might have some lingering blinking eyes
var/obj/item/bodypart/head/head = old_owner?.get_bodypart(BODY_ZONE_HEAD)
if(head)
var/soul_eyes = locate(/datum/bodypart_overlay/simple/soul_pending_eyes) in head.bodypart_overlays
if(soul_eyes)
head.remove_bodypart_overlay(soul_eyes)
prepare_brain(brain)
/datum/component/ghostrole_on_revive/proc/prepare_brain(obj/item/organ/brein)
SIGNAL_HANDLER
RegisterSignal(brein, COMSIG_ORGAN_IMPLANTED, PROC_REF(prepare_mob_from_brain))
UnregisterSignal(brein, COMSIG_ORGAN_REMOVED)
/datum/component/ghostrole_on_revive/proc/prepare_mob_from_brain(obj/item/organ/internal/brain/brein, mob/living/owner)
SIGNAL_HANDLER
UnregisterSignal(brein, COMSIG_ORGAN_IMPLANTED)
prepare_mob(owner)
/datum/component/ghostrole_on_revive/proc/on_revive(mob/living/aliver)
SIGNAL_HANDLER
INVOKE_ASYNC(src, PROC_REF(poll_ghosts), aliver)
/datum/component/ghostrole_on_revive/proc/poll_ghosts(mob/living/aliver)
var/soul_eyes
var/obj/item/bodypart/head
// adds soulful SOUL PENDING eyes to indicate what's happening to observers
var/mob/living/carbon/human/hewmon
if(ishuman(aliver))
hewmon = aliver
head = hewmon.get_bodypart(BODY_ZONE_HEAD)
if(head)
soul_eyes = new /datum/bodypart_overlay/simple/soul_pending_eyes ()
head.add_bodypart_overlay(soul_eyes)
hewmon.update_body_parts()
var/mob/dead/observer/chosen_one = SSpolling.poll_ghosts_for_target(
question = "Would you like to play as a recovered crewmember?",
role = null,
check_jobban = ROLE_RECOVERED_CREW,
poll_time = 15 SECONDS,
checked_target = aliver,
ignore_category = POLL_IGNORE_RECOVERED_CREW,
alert_pic = aliver,
role_name_text = "recovered crew",
)
if(head)
head.remove_bodypart_overlay(soul_eyes)
hewmon?.update_body_parts()
if(!isobserver(chosen_one))
if(refuse_revival_if_failed)
aliver.death()
aliver.visible_message(span_deadsay("[aliver.name]'s soul is struggling to return!"))
else
aliver.key = chosen_one.key
on_succesful_revive?.Invoke(aliver)
qdel(src)
/datum/component/ghostrole_on_revive/Destroy(force)
REMOVE_TRAIT(parent, TRAIT_GHOSTROLE_ON_REVIVE, REF(src))
var/mob/living/living
if(isliving(parent))
living = parent
else if(istype(parent, /obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/brain = parent
living = brain.owner
living?.med_hud_set_status()
. = ..()