From cf131db497dd9120fecc4fae861e56786fecbbe2 Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Mon, 24 Mar 2025 13:53:03 +0100 Subject: [PATCH] Cleans up mood and mood-related code (#90162) ## About The Pull Request One of my upcoming PRs affects a significant chunk of the codebase so I'm cleaning up messes that I've found along the way. This PR adds wrappers for adjusting sanity/checking if a mob already has a certain moodlet, fixes an oversight where attempting to set sanity over passed maximum would abort the change outright (instead of actually capping it out), moved jolly and depression processing into quirks themselves (instead of having dedicated traits for them used solely by said quirks and nothing else that are constantly checked for by mood datums), and rewrote how blessings return their results to move omen's deletion on blessing effect from constantly checking mood for a blessing moodlet to a comsig. ## Why It's Good For The Game Less jank handling of certain mechanics, we ***really*** shouldn't be checking for blessings every time mood of all things is updated. ## Changelog :cl: fix: Adjusting sanity over the allowed maximum will no longer completely halt the change, and instead actually cap it at the maximum value. code: Cleaned up mood and mood-adjacent code. /:cl: --- .../signals/signals_mob/signals_mob_living.dm | 3 + code/__DEFINES/mobs.dm | 49 -------- code/__DEFINES/mood.dm | 48 +++++++- code/__DEFINES/religion.dm | 7 ++ code/__DEFINES/traits/declarations.dm | 2 - code/_globalvars/traits/_traits.dm | 2 - code/_globalvars/traits/admin_tooling.dm | 2 - code/datums/components/omen.dm | 12 +- code/datums/mood.dm | 64 +++++----- .../quirks/negative_quirks/all_nighter.dm | 5 +- .../quirks/negative_quirks/depression.dm | 12 +- code/datums/quirks/positive_quirks/jolly.dm | 12 +- .../heretic/items/heretic_necks.dm | 18 +-- .../heretic/knowledge/moon_lore.dm | 9 +- .../antagonists/heretic/magic/moon_parade.dm | 2 +- .../heretic/magic/moon_ringleader.dm | 2 +- .../antagonists/heretic/magic/moon_smile.dm | 2 +- .../antagonists/survivalist/survivalist.dm | 4 +- code/modules/clothing/head/soft_caps.dm | 9 -- .../flufftext/{Dreaming.dm => dreaming.dm} | 2 +- code/modules/library/bibles.dm | 39 +++--- .../monster_organs/regenerative_core.dm | 2 +- .../living/basic/lavaland/legion/legion.dm | 2 +- .../basic/lavaland/legion/legion_tumour.dm | 2 +- .../chemistry/reagents/medicine_reagents.dm | 2 +- code/modules/religion/religion_sects.dm | 115 +++++++++++------- tgstation.dme | 2 +- 27 files changed, 236 insertions(+), 194 deletions(-) rename code/modules/flufftext/{Dreaming.dm => dreaming.dm} (98%) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 4dd23f4e3eb..5871b3c1e6e 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -319,3 +319,6 @@ /// Allows mobs to override how they perceive others when examining #define COMSIG_LIVING_PERCEIVE_EXAMINE_NAME "living_perceive_examine_name" #define COMPONENT_EXAMINE_NAME_OVERRIDEN (1<<0) + +/// From /obj/item/book/bible/attack() : (mob/living/user, obj/item/book/bible/bible, bless_result) +#define COMSIG_LIVING_BLESSED "living_blessed" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index b509aaf157a..37f9d9ac0a9 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -236,54 +236,6 @@ #define SCREWYHUD_DEAD 2 #define SCREWYHUD_HEALTHY 3 -//Threshold levels for beauty for humans -#define BEAUTY_LEVEL_HORRID -66 -#define BEAUTY_LEVEL_BAD -33 -#define BEAUTY_LEVEL_DECENT 33 -#define BEAUTY_LEVEL_GOOD 66 -#define BEAUTY_LEVEL_GREAT 100 - -//Moods levels for humans -#define MOOD_HAPPY4 15 -#define MOOD_HAPPY3 10 -#define MOOD_HAPPY2 6 -#define MOOD_HAPPY1 2 -#define MOOD_NEUTRAL 0 -#define MOOD_SAD1 -3 -#define MOOD_SAD2 -7 -#define MOOD_SAD3 -15 -#define MOOD_SAD4 -20 - -//Moods levels for humans -#define MOOD_LEVEL_HAPPY4 9 -#define MOOD_LEVEL_HAPPY3 8 -#define MOOD_LEVEL_HAPPY2 7 -#define MOOD_LEVEL_HAPPY1 6 -#define MOOD_LEVEL_NEUTRAL 5 -#define MOOD_LEVEL_SAD1 4 -#define MOOD_LEVEL_SAD2 3 -#define MOOD_LEVEL_SAD3 2 -#define MOOD_LEVEL_SAD4 1 - -//Sanity values for humans -#define SANITY_MAXIMUM 150 -#define SANITY_GREAT 125 -#define SANITY_NEUTRAL 100 -#define SANITY_DISTURBED 75 -#define SANITY_UNSTABLE 50 -#define SANITY_CRAZY 25 -#define SANITY_INSANE 0 - -//Sanity levels for humans -#define SANITY_LEVEL_GREAT 1 -#define SANITY_LEVEL_NEUTRAL 2 -#define SANITY_LEVEL_DISTURBED 3 -#define SANITY_LEVEL_UNSTABLE 4 -#define SANITY_LEVEL_CRAZY 5 -#define SANITY_LEVEL_INSANE 6 -/// Equal to the highest sanity level -#define SANITY_LEVEL_MAX SANITY_LEVEL_INSANE - //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 @@ -316,7 +268,6 @@ #define ETHEREAL_CHARGE_OVERLOAD (2.5 * STANDARD_ETHEREAL_CHARGE) #define ETHEREAL_CHARGE_DANGEROUS (3 * STANDARD_ETHEREAL_CHARGE) - #define CRYSTALIZE_COOLDOWN_LENGTH (120 SECONDS) #define CRYSTALIZE_PRE_WAIT_TIME (40 SECONDS) #define CRYSTALIZE_DISARM_WAIT_TIME (120 SECONDS) diff --git a/code/__DEFINES/mood.dm b/code/__DEFINES/mood.dm index 161f253b04c..80c32c4446c 100644 --- a/code/__DEFINES/mood.dm +++ b/code/__DEFINES/mood.dm @@ -1 +1,47 @@ -#define MOOD_CATEGORY_LEGION_CORE "regenerative core" +// Threshold levels for beauty for humans +#define BEAUTY_LEVEL_HORRID -66 +#define BEAUTY_LEVEL_BAD -33 +#define BEAUTY_LEVEL_DECENT 33 +#define BEAUTY_LEVEL_GOOD 66 +#define BEAUTY_LEVEL_GREAT 100 + +// Moods levels for humans +#define MOOD_HAPPY4 15 +#define MOOD_HAPPY3 10 +#define MOOD_HAPPY2 6 +#define MOOD_HAPPY1 2 +#define MOOD_NEUTRAL 0 +#define MOOD_SAD1 -3 +#define MOOD_SAD2 -7 +#define MOOD_SAD3 -15 +#define MOOD_SAD4 -20 + +// Moods levels for humans +#define MOOD_LEVEL_HAPPY4 9 +#define MOOD_LEVEL_HAPPY3 8 +#define MOOD_LEVEL_HAPPY2 7 +#define MOOD_LEVEL_HAPPY1 6 +#define MOOD_LEVEL_NEUTRAL 5 +#define MOOD_LEVEL_SAD1 4 +#define MOOD_LEVEL_SAD2 3 +#define MOOD_LEVEL_SAD3 2 +#define MOOD_LEVEL_SAD4 1 + +// Sanity values for humans +#define SANITY_MAXIMUM 150 +#define SANITY_GREAT 125 +#define SANITY_NEUTRAL 100 +#define SANITY_DISTURBED 75 +#define SANITY_UNSTABLE 50 +#define SANITY_CRAZY 25 +#define SANITY_INSANE 0 + +// Sanity levels for humans +#define SANITY_LEVEL_GREAT 1 +#define SANITY_LEVEL_NEUTRAL 2 +#define SANITY_LEVEL_DISTURBED 3 +#define SANITY_LEVEL_UNSTABLE 4 +#define SANITY_LEVEL_CRAZY 5 +#define SANITY_LEVEL_INSANE 6 +/// Equal to the highest sanity level +#define SANITY_LEVEL_MAX SANITY_LEVEL_INSANE diff --git a/code/__DEFINES/religion.dm b/code/__DEFINES/religion.dm index 3074dae2987..a6a1810adf2 100644 --- a/code/__DEFINES/religion.dm +++ b/code/__DEFINES/religion.dm @@ -54,3 +54,10 @@ #define PUNISHMENT_LIGHTNING "lightningbolt" ///brands the sinner #define PUNISHMENT_BRAND "brand" + +/// Failed to bless the target, beat them over the head +#define BLESSING_FAILED "failed" +/// Blessed unsuccessfully, no limbs to heal, robotic limbs, etc +#define BLESSING_IGNORED "ignored" +/// Blessed successfully by healing or whatever +#define BLESSING_SUCCESS "success" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index 3c92c3c4cdb..86892264301 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -216,8 +216,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MAGICALLY_GIFTED "magically_gifted" /// This object innately spawns with fantasy variables already applied (the magical component is given to it on initialize), and thus we never want to give it the component again. #define TRAIT_INNATELY_FANTASTICAL_ITEM "innately_fantastical_item" -#define TRAIT_DEPRESSION "depression" -#define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" /// Prevents shovies and some strong blows such as unarmed punches and (unreliably) tackles the owner down #define TRAIT_BRAWLING_KNOCKDOWN_BLOCKED "brawling_knockdown_blocked" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 84ebeb2d298..7179ab344a1 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -217,7 +217,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, - "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, "TRAIT_DETECTIVES_TASTE" = TRAIT_DETECTIVES_TASTE, "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, @@ -328,7 +327,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_IN_CALL" = TRAIT_IN_CALL, "TRAIT_IS_WET" = TRAIT_IS_WET, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, - "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, "TRAIT_SYNDIE_KISS" = TRAIT_SYNDIE_KISS, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index cbe4dd299fd..273b53bc0f0 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -79,7 +79,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, - "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, "TRAIT_BOT_PATH_HUD" = TRAIT_BOT_PATH_HUD, @@ -152,7 +151,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_INTROVERT" = TRAIT_INTROVERT, "TRAIT_INVISIBLE_MAN" = TRAIT_INVISIBLE_MAN, "TRAIT_IWASBATONED" = TRAIT_IWASBATONED, - "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index e250bb7124f..7a696cefe87 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -66,11 +66,11 @@ /datum/component/omen/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(check_accident)) RegisterSignal(parent, COMSIG_ON_CARBON_SLIP, PROC_REF(check_slip)) - RegisterSignal(parent, COMSIG_CARBON_MOOD_UPDATE, PROC_REF(check_bless)) + RegisterSignal(parent, COMSIG_LIVING_BLESSED, PROC_REF(check_bless)) RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(check_death)) /datum/component/omen/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ON_CARBON_SLIP, COMSIG_MOVABLE_MOVED, COMSIG_CARBON_MOOD_UPDATE, COMSIG_LIVING_DEATH)) + UnregisterSignal(parent, list(COMSIG_ON_CARBON_SLIP, COMSIG_MOVABLE_MOVED, COMSIG_LIVING_BLESSED, COMSIG_LIVING_DEATH)) /datum/component/omen/proc/consume_omen() incidents_left-- @@ -218,18 +218,14 @@ return /// Hijack the mood system to see if we get the blessing mood event to cancel the omen -/datum/component/omen/proc/check_bless(mob/living/our_guy, category) +/datum/component/omen/proc/check_bless(mob/living/our_guy, mob/living/priest, obj/item/book/bible/bible, bless_result) SIGNAL_HANDLER - if(incidents_left == INFINITY) - return - - if(!("blessing" in our_guy.mob_mood.mood_events)) + if(incidents_left == INFINITY || bless_result != BLESSING_SUCCESS) return playsound(our_guy, 'sound/effects/pray_chaplain.ogg', 40, TRUE) to_chat(our_guy, span_green("You feel fantastic!")) - qdel(src) /// Severe deaths. Normally lifts the curse. diff --git a/code/datums/mood.dm b/code/datums/mood.dm index ac391425563..3622e5e44e0 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -32,10 +32,6 @@ /// List of mood events currently active on this datum var/list/mood_events = list() - /// Tracks the last mob stat, updates on change - /// Used to stop processing SSmood - var/last_stat = CONSCIOUS - /datum/mood/New(mob/living/mob_to_make_moody) if (!istype(mob_to_make_moody)) stack_trace("Tried to apply mood to a non-living atom!") @@ -83,40 +79,31 @@ /datum/mood/process(seconds_per_tick) switch(mood_level) if(MOOD_LEVEL_SAD4) - set_sanity(sanity - 0.3 * seconds_per_tick, SANITY_INSANE) + adjust_sanity(-0.3 * seconds_per_tick, SANITY_INSANE) if(MOOD_LEVEL_SAD3) - set_sanity(sanity - 0.15 * seconds_per_tick, SANITY_INSANE) + adjust_sanity(-0.15 * seconds_per_tick, SANITY_INSANE) if(MOOD_LEVEL_SAD2) - set_sanity(sanity - 0.1 * seconds_per_tick, SANITY_CRAZY) + adjust_sanity(-0.1 * seconds_per_tick, SANITY_CRAZY) if(MOOD_LEVEL_SAD1) - set_sanity(sanity - 0.05 * seconds_per_tick, SANITY_UNSTABLE) + adjust_sanity(-0.05 * seconds_per_tick, SANITY_UNSTABLE) if(MOOD_LEVEL_NEUTRAL) - set_sanity(sanity, SANITY_UNSTABLE) //This makes sure that mood gets increased should you be below the minimum. + adjust_sanity(0, SANITY_UNSTABLE) //This makes sure that mood gets increased should you be below the minimum. if(MOOD_LEVEL_HAPPY1) - set_sanity(sanity + 0.2 * seconds_per_tick, SANITY_UNSTABLE) + adjust_sanity(0.2 * seconds_per_tick, SANITY_UNSTABLE) if(MOOD_LEVEL_HAPPY2) - set_sanity(sanity + 0.3 * seconds_per_tick, SANITY_UNSTABLE) + adjust_sanity(0.3 * seconds_per_tick, SANITY_UNSTABLE) if(MOOD_LEVEL_HAPPY3) - set_sanity(sanity + 0.4 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) + adjust_sanity(0.4 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) if(MOOD_LEVEL_HAPPY4) - set_sanity(sanity + 0.6 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) + adjust_sanity(0.6 * seconds_per_tick, SANITY_NEUTRAL, SANITY_MAXIMUM) - // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute - // mood runtime, so 50% average uptime across the hour. - if(HAS_TRAIT(mob_parent, TRAIT_DEPRESSION) && SPT_PROB(0.416, seconds_per_tick)) - add_mood_event("depression", /datum/mood_event/depression) - - if(HAS_TRAIT(mob_parent, TRAIT_JOLLY) && SPT_PROB(0.416, seconds_per_tick)) - add_mood_event("jolly", /datum/mood_event/jolly) - -/datum/mood/proc/handle_mob_death(datum/source) +/datum/mood/proc/handle_mob_death(datum/source, new_stat, old_stat) SIGNAL_HANDLER - if (last_stat == DEAD && mob_parent.stat != DEAD) + if (old_stat == DEAD && new_stat != DEAD) START_PROCESSING(SSmood, src) - else if (last_stat != DEAD && mob_parent.stat == DEAD) + else if (old_stat != DEAD && new_stat == DEAD) STOP_PROCESSING(SSmood, src) - last_stat = mob_parent.stat /// Handles mood given by nutrition /datum/mood/proc/update_nutrition_moodlets() @@ -172,15 +159,15 @@ var/datum/mood_event/the_event if (mood_events[category]) the_event = mood_events[category] - if (the_event.type != type) - clear_mood_event(category) - else + if (the_event.type == type) if (the_event.timeout) if (!isnull(mood_to_copy_from)) the_event.timeout = mood_to_copy_from.timeout addtimer(CALLBACK(src, PROC_REF(clear_mood_event), category), the_event.timeout, (TIMER_UNIQUE|TIMER_OVERRIDE)) qdel(mood_to_copy_from) return // Don't need to update the event. + + clear_mood_event(category) var/list/params = args.Copy(3) params.Insert(1, mob_parent) @@ -216,6 +203,9 @@ qdel(event) update_mood() +/datum/mood/proc/get_mood_event(category) + return mood_events[category] + /// Updates the mobs mood. /// Called after mood events have been added/removed. /datum/mood/proc/update_mood() @@ -224,13 +214,12 @@ mood = 0 shown_mood = 0 - SEND_SIGNAL(mob_parent, COMSIG_CARBON_MOOD_UPDATE) - for(var/category in mood_events) var/datum/mood_event/the_event = mood_events[category] mood += the_event.mood_change if (!the_event.hidden) shown_mood += the_event.mood_change + mood *= mood_modifier shown_mood *= mood_modifier @@ -255,6 +244,7 @@ mood_level = MOOD_LEVEL_HAPPY4 update_mood_icon() + SEND_SIGNAL(mob_parent, COMSIG_CARBON_MOOD_UPDATE) /// Updates the mob's mood icon /datum/mood/proc/update_mood_icon() @@ -510,10 +500,16 @@ // If the new amount would move towards the acceptable range faster then use it instead if(amount < minimum && sanity < minimum) amount = sanity + 0.7 - if((!override && HAS_TRAIT(mob_parent, TRAIT_UNSTABLE)) || amount > maximum) + + if(!override && HAS_TRAIT(mob_parent, TRAIT_UNSTABLE)) amount = min(sanity, amount) + + if (amount > maximum) + amount = min(amount, maximum) + if(amount == sanity) //Prevents stuff from flicking around. return + sanity = amount SEND_SIGNAL(mob_parent, COMSIG_CARBON_SANITY_UPDATE, amount) switch(sanity) @@ -556,6 +552,10 @@ update_mood_icon() +/// Adjusts sanity by a value +/datum/mood/proc/adjust_sanity(amount, minimum = SANITY_INSANE, maximum = SANITY_GREAT, override = FALSE) + set_sanity(sanity + amount, minimum, maximum, override) + /// Sets the insanity effect on the mob /datum/mood/proc/set_insanity_effect(newval) if (newval == insanity_effect) @@ -575,7 +575,7 @@ /// Helper to forcefully drain sanity /datum/mood/proc/direct_sanity_drain(amount) - set_sanity(sanity + amount, override = TRUE) + adjust_sanity(amount, override = TRUE) /** * Returns true if you already have a mood from a provided category. diff --git a/code/datums/quirks/negative_quirks/all_nighter.dm b/code/datums/quirks/negative_quirks/all_nighter.dm index cb11ba0d5fa..8220972ad22 100644 --- a/code/datums/quirks/negative_quirks/all_nighter.dm +++ b/code/datums/quirks/negative_quirks/all_nighter.dm @@ -80,6 +80,7 @@ /datum/quirk/all_nighter/process(seconds_per_tick) var/happy_camper = TRUE var/beauty_sleep = TRUE + var/all_nighter = quirk_holder.mob_mood?.get_mood_event("all_nighter") if(quirk_holder.IsSleeping()) five_more_minutes += SLEEP_BANK_MULTIPLIER * seconds_per_tick @@ -93,9 +94,9 @@ happy_camper = FALSE //adjusts the mood event accordingly - if(("all_nighter" in quirk_holder.mob_mood?.mood_events) && happy_camper) + if(all_nighter && happy_camper) quirk_holder.clear_mood_event("all_nighter", /datum/mood_event/all_nighter) - if(!("all_nighter" in quirk_holder.mob_mood?.mood_events) && !happy_camper) + if(!all_nighter && !happy_camper) quirk_holder.add_mood_event("all_nighter", /datum/mood_event/all_nighter) to_chat(quirk_holder, span_danger("You start feeling tired again.")) diff --git a/code/datums/quirks/negative_quirks/depression.dm b/code/datums/quirks/negative_quirks/depression.dm index 0bf15516105..b72b5791db9 100644 --- a/code/datums/quirks/negative_quirks/depression.dm +++ b/code/datums/quirks/negative_quirks/depression.dm @@ -2,11 +2,19 @@ name = "Depression" desc = "You sometimes just hate life." icon = FA_ICON_FROWN - mob_trait = TRAIT_DEPRESSION value = -3 gain_text = span_danger("You start feeling depressed.") lose_text = span_notice("You no longer feel depressed.") //if only it were that easy! medical_record_text = "Patient has a mild mood disorder causing them to experience acute episodes of depression." - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES hardcore_value = 2 mail_goodies = list(/obj/item/storage/pill_bottle/happinesspsych) + +/datum/quirk/depression/process(seconds_per_tick) + // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute + // mood runtime, so 50% average uptime across the hour. + if(SPT_PROB(0.416, seconds_per_tick)) + quirk_holder.add_mood_event("depression", /datum/mood_event/depression) + +/datum/quirk/depression/remove() + quirk_holder.clear_mood_event("depression") diff --git a/code/datums/quirks/positive_quirks/jolly.dm b/code/datums/quirks/positive_quirks/jolly.dm index 7f6c334ba9d..a6d9ea3c199 100644 --- a/code/datums/quirks/positive_quirks/jolly.dm +++ b/code/datums/quirks/positive_quirks/jolly.dm @@ -3,7 +3,15 @@ desc = "You sometimes just feel happy, for no reason at all." icon = FA_ICON_GRIN value = 4 - mob_trait = TRAIT_JOLLY - quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_MOODLET_BASED|QUIRK_PROCESSES medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest." mail_goodies = list(/obj/item/clothing/mask/joy) + +/datum/quirk/jolly/process(seconds_per_tick) + // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute + // mood runtime, so 50% average uptime across the hour. + if(SPT_PROB(0.416, seconds_per_tick)) + quirk_holder.add_mood_event("jolly", /datum/mood_event/jolly) + +/datum/quirk/jolly/remove() + quirk_holder.clear_mood_event("jolly") diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index 5e0ab46375a..6186a33c338 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -162,19 +162,23 @@ if(!IS_HERETIC_OR_MONSTER(user)) user.balloon_alert(user, "you feel a presence watching you") user.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - user.mob_mood.set_sanity(user.mob_mood.sanity - 50) + user.mob_mood.adjust_sanity(-50) return + if(hit.can_block_magic(MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND)) return + if(!hit.mob_mood) return + if(hit.mob_mood.sanity_level > SANITY_LEVEL_UNSTABLE) user.balloon_alert(user, "their mind is too strong!") hit.add_mood_event("Moon Amulet Insanity", /datum/mood_event/amulet_insanity) - hit.mob_mood.set_sanity(hit.mob_mood.sanity - sanity_damage) - else - user.balloon_alert(user, "their mind bends to see the truth!") - hit.apply_status_effect(/datum/status_effect/moon_converted) - user.log_message("made [target] insane.", LOG_GAME) - hit.log_message("was driven insane by [user]") + hit.mob_mood.adjust_sanity(-sanity_damage) + return ..() + + user.balloon_alert(user, "their mind bends to see the truth!") + hit.apply_status_effect(/datum/status_effect/moon_converted) + user.log_message("made [target] insane.", LOG_GAME) + hit.log_message("was driven insane by [user]") . = ..() diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index c5a6930eab7..8ae742d9749 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -62,7 +62,7 @@ var/mob/living/carbon/carbon_target = target to_chat(carbon_target, span_danger("You hear echoing laughter from above")) carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") - carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-30) + carbon_target.mob_mood.adjust_sanity(-30) /datum/heretic_knowledge/spell/moon_smile name = "Smile of the moon" @@ -134,7 +134,7 @@ "upgraded path of moon blades", \ ) target.emote(pick("giggle", "laugh")) - target.mob_mood.set_sanity(target.mob_mood.sanity - 10) + target.mob_mood.adjust_sanity(-10) /datum/heretic_knowledge/spell/moon_ringleader name = "Ringleaders Rise" @@ -234,7 +234,6 @@ ) for(var/mob/living/carbon/carbon_view in view(5, source)) - var/carbon_sanity = carbon_view.mob_mood.sanity if(carbon_view.stat != CONSCIOUS) continue if(IS_HERETIC_OR_MONSTER(carbon_view)) @@ -243,11 +242,13 @@ continue new moon_effect(get_turf(carbon_view)) carbon_view.adjust_confusion(2 SECONDS) - carbon_view.mob_mood.set_sanity(carbon_sanity - 5) + carbon_view.mob_mood.adjust_sanity(-5) + var/carbon_sanity = carbon_view.mob_mood.sanity if(carbon_sanity < 30) if(SPT_PROB(20, seconds_per_tick)) to_chat(carbon_view, span_warning("you feel your mind beginning to rend!")) carbon_view.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + if(carbon_sanity < 10) if(SPT_PROB(20, seconds_per_tick)) to_chat(carbon_view, span_warning("it echoes through you!")) diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index 49f8c428082..d8873c816cc 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -85,7 +85,7 @@ victim.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) victim.cause_hallucination(/datum/hallucination/delusion/preset/moon, name) - victim.mob_mood.set_sanity(victim.mob_mood.sanity - 20) + victim.mob_mood.adjust_sanity(-20) /obj/projectile/moon_parade/Destroy() for(var/mob/living/leftover_mob as anything in mobs_hit) diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index d79269dc269..beacd0f5afa 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -51,7 +51,7 @@ victim.apply_status_effect(/datum/status_effect/moon_converted) caster.log_message("made [victim] insane.", LOG_GAME) victim.log_message("was driven insane by [caster]") - victim.mob_mood.set_sanity(victim_sanity * 0.5) + victim.mob_mood.adjust_sanity(victim_sanity * -0.5) /obj/effect/temp_visual/moon_ringleader diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index 2ded0134a04..62e1fa6747e 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -51,5 +51,5 @@ if(cast_on.mob_mood.sanity < 40) cast_on.AdjustKnockdown(2 SECONDS) //Lowers sanity - cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) + cast_on.mob_mood.adjust_sanity(-20) return TRUE diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index b801076747f..01000da5908 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -78,7 +78,7 @@ Noncompliance and removal of this implant is not recommended, and remember to smile for the cameras!")) return ..() - + /datum/antagonist/survivalist/battle_royale/on_removal() if (isnull(owner.current)) return ..() @@ -86,7 +86,7 @@ if (owner.current.stat == DEAD) return ..() to_chat(owner, span_notice("Your body is flooded with relief. Against all the odds, you've made it out alive.")) - owner.current?.mob_mood.add_mood_event("battle_royale", /datum/mood_event/royale_survivor) + owner.current?.add_mood_event("battle_royale", /datum/mood_event/royale_survivor) return ..() /// Add an objective to go to a specific place. diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index a25a8eb3ca9..2b7913b42c2 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -83,15 +83,6 @@ soft_type = "grey" dog_fashion = null -/* A grey baseball cap that grants TRAIT_JOLLY when it's on your head. - * Used for testing that gaining and losing the JOLLY trait behaves properly. - * Also a perfectly valid weird admin reward. - */ -/obj/item/clothing/head/soft/grey/jolly - name = "jolly grey cap" - desc = "It's a baseball hat in a sublime grey colour. Why, wearing this alone would boost a person's spirits!" - clothing_traits = list(TRAIT_JOLLY) - /obj/item/clothing/head/soft/orange name = "orange cap" desc = "It's a baseball hat in a tasteless orange colour." diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/dreaming.dm similarity index 98% rename from code/modules/flufftext/Dreaming.dm rename to code/modules/flufftext/dreaming.dm index c38108dac14..a813c8d9652 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/dreaming.dm @@ -23,7 +23,7 @@ set waitfor = FALSE var/datum/dream/chosen_dream - if (IS_HERETIC(src) && !("mansus_dream_fatigue" in src.mob_mood.mood_events) && GLOB.reality_smash_track.smashes.len) + if (IS_HERETIC(src) && !mob_mood.get_mood_event("mansus_dream_fatigue") && GLOB.reality_smash_track.smashes.len) chosen_dream = new /datum/dream/heretic(pick(GLOB.reality_smash_track.smashes)) else chosen_dream = pick_weight(GLOB.dreams) diff --git a/code/modules/library/bibles.dm b/code/modules/library/bibles.dm index 4c31092199d..b14c9baa56b 100644 --- a/code/modules/library/bibles.dm +++ b/code/modules/library/bibles.dm @@ -204,25 +204,30 @@ GLOBAL_LIST_INIT(bibleitemstates, list( /obj/item/book/bible/proc/bless(mob/living/blessed, mob/living/user) if(GLOB.religious_sect) return GLOB.religious_sect.sect_bless(blessed,user) + if(!ishuman(blessed)) - return + return BLESSING_FAILED + var/mob/living/carbon/human/built_in_his_image = blessed for(var/obj/item/bodypart/bodypart as anything in built_in_his_image.bodyparts) if(!IS_ORGANIC_LIMB(bodypart)) balloon_alert(user, "can't heal inorganic!") - return FALSE + return BLESSING_IGNORED var/heal_amt = 10 var/list/hurt_limbs = built_in_his_image.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) - if(length(hurt_limbs)) - for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) - built_in_his_image.update_damage_overlays() - built_in_his_image.visible_message(span_notice("[user] heals [built_in_his_image] with the power of [deity_name]!")) - to_chat(built_in_his_image, span_boldnotice("May the power of [deity_name] compel you to be healed!")) - playsound(built_in_his_image, SFX_PUNCH, 25, TRUE, -1) - built_in_his_image.add_mood_event("blessing", /datum/mood_event/blessing) - return TRUE + if(!length(hurt_limbs)) + return BLESSING_IGNORED + + for(var/obj/item/bodypart/affecting as anything in hurt_limbs) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) + built_in_his_image.update_damage_overlays() + + built_in_his_image.visible_message(span_notice("[user] heals [built_in_his_image] with the power of [deity_name]!")) + to_chat(built_in_his_image, span_boldnotice("May the power of [deity_name] compel you to be healed!")) + playsound(built_in_his_image, SFX_PUNCH, 25, TRUE, -1) + built_in_his_image.add_mood_event("blessing", /datum/mood_event/blessing) + return BLESSING_SUCCESS /obj/item/book/bible/attack(mob/living/target_mob, mob/living/carbon/human/user, params, heal_mode = TRUE) if(!ISADVANCEDTOOLUSER(user)) @@ -244,7 +249,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list( return ..() if(target_mob.stat == DEAD) - if(!GLOB.religious_sect?.sect_dead_bless(target_mob, user)) + if(GLOB.religious_sect?.sect_dead_bless(target_mob, user) == BLESSING_FAILED) target_mob.visible_message(span_danger("[user] smacks [target_mob]'s lifeless corpse with [src].")) playsound(target_mob, SFX_PUNCH, 25, TRUE, -1) return @@ -256,9 +261,13 @@ GLOBAL_LIST_INIT(bibleitemstates, list( var/smack_chance = DEFAULT_SMACK_CHANCE if(GLOB.religious_sect) smack_chance = GLOB.religious_sect.smack_chance - var/success = !prob(smack_chance) && bless(target_mob, user) - if(success) - return + + if(!prob(smack_chance)) + var/bless_result = bless(target_mob, user) + if (bless_result != BLESSING_FAILED) + SEND_SIGNAL(target_mob, COMSIG_LIVING_BLESSED, user, src, bless_result) + return + if(iscarbon(target_mob)) var/mob/living/carbon/carbon_target = target_mob if(!istype(carbon_target.head, /obj/item/clothing/head/helmet)) diff --git a/code/modules/mining/equipment/monster_organs/regenerative_core.dm b/code/modules/mining/equipment/monster_organs/regenerative_core.dm index bcb7bc0455f..bcec0eb6c4e 100644 --- a/code/modules/mining/equipment/monster_organs/regenerative_core.dm +++ b/code/modules/mining/equipment/monster_organs/regenerative_core.dm @@ -36,7 +36,7 @@ /// Log applications and apply moodlet. /obj/item/organ/monster_core/regenerative_core/apply_to(mob/living/target, mob/user) - target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) + target.add_mood_event("legion_core", /datum/mood_event/healsbadman) if (target != user) target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion.dm b/code/modules/mob/living/basic/lavaland/legion/legion.dm index 7047664386a..6a2d3840884 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion.dm @@ -60,7 +60,7 @@ UnregisterSignal(stored_mob, COMSIG_LIVING_REVIVE) ai_controller.clear_blackboard_key(BB_LEGION_CORPSE) stored_mob.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_LEGION_EATEN) - stored_mob.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman/long_term) // This will still probably mostly be gone before you are alive + stored_mob.add_mood_event("legion_core", /datum/mood_event/healsbadman/long_term) // This will still probably mostly be gone before you are alive stored_mob = null /mob/living/basic/mining/legion/death(gibbed) diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm index fbcea0d1719..daa10681794 100644 --- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm +++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm @@ -72,7 +72,7 @@ return FALSE if (target.stat <= SOFT_CRIT && !(organ_flags & ORGAN_FAILING)) - target.add_mood_event(MOOD_CATEGORY_LEGION_CORE, /datum/mood_event/healsbadman) + target.add_mood_event("legion_core", /datum/mood_event/healsbadman) target.apply_status_effect(applied_status) if (target != user) diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 2b446a0e6f9..dadc3046d33 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1611,7 +1611,7 @@ affected_mob.adjust_confusion(-6 SECONDS * REM * seconds_per_tick) affected_mob.disgust = max(affected_mob.disgust - (6 * REM * seconds_per_tick), 0) if(affected_mob.mob_mood != null && affected_mob.mob_mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... - affected_mob.mob_mood.set_sanity(min(affected_mob.mob_mood.sanity + (5 * REM * seconds_per_tick), SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral + affected_mob.mob_mood.adjust_sanity(5 * REM * seconds_per_tick, maximum = SANITY_NEUTRAL) // set minimum to prevent unwanted spiking over neutral /datum/reagent/medicine/psicodine/overdose_process(mob/living/affected_mob, seconds_per_tick, times_fired) . = ..() diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 58209cac74a..503d1f850c0 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -104,26 +104,29 @@ /// Replaces the bible's bless mechanic. Return TRUE if you want to not do the brain hit. /datum/religion_sect/proc/sect_bless(mob/living/target, mob/living/chap) if(!ishuman(target)) - return FALSE + return BLESSING_FAILED + var/mob/living/carbon/human/blessed = target for(var/obj/item/bodypart/bodypart as anything in blessed.bodyparts) if(IS_ROBOTIC_LIMB(bodypart)) to_chat(chap, span_warning("[GLOB.deity] refuses to heal this metallic taint!")) - return TRUE + return BLESSING_IGNORED var/heal_amt = 10 var/list/hurt_limbs = blessed.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) - if(hurt_limbs.len) - for(var/X in hurt_limbs) - var/obj/item/bodypart/affecting = X - if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) - blessed.update_damage_overlays() - blessed.visible_message(span_notice("[chap] heals [blessed] with the power of [GLOB.deity]!")) - to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) - playsound(chap, SFX_PUNCH, 25, TRUE, -1) - blessed.add_mood_event("blessing", /datum/mood_event/blessing) - return TRUE + if(!length(hurt_limbs)) + return BLESSING_IGNORED + + for(var/obj/item/bodypart/affecting as anything in hurt_limbs) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) + blessed.update_damage_overlays() + + blessed.visible_message(span_notice("[chap] heals [blessed] with the power of [GLOB.deity]!")) + to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) + playsound(chap, SFX_PUNCH, 25, TRUE, -1) + blessed.add_mood_event("blessing", /datum/mood_event/blessing) + return BLESSING_SUCCESS /// What happens if we bless a corpse? By default just do the default smack behavior /datum/religion_sect/proc/sect_dead_bless(mob/living/target, mob/living/chap) @@ -162,9 +165,11 @@ to_chat(R, span_boldnotice("You are charged by the power of [GLOB.deity]!")) R.add_mood_event("blessing", /datum/mood_event/blessing) playsound(chap, 'sound/effects/bang.ogg', 25, TRUE, -1) - return TRUE + return BLESSING_SUCCESS + if(!ishuman(target)) - return + return BLESSING_FAILED + var/mob/living/carbon/human/blessed = target //first we determine if we can charge them @@ -179,12 +184,13 @@ if(IS_ORGANIC_LIMB(bodypart)) if(!did_we_charge) to_chat(chap, span_warning("[GLOB.deity] scoffs at the idea of healing such fleshy matter!")) - else - blessed.visible_message(span_notice("[chap] charges [blessed] with the power of [GLOB.deity]!")) - to_chat(blessed, span_boldnotice("You feel charged by the power of [GLOB.deity]!")) - blessed.add_mood_event("blessing", /datum/mood_event/blessing) - playsound(chap, 'sound/machines/synth/synth_yes.ogg', 25, TRUE, -1) - return TRUE + return BLESSING_IGNORED + + blessed.visible_message(span_notice("[chap] charges [blessed] with the power of [GLOB.deity]!")) + to_chat(blessed, span_boldnotice("You feel charged by the power of [GLOB.deity]!")) + blessed.add_mood_event("blessing", /datum/mood_event/blessing) + playsound(chap, 'sound/machines/synth/synth_yes.ogg', 25, TRUE, -1) + return BLESSING_SUCCESS //charge(?) and go if(bodypart.heal_damage(5,5,BODYTYPE_ROBOTIC)) @@ -194,7 +200,7 @@ to_chat(blessed, span_boldnotice("The inner machinations of [GLOB.deity] [did_we_charge ? "repairs and charges" : "repairs"] you!")) playsound(chap, 'sound/effects/bang.ogg', 25, TRUE, -1) blessed.add_mood_event("blessing", /datum/mood_event/blessing) - return TRUE + return BLESSING_SUCCESS /datum/religion_sect/mechanical/on_sacrifice(obj/item/stock_parts/power_store/cell/power_cell, mob/living/chap) if(!istype(power_cell)) @@ -258,33 +264,39 @@ return "In the eyes of [GLOB.deity], your wealth is your favor." /datum/religion_sect/greed/sect_bless(mob/living/blessed_living, mob/living/chap) + if(!ishuman(blessed_living)) + return BLESSING_FAILED + var/datum/bank_account/account = chap.get_bank_account() if(!account) to_chat(chap, span_warning("You need a way to pay for the heal!")) - return TRUE + return BLESSING_IGNORED + if(account.account_balance < GREEDY_HEAL_COST) to_chat(chap, span_warning("Healing from [GLOB.deity] costs [GREEDY_HEAL_COST] credits for 30 health!")) - return TRUE - if(!ishuman(blessed_living)) - return FALSE + return BLESSING_IGNORED + var/mob/living/carbon/human/blessed = blessed_living for(var/obj/item/bodypart/robolimb as anything in blessed.bodyparts) if(IS_ROBOTIC_LIMB(robolimb)) to_chat(chap, span_warning("[GLOB.deity] refuses to heal this metallic taint!")) - return TRUE + return BLESSING_IGNORED account.adjust_money(-GREEDY_HEAL_COST, "Church Donation: Treatment") var/heal_amt = 30 var/list/hurt_limbs = blessed.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) - if(hurt_limbs.len) - for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) - blessed.update_damage_overlays() - blessed.visible_message(span_notice("[chap] barters a heal for [blessed] from [GLOB.deity]!")) - to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed! Thank you for choosing [GLOB.deity]!")) - playsound(chap, 'sound/effects/cashregister.ogg', 60, TRUE) - blessed.add_mood_event("blessing", /datum/mood_event/blessing) - return TRUE + if(!length(hurt_limbs)) + return BLESSING_IGNORED + + for(var/obj/item/bodypart/affecting as anything in hurt_limbs) + if(affecting.heal_damage(heal_amt, heal_amt, required_bodytype = BODYTYPE_ORGANIC)) + blessed.update_damage_overlays() + + blessed.visible_message(span_notice("[chap] barters a heal for [blessed] from [GLOB.deity]!")) + to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed! Thank you for choosing [GLOB.deity]!")) + playsound(chap, 'sound/effects/cashregister.ogg', 60, TRUE) + blessed.add_mood_event("blessing", /datum/mood_event/blessing) + return BLESSING_SUCCESS #undef GREEDY_HEAL_COST @@ -321,10 +333,12 @@ /datum/religion_sect/burden/sect_bless(mob/living/carbon/target, mob/living/carbon/chaplain) if(!istype(target) || !istype(chaplain)) - return FALSE + return BLESSING_FAILED + var/datum/brain_trauma/special/burdened/burden = chaplain.has_trauma_type(/datum/brain_trauma/special/burdened) if(!burden) - return FALSE + return BLESSING_FAILED + var/burden_modifier = max(1 - 0.07 * burden.burden_level, 0.01) var/transferred = FALSE var/list/hurt_limbs = target.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) + target.get_wounded_bodyparts(BODYTYPE_ORGANIC) @@ -332,6 +346,7 @@ for(var/obj/item/bodypart/possible_limb in chaplain.bodyparts) if(IS_ORGANIC_LIMB(possible_limb)) chaplains_limbs += possible_limb + if(length(chaplains_limbs)) for(var/obj/item/bodypart/affected_limb as anything in hurt_limbs) var/obj/item/bodypart/chaplains_limb = chaplain.get_bodypart(affected_limb.body_zone) @@ -347,20 +362,24 @@ transferred = TRUE iter_wound.remove_wound() iter_wound.apply_wound(chaplains_limb) + if(HAS_TRAIT_FROM(target, TRAIT_HUSK, BURN)) transferred = TRUE target.cure_husk(BURN) chaplain.become_husk(BURN) + var/toxin_damage = target.getToxLoss() if(toxin_damage && !HAS_TRAIT(chaplain, TRAIT_TOXIMMUNE)) transferred = TRUE target.adjustToxLoss(-toxin_damage) chaplain.adjustToxLoss(toxin_damage * burden_modifier, forced = TRUE) + var/suffocation_damage = target.getOxyLoss() if(suffocation_damage && !HAS_TRAIT(chaplain, TRAIT_NOBREATH)) transferred = TRUE target.adjustOxyLoss(-suffocation_damage) chaplain.adjustOxyLoss(suffocation_damage * burden_modifier, forced = TRUE) + if(!HAS_TRAIT(chaplain, TRAIT_NOBLOOD)) if(target.blood_volume < BLOOD_VOLUME_SAFE) var/target_blood_data = target.get_blood_data(target.get_blood_id()) @@ -371,16 +390,18 @@ chaplain.transfer_blood_to(target, transferred_blood_amount, forced = TRUE) if(target.blood_volume > BLOOD_VOLUME_EXCESS) target.transfer_blood_to(chaplain, target.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE) + target.update_damage_overlays() chaplain.update_damage_overlays() if(transferred) - target.visible_message(span_notice("[chaplain] takes on [target]'s burden!")) - to_chat(target, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) - playsound(chaplain, SFX_PUNCH, 25, vary = TRUE, extrarange = -1) - target.add_mood_event("blessing", /datum/mood_event/blessing) - else to_chat(chaplain, span_warning("They hold no burden!")) - return TRUE + return BLESSING_IGNORED + + target.visible_message(span_notice("[chaplain] takes on [target]'s burden!")) + to_chat(target, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) + playsound(chaplain, SFX_PUNCH, 25, vary = TRUE, extrarange = -1) + target.add_mood_event("blessing", /datum/mood_event/blessing) + return BLESSING_SUCCESS /datum/religion_sect/burden/sect_dead_bless(mob/living/target, mob/living/chaplain) return sect_bless(target, chaplain) @@ -436,17 +457,19 @@ /datum/religion_sect/maintenance/sect_bless(mob/living/blessed_living, mob/living/chap) if(!ishuman(blessed_living)) - return TRUE + return BLESSING_FAILED + var/mob/living/carbon/human/blessed = blessed_living if(blessed.reagents.has_reagent(/datum/reagent/drug/maint/sludge)) to_chat(blessed, span_warning("[GLOB.deity] has already empowered them.")) - return TRUE + return BLESSING_IGNORED + blessed.reagents.add_reagent(/datum/reagent/drug/maint/sludge, 5) blessed.visible_message(span_notice("[chap] empowers [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("The power of [GLOB.deity] has made you harder to wound for a while!")) playsound(chap, SFX_PUNCH, 25, TRUE, -1) blessed.add_mood_event("blessing", /datum/mood_event/blessing) - return TRUE //trust me, you'll be feeling the pain from the maint drugs all well enough + return BLESSING_SUCCESS //trust me, you'll be feeling the pain from the maint drugs all well enough /datum/religion_sect/maintenance/on_sacrifice(obj/item/reagent_containers/offering, mob/living/user) if(!istype(offering)) diff --git a/tgstation.dme b/tgstation.dme index 93986120e2f..42e5d099d84 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4269,7 +4269,7 @@ #include "code\modules\fishing\fish\types\tiziran.dm" #include "code\modules\fishing\sources\_fish_source.dm" #include "code\modules\fishing\sources\source_types.dm" -#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\dreaming.dm" #include "code\modules\food_and_drinks\pizzabox.dm" #include "code\modules\food_and_drinks\plate.dm" #include "code\modules\food_and_drinks\machinery\coffeemaker.dm"