mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 05:30:05 +01:00
## About The Pull Request What it says on the tin. `times_fired` is the most unused parameter in all mob procs. I say most because there were just 2 cases where it was used - handling breathing - handling heartbeat Besides these 2 cases this parameter did nothing in every proc. Removing it does 2 things - Makes those procs more readable as it now has 1 less parameter that was documented poorly and did nothing - Makes those procs slightly faster as we are passing 1 less variable to its parameter call stack It can easily be substituted with `SSmobs.times_fired` which was its original value anyways ## Changelog 🆑 code: removes an unused parameter `times_fired` from mob life procs. Making them function slightly faster /🆑
263 lines
8.0 KiB
Plaintext
263 lines
8.0 KiB
Plaintext
/datum/disease/asthma_attack
|
|
form = "Bronchitis"
|
|
name = "Asthma attack"
|
|
desc = "Subject is undergoing a autoimmune response which threatens to close the esophagus and halt all respiration, leading to death. \
|
|
Minor asthma attacks may disappear on their own, but all are dangerous."
|
|
cure_text = "Albuterol/Surgical intervention"
|
|
cures = list(/datum/reagent/medicine/albuterol)
|
|
agent = "Inflammatory"
|
|
viable_mobtypes = list(/mob/living/carbon/human)
|
|
disease_flags = CURABLE
|
|
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
|
|
spread_text = "Inflammatory"
|
|
visibility_flags = HIDDEN_PANDEMIC
|
|
bypasses_immunity = TRUE
|
|
disease_flags = CURABLE|INCREMENTAL_CURE
|
|
required_organ = ORGAN_SLOT_LUNGS
|
|
infectable_biotypes = MOB_ROBOTIC|MOB_ORGANIC|MOB_MINERAL|MOB_UNDEAD
|
|
|
|
/// The world.time after which we will begin remission.
|
|
var/time_to_start_remission
|
|
|
|
/// The max time, after initial infection, it will take for us to begin remission
|
|
var/max_time_til_remission
|
|
/// The min time, after initial infection, it will take for us to begin remission
|
|
var/min_time_til_remission
|
|
|
|
/// Are we in remission, where we stop progressing and instead slowly degrade in intensity until we remove ourselves?
|
|
var/in_remission = FALSE
|
|
|
|
/// The current progress to stage demotion. Resets to 0 and reduces our stage by 1 when it exceeds [progress_needed_to_demote]. Only increases when in remission.
|
|
var/progress_to_stage_demotion = 0
|
|
/// The amount of demotion progress we receive per second while in remission.
|
|
var/progress_to_demotion_per_second = 1
|
|
/// Once [progress_to_stage_demotion] exceeds or meets this, we reduce our stage.
|
|
var/progress_needed_to_demote = 10
|
|
|
|
/// Do we alert ghosts when we are applied?
|
|
var/alert_ghosts = FALSE
|
|
|
|
/// A assoc list of (severity -> string), where string will be suffixed to our name in (suffix) format.
|
|
var/static/list/severity_to_suffix = list(
|
|
DISEASE_SEVERITY_MEDIUM = "Minor",
|
|
DISEASE_SEVERITY_HARMFUL = "Moderate",
|
|
DISEASE_SEVERITY_DANGEROUS = "Severe",
|
|
DISEASE_SEVERITY_BIOHAZARD = "EXTREME",
|
|
)
|
|
/// A assoc list of (stringified number -> number), where the key is the stage and the number is how much inflammation we will cause the asthmatic per second.
|
|
var/list/stage_to_inflammation_per_second
|
|
|
|
/datum/disease/asthma_attack/New()
|
|
. = ..()
|
|
|
|
suffix_name()
|
|
|
|
time_to_start_remission = world.time + rand(min_time_til_remission, max_time_til_remission)
|
|
|
|
/datum/disease/asthma_attack/try_infect(mob/living/infectee, make_copy)
|
|
if (!get_asthma_quirk())
|
|
return FALSE
|
|
if (HAS_TRAIT(infectee, TRAIT_NOBREATH))
|
|
return FALSE
|
|
|
|
return ..()
|
|
|
|
/// Adds our suffix via [severity_to_suffix] in the format of (suffix) to our name.
|
|
/datum/disease/asthma_attack/proc/suffix_name()
|
|
name += " ([severity_to_suffix[severity]])"
|
|
|
|
/// Returns the asthma quirk of our victim. As we can only be applied to asthmatics, this should never return null.
|
|
/datum/disease/asthma_attack/proc/get_asthma_quirk(mob/living/target = affected_mob)
|
|
RETURN_TYPE(/datum/quirk/item_quirk/asthma)
|
|
|
|
return (locate(/datum/quirk/item_quirk/asthma) in target.quirks)
|
|
|
|
/datum/disease/asthma_attack/stage_act(seconds_per_tick)
|
|
. = ..()
|
|
if (!.)
|
|
return
|
|
|
|
if (HAS_TRAIT(affected_mob, TRAIT_NOBREATH))
|
|
cure()
|
|
return FALSE
|
|
|
|
var/datum/quirk/item_quirk/asthma/asthma_quirk = get_asthma_quirk()
|
|
var/inflammation = stage_to_inflammation_per_second["[stage]"]
|
|
if (inflammation)
|
|
asthma_quirk.adjust_inflammation(inflammation * seconds_per_tick)
|
|
|
|
if (!(world.time >= time_to_start_remission))
|
|
return
|
|
|
|
if (!in_remission)
|
|
in_remission = TRUE
|
|
stage_prob = 0
|
|
name += " (Remission)"
|
|
desc += " <i>The attack has entered remission. It will slowly decrease in intensity before vanishing.</i>"
|
|
progress_to_stage_demotion += (progress_to_demotion_per_second * seconds_per_tick)
|
|
if (progress_to_stage_demotion >= progress_needed_to_demote)
|
|
progress_to_stage_demotion = 0
|
|
update_stage(stage - 1)
|
|
|
|
// TYPES OF ASTHMA ATTACK
|
|
|
|
/datum/disease/asthma_attack/minor
|
|
severity = DISEASE_SEVERITY_MEDIUM
|
|
stage_prob = 4
|
|
|
|
max_time_til_remission = 120 SECONDS
|
|
min_time_til_remission = 80 SECONDS
|
|
max_stages = 3
|
|
|
|
cure_chance = 20
|
|
|
|
stage_to_inflammation_per_second = list(
|
|
"2" = 0.3,
|
|
"3" = 0.6,
|
|
)
|
|
|
|
/datum/disease/asthma_attack/minor/stage_act(seconds_per_tick)
|
|
. = ..()
|
|
if (!.)
|
|
return FALSE
|
|
|
|
if (SPT_PROB(5, seconds_per_tick))
|
|
to_chat(affected_mob, span_warning(pick("Mucous runs down the back of your throat.", "You swallow excess mucus.")))
|
|
|
|
/datum/disease/asthma_attack/moderate
|
|
severity = DISEASE_SEVERITY_HARMFUL
|
|
stage_prob = 5
|
|
|
|
max_time_til_remission = 120 SECONDS
|
|
min_time_til_remission = 80 SECONDS
|
|
max_stages = 4
|
|
|
|
cure_chance = 20
|
|
|
|
stage_to_inflammation_per_second = list(
|
|
"2" = 1,
|
|
"3" = 2,
|
|
"4" = 4,
|
|
)
|
|
|
|
/datum/disease/asthma_attack/moderate/stage_act(seconds_per_tick)
|
|
. = ..()
|
|
if (!.)
|
|
return FALSE
|
|
|
|
if (SPT_PROB(15, seconds_per_tick))
|
|
to_chat(affected_mob, span_warning(pick("Mucous runs down the back of your throat.", "You swallow excess mucus.")))
|
|
|
|
if (stage < 4 || !SPT_PROB(10, seconds_per_tick))
|
|
return
|
|
to_chat(affected_mob, span_warning("You briefly choke on the mucus piling in your throat!"))
|
|
affected_mob.losebreath++
|
|
|
|
|
|
/datum/disease/asthma_attack/severe
|
|
severity = DISEASE_SEVERITY_DANGEROUS
|
|
stage_prob = 6
|
|
|
|
max_time_til_remission = 80 SECONDS
|
|
min_time_til_remission = 60 SECONDS
|
|
max_stages = 5
|
|
|
|
cure_chance = 20
|
|
|
|
stage_to_inflammation_per_second = list(
|
|
"2" = 1,
|
|
"3" = 3,
|
|
"4" = 6,
|
|
"5" = 8,
|
|
)
|
|
|
|
visibility_flags = HIDDEN_SCANNER
|
|
alert_ghosts = TRUE
|
|
|
|
/datum/disease/asthma_attack/severe/stage_act(seconds_per_tick)
|
|
. = ..()
|
|
if (!.)
|
|
return FALSE
|
|
|
|
if (stage > 1)
|
|
visibility_flags &= ~HIDDEN_SCANNER // revealed
|
|
|
|
if (SPT_PROB(15, seconds_per_tick))
|
|
to_chat(affected_mob, span_warning(pick("Mucous runs down the back of your throat.", "You swallow excess mucus.")))
|
|
else if (SPT_PROB(20, seconds_per_tick))
|
|
affected_mob.emote("cough")
|
|
|
|
if (stage < 4 || !SPT_PROB(15, seconds_per_tick))
|
|
return
|
|
to_chat(affected_mob, span_warning("You briefly choke on the mucus piling in your throat!"))
|
|
affected_mob.losebreath++
|
|
|
|
/datum/disease/asthma_attack/critical
|
|
severity = DISEASE_SEVERITY_BIOHAZARD
|
|
stage_prob = 85
|
|
|
|
max_time_til_remission = 60 SECONDS // this kills you extremely quickly, so its fair
|
|
min_time_til_remission = 40 SECONDS
|
|
max_stages = 6
|
|
|
|
cure_chance = 30
|
|
|
|
stage_to_inflammation_per_second = list(
|
|
"1" = 5,
|
|
"2" = 6,
|
|
"3" = 7,
|
|
"4" = 10,
|
|
"5" = 20,
|
|
"6" = 500, // youre fucked frankly
|
|
)
|
|
|
|
/// Have we warned our user of the fact they are at stage 5? If no, and are at or above stage five, we send a warning and set this to true.
|
|
var/warned_user = FALSE
|
|
/// Have we ever reached our max stage? If no, and we are at our max stage, we send a ominous message warning them of their imminent demise.
|
|
var/max_stage_reached = FALSE
|
|
|
|
/datum/disease/asthma_attack/critical/stage_act(seconds_per_tick)
|
|
. = ..()
|
|
if (!.)
|
|
return FALSE
|
|
|
|
if (stage < 5)
|
|
if (SPT_PROB(75, seconds_per_tick))
|
|
to_chat(affected_mob, span_warning(pick("Mucous runs down the back of your throat.", "You swallow excess mucus.")))
|
|
|
|
var/wheeze_chance
|
|
if (!warned_user && stage >= 5)
|
|
to_chat(affected_mob, span_userdanger("You feel like your lungs are filling with fluid! It's getting incredibly hard to breathe!"))
|
|
warned_user = TRUE
|
|
|
|
switch (stage)
|
|
if (1)
|
|
wheeze_chance = 0
|
|
if (2)
|
|
wheeze_chance = 20
|
|
if (3)
|
|
wheeze_chance = 40
|
|
if (4)
|
|
wheeze_chance = 60
|
|
if (5)
|
|
wheeze_chance = 80
|
|
if (!in_remission)
|
|
stage_prob = 10 // slow it down significantly
|
|
if (6)
|
|
if (!max_stage_reached)
|
|
max_stage_reached = TRUE
|
|
to_chat(affected_mob, span_userdanger("You feel your windpipe squeeze shut!"))
|
|
wheeze_chance = 0
|
|
if (SPT_PROB(10, seconds_per_tick))
|
|
affected_mob.emote("gag")
|
|
var/datum/quirk/item_quirk/asthma/asthma_quirk = get_asthma_quirk()
|
|
asthma_quirk.adjust_inflammation(INFINITY)
|
|
|
|
if (SPT_PROB(wheeze_chance, seconds_per_tick))
|
|
affected_mob.emote("wheeze")
|
|
|
|
if (stage < 4 || !SPT_PROB(15, seconds_per_tick))
|
|
return
|
|
to_chat(affected_mob, span_warning("You briefly choke on the mucus piling in your throat!"))
|
|
affected_mob.losebreath++
|