Skip to content

Commit

Permalink
refactor: Moves stuns and weakens etc. to status effects (#3135)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rerik007 authored Jul 15, 2023
1 parent 610da1d commit 54bfe32
Show file tree
Hide file tree
Showing 371 changed files with 2,926 additions and 2,816 deletions.
2 changes: 1 addition & 1 deletion code/LINDA/LINDA_turf_tile.dm
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@
// Feature disabled until issue with effect stacking will be resolved
// if (iscarbon(src) && pressure_difference > 50)
// var/mob/living/carbon/carbon = src
// carbon.AdjustWeakened(3)
// carbon.AdjustWeakened(6 SECONDS)
step(src, direction)
last_high_pressure_movement_air_cycle = SSair.times_fired

Expand Down
9 changes: 6 additions & 3 deletions code/__DEFINES/combat.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@
#define DROWSY "drowsy"
#define JITTER "jitter"

/// Jitter decays at a rate of 3 per life cycle, 15 if resting.
#define SECONDS_TO_JITTER SECONDS_TO_LIFE_CYCLES*3

//I hate adding defines like this but I'd much rather deal with bitflags than lists and string searches
#define BRUTELOSS 1
#define FIRELOSS 2
Expand Down Expand Up @@ -127,3 +124,9 @@

#define EMP_HEAVY 1
#define EMP_LIGHT 2

/*
* converts life cycle values into deciseconds. try and avoid usage of this.
* this is needed as many functions for stun durations used to output cycles as values, but we now track stun times in deciseconds.
*/
#define STATUS_EFFECT_CONSTANT * 20
20 changes: 11 additions & 9 deletions code/__DEFINES/dcs/signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -384,18 +384,20 @@
#define COMSIG_LIVING_DEATH "living_death"

//ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS!

///from base of mob/living/Stun() (amount, update, ignore)
// none of these are called as of right now, as there is nothing listening for them.
///from base of mob/living/Stun() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_STUN "living_stun"
///from base of mob/living/Knockdown() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown"
///from base of mob/living/Paralyze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_PARALYZE "living_paralyze"
///from base of mob/living/Immobilize() (amount, update, ignore)
///from base of mob/living/Stun() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_WEAKEN "living_weaken"
///from base of mob/living/Knockdown() (amount, ignore_canstun)
///#define COMSIG_LIVING_STATUS_KNOCKDOWN "living_knockdown" // one day
///from base of mob/living/Paralyse() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_PARALYSE "living_paralyse"
///from base of mob/living/Immobilize() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_IMMOBILIZE "living_immobilize"
///from base of mob/living/Unconscious() (amount, update, ignore)
///from base of mob/living/Unconscious() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_UNCONSCIOUS "living_unconscious"
///from base of mob/living/Sleeping() (amount, update, ignore)
///from base of mob/living/Sleeping() (amount, ignore_canstun)
#define COMSIG_LIVING_STATUS_SLEEP "living_sleeping"
#define COMPONENT_NO_STUN (1<<0) //For all of them
///from base of /mob/living/can_track(): (mob/user)
Expand Down
11 changes: 4 additions & 7 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@
#define ALIEN_SELECT_AFK_BUFFER 1 // How many minutes that a person can be AFK before not being allowed to be an alien.
#define SHOES_SLOWDOWN 0 // How much shoes slow you down by default. Negative values speed you up

#define DISGUST_LEVEL_MAXEDOUT 150
#define DISGUST_LEVEL_DISGUSTED 75
#define DISGUST_LEVEL_VERYGROSS 50
#define DISGUST_LEVEL_GROSS 25
#define DISGUST_LEVEL_MAXEDOUT 150 STATUS_EFFECT_CONSTANT
#define DISGUST_LEVEL_DISGUSTED 75 STATUS_EFFECT_CONSTANT
#define DISGUST_LEVEL_VERYGROSS 50 STATUS_EFFECT_CONSTANT
#define DISGUST_LEVEL_GROSS 25 STATUS_EFFECT_CONSTANT

//Mob attribute defaults.
#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles.
Expand Down Expand Up @@ -179,12 +179,9 @@

#define STATUS_UPDATE_HEALTH 1
#define STATUS_UPDATE_STAT 2
#define STATUS_UPDATE_CANMOVE 4
#define STATUS_UPDATE_STAMINA 8
#define STATUS_UPDATE_BLIND 16
#define STATUS_UPDATE_BLURRY 32
#define STATUS_UPDATE_NEARSIGHTED 64
#define STATUS_UPDATE_DRUGGY 128

#define STATUS_UPDATE_NONE 0
#define STATUS_UPDATE_ALL (~0)
Expand Down
34 changes: 28 additions & 6 deletions code/__DEFINES/status_effects.dm
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,8 @@
// DEBUFFS //
/////////////

//#define STATUS_EFFECT_STUN /datum/status_effect/incapacitating/stun //the affected is stunned

//#define STATUS_EFFECT_KNOCKDOWN /datum/status_effect/incapacitating/knockdown //the affected is knocked down

//#define STATUS_EFFECT_UNCONSCIOUS /datum/status_effect/incapacitating/unconscious //the affected is unconscious

//#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep

//#define STATUS_EFFECT_BELLIGERENT /datum/status_effect/belligerent //forces the affected to walk, doing damage if they try to run

//#define STATUS_EFFECT_GEISTRACKER /datum/status_effect/geis_tracker //if you're using geis, this tracks that and keeps you from using scripture
Expand Down Expand Up @@ -87,6 +81,34 @@
/// If a moth is in a cocoon
#define STATUS_EFFECT_COCOONED /datum/status_effect/cocooned

//human status effects
// incapacitating
#define STATUS_EFFECT_STUN /datum/status_effect/incapacitating/stun
#define STATUS_EFFECT_WEAKENED /datum/status_effect/incapacitating/weakened
#define STATUS_EFFECT_IMMOBILIZED /datum/status_effect/incapacitating/immobilized
#define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping
#define STATUS_EFFECT_SLOWED /datum/status_effect/incapacitating/slowed
#define STATUS_EFFECT_PARALYZED /datum/status_effect/incapacitating/paralyzed

// transient
#define STATUS_EFFECT_CONFUSION /datum/status_effect/transient/confusion
#define STATUS_EFFECT_DIZZINESS /datum/status_effect/transient/dizziness
#define STATUS_EFFECT_DROWSINESS /datum/status_effect/transient/drowsiness
#define STATUS_EFFECT_DRUNKENNESS /datum/status_effect/transient/drunkenness
#define STATUS_EFFECT_SILENCED /datum/status_effect/transient/silence
#define STATUS_EFFECT_JITTER /datum/status_effect/transient/jittery
#define STATUS_EFFECT_CULT_SLUR /datum/status_effect/transient/cult_slurring
#define STATUS_EFFECT_CLOCK_CULT_SLUR /datum/status_effect/transient/clock_cult_slurring
#define STATUS_EFFECT_STAMMER /datum/status_effect/transient/stammering
#define STATUS_EFFECT_SLURRING /datum/status_effect/transient/slurring
#define STATUS_EFFECT_LOSE_BREATH /datum/status_effect/transient/lose_breath
#define STATUS_EFFECT_HALLUCINATION /datum/status_effect/transient/hallucination
#define STATUS_EFFECT_BLURRY_EYES /datum/status_effect/transient/eye_blurry
#define STATUS_EFFECT_BLINDED /datum/status_effect/transient/blindness
#define STATUS_EFFECT_DRUGGED /datum/status_effect/transient/drugged
#define STATUS_EFFECT_DISGUST /datum/status_effect/transient/disgust
#define STATUS_EFFECT_DEAF /datum/status_effect/transient/deaf

/////////////
// NEUTRAL //
/////////////
Expand Down
4 changes: 2 additions & 2 deletions code/__HELPERS/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,8 @@
// By default, checks for weakness and stunned get added to the extra_checks list.
// Setting `use_default_checks` to FALSE means that you don't want the do_after to check for these statuses, or that you will be supplying your own checks.
if(use_default_checks)
extra_checks += CALLBACK(user, TYPE_PROC_REF(/mob, IsWeakened))
extra_checks += CALLBACK(user, TYPE_PROC_REF(/mob, IsStunned))
extra_checks += CALLBACK(user, TYPE_PROC_REF(/mob/living, IsWeakened))
extra_checks += CALLBACK(user, TYPE_PROC_REF(/mob/living, IsStunned))
if(istype(holding, /obj/item/gripper/))
var/obj/item/gripper/gripper = holding
if(!(gripper.isEmpty()))
Expand Down
4 changes: 4 additions & 0 deletions code/__HELPERS/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@
} while (0)
#define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE)
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE)
#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE)

