mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-18 13:43:27 +00:00
* 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>
327 lines
12 KiB
Plaintext
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))
|