Files
Bubberstation/code/datums/brain_damage/mild.dm
SkyratBot 832f9fb865 [MIRROR] Significantly increases stamina recovery on most effects that provide it (#28131)
* Significantly increases stamina recovery on most effects that provide it (#83556)

## About The Pull Request

Currently, stamina healing is a niche side effect on many drugs, besides
a few effects (mostly heretic powers, an obscure side effect of some
drinks) that actually contribute to a significant shift in gameplay
style when you use them. In this PR I significantly increased the
stamina recovery on almost every drug and some effects that provide it.

Points of interest (not completely inclusive):
Syndicate stimulants heal 12 instead of 5 stamina damage. This will
bring you out of stam crit in two cycles, and let you heal out of the
slowdown from the stamina damage from a baton strike. The current rate
of 5 takes 5 seconds to heal out of stam crit, and the stamina reset
takes place before you heal out of stamina damage slowdown.
Bath salts heal stamina at the rate stimulants used to. Meth heals
stamina slightly slower.
Changeling adrenaline will instantly bring you out of stam crit if
you're in it; otherwise, it will heal 10 stamina damage.
Ephedrine heals 4 stamina per life, instead of 1.
Being so drunk that you black out and give up your body to ghost control
will make you heal stamina more quickly than an ascended rust heretic.
You will also likely be dying of liver damage.
## Why It's Good For The Game

At the levels they are set, most of these stamina healing effects have
almost no effect on gameplay whatsoever except in the case of tanking a
couple of extra disabler shots (only in the case of the high end drugs),
or being able to do stamina consuming tasks slightly longer (breaking
boulders, grinding with pestle and mortar, working out, ???).

Adjusting these numbers would make these drugs an actual factor in
combat situations that rely on stamina crit (stun batons, ebows, stamina
damaging poisons and diseases). Most of the drugs already have side
effects such as brain and organ damage, which in the current state
hugely outweighs any reason to use most of them besides a few that give
a movespeed buff or prevent baton knockdown (ephedrine, stimulants).

This only affects stamina healing. There has been no change to any other
interactions with things that knock down or cause any other kind of
stun.

These changes are in consideration of the fact that taking stamina
damage puts you in a cooldown before you can recover your stamina
naturally. Effects that cause steady stamina damage will bottom out your
stamina the way they do now, unless you use something to heal it.
## Changelog
🆑
balance: Stamina healing has been significantly increased for most
reagents and passive effects.
/🆑

* Significantly increases stamina recovery on most effects that provide it

---------

Co-authored-by: Joshua Kidder <49173900+Metekillot@users.noreply.github.com>
Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
2024-06-15 17:39:18 +01:00

327 lines
12 KiB
Plaintext

//Mild traumas are the most common; they are generally minor annoyances.
//They can be cured with mannitol and patience, although brain surgery still works.
//Most of the old brain damage effects have been transferred to the dumbness trauma.
/datum/brain_trauma/mild
abstract_type = /datum/brain_trauma/mild
/datum/brain_trauma/mild/hallucinations
name = "Hallucinations"
desc = "Patient suffers constant hallucinations."
scan_desc = "schizophrenia"
gain_text = span_warning("You feel your grip on reality slipping...")
lose_text = span_notice("You feel more grounded.")
/datum/brain_trauma/mild/hallucinations/on_life(seconds_per_tick, times_fired)
if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious())
return
if(HAS_TRAIT(owner, TRAIT_RDS_SUPPRESSED))
owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA)
return
if(!HAS_TRAIT(owner, TRAIT_RDS_SUPPRESSED))
owner.grant_language(/datum/language/aphasia, source = LANGUAGE_APHASIA)
owner.adjust_hallucinations_up_to(10 SECONDS * seconds_per_tick, 100 SECONDS)
/datum/brain_trauma/mild/hallucinations/on_lose()
owner.remove_status_effect(/datum/status_effect/hallucination)
if(!QDELING(owner))
owner.remove_language(/datum/language/aphasia, source = LANGUAGE_APHASIA)
return ..()
/datum/brain_trauma/mild/stuttering
name = "Stuttering"
desc = "Patient can't speak properly."
scan_desc = "reduced mouth coordination"
gain_text = span_warning("Speaking clearly is getting harder.")
lose_text = span_notice("You feel in control of your speech.")
/datum/brain_trauma/mild/stuttering/on_life(seconds_per_tick, times_fired)
owner.adjust_stutter_up_to(5 SECONDS * seconds_per_tick, 50 SECONDS)
/datum/brain_trauma/mild/stuttering/on_lose()
owner.remove_status_effect(/datum/status_effect/speech/stutter)
return ..()
/datum/brain_trauma/mild/dumbness
name = "Dumbness"
desc = "Patient has reduced brain activity, making them less intelligent."
scan_desc = "reduced brain activity"
gain_text = span_warning("You feel dumber.")
lose_text = span_notice("You feel smart again.")
/datum/brain_trauma/mild/dumbness/on_gain()
ADD_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT)
owner.add_mood_event("dumb", /datum/mood_event/oblivious)
return ..()
/datum/brain_trauma/mild/dumbness/on_life(seconds_per_tick, times_fired)
owner.adjust_derpspeech_up_to(5 SECONDS * seconds_per_tick, 50 SECONDS)
if(SPT_PROB(1.5, seconds_per_tick))
owner.emote("drool")
else if(owner.stat == CONSCIOUS && SPT_PROB(1.5, seconds_per_tick))
owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage", filterproof = TRUE)
/datum/brain_trauma/mild/dumbness/on_lose()
REMOVE_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT)
owner.remove_status_effect(/datum/status_effect/speech/stutter/derpspeech)
owner.clear_mood_event("dumb")
return ..()
/datum/brain_trauma/mild/speech_impediment
name = "Speech Impediment"
desc = "Patient is unable to form coherent sentences."
scan_desc = "communication disorder"
gain_text = span_danger("You can't seem to form any coherent thoughts!")
lose_text = span_danger("Your mind feels more clear.")
/datum/brain_trauma/mild/speech_impediment/on_gain()
ADD_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
..()
/datum/brain_trauma/mild/speech_impediment/on_lose()
REMOVE_TRAIT(owner, TRAIT_UNINTELLIGIBLE_SPEECH, TRAUMA_TRAIT)
..()
/datum/brain_trauma/mild/concussion
name = "Concussion"
desc = "Patient's brain is concussed."
scan_desc = "concussion"
gain_text = span_warning("Your head hurts!")
lose_text = span_notice("The pressure inside your head starts fading.")
/datum/brain_trauma/mild/concussion/on_life(seconds_per_tick, times_fired)
if(SPT_PROB(2.5, seconds_per_tick))
switch(rand(1,11))
if(1)
owner.vomit(VOMIT_CATEGORY_DEFAULT)
if(2,3)
owner.adjust_dizzy(20 SECONDS)
if(4,5)
owner.adjust_confusion(10 SECONDS)
owner.set_eye_blur_if_lower(20 SECONDS)
if(6 to 9)
owner.adjust_slurring(1 MINUTES)
if(10)
to_chat(owner, span_notice("You forget for a moment what you were doing."))
owner.Stun(20)
if(11)
to_chat(owner, span_warning("You faint."))
owner.Unconscious(80)
..()
/datum/brain_trauma/mild/healthy
name = "Anosognosia"
desc = "Patient always feels healthy, regardless of their condition."
scan_desc = "self-awareness deficit"
gain_text = span_notice("You feel great!")
lose_text = span_warning("You no longer feel perfectly healthy.")
/datum/brain_trauma/mild/healthy/on_gain()
owner.apply_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type)
return ..()
/datum/brain_trauma/mild/healthy/on_life(seconds_per_tick, times_fired)
owner.adjustStaminaLoss(-6 * seconds_per_tick) //no pain, no fatigue
/datum/brain_trauma/mild/healthy/on_lose()
owner.remove_status_effect(/datum/status_effect/grouped/screwy_hud/fake_healthy, type)
return ..()
/datum/brain_trauma/mild/muscle_weakness
name = "Muscle Weakness"
desc = "Patient experiences occasional bouts of muscle weakness."
scan_desc = "weak motor nerve signal"
gain_text = span_warning("Your muscles feel oddly faint.")
lose_text = span_notice("You feel in control of your muscles again.")
/datum/brain_trauma/mild/muscle_weakness/on_life(seconds_per_tick, times_fired)
var/fall_chance = 1
if(owner.move_intent == MOVE_INTENT_RUN)
fall_chance += 2
if(SPT_PROB(0.5 * fall_chance, seconds_per_tick) && owner.body_position == STANDING_UP)
to_chat(owner, span_warning("Your leg gives out!"))
owner.Paralyze(35)
else if(owner.get_active_held_item())
var/drop_chance = 1
var/obj/item/I = owner.get_active_held_item()
drop_chance += I.w_class
if(SPT_PROB(0.5 * drop_chance, seconds_per_tick) && owner.dropItemToGround(I))
to_chat(owner, span_warning("You drop [I]!"))
else if(SPT_PROB(1.5, seconds_per_tick))
to_chat(owner, span_warning("You feel a sudden weakness in your muscles!"))
owner.adjustStaminaLoss(50)
..()
/datum/brain_trauma/mild/muscle_spasms
name = "Muscle Spasms"
desc = "Patient has occasional muscle spasms, causing them to move unintentionally."
scan_desc = "nervous fits"
gain_text = span_warning("Your muscles feel oddly faint.")
lose_text = span_notice("You feel in control of your muscles again.")
/datum/brain_trauma/mild/muscle_spasms/on_gain()
owner.apply_status_effect(/datum/status_effect/spasms)
..()
/datum/brain_trauma/mild/muscle_spasms/on_lose()
owner.remove_status_effect(/datum/status_effect/spasms)
..()
/datum/brain_trauma/mild/nervous_cough
name = "Nervous Cough"
desc = "Patient feels a constant need to cough."
scan_desc = "nervous cough"
gain_text = span_warning("Your throat itches incessantly...")
lose_text = span_notice("Your throat stops itching.")
/datum/brain_trauma/mild/nervous_cough/on_life(seconds_per_tick, times_fired)
if(SPT_PROB(6, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_SOOTHED_THROAT))
if(prob(5))
to_chat(owner, span_warning("[pick("You have a coughing fit!", "You can't stop coughing!")]"))
owner.Immobilize(20)
owner.emote("cough")
addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 0.6 SECONDS)
addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/, emote), "cough"), 1.2 SECONDS)
owner.emote("cough")
..()
/datum/brain_trauma/mild/expressive_aphasia
name = "Expressive Aphasia"
desc = "Patient is affected by partial loss of speech leading to a reduced vocabulary."
scan_desc = "inability to form complex sentences"
gain_text = span_warning("You lose your grasp on complex words.")
lose_text = span_notice("You feel your vocabulary returning to normal again.")
var/static/list/common_words = world.file2list("strings/1000_most_common.txt")
/datum/brain_trauma/mild/expressive_aphasia/handle_speech(datum/source, list/speech_args)
var/message = speech_args[SPEECH_MESSAGE]
if(message)
var/list/message_split = splittext(message, " ")
var/list/new_message = list()
for(var/word in message_split)
var/suffix = ""
var/suffix_foundon = 0
for(var/potential_suffix in list("." , "," , ";" , "!" , ":" , "?"))
suffix_foundon = findtext(word, potential_suffix, -length(potential_suffix))
if(suffix_foundon)
suffix = potential_suffix
break
if(suffix_foundon)
word = copytext(word, 1, suffix_foundon)
word = html_decode(word)
if(LOWER_TEXT(word) in common_words)
new_message += word + suffix
else
if(prob(30) && message_split.len > 2)
new_message += pick("uh","erm")
break
else
var/list/charlist = text2charlist(word)
charlist.len = round(charlist.len * 0.5, 1)
shuffle_inplace(charlist)
new_message += jointext(charlist, "") + suffix
message = jointext(new_message, " ")
speech_args[SPEECH_MESSAGE] = trim(message)
/datum/brain_trauma/mild/mind_echo
name = "Mind Echo"
desc = "Patient's language neurons do not terminate properly, causing previous speech patterns to occasionally resurface spontaneously."
scan_desc = "looping neural pattern"
gain_text = span_warning("You feel a faint echo of your thoughts...")
lose_text = span_notice("The faint echo fades away.")
var/list/hear_dejavu = list()
var/list/speak_dejavu = list()
/datum/brain_trauma/mild/mind_echo/handle_hearing(datum/source, list/hearing_args)
if(!owner.can_hear() || owner == hearing_args[HEARING_SPEAKER])
return
if(hear_dejavu.len >= 5)
if(prob(25))
var/deja_vu = pick_n_take(hear_dejavu)
var/static/regex/quoted_spoken_message = regex("\".+\"", "gi")
hearing_args[HEARING_RAW_MESSAGE] = quoted_spoken_message.Replace(hearing_args[HEARING_RAW_MESSAGE], "\"[deja_vu]\"") //Quotes included to avoid cases where someone says part of their name
return
if(hear_dejavu.len >= 15)
if(prob(50))
popleft(hear_dejavu) //Remove the oldest
hear_dejavu += hearing_args[HEARING_RAW_MESSAGE]
else
hear_dejavu += hearing_args[HEARING_RAW_MESSAGE]
/datum/brain_trauma/mild/mind_echo/handle_speech(datum/source, list/speech_args)
if(speak_dejavu.len >= 5)
if(prob(25))
var/deja_vu = pick_n_take(speak_dejavu)
speech_args[SPEECH_MESSAGE] = deja_vu
return
if(speak_dejavu.len >= 15)
if(prob(50))
popleft(speak_dejavu) //Remove the oldest
speak_dejavu += speech_args[SPEECH_MESSAGE]
else
speak_dejavu += speech_args[SPEECH_MESSAGE]
/datum/brain_trauma/mild/color_blindness
name = "Achromatopsia"
desc = "Patient's occipital lobe is unable to recognize and interpret color, rendering the patient completely colorblind."
scan_desc = "colorblindness"
gain_text = span_warning("The world around you seems to lose its color.")
lose_text = span_notice("The world feels bright and colorful again.")
/datum/brain_trauma/mild/color_blindness/on_gain()
owner.add_client_colour(/datum/client_colour/monochrome/colorblind)
return ..()
/datum/brain_trauma/mild/color_blindness/on_lose(silent)
owner.remove_client_colour(/datum/client_colour/monochrome/colorblind)
return ..()
/datum/brain_trauma/mild/possessive
name = "Possessive"
desc = "Patient is extremely possessive of their belongings."
scan_desc = "possessiveness"
gain_text = span_warning("You start to worry about your belongings.")
lose_text = span_notice("You worry less about your belongings.")
/datum/brain_trauma/mild/possessive/on_lose(silent)
. = ..()
for(var/obj/item/thing in owner.held_items)
clear_trait(thing)
/datum/brain_trauma/mild/possessive/on_life(seconds_per_tick, times_fired)
if(!SPT_PROB(5, seconds_per_tick))
return
var/obj/item/my_thing = pick(owner.held_items) // can pick null, that's fine
if(isnull(my_thing) || HAS_TRAIT(my_thing, TRAIT_NODROP) || (my_thing.item_flags & (HAND_ITEM|ABSTRACT)))
return
ADD_TRAIT(my_thing, TRAIT_NODROP, TRAUMA_TRAIT)
RegisterSignals(my_thing, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED), PROC_REF(clear_trait))
to_chat(owner, span_warning("You feel a need to keep [my_thing] close..."))
addtimer(CALLBACK(src, PROC_REF(relax), my_thing), rand(30 SECONDS, 3 MINUTES), TIMER_DELETE_ME)
/datum/brain_trauma/mild/possessive/proc/relax(obj/item/my_thing)
if(QDELETED(my_thing))
return
if(HAS_TRAIT_FROM_ONLY(my_thing, TRAIT_NODROP, TRAUMA_TRAIT)) // in case something else adds nodrop, somehow?
to_chat(owner, span_notice("You feel more comfortable letting go of [my_thing]."))
clear_trait(my_thing)
/datum/brain_trauma/mild/possessive/proc/clear_trait(obj/item/my_thing, ...)
SIGNAL_HANDLER
REMOVE_TRAIT(my_thing, TRAIT_NODROP, TRAUMA_TRAIT)
UnregisterSignal(my_thing, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_MOVED))