/*
Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits.
Expand All @@ -70,6 +71,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_BLOODCRAWL "bloodcrawl"
#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat"
#define TRAIT_JESTER "jester"
#define TRAIT_MUTE "mute"
#define TRAIT_DEAF "deaf"
#define TRAIT_ELITE_CHALLENGER "elite_challenger"

//item traits
Expand All @@ -87,6 +90,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define CULT_TRAIT "cult"
#define CLOCK_TRAIT "clockwork cult"
#define INNATE_TRAIT "innate"
#define EAR_DAMAGE "ear_damage"

// unique trait sources
#define CULT_EYES "cult_eyes"
Expand Down
4 changes: 3 additions & 1 deletion code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"BLOODCRAWL" = TRAIT_BLOODCRAWL,
"BLOODCRAWL_EAT" = TRAIT_BLOODCRAWL_EAT,
"JESTER" = TRAIT_JESTER,
"TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER
"TRAIT_ELITE_CHALLENGER" = TRAIT_ELITE_CHALLENGER,
"TRAIT_MUTE" = TRAIT_MUTE,
"TRAIT_DEAF" = TRAIT_DEAF
),
/obj/item = list(
"TRAIT_CMAGGED" = TRAIT_CMAGGED
Expand Down
2 changes: 1 addition & 1 deletion code/_onclick/click_override.dm
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
var/mob/living/L = target_atom
if(user.a_intent == INTENT_DISARM)
add_attack_logs(user, L, "shocked and weakened with power gloves")
L.Weaken(3)
L.Weaken(6 SECONDS)
else
add_attack_logs(user, L, "electrocuted with[P.unlimited_power ? " unlimited" : null] power gloves [!P.unlimited_power ? "dealing [C.powernet?.get_electrocute_damage()] damage." : "dealing 1000 damage!!"]")
if(P.unlimited_power)
Expand Down
2 changes: 1 addition & 1 deletion code/_onclick/cyborg.dm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

if(is_ventcrawling(src)) // To stop drones interacting with anything while ventcrawling
return
if(stat == DEAD)
if(stat == DEAD || lockcharge || IsWeakened() || IsStunned() || IsParalyzed() || low_power_mode)
return

var/list/modifiers = params2list(params)
Expand Down
6 changes: 4 additions & 2 deletions code/datums/action.dm
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,10 @@
if(owner.restrained())
return FALSE
if(check_flags & AB_CHECK_STUNNED)
if(owner.stunned || owner.IsWeakened())
return FALSE
if(isliving(owner))
var/mob/living/L = owner
if(L.IsStunned() || L.IsWeakened())
return FALSE
if(check_flags & AB_CHECK_LYING)
if(owner.lying)
return FALSE
Expand Down
2 changes: 1 addition & 1 deletion code/datums/components/caltrop.dm
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,4 @@
H.visible_message("<span class='danger'>[H] slides on [A]!</span>", "<span class='userdanger'>You slide on [A]!</span>")

cooldown = world.time
H.Weaken(3)
H.Weaken(6 SECONDS)
7 changes: 2 additions & 5 deletions code/datums/components/slippery.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
/datum/component/slippery
/// Text that gets displayed in the slip proc, i.e. "user slips on [description]"
var/description
/// The amount of stun to apply after slip.
var/stun
/// The amount of weaken to apply after slip.
var/weaken
/// The chance that walking over the parent will slip you.
Expand All @@ -27,12 +25,11 @@
/// The verb that players will see when someone slips on the parent. In the form of "You [slip_verb]ped on".
var/slip_verb

/datum/component/slippery/Initialize(_description, _stun = 0, _weaken = 0, _slip_chance = 100, _slip_tiles = 0, _walking_is_safe = TRUE, _slip_always = FALSE, _gravi_ignore = FALSE, _slip_verb = "slip")
/datum/component/slippery/Initialize(_description, _weaken = 0, _slip_chance = 100, _slip_tiles = 0, _walking_is_safe = TRUE, _slip_always = FALSE, _gravi_ignore = FALSE, _slip_verb = "slip")
if(!isatom(parent))
return COMPONENT_INCOMPATIBLE

description = _description
stun = max(0, _stun)
weaken = max(0, _weaken)
slip_chance = max(0, _slip_chance)
slip_tiles = max(0, _slip_tiles)
Expand All @@ -54,6 +51,6 @@
Additionally calls the parent's `after_slip()` proc on the `victim`.
*/
/datum/component/slippery/proc/Slip(datum/source, mob/living/carbon/human/victim)
if(istype(victim) && !victim.flying && prob(slip_chance) && victim.slip(description, stun, weaken, slip_tiles, walking_is_safe, slip_always, gravi_ignore, slip_verb))
if(istype(victim) && !victim.flying && prob(slip_chance) && victim.slip(description, weaken, slip_tiles, walking_is_safe, slip_always, gravi_ignore, slip_verb))
var/atom/movable/owner = parent
owner.after_slip(victim)
14 changes: 7 additions & 7 deletions code/datums/components/spooky.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
var/mob/living/carbon/human/U = user
if(!istype(U.dna.species, /datum/species/skeleton))
U.adjustStaminaLoss(35) //Extra Damage
U.Jitter(35)
U.stuttering = 20
U.Jitter(70 SECONDS)
U.SetStuttering(40 SECONDS)
if(U.getStaminaLoss() > 95)
to_chat(U, "<font color='red' size='4'><b>Your ears weren't meant for this spectral sound.</b></font>")
spectral_change(U)
Expand All @@ -20,20 +20,20 @@
var/mob/living/carbon/human/H = C
if(istype(H.dna.species, /datum/species/skeleton))
return //undeads are unaffected by the spook-pocalypse.
C.Jitter(35)
C.stuttering = 20
C.Jitter(70 SECONDS)
C.SetStuttering(40 SECONDS)
if(!istype(H.dna.species, /datum/species/diona) && !istype(H.dna.species, /datum/species/machine) && !istype(H.dna.species, /datum/species/slime) && !istype(H.dna.species, /datum/species/golem) && !istype(H.dna.species, /datum/species/plasmaman))
C.adjustStaminaLoss(25) //boneless humanoids don't lose the will to live
to_chat(C, "<font color='red' size='4'><B>DOOT</B></font>")
spectral_change(H)

else //the sound will spook monkeys.
C.Jitter(15)
C.stuttering = 20
C.Jitter(30 SECONDS)
C.SetStuttering(40 SECONDS)

/datum/component/spooky/proc/spectral_change(mob/living/carbon/human/H, mob/user)
if((H.getStaminaLoss() > 95) && (!istype(H.dna.species, /datum/species/diona) && !istype(H.dna.species, /datum/species/machine) && !istype(H.dna.species, /datum/species/slime) && !istype(H.dna.species, /datum/species/golem) && !istype(H.dna.species, /datum/species/plasmaman) && !istype(H.dna.species, /datum/species/skeleton)))
H.Stun(20)
H.Stun(40 SECONDS)
H.set_species(/datum/species/skeleton)
H.visible_message("<span class='warning'>[H] has given up on life as a mortal.</span>")
var/T = get_turf(H)
Expand Down
2 changes: 1 addition & 1 deletion code/datums/diseases/advance/symptoms/confusion.dm
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ Bonus
to_chat(M, "<span class='warning'>[pick("Your head hurts.", "Your mind blanks for a moment.")]</span>")
else
to_chat(M, "<span class='userdanger'>You can't think straight!</span>")
M.AdjustConfused(8, bound_lower = 0, bound_upper = 100)
M.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)

return
2 changes: 1 addition & 1 deletion code/datums/diseases/advance/symptoms/dizzy.dm
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,5 @@ Bonus
to_chat(M, "<span class='warning'>[pick("You feel dizzy.", "Your head spins.")]</span>")
else
to_chat(M, "<span class='userdanger'>A wave of dizziness washes over you!</span>")
M.Dizzy(5)
M.Dizzy(10 SECONDS)
return
2 changes: 1 addition & 1 deletion code/datums/diseases/advance/symptoms/hallucigen.dm
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ Bonus
to_chat(M, "<span class='warning'><b>[pick("Something is following you.", "You are being watched.", "You hear a whisper in your ear.", "Thumping footsteps slam toward you from nowhere.")]</b></span>")
else
to_chat(M, "<span class='userdanger'>[pick("Oh, your head...", "Your head pounds.", "They're everywhere! Run!", "Something in the shadows...")]</span>")
M.AdjustHallucinate(5)
M.AdjustHallucinate(5 SECONDS)
M.last_hallucinator_log = name

return
6 changes: 3 additions & 3 deletions code/datums/diseases/advance/symptoms/painkiller.dm
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ Bonus
if(prob(SYMPTOM_ACTIVATION_PROB * 5))
switch(A.stage)
if(1)
M.Confused(20)
M.Confused(40 SECONDS)
if(2, 3)
M.Slowed(20)
M.Confused(40)
M.Slowed(40 SECONDS)
M.Confused(80 SECONDS)
to_chat(M, "<span class='danger'>[pick("Something feels very wrong about your body.", "You have hard time controlling own body", "You can't feel your body.")]</span>")
if(4, 5)
if(prob(10))
Expand Down
8 changes: 4 additions & 4 deletions code/datums/diseases/advance/symptoms/sensory.dm
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ Bonus
var/datum/reagents/RD = M.reagents

if(A.stage >= 3)
M.AdjustSlur(-2)
M.AdjustDrunk(-4)
M.AdjustSlur(-4 SECONDS)
M.AdjustDrunk(-8 SECONDS)
M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3, 0, 1)
if(A.stage >= 4)
M.AdjustDrowsy(-2)
M.AdjustDrowsy(-4 SECONDS)
if(RD.has_reagent("lsd"))
RD.remove_reagent("lsd", 5)
if(RD.has_reagent("histamine"))
RD.remove_reagent("histamine", 5)
M.AdjustHallucinate(-10)
M.AdjustHallucinate(-10 SECONDS)
if(A.stage >= 5)
RD.check_and_add("mannitol", 10, 10)

Expand Down
8 changes: 5 additions & 3 deletions code/datums/diseases/advance/symptoms/vision.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,16 @@ Bonus
to_chat(M, "<span class='warning'>Your eyes itch.</span>")
if(3, 4)
to_chat(M, "<span class='warning'><b>Your eyes burn!</b></span>")
M.EyeBlurry(20)
M.EyeBlurry(40 SECONDS)
eyes.receive_damage(1)
else
to_chat(M, "<span class='userdanger'>Your eyes burn horrificly!</span>")
M.EyeBlurry(30)
M.EyeBlurry(60 SECONDS)
eyes.receive_damage(5)
if(eyes.damage >= 10)
M.BecomeNearsighted()
if(prob(eyes.damage - 10 + 1))
if(M.BecomeBlind())
if(!(BLINDNESS in M.mutations))
M.mutations |= BLINDNESS
M.update_blind_effects()
to_chat(M, "<span class='userdanger'>You go blind!</span>")
2 changes: 1 addition & 1 deletion code/datums/diseases/advance/symptoms/weakness.dm
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ Bonus
M.adjustStaminaLoss(30)
if(M.getStaminaLoss() > 60 && !M.stat)
M.visible_message("<span class='warning'>[M] faints!</span>", "<span class='userdanger'>You swoon and faint...</span>")
M.AdjustSleeping(5)
M.AdjustSleeping(10 SECONDS)
return
6 changes: 3 additions & 3 deletions code/datums/diseases/anxiety.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@
to_chat(affected_mob, "<span class='notice'>You feel panicky.</span>")
if(prob(2))
to_chat(affected_mob, "<span class='danger'>You're overtaken with panic!</span>")
affected_mob.AdjustConfused(rand(2,3))
affected_mob.AdjustConfused(rand(4 SECONDS, 6 SECONDS))
if(4)
if(prob(10))
to_chat(affected_mob, "<span class='danger'>You feel butterflies in your stomach.</span>")
if(prob(5))
affected_mob.visible_message("<span class='danger'>[affected_mob] stumbles around in a panic.</span>", \
"<span class='userdanger'>You have a panic attack!</span>")
affected_mob.AdjustConfused(rand(6,8))
affected_mob.AdjustJitter(rand(6,8))
affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS))
affected_mob.AdjustJitter(rand(12 SECONDS, 16 SECONDS))
if(prob(2))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up butterflies!</span>", \
"<span class='userdanger'>You cough up butterflies!</span>")
Expand Down
Loading

0 comments on commit 54bfe32

Please sign in to comment.