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"