diff --git a/code/datums/skills/occupational/medical.dm b/code/datums/skills/occupational/medical.dm
index c749937dd0c..2b2010142bb 100644
--- a/code/datums/skills/occupational/medical.dm
+++ b/code/datums/skills/occupational/medical.dm
@@ -69,12 +69,38 @@
/singleton/skill/anatomy
name = "Anatomy"
- description = "Not currently implemented."
+ description = "Governs the speed at which you can check yourself for injuries, as well as the quality of the information obtained when doing so."
maximum_level = SKILL_LEVEL_PROFESSIONAL
- uneducated_skill_cap = SKILL_LEVEL_TRAINED
+ uneducated_skill_cap = SKILL_LEVEL_PROFESSIONAL
category = /singleton/skill_category/occupational
subcategory = SKILL_SUBCATEGORY_MEDICAL
component_type = ANATOMY_SKILL_COMPONENT
+ skill_level_descriptions = alist(
+ SKILL_LEVEL_UNFAMILIAR = "You have zero training or knowledge of anatomy.
" \
+ + " - You can only distinguish visible damage like cuts and burns.",
+ SKILL_LEVEL_FAMILIAR = "You have minimal training on the basics of anatomy.
" \
+ + "You can diagnose the following conditions:
" \
+ + " - External injuries.
" \
+ + " - Limb dislocation.
" \
+ + " - Simple bleeds.",
+ SKILL_LEVEL_TRAINED = "You have years of formal training and experience with anatomy.
" \
+ + "You can diagnose the following conditions:
" \
+ + " - External injuries at a high level of detail.
" \
+ + " - Limb dislocation.
" \
+ + " - Broken bones.
" \
+ + " - Distinguish between simple bleeds and severed arteries.
" \
+ + " - Limb necrosis.
" \
+ + " - Tag injuries by triage priority.",
+ SKILL_LEVEL_PROFESSIONAL = "You have extensive training and experience with anatomy.
" \
+ + "You can diagnose the following conditions at the highest level of detail:
" \
+ + " - External injuries at a high level of detail.
" \
+ + " - Limb dislocation.
" \
+ + " - Broken bones.
" \
+ + " - Distinguish between simple bleeds and severed arteries.
" \
+ + " - Limb necrosis.
" \
+ + " - Tag injuries by triage priority."
+ )
+ required = TRUE
/singleton/skill/forensics
name = "Forensics"
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 0354370bb2c..08d6660d9fd 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -220,52 +220,118 @@
var/mob/living/carbon/human/H = src
src.visible_message(
SPAN_NOTICE("[src] examines [src.get_pronoun("himself")]."), \
- SPAN_NOTICE("You check yourself for injuries.") \
+ SPAN_NOTICE("You start checking yourself for injuries.") \
)
+ var/anatomy = GET_SKILL_LEVEL(M, ANATOMY_SKILL_COMPONENT)
+ if (!do_after(M, 5 SECONDS * (1 / (anatomy ? anatomy : 1))))
+ to_chat(M, SPAN_WARNING("You must stand still to examine yourself for injuries."))
+ return
+
+ // Set to vanilla-equivalent for people without the skill.
+ if(!anatomy)
+ anatomy = 2
+ var/painful_check = FALSE
for(var/obj/item/organ/external/org in H.organs)
var/list/status = list()
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
+
+ // Basic Anatomy 1: All the obvious stuff
+ // Damaged and missing limbs
switch(brutedamage)
- if(1 to 20)
- status += "bruised"
- if(20 to 40)
- status += "wounded"
- if(40 to INFINITY)
- status += "mangled"
+ if(1 to 10)
+ status += (anatomy < 3 ? "bruised" : "superficially cut")
+ if(10 to 25)
+ status += (anatomy < 3 ? "wounded" : "moderately injured")
+ if(25 to 50)
+ status += (anatomy < 3 ? "badly injured" : "significantly injured")
+ if(50 to 75)
+ status += (anatomy < 3 ? "severely injured" : "mangled and difficult to move")
+ if(75 to 100)
+ status += (anatomy < 3 ? "extremely injured" : SPAN_DANGER("horribly mangled, and it feels like it may give out at any moment"))
+ if(100 to INFINITY)
+ status += (anatomy < 3 ? "critically injured" : SPAN_DANGER("ruined beyond recognition, and you can barely feel it at all"))
switch(burndamage)
if(1 to 10)
- status += "numb"
- if(10 to 40)
- status += "blistered"
- if(40 to INFINITY)
- status += "peeling away"
+ status += (anatomy < 3 ? "numb" : "lightly burned")
+ if(10 to 25)
+ status += (anatomy < 3 ? "blistered" : "moderately burned")
+ if(25 to 50)
+ status += (anatomy < 3 ? "peeling away" : "marked by notable partial-thickness burns")
+ if(50 to 75)
+ status += (anatomy < 3 ? "visibly charred" : "covered in extensive partial-thickness burns")
+ if(75 to 100)
+ status += (anatomy < 3 ? "like black leather" : SPAN_DANGER("burned down to deadened, leathery tissue and looks close to being unrecoverable"))
+ if(100 to INFINITY)
+ status += (anatomy < 3 ? "like charcoal" : SPAN_DANGER("charred beyond recognition and may be beyond saving"))
if(org.is_stump())
status += SPAN_DANGER("MISSING")
if(org.status & ORGAN_MUTATED)
status += "weirdly shapen"
- if(org.dislocated == 2)
- status += "dislocated"
- if(org.status & ORGAN_BROKEN)
- status += "hurts when touched"
- if(org.status & ORGAN_DEAD)
- status += "is necrotic"
if(!org.is_usable())
status += "dangling uselessly"
- if(org.status & ORGAN_BLEEDING)
- status += SPAN_DANGER("bleeding")
+ // End of basic Anatomy 1.
+
+ // Advanced Anatomy 1: Slightly harder.
+ // Dislocation
+ // Broken limbs
+ // Regular and arterial bleeding are vague
+ // Necrotic is vague
+ if(org.dislocated == 2)
+ status += (anatomy >= 2 ? "dislocated" : "hanging oddly")
+ if(org.status & ORGAN_BROKEN)
+ status += (anatomy < 3 ? "hurts when touched" : "broken")
+ painful_check = TRUE
+ // Anatomy 2 can't distinguish between regular bleeding and arterial.
+ // Bleeding without arterial
+ if(anatomy < 3 && ((org.status & ORGAN_BLEEDING) && !(org.status & ORGAN_ARTERY_CUT)))
+ status += "bleeding"
+ // Bleeding and arterial
+ else if(anatomy < 3 && ((org.status & ORGAN_BLEEDING) && (org.status & ORGAN_ARTERY_CUT)))
+ status += SPAN_DANGER("gushing with blood")
+ // Arterial without bleeding
+ else if(anatomy < 3 && (!(org.status & ORGAN_BLEEDING) && (org.status & ORGAN_ARTERY_CUT)))
+ if(!(org.status & (ORGAN_DEAD | ORGAN_BROKEN)))
+ status += "hurts when touched"
+ painful_check = TRUE
+ status += "swelled and has darkly discolored spots"
+
+ if(anatomy < 3 && (org.status & ORGAN_DEAD))
+ status += "feels numb and pale"
+ // End of advanced Anatomy 1.
+
+ // Anatomy 3: Descriptions start to get more medical.
+ // Necrotic and arterials are plainly visible
+ // Bleeding gets an extra description
+ if(anatomy >= 3)
+ if(org.status & ORGAN_DEAD)
+ status += (anatomy < 4 ? "possibly necrotic" : "visible discoloration of skin that indicates tissue necrosis")
+ // Bleeding & arterial
+ if((org.status & ORGAN_BLEEDING) && (org.status & ORGAN_ARTERY_CUT))
+ status += SPAN_DANGER("spraying blood from a severed artery")
+ // bleeding and no arterial
+ else if((org.status & ORGAN_BLEEDING) && !(org.status & ORGAN_ARTERY_CUT))
+ status += "bandage-ably cut"
+ // arterial and no bleeding
+ else if(!(org.status & ORGAN_BLEEDING) && (org.status & ORGAN_ARTERY_CUT))
+ status += SPAN_DANGER("swollen from an internal arterial bleed")
+ // End of Anatomy 3
+
var/output = ""
if(length(status))
output = "My [org.name] is [SPAN_WARNING("[english_list(status)].")]"
else
- output = "My [org.name] feels [SPAN_NOTICE("OK.")]"
+ output = (anatomy < 3 ? "My [org.name] feels [SPAN_NOTICE("OK.")]" : "My [org.name] has [SPAN_NOTICE("no visible signs of injuries.")]")
if(length(org.implants))
output += " [SPAN_WARNING("I can feel something inside it.")]"
to_chat(src, output)
+ if(painful_check)
+ custom_pain("Pain jolts through your body", 10, FALSE, null, TRUE)
+
if((isskeleton(H)) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
else
diff --git a/html/changelogs/hellfirejag-anatomy-skill.yml b/html/changelogs/hellfirejag-anatomy-skill.yml
new file mode 100644
index 00000000000..04b9661a5cf
--- /dev/null
+++ b/html/changelogs/hellfirejag-anatomy-skill.yml
@@ -0,0 +1,4 @@
+author: Hellfirejag, TheGreyWolf
+delete-after: True
+changes:
+ - rscadd: "Implemented the Anatomy skill. Anatomy determines the quality of information received when medically examining your own injuries."