diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index ec7e2e7c7b8..000f77b7fd6 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -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 diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index cd7c41530e5..4c5ec43f39c 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -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." diff --git a/code/modules/antagonists/heretic/heretic_curses.dm b/code/modules/antagonists/heretic/heretic_curses.dm index 23d88e91f35..f9ae9fde801 100644 --- a/code/modules/antagonists/heretic/heretic_curses.dm +++ b/code/modules/antagonists/heretic/heretic_curses.dm @@ -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 ..() diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm index c4de12a5ec4..f42670b4cc8 100644 --- a/code/modules/antagonists/heretic/items/eldritch_painting.dm +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -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 diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm index c92d7343751..44af5f0acb1 100644 --- a/code/modules/antagonists/heretic/items/unfathomable_curio.dm +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -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 ) diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index 363a1f91339..2ed47663fba 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -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" diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index a5b2dce4d7d..d8b7d1ac039 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -370,6 +370,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 diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 8ebfdd14b4e..231b6d006d3 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