diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 192606f191f..1cac5747c14 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -112,6 +112,8 @@
to_chat(user, "[span_warning("\The [src] isn't bright enough to see anything!")] ")
return
+ var/render_list = list()//information will be packaged in a list for clean display to the user
+
switch(user.zone_selected)
if(BODY_ZONE_PRECISE_EYES)
if((M.head && M.head.flags_cover & HEADCOVERSEYES) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) || (M.glasses && M.glasses.flags_cover & GLASSESCOVERSEYES))
@@ -119,24 +121,38 @@
return
var/obj/item/organ/internal/eyes/E = M.get_organ_slot(ORGAN_SLOT_EYES)
+ var/obj/item/organ/internal/brain = M.get_organ_slot(ORGAN_SLOT_BRAIN)
if(!E)
to_chat(user, span_warning("[M] doesn't have any eyes!"))
return
+ M.flash_act(visual = TRUE, length = (user.combat_mode) ? 2.5 SECONDS : 1 SECONDS) // Apply a 1 second flash effect to the target. The duration increases to 2.5 Seconds if you have combat mode on.
+
if(M == user) //they're using it on themselves
- if(M.flash_act(visual = 1))
- M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes! Trippy!"))
+ user.visible_message(span_warning("[user] shines [src] into [M.p_their()] eyes."), ignored_mobs = user)
+ render_list += span_info("You direct [src] to into your eyes:\n")
+
+ if(M.is_blind())
+ render_list += "You're not entirely certain what you were expecting...\n"
else
- M.visible_message(span_notice("[M] directs [src] to [M.p_their()] eyes."), span_notice("You wave the light in front of your eyes."))
+ render_list += "Trippy!\n"
+
else
- user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), \
- span_danger("You direct [src] to [M]'s eyes."))
- if(M.stat == DEAD || (M.is_blind()) || !M.flash_act(visual = 1)) //mob is dead or fully blind
- to_chat(user, span_warning("[M]'s pupils don't react to the light!"))
- else if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray)) //mob has X-ray vision
- to_chat(user, span_danger("[M]'s pupils give an eerie glow!"))
- else //they're okay!
- to_chat(user, span_notice("[M]'s pupils narrow."))
+ user.visible_message(span_warning("[user] directs [src] to [M]'s eyes."), ignored_mobs = user)
+ render_list += span_info("You direct [src] to [M]'s eyes:\n")
+
+ if(M.stat == DEAD || M.is_blind())
+ render_list += "[M.p_their(TRUE)] pupils don't react to the light!\n"//mob is dead
+ else if(brain.damage > 20)
+ render_list += "[M.p_their(TRUE)] pupils contract unevenly!\n"//mob has sustained damage to their brain
+ else
+ render_list += "[M.p_their(TRUE)] pupils narrow.\n"//they're okay :D
+
+ if(M.dna && M.dna.check_mutation(/datum/mutation/human/xray))
+ render_list += "[M.p_their(TRUE)] pupils give an eerie glow!\n"//mob has X-ray vision
+
+ //display our packaged information in an examine block for easy reading
+ to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
if(BODY_ZONE_PRECISE_MOUTH)
@@ -144,8 +160,6 @@
to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first!"))
return
- var/their = M.p_their()
-
var/list/mouth_organs = new
for(var/obj/item/organ/organ as anything in M.organs)
if(organ.zone == BODY_ZONE_PRECISE_MOUTH)
@@ -166,7 +180,7 @@
for(var/datum/action/item_action/hands_free/activate_pill/AP in M.actions)
pill_count++
- if(M == user)
+ if(M == user)//if we're looking on our own mouth
var/can_use_mirror = FALSE
if(isturf(user.loc))
var/obj/structure/mirror/mirror = locate(/obj/structure/mirror, user.loc)
@@ -181,27 +195,57 @@
if(WEST)
can_use_mirror = mirror.pixel_x < 0
- M.visible_message(span_notice("[M] directs [src] to [their] mouth."), \
- span_notice("You point [src] into your mouth."))
+ M.visible_message(span_notice("[M] directs [src] to [ M.p_their()] mouth."), ignored_mobs = user)
+ render_list += span_info("You point [src] into your mouth:\n")
if(!can_use_mirror)
to_chat(user, span_notice("You can't see anything without a mirror."))
return
if(organ_count)
- to_chat(user, span_notice("Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list]."))
+ render_list += "Inside your mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n"
else
- to_chat(user, span_notice("There's nothing inside your mouth."))
+ render_list += "There's nothing inside your mouth.\n"
if(pill_count)
- to_chat(user, span_notice("You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""]."))
+ render_list += "You have [pill_count] implanted pill[pill_count > 1 ? "s" : ""].\n"
- else
- user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."),\
- span_notice("You direct [src] to [M]'s mouth."))
+ else //if we're looking in someone elses mouth
+ user.visible_message(span_notice("[user] directs [src] to [M]'s mouth."), ignored_mobs = user)
+ render_list += span_info("You point [src] into [M]'s mouth:\n")
if(organ_count)
- to_chat(user, span_notice("Inside [their] mouth [organ_count > 1 ? "are" : "is"] [organ_list]."))
+ render_list += "Inside [ M.p_their()] mouth [organ_count > 1 ? "are" : "is"] [organ_list].\n"
else
- to_chat(user, span_notice("[M] doesn't have any organs in [their] mouth."))
+ render_list += "[M] doesn't have any organs in [ M.p_their()] mouth.\n"
if(pill_count)
- to_chat(user, span_notice("[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [their] teeth."))
+ render_list += "[M] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [ M.p_their()] teeth.\n"
+
+ //assess any suffocation damage
+ var/hypoxia_status = M.getOxyLoss() > 20
+
+ if(M == user)
+ if(hypoxia_status)
+ render_list += "Your lips appear blue!\n"//you have suffocation damage
+ else
+ render_list += "Your lips appear healthy.\n"//you're okay!
+ else
+ if(hypoxia_status)
+ render_list += "[M.p_their(TRUE)] lips appear blue!\n"//they have suffocation damage
+ else
+ render_list += "[M.p_their(TRUE)] lips appear healthy.\n"//they're okay!
+
+ //assess blood level
+ if(M == user)
+ render_list += span_info("You press a finger to your gums:\n")
+ else
+ render_list += span_info("You press a finger to [M.p_their()] gums:\n")
+
+ if(M.blood_volume <= BLOOD_VOLUME_SAFE && M.blood_volume > BLOOD_VOLUME_OKAY)
+ render_list += "Color returns slowly!\n"//low blood
+ else if(M.blood_volume <= BLOOD_VOLUME_OKAY)
+ render_list += "Color does not return!\n"//critical blood
+ else
+ render_list += "Color returns quickly.\n"//they're okay :D
+
+ //display our packaged information in an examine block for easy reading
+ to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
else
return ..()
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index e01fd3bb353..dc8e5623267 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -185,26 +185,118 @@
var/mob/living/carbon/carbon_patient = M
var/body_part = parse_zone(user.zone_selected)
+ var/oxy_loss = carbon_patient.getOxyLoss()
- var/heart_strength = span_danger("no")
- var/lung_strength = span_danger("no")
+ var/heart_strength
+ var/pulse_pressure
var/obj/item/organ/internal/heart/heart = carbon_patient.get_organ_slot(ORGAN_SLOT_HEART)
var/obj/item/organ/internal/lungs/lungs = carbon_patient.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/organ/internal/liver/liver = carbon_patient.get_organ_slot(ORGAN_SLOT_LIVER)
+ var/obj/item/organ/internal/appendix/appendix = carbon_patient.get_organ_slot(ORGAN_SLOT_APPENDIX)
- if(carbon_patient.stat != DEAD && !(HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH)))
- if(istype(heart))
- heart_strength = (heart.beating ? "a healthy" : span_danger("an unstable"))
- if(istype(lungs))
- lung_strength = ((carbon_patient.failed_last_breath || carbon_patient.losebreath) ? span_danger("strained") : "healthy")
+ var/render_list = list()//information will be packaged in a list for clean display to the user
- user.visible_message(span_notice("[user] places [src] against [carbon_patient]'s [body_part] and listens attentively."), ignored_mobs = user)
+ //determine what specific action we're taking
+ switch (body_part)
+ if(BODY_ZONE_CHEST)//Listening to the chest
+ user.visible_message(span_notice("[user] places [src] against [carbon_patient]'s [body_part] and listens attentively."), ignored_mobs = user)
+ if(!user.can_hear())
+ to_chat(user, span_notice("You place [src] against [carbon_patient]'s [body_part]. Fat load of good it does you though, since you can't hear"))
+ return
+ else
+ render_list += span_info("You place [src] against [carbon_patient]'s [body_part]:\n")
- var/diagnosis = (body_part == BODY_ZONE_CHEST ? "You hear [heart_strength] pulse and [lung_strength] respiration" : "You faintly hear [heart_strength] pulse")
- if(!user.can_hear())
- diagnosis = "Fat load of good it does you though, since you can't hear"
+ //assess breathing
+ if(!lungs)//sanity check, enusure patient actually has lungs
+ render_list += "[M] doesn't have any lungs!\n"
+ else
+ if(carbon_patient.stat == DEAD || (HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH)) || (HAS_TRAIT(carbon_patient, TRAIT_NOBREATH))|| carbon_patient.failed_last_breath || carbon_patient.losebreath)//If pt is dead or otherwise not breathing
+ render_list += "[M.p_theyre(TRUE)] not breathing!\n"
+ else if(lungs.damage > 10)//if breathing, check for lung damage
+ render_list += "You hear fluid in [M.p_their()] lungs!\n"
+ else if(oxy_loss > 10)//if they have suffocation damage
+ render_list += "[M.p_theyre(TRUE)] breathing heavily!\n"
+ else
+ render_list += "[M.p_theyre(TRUE)] breathing normally.\n"//they're okay :D
- to_chat(user, span_notice("You place [src] against [carbon_patient]'s [body_part]. [diagnosis]."))
+ //assess heart
+ if(body_part == BODY_ZONE_CHEST)//if we're listening to the chest
+ if(!heart)//sanity check, ensure the patient actually has a heart
+ render_list += "[M] doesn't have a heart!\n"
+ else
+ if(!heart.beating || carbon_patient.stat == DEAD)
+ render_list += "You don't hear a heartbeat!\n"//they're dead or their heart isn't beating
+ else if(heart.damage > 10 || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY)
+ render_list += "You hear a weak heartbeat.\n"//their heart is damaged, or they have critical blood
+ else
+ render_list += "You hear a healthy heartbeat.\n"//they're okay :D
+
+ if(BODY_ZONE_PRECISE_GROIN)//If we're targeting the groin
+ render_list += span_info("You carefully press down on [carbon_patient]'s abdomen:\n")
+ user.visible_message(span_notice("[user] presses their hands against [carbon_patient]'s abdomen."), ignored_mobs = user)
+
+ //assess abdominal organs
+ if(body_part == BODY_ZONE_PRECISE_GROIN)
+ var/appendix_okay = TRUE
+ var/liver_okay = TRUE
+ if(!liver)//sanity check, ensure the patient actually has a liver
+ render_list += "[M] doesn't have a liver!\n"
+ liver_okay = FALSE
+ else
+ if(liver.damage > 10)
+ render_list += "[M.p_their(TRUE)] liver feels firm.\n"//their liver is damaged
+ liver_okay = FALSE
+
+ if(!appendix)//sanity check, ensure the patient actually has an appendix
+ render_list += "[M] doesn't have an appendix!\n"
+ appendix_okay = FALSE
+ else
+ if(appendix.damage > 10 && carbon_patient.stat == CONSCIOUS)
+ render_list += "[M] screams when you lift your hand from [M.p_their()] appendix!\n"//scream if their appendix is damaged and they're awake
+ M.emote("scream")
+ appendix_okay = FALSE
+
+ if(liver_okay && appendix_okay)//if they have all their organs and have no detectable damage
+ render_list += "You don't find anything abnormal.\n"//they're okay :D
+
+ if(BODY_ZONE_PRECISE_EYES)
+ balloon_alert(user, "can't do that!")
+ return
+
+ if(BODY_ZONE_PRECISE_MOUTH)
+ balloon_alert(user, "can't do that!")
+ return
+
+ else//targeting an extremity or the head
+ if(body_part == BODY_ZONE_HEAD)
+ render_list += span_info("You carefully press your fingers to [carbon_patient]'s neck:\n")
+ user.visible_message(span_notice("[user] presses their fingers against [carbon_patient]'s neck."), ignored_mobs = user)
+ else
+ render_list += span_info("You carefully press your fingers to [carbon_patient]'s [body_part]:\n")
+ user.visible_message(span_notice("[user] presses their fingers against [carbon_patient]'s [body_part]."), ignored_mobs = user)
+
+ //assess pulse (heart & blood level)
+ if(!heart)//sanity check, ensure the patient actually has a heart
+ render_list += "[M] doesn't have a heart!\n"
+ else
+ if(!heart.beating || carbon_patient.blood_volume <= BLOOD_VOLUME_OKAY || carbon_patient.stat == DEAD)
+ render_list += "You can't find a pulse!\n"//they're dead, their heart isn't beating, or they have critical blood
+ else
+ if(heart.damage > 10)
+ heart_strength = span_danger("irregular")//their heart is damaged
+ else
+ heart_strength = span_notice("regular")//they're okay :D
+
+ if(carbon_patient.blood_volume <= BLOOD_VOLUME_SAFE && carbon_patient.blood_volume > BLOOD_VOLUME_OKAY)
+ pulse_pressure = span_danger("thready")//low blood
+ else
+ pulse_pressure = span_notice("strong")//they're okay :D
+
+ render_list += "[M.p_their(TRUE)] pulse is [pulse_pressure] and [heart_strength].\n"
+
+ //display our packaged information in an examine block for easy reading
+ to_chat(user, examine_block(jointext(render_list, "")), type = MESSAGE_TYPE_INFO)
///////////
//SCARVES//