Files
MrMelbert 45b23412f8 [MDB Ignore] Medical larp: Adds the SDSM-35 (an in game brain trauma reference) (#94761)
## About The Pull Request

Medbay, the CMO, the Psychologist, (possibly) the Library, and some
maint rooms across all maps now have multiple copies of the SDSM-35

This exists as an in game ability to reference what brain traumas do. No
special bells or whistles, not even a search bar - it's a book after
all.

<img width="819" height="589" alt="image"
src="https://github.com/user-attachments/assets/ace867b9-a0f0-4302-99f9-46ed4d6fe377"
/>

<img width="802" height="546" alt="image"
src="https://github.com/user-attachments/assets/c96941d3-8da8-48f7-859b-93953fe01473"
/>

## Why It's Good For The Game

De-wikification: Rather than needing to pull up the wiki to figure out
what the brain trauma is doing, you can refer to the in game book and
cross reference the patient's behavior.

Medial larp: It's a reference to the DSM-5. If that wasn't obvious. 

## Changelog

🆑 Melbert
add: You can now find the SDMS-35 in Medbay, the CMO's office, the
Psychologist's office, and possibly the Library. Quite simply, it's a
reference book for all the brain trauma's you may experience.
/🆑
2026-01-08 19:47:04 -07:00

152 lines
5.8 KiB
Plaintext

//Magical traumas, caused by spells and curses.
//Blurs the line between the victim's imagination and reality
//Unlike regular traumas this can affect the victim's body and surroundings
/datum/brain_trauma/magic
abstract_type = /datum/brain_trauma/magic
resilience = TRAUMA_RESILIENCE_LOBOTOMY
/datum/brain_trauma/magic/lumiphobia
name = "Lumiphobia"
desc = "Patient has an inexplicable adverse reaction to light."
scan_desc = "light hypersensitivity"
symptoms = "Exhibits extreme discomfort and adverse reactions when exposed to bright light sources, \
and will go to great lengths to avoid illuminated areas. \
This sensitivity can lead to skin irritation, similar to that of a severe sunburn."
gain_text = span_warning("You feel a craving for darkness.")
lose_text = span_notice("Light no longer bothers you.")
/// Cooldown to prevent warning spam
COOLDOWN_DECLARE(damage_warning_cooldown)
var/next_damage_warning = 0
/datum/brain_trauma/magic/lumiphobia/on_life(seconds_per_tick)
..()
var/turf/T = owner.loc
if(!istype(T))
return
if(T.get_lumcount() <= SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
return
if(COOLDOWN_FINISHED(src, damage_warning_cooldown))
to_chat(owner, span_warning("<b>The light burns you!</b>"))
COOLDOWN_START(src, damage_warning_cooldown, 10 SECONDS)
owner.take_overall_damage(burn = 1.5 * seconds_per_tick)
/datum/brain_trauma/magic/poltergeist
name = "Poltergeist"
desc = "Patient appears to be targeted by a violent invisible entity."
scan_desc = "paranormal activity"
symptoms = "Experiences frequent and unprovoked physical disturbances in their immediate vicinity, \
such as objects being thrown or moved without any apparent cause."
gain_text = span_warning("You feel a hateful presence close to you.")
lose_text = span_notice("You feel the hateful presence fade away.")
/datum/brain_trauma/magic/poltergeist/on_life(seconds_per_tick)
..()
if(!SPT_PROB(2, seconds_per_tick))
return
var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else
var/obj/item/throwing
for(var/obj/item/I in view(5, get_turf(owner)))
if(I.anchored)
continue
if(I.throwforce > most_violent)
most_violent = I.throwforce
throwing = I
if(throwing)
throwing.throw_at(owner, 8, 2)
/datum/brain_trauma/magic/antimagic
name = "Athaumasia"
desc = "Patient is completely inert to magical forces."
scan_desc = "thaumic blank"
symptoms = "Exhibits a complete immunity to effects unexplainable by conventional science, \
such as the abilities demonstrated by members of the Wizard Federation."
gain_text = span_notice("You realize that magic cannot be real.")
lose_text = span_notice("You realize that magic might be real.")
/datum/brain_trauma/magic/antimagic/on_gain()
ADD_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT)
. = ..()
/datum/brain_trauma/magic/antimagic/on_lose()
REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, TRAUMA_TRAIT)
..()
/datum/brain_trauma/magic/stalker
name = "Stalking Phantom"
desc = "Patient is stalked by a phantom only they can see."
scan_desc = "extra-sensory paranoia"
symptoms = "Feels an unshakable sensation of being watched or pursued by an unseen entity, \
leading to heightened anxiety, paranoia, and occasional hallucinations of a ghostly figure in their vicinity. \
Extreme cases may even result in physical harm inflicted upon the patient by a seemingly invisible force."
gain_text = span_warning("You feel like something wants to kill you...")
lose_text = span_notice("You no longer feel eyes on your back.")
/// Type of stalker that is chasing us
var/stalker_type = /obj/effect/client_image_holder/stalker_phantom
/// Reference to the stalker that is chasing us
var/obj/effect/client_image_holder/stalker_phantom/stalker
/// Plays a sound when the stalker is near their victim
var/close_stalker = FALSE
/datum/brain_trauma/magic/stalker/Destroy()
QDEL_NULL(stalker)
return ..()
/datum/brain_trauma/magic/stalker/on_gain()
create_stalker()
return ..()
/datum/brain_trauma/magic/stalker/proc/create_stalker()
var/turf/stalker_source = locate(owner.x + pick(-12, 12), owner.y + pick(-12, 12), owner.z) //random corner
stalker = new stalker_type(stalker_source, owner)
/datum/brain_trauma/magic/stalker/on_lose()
QDEL_NULL(stalker)
return ..()
/datum/brain_trauma/magic/stalker/on_life(seconds_per_tick)
// Dead and unconscious people are not interesting to the psychic stalker.
if(owner.stat != CONSCIOUS)
return
// Not even nullspace will keep it at bay.
if(!stalker || !stalker.loc || stalker.z != owner.z)
qdel(stalker)
create_stalker()
if(get_dist(owner, stalker) <= 1)
playsound(owner, 'sound/effects/magic/demon_attack1.ogg', 50)
owner.visible_message(span_warning("[owner] is torn apart by invisible claws!"), span_userdanger("Ghostly claws tear your body apart!"))
owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND)
else if(SPT_PROB(30, seconds_per_tick))
stalker.forceMove(get_step_towards(stalker, owner))
if(get_dist(owner, stalker) <= 8)
if(!close_stalker)
var/sound/slowbeat = sound('sound/effects/health/slowbeat.ogg', repeat = TRUE)
owner.playsound_local(owner, slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
close_stalker = TRUE
else
if(close_stalker)
owner.stop_sound_channel(CHANNEL_HEARTBEAT)
close_stalker = FALSE
..()
/obj/effect/client_image_holder/stalker_phantom
name = "???"
desc = "It's coming closer..."
image_icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi'
image_state = "curseblob"
// Heretic subtype that replaces the ghost guy with a stargazer
/datum/brain_trauma/magic/stalker/cosmic
stalker_type = /obj/effect/client_image_holder/stalker_phantom/cosmic
random_gain = FALSE
known_trauma = FALSE
/obj/effect/client_image_holder/stalker_phantom/cosmic
image_icon = 'icons/mob/nonhuman-player/96x96eldritch_mobs.dmi'
image_state = "star_gazer"