Changes the eldritch painting effects from a brain trauma to a status effect. Large doses of holy water can remove the effect early, and it protects you from inflictions while in your system. (#91496)

## About The Pull Request

What it says on the tin. 

Inflicts status effects instead of brain traumas.

Needs a large dosage (somewhere around 50 units, I don't think the code
comments are accurate about the dosage) to remove the status effect.

Having any amount of holy water in your system prevents the paintings
from inflicting its status effect on you.

## Why It's Good For The Game

So I had a little event involving these paintings, and I...vastly
underestimated just how horrifically disruptive these paintings can be
and how few options you have to deal with them adequately if there are a
lot of them around. They can do some serious damage.

They probably don't exactly see much use, not because of their lack of
effectiveness, but because they simply do not push the heretic closer to
victory. Most heretics ignore these kinds of 'sabotage' tools because
they're slow like that. But if someone is particularly eager to use
them, they might make enough of a mess to, say, force a shuttle call
early as the station rusts mysteriously all around them and everyone
starts to crater in sanity. (moon heretics would love that if they
weren't speedrunning ascension)

So, traumas suck and also resolving the trauma does not necessarily give
you the means to stop getting more traumas or deal with future traumas
while dealing with the paintings, Holy water is already a tool for
dealing with magical stuff, but in of itself it is not necessarily
immediately sourcable unless there is a chaplain, or botany or cargo has
been on ball. So it still reliant on someone else to help combat it than
just some random joe shmoe with a wirecutter. I think this is mostly net
neutral balance wise enough to be considered 'quality of life' if only
that it makes engagement better while still being largely as impactful
as it ever was due to the fact people will likely still suffer/inflict
damage on the station from coming into contact with the painting, as
well as the removal still taking an amount of time and a large dosage of
holy water, all the while the effect still takes place.

## Changelog
🆑
qol: Eldritch paintings no longer inflict brain traumas on you that need
surgery to remove. Instead, they inflict a status effect that can be
protected from and removed using large doses of holy water.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
This commit is contained in:
necromanceranne
2025-06-16 11:32:51 +10:00
committed by GitHub
parent 7f4c2dfa2d
commit 4db41ed99a
8 changed files with 154 additions and 124 deletions
+1 -1
View File
@@ -1317,7 +1317,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait determines if this mob has examined an eldritch painting
#define TRAIT_ELDRITCH_PAINTING_EXAMINE "eldritch_painting_examine"
/// Trait used by the /datum/brain_trauma/severe/flesh_desire trauma to change their preferences of what they eat
/// Trait used by the /obj/item/wallframe/painting/eldritch/desire status effect to change their preferences of what they eat
#define TRAIT_FLESH_DESIRE "flesh_desire"
///Trait granted by janitor skillchip, allows communication with cleanbots
-105
View File
@@ -306,111 +306,6 @@
REMOVE_TRAIT(owner, TRAIT_ILLITERATE, TRAUMA_TRAIT)
..()
/*
* Brain traumas that eldritch paintings apply
* This one is for "The Sister and He Who Wept" or /obj/structure/sign/painting/eldritch
*/
/datum/brain_trauma/severe/weeping
name = "Psychotic Depression"
desc = "Patient is suffering from severe depressive episodes. Patient sometimes hallucinates during these episodes."
scan_desc = "depression"
gain_text = span_warning("The weeping... It haunts my mind...")
lose_text = span_notice("Your fixation ends. You feel significantly less stressed.")
random_gain = FALSE
/// Our cooldown declare for causing hallucinations
COOLDOWN_DECLARE(weeping_hallucinations)
/datum/brain_trauma/severe/weeping/on_life(seconds_per_tick, times_fired)
if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious())
return
// If they have examined a painting recently
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
if(!COOLDOWN_FINISHED(src, weeping_hallucinations))
return
owner.cause_hallucination(/datum/hallucination/delusion/preset/heretic, "Caused by The Weeping brain trauma")
owner.add_mood_event("eldritch_weeping", /datum/mood_event/eldritch_painting/weeping)
COOLDOWN_START(src, weeping_hallucinations, 10 SECONDS)
return ..()
//This one is for "The First Desire" or /obj/structure/sign/painting/eldritch/desire
/datum/brain_trauma/severe/flesh_desire
name = "Bean's Disorder"
desc = "Patient has a fixation on consuming raw flesh, particularly that of the same species. Patient also suffers from psychosomatic hunger pangs."
scan_desc = "moderate eating disorder"
gain_text = span_warning("You feel a hunger, for organs and raw meat...")
lose_text = span_notice("Your appetite returns to normal.")
random_gain = FALSE
/// How much faster we loose hunger
var/hunger_rate = 15
/datum/brain_trauma/severe/flesh_desire/on_gain()
// Allows them to eat faster, mainly for flavor
ADD_TRAIT(owner, TRAIT_VORACIOUS, REF(src))
ADD_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src))
return ..()
/datum/brain_trauma/severe/flesh_desire/on_life(seconds_per_tick, times_fired)
// Causes them to need to eat at 10x the normal rate
owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR)
if(SPT_PROB(10, seconds_per_tick))
to_chat(owner, span_notice(pick("You can't stop thinking about raw meat...", "You **NEED** to eat someone.", "The hunger pangs are back...", "You hunger for flesh.", "You are starving!")))
owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0)
/datum/brain_trauma/severe/flesh_desire/on_lose()
REMOVE_TRAIT(owner, TRAIT_VORACIOUS, REF(src))
REMOVE_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src))
return ..()
// This one is for "Lady out of gates" or /obj/item/wallframe/painting/eldritch/beauty
/datum/brain_trauma/severe/eldritch_beauty
name = "Obsessive Perfectionism"
desc = "Patient is fixated on the perceived 'imperfection' of objects around them. Patient is agitated by the feeling of clothing on their body."
scan_desc = "obsessive personality disorder"
gain_text = span_warning("It's all *imperfect*! I can't stand any of it touching me!")
lose_text = span_notice("Your mind calms.")
random_gain = FALSE
/// How much damage we deal with each scratch
var/scratch_damage = 0.5
/datum/brain_trauma/severe/eldritch_beauty/on_life(seconds_per_tick, times_fired)
if(owner.incapacitated)
return
// Scratching code
var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE))
if(!bodypart || !IS_ORGANIC_LIMB(bodypart) || (bodypart.bodypart_flags & BODYPART_PSEUDOPART))
return
if(!ishuman(owner))
return
// Jumpsuits ruin the "perfection" of the body
var/mob/living/carbon/human/scratcher = owner
if(!length(scratcher.get_clothing_on_part(bodypart)))
return
owner.apply_damage(scratch_damage, BRUTE, bodypart)
if(SPT_PROB(33, seconds_per_tick))
to_chat(owner, span_notice("You scratch furiously at your clothed [bodypart.plaintext_zone]!"))
// This one is for "Climb over the rusted mountain" or /obj/structure/sign/painting/eldritch/rust
/datum/brain_trauma/severe/rusting
name = "Intermittent Psychic Manifestation Syndrome"
desc = "Patient suffers from a rare psychic disorder, and may manifest or amplify psychic phenomena in the area. Patient has no control over these phenomena."
scan_desc = "dangerous psi-wave activity"
gain_text = span_warning("Climb the rust. Master entropy.")
lose_text = span_notice("You feel like you just woke up from a bad dream.")
random_gain = FALSE
/datum/brain_trauma/severe/rusting/on_life(seconds_per_tick, times_fired)
var/atom/tile = get_turf(owner)
// Examining a painting should stop this effect to give counterplay
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
if(SPT_PROB(50, seconds_per_tick))
to_chat(owner, span_notice("You feel the decay..."))
tile.rust_heretic_act()
/datum/brain_trauma/severe/kleptomaniac
name = "Kleptomania"
desc = "Patient is prone to stealing things."
@@ -272,12 +272,12 @@
curse_color = COLOR_MAROON
/datum/heretic_knowledge/curse/indulgence/curse(mob/living/carbon/human/chosen_mob)
chosen_mob.gain_trauma(/datum/brain_trauma/severe/flesh_desire, TRAUMA_RESILIENCE_MAGIC)
chosen_mob.apply_status_effect(/datum/status_effect/eldritch_painting/desire/permanent)
chosen_mob.nutrition = NUTRITION_LEVEL_STARVING
return ..()
/datum/heretic_knowledge/curse/indulgence/uncurse(mob/living/carbon/human/chosen_mob)
if(QDELETED(chosen_mob))
return
chosen_mob.cure_trauma_type(/datum/brain_trauma/severe/flesh_desire, TRAUMA_RESILIENCE_MAGIC)
chosen_mob.remove_status_effect(/datum/status_effect/eldritch_painting/desire/permanent)
return ..()
@@ -22,7 +22,7 @@
// Set to false since we don't want this to persist
persistence_id = FALSE
/// The trauma the painting applies
var/applied_trauma = /datum/brain_trauma/severe/pacifism
var/applied_status_effect = /datum/status_effect/eldritch_painting
/// The text that shows up when you cross the paintings path
var/text_to_display = "Some things should not be seen by mortal eyes..."
/// The range of the paintings effect
@@ -30,29 +30,31 @@
/obj/structure/sign/painting/eldritch/Initialize(mapload, dir, building)
. = ..()
if(ispath(applied_trauma))
var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_trauma))
if(ispath(applied_status_effect))
var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_status_effect))
AddComponent(/datum/component/connect_range, tracked = src, connections = connections, range = range, works_in_containers = FALSE)
/obj/structure/sign/painting/eldritch/proc/apply_trauma(datum/source, mob/living/carbon/viewer)
/obj/structure/sign/painting/eldritch/proc/apply_status_effect(datum/source, mob/living/carbon/viewer)
SIGNAL_HANDLER
if(!isliving(viewer) || !can_see(viewer, src, range))
return
if(isnull(viewer.mind) || isnull(viewer.mob_mood) || viewer.stat != CONSCIOUS || viewer.is_blind())
return
if(viewer.has_trauma_type(applied_trauma))
if(viewer.has_status_effect(applied_status_effect))
return
if(IS_HERETIC(viewer))
return
if(viewer.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND))
return
if(viewer.reagents.has_reagent(/datum/reagent/water/holywater))
return
to_chat(viewer, span_notice(text_to_display))
viewer.gain_trauma(applied_trauma, TRAUMA_RESILIENCE_SURGERY)
viewer.apply_status_effect(applied_status_effect)
INVOKE_ASYNC(viewer, TYPE_PROC_REF(/mob, emote), "scream")
to_chat(viewer, span_hypnophrase("Your mind is overcome! The painting leaves a mark on your psyche."))
/obj/structure/sign/painting/eldritch/wirecutter_act(mob/living/user, obj/item/I)
if(!user.can_block_magic(MAGIC_RESISTANCE))
if(!user.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND))
user.add_mood_event("ripped_eldritch_painting", /datum/mood_event/eldritch_painting)
to_chat(user, span_hypnophrase("There's an itch in your brain. It's laughing at you..."))
qdel(src)
@@ -87,7 +89,7 @@
name = "\improper The Sister and He Who Wept"
desc = "A beautiful painting depicting a fair lady sitting beside Him. He weeps. You will see him again. Removable with wirecutters."
icon_state = "eldritch_painting_weeping"
applied_trauma = /datum/brain_trauma/severe/weeping
applied_status_effect = /datum/status_effect/eldritch_painting/weeping
text_to_display = "Such beauty! Such sorrow!"
/obj/structure/sign/painting/eldritch/weeping/examine_effects(mob/living/carbon/examiner)
@@ -112,7 +114,7 @@
name = "\improper The Feast of Desire"
desc = "A painting of an elaborate feast. Despite being made entirely of rotting meat and decaying organs, the food looks very appetising. Removable with wirecutters."
icon_state = "eldritch_painting_desire"
applied_trauma = /datum/brain_trauma/severe/flesh_desire
applied_status_effect = /datum/status_effect/eldritch_painting/desire
text_to_display = "Just looking at this painting makes me hungry..."
// The special examine interaction for this painting
@@ -160,7 +162,7 @@
name = "\improper Great Chaparral Over Rolling Hills"
desc = "A painting depicting a massive thicket. This painting teems with life, and seems to strain against its frame. Removable with wirecutters."
icon_state = "eldritch_painting_vines"
applied_trauma = null
applied_status_effect = null
// A static list of 5 pretty strong mutations, simple to expand for any admins
var/list/mutations = list(
/datum/spacevine_mutation/aggressive_spread,
@@ -205,7 +207,7 @@
name = "\improper Lady of the Gate"
desc = "A painting of an otherworldly being. Its thin, porcelain-coloured skin is stretched tight over its strange bone structure. It has an odd beauty. Removable with wirecutters."
icon_state = "eldritch_painting_beauty"
applied_trauma = /datum/brain_trauma/severe/eldritch_beauty
applied_status_effect = /datum/status_effect/eldritch_painting/beauty
text_to_display = "A beacon of purity, the real world seems so mundane and imperfect in comparison..."
/// List of reagents to add to heretics on examine, set to mutadone by default to remove mutations
var/list/reagents_to_add = list(/datum/reagent/medicine/mutadone = 5)
@@ -235,7 +237,7 @@
name = "\improper Master of the Rusted Mountain"
desc = "A painting of a strange being climbing a rust-coloured mountain. The brushwork is unnatural and unnerving. Removable with wirecutters."
icon_state = "eldritch_painting_rust"
applied_trauma = /datum/brain_trauma/severe/rusting
applied_status_effect = /datum/status_effect/eldritch_painting/rusting
text_to_display = "The rust decays. The master climbs. It calls. You answer..."
// The special examine interaction for this painting
@@ -57,8 +57,6 @@
/obj/item/storage/belt/unfathomable_curio/proc/shield_damaged(mob/living/carbon/wearer, attack_text, new_current_charges)
var/list/brain_traumas = list(
/datum/brain_trauma/severe/mute,
/datum/brain_trauma/severe/flesh_desire,
/datum/brain_trauma/severe/eldritch_beauty,
/datum/brain_trauma/severe/paralysis,
/datum/brain_trauma/severe/monophobia
)
@@ -177,8 +177,6 @@
REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id))
owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE)
/// Used by moon heretics to make people mad
/datum/status_effect/moon_converted
id = "moon converted"
@@ -256,3 +254,138 @@
name = "Moon Converted"
desc = "They LIE, SLAY ALL OF THE THEM!!! THE LIARS OF THE SUN MUST FALL!!!"
icon_state = "moon_insanity"
// Status effects that eldritch paintings apply
//The debug painting status effect. To make sure this isn't applying to heretics.
/datum/status_effect/eldritch_painting
id = "eldritch_painting"
alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting
duration = 10 MINUTES
status_type = STATUS_EFFECT_UNIQUE
/datum/status_effect/eldritch_painting/on_apply()
if(IS_HERETIC_OR_MONSTER(owner))
return FALSE
if(!ishuman(owner))
return FALSE
if(owner.reagents.has_reagent(/datum/reagent/water/holywater))
return FALSE
return TRUE
/atom/movable/screen/alert/status_effect/eldritch_painting
name = "Rick Roll'd"
desc = "Fucking coders are at it again."
icon_state = "eldritch_painting_debug"
//"The Sister and He Who Wept": /obj/structure/sign/painting/eldritch
/datum/status_effect/eldritch_painting/weeping
id = "painting_weeping"
alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting/weeping
tick_interval = 10 SECONDS
/datum/status_effect/eldritch_painting/weeping/tick(seconds_between_ticks)
if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious())
return
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
owner.cause_hallucination(/datum/hallucination/delusion/preset/heretic, "Caused by The Weeping status effect")
owner.add_mood_event("eldritch_weeping", /datum/mood_event/eldritch_painting/weeping)
/atom/movable/screen/alert/status_effect/eldritch_painting/weeping
name = "The Sister and He Who Wept"
desc = "The weeping echos through your mind like an echo, undoing your psyche! Maybe if you look at the painting again, it won't hurt so badly..."
icon_state = "eldritch_painting_weeping"
//"The First Desire": /obj/structure/sign/painting/eldritch/desire
/datum/status_effect/eldritch_painting/desire
id = "painting_desire"
alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting/desire
/// How much faster we loose hunger
var/hunger_rate = 15
/datum/status_effect/eldritch_painting/desire/on_apply()
if(IS_HERETIC_OR_MONSTER(owner))
return FALSE
if(!ishuman(owner))
return FALSE
if(HAS_TRAIT(owner, TRAIT_NOHUNGER))
return FALSE
// Allows them to eat faster, mainly for flavor
ADD_TRAIT(owner, TRAIT_VORACIOUS, TRAIT_STATUS_EFFECT(id))
ADD_TRAIT(owner, TRAIT_FLESH_DESIRE, TRAIT_STATUS_EFFECT(id))
return TRUE
/datum/status_effect/eldritch_painting/desire/tick(seconds_between_ticks)
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
// Causes them to need to eat at 10x the normal rate
owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR)
if(SPT_PROB(10, seconds_between_ticks))
to_chat(owner, span_notice(pick("You can't stop thinking about raw meat...", "You **NEED** to eat someone.", "The hunger pangs are back...", "You hunger for flesh.", "You are starving!")))
owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0)
/datum/status_effect/eldritch_painting/desire/on_remove()
REMOVE_TRAIT(owner, TRAIT_VORACIOUS, TRAIT_STATUS_EFFECT(id))
REMOVE_TRAIT(owner, TRAIT_FLESH_DESIRE, TRAIT_STATUS_EFFECT(id))
return ..()
/atom/movable/screen/alert/status_effect/eldritch_painting/desire
name = "The First Desire"
desc = "Your are struck with a ravenous hunger! SATIATE IT AT ANY COST! Or maybe just go stare at the painting and long for the excellent meal it promises..."
icon_state = "eldritch_painting_desire"
/datum/status_effect/eldritch_painting/desire/permanent
duration = STATUS_EFFECT_PERMANENT
// "Lady out of gates": /obj/item/wallframe/painting/eldritch/beauty
/datum/status_effect/eldritch_painting/beauty
id = "painting_beauty"
alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting/beauty
tick_interval = 3 SECONDS
/// How much damage we deal with each scratch
var/scratch_damage = 3
/datum/status_effect/eldritch_painting/beauty/tick(seconds_between_ticks)
if(owner.incapacitated)
return
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
// Scratching code
var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE))
if(!bodypart || !IS_ORGANIC_LIMB(bodypart) || (bodypart.bodypart_flags & BODYPART_PSEUDOPART))
return
// Jumpsuits ruin the "perfection" of the body
var/mob/living/carbon/human/scratcher = owner
if(!length(scratcher.get_clothing_on_part(bodypart)))
return
owner.apply_damage(scratch_damage, BRUTE, bodypart)
to_chat(owner, span_notice("You scratch furiously at your clothed [bodypart.plaintext_zone]!"))
/atom/movable/screen/alert/status_effect/eldritch_painting/beauty
name = "Lady Out of Gates"
desc = "Your clothing obscures the beauty beneath. Remove it, and reach perfection. Or behold perfect for a brief moment of clarity in the painting you saw your ideal image in."
icon_state = "eldritch_painting_beauty"
// "Climb over the rusted mountain": /obj/structure/sign/painting/eldritch/rust
/datum/status_effect/eldritch_painting/rusting
id = "painting_rusting"
alert_type = /atom/movable/screen/alert/status_effect/eldritch_painting/rusting
tick_interval = 3 SECONDS
/datum/status_effect/eldritch_painting/rusting/tick(seconds_between_ticks)
var/atom/tile = get_turf(owner)
if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE))
return
to_chat(owner, span_notice("You feel the decay..."))
tile.rust_heretic_act()
/atom/movable/screen/alert/status_effect/eldritch_painting/rusting
name = "Climb Over the Rusted Mountain"
desc = "Your every footfall erodes the ground beneath you! Everything crumbles away! Maybe if you looked closer at the mountain in that painting, the path might be clearer..."
icon_state = "eldritch_painting_rust"
@@ -363,6 +363,8 @@
need_mob_update += affected_mob.adjustFireLoss(10 * REM * seconds_per_tick, updating_health = FALSE)
affected_mob.remove_status_effect(/datum/status_effect/jitter)
affected_mob.remove_status_effect(/datum/status_effect/speech/stutter)
for(var/datum/status_effect/eldritch_painting/eldritch_curses in affected_mob.status_effects)
qdel(eldritch_curses)
holder?.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
if(need_mob_update)
return UPDATE_MOB_HEALTH
Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 KiB

After

Width:  |  Height:  |  Size: 174 KiB