[Ready] Refactors stuns and status effects. (#17579)

* Fixes reviver runtime

* Confusion status effect

* Dizzy status effect

* Drowsiness status effect

* decaying -> transient

* Drunkenness status effect

* why use timer when SSfastprocessing work good

* stuns (mostly)

* weaken and immobalise

* stun/weaken times

* update_flags redundancies.

* Slowed()

* Silence + fixes transient decay

* Jittery

* sleeping

* Paralyze -> weaken

* Cult sluring

* paralyse

* Stammer

* slurring + projectile cleanups

* losebreath

* Hallucination

* forgor this

* eyeblurry

* eye blind

* Druggy

* affected didn't like my spacing

* review pass

* second review pass

* some cleanups

* documentation and signal framework

* confusion fix

* Fixes spec_stun

* rejuv fix

* removes a TODO

* conflicted myself

* fixes

* self review

* review

* removes TODOs

* adminfreeze

* TM fixes

* hallucination fix + others

* tones down alchol and runtime fixes

* confusion overlay suggestion

* more fixes

* runtime fix

* losebreath fix

* clamp => directional bounded sum

* steel review

* oops

Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>

* reduces the dizziness cycle rate

* borg hotfix

* sanctified decursening

Co-authored-by: mochi <1496804+dearmochi@users.noreply.github.com>
Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
This commit is contained in:
Charlie
2022-05-24 16:35:26 +01:00
committed by GitHub
co-authored by SteelSlayer mochi
parent b32fb92770
commit 0f7a8707ef
311 changed files with 2268 additions and 2155 deletions
+6
View File
@@ -142,3 +142,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
+11 -9
View File
@@ -374,18 +374,20 @@
#define COMSIG_LIVING_AHEAL "living_aheal"
//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)
+1 -4
View File
@@ -196,12 +196,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)
@@ -300,4 +297,4 @@
#define FLASH_PROTECTION_WELDER 2
#define MAX_EYE_BLURRY_FILTER_SIZE 2
#define EYE_BLUR_TO_FILTER_SIZE_MULTIPLIER 0.1
#define EYE_BLUR_TO_FILTER_SIZE_MULTIPLIER 0.005
+1 -1
View File
@@ -33,7 +33,7 @@ Ask ninjanomnom if they're around
#define RAD_MOB_KNOCKDOWN 2000 // How much stored radiation to check for stunning
#define RAD_MOB_KNOCKDOWN_PROB 1 // Chance of knockdown per tick when over threshold
#define RAD_MOB_KNOCKDOWN_AMOUNT 3 // Amount of knockdown when it occurs
#define RAD_MOB_KNOCKDOWN_AMOUNT 6 SECONDS // Amount of knockdown when it occurs
#define RAD_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason
#define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have
+25 -6
View File
@@ -46,14 +46,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
@@ -87,6 +81,31 @@
/// 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_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
/////////////
// NEUTRAL //
/////////////
+2 -2
View File
@@ -417,8 +417,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, /mob.proc/IsWeakened)
extra_checks += CALLBACK(user, /mob.proc/IsStunned)
extra_checks += CALLBACK(user, /mob/living.proc/IsWeakened)
extra_checks += CALLBACK(user, /mob/living.proc/IsStunned)
while(world.time < endtime)
sleep(1)
+1 -1
View File
@@ -72,7 +72,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")
if(P.unlimited_power)
+1 -1
View File
@@ -17,7 +17,7 @@
if(is_ventcrawling(src)) // To stop drones interacting with anything while ventcrawling
return
if(stat == DEAD || lockcharge || IsWeakened() || stunned || paralysis || low_power_mode)
if(stat == DEAD || lockcharge || IsWeakened() || IsStunned() || IsParalyzed() || low_power_mode)
return
var/list/modifiers = params2list(params)
+4 -2
View File
@@ -76,8 +76,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
+1 -1
View File
@@ -56,4 +56,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)
+2 -5
View File
@@ -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.
@@ -25,12 +23,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, _slip_verb = "slip")
/datum/component/slippery/Initialize(_description, _weaken = 0, _slip_chance = 100, _slip_tiles = 0, _walking_is_safe = TRUE, _slip_always = 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)
@@ -51,6 +48,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, slip_verb))
if(istype(victim) && !victim.flying && prob(slip_chance) && victim.slip(description, weaken, slip_tiles, walking_is_safe, slip_always, slip_verb))
var/atom/movable/owner = parent
owner.after_slip(victim)
+7 -7
View File
@@ -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)
@@ -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)
+3 -2
View File
@@ -754,8 +754,9 @@
var/haltype = input(usr, "Select the hallucination type:", "Hallucinate") as null|anything in subtypesof(/obj/effect/hallucination)
if(!haltype)
return
C.hallucinate(haltype)
C.Hallucinate(20 SECONDS)
var/datum/status_effect/transient/hallucination/H = C.has_status_effect(STATUS_EFFECT_HALLUCINATION)
H.hallucinate(haltype)
message_admins("[key_name(usr)] has given [key_name(C)] the [haltype] hallucination")
log_admin("[key_name_admin(usr)] has given [key_name_admin(C)] the [haltype] hallucination")
href_list["datumrefresh"] = href_list["hallucinate"]
@@ -35,6 +35,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
@@ -34,5 +34,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
@@ -36,6 +36,6 @@ 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)
return
@@ -31,16 +31,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)
@@ -37,15 +37,15 @@ 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.become_nearsighted(EYE_DAMAGE)
if(prob(eyes.damage - 10 + 1))
if(!M.eye_blind)
if(!M.AmountBlinded())
to_chat(M, "<span class='userdanger'>You go blind!</span>")
eyes.receive_damage(eyes.max_damage)
@@ -40,5 +40,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
+3 -3
View File
@@ -24,15 +24,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>")
+1 -1
View File
@@ -28,7 +28,7 @@
A.update_icon()
if(prob(3))
to_chat(affected_mob, "<span class='warning'>You feel a stabbing pain in your abdomen!</span>")
affected_mob.Stun(rand(2,3))
affected_mob.Stun(rand(4 SECONDS, 6 SECONDS))
affected_mob.adjustToxLoss(1)
if(3)
if(prob(1))
+2 -2
View File
@@ -47,10 +47,10 @@
if(prob(3))
to_chat(affected_mob, "<span class='danger'>You lose consciousness...</span>")
affected_mob.visible_message("<span class='warning'>[affected_mob] suddenly collapses</span>")
affected_mob.Paralyse(rand(5,10))
affected_mob.Paralyse(rand(10 SECONDS, 20 SECONDS))
if(prob(1))
affected_mob.emote("snore")
if(prob(15))
affected_mob.stuttering += 3
affected_mob.AdjustStuttering(6 SECONDS)
return
+9 -9
View File
@@ -74,7 +74,7 @@
affected_mob.emote(pick("faint", "collapse", "groan"))
if(prob(7))
to_chat(affected_mob, "<span class='danger'>You can't breathe!</span>")
affected_mob.AdjustLoseBreath(1)
affected_mob.AdjustLoseBreath(2 SECONDS)
if(prob(5))
var/datum/disease/D = new /datum/disease/critical/heart_failure
affected_mob.ForceContractDisease(D)
@@ -126,10 +126,10 @@
affected_mob.emote(pick("pale", "groan"))
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your heart lurches in your chest!</span>")
affected_mob.AdjustLoseBreath(1)
affected_mob.AdjustLoseBreath(2 SECONDS)
if(prob(3))
to_chat(affected_mob, "<span class='danger'>Your heart stops beating!</span>")
affected_mob.AdjustLoseBreath(3)
affected_mob.AdjustLoseBreath(6 SECONDS)
if(prob(5))
affected_mob.emote(pick("faint", "collapse", "groan"))
if(3)
@@ -183,11 +183,11 @@
if(prob(4))
to_chat(affected_mob, "<span class='warning'>You feel like everything is wrong with your life!</span>")
if(prob(5))
affected_mob.Slowed(rand(4, 16))
affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS))
to_chat(affected_mob, "<span class='warning'>You feel [pick("tired", "exhausted", "sluggish")].</span>")
if(prob(5))
affected_mob.Weaken(6)
affected_mob.Stuttering(10)
affected_mob.Weaken(12 SECONDS)
affected_mob.Stuttering(20 SECONDS)
to_chat(affected_mob, "<span class='warning'>You feel [pick("numb", "confused", "dizzy", "lightheaded")].</span>")
affected_mob.emote("collapse")
if(3)
@@ -195,10 +195,10 @@
var/datum/disease/D = new /datum/disease/critical/shock
affected_mob.ForceContractDisease(D)
if(prob(12))
affected_mob.Weaken(6)
affected_mob.Stuttering(10)
affected_mob.Weaken(12 SECONDS)
affected_mob.Stuttering(20 SECONDS)
to_chat(affected_mob, "<span class='warning'>You feel [pick("numb", "confused", "dizzy", "lightheaded")].</span>")
affected_mob.emote("collapse")
if(prob(12))
to_chat(affected_mob, "<span class='warning'>You feel [pick("tired", "exhausted", "sluggish")].</span>")
affected_mob.Slowed(rand(4, 16))
affected_mob.Slowed(rand(8 SECONDS, 32 SECONDS))
+5 -5
View File
@@ -17,7 +17,7 @@
/datum/disease/food_poisoning/stage_act()
..()
if(affected_mob.sleeping && prob(33))
if(affected_mob.IsSleeping() && prob(33))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
@@ -28,7 +28,7 @@
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel queasy.</span>")
if(2)
if(affected_mob.sleeping && prob(40))
if(affected_mob.IsSleeping() && prob(40))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
@@ -43,7 +43,7 @@
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel nauseous.</span>")
if(3)
if(affected_mob.sleeping && prob(25))
if(affected_mob.IsSleeping() && prob(25))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return
@@ -67,5 +67,5 @@
else
to_chat(affected_mob, "<span class='danger'>Your stomach lurches painfully!</span>")
affected_mob.visible_message("<span class='danger'>[affected_mob] gags and retches!</span>")
affected_mob.Stun(rand(2,4))
affected_mob.Weaken(rand(2,4))
affected_mob.Stun(rand(4 SECONDS, 8 SECONDS))
affected_mob.Weaken(rand(4 SECONDS, 8 SECONDS))
+1 -1
View File
@@ -38,7 +38,7 @@
if(istajaran(affected_mob))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up a hairball!</span>", \
"<span class='userdanger'>You cough up a hairball!</span>")
affected_mob.Stun(5)
affected_mob.Stun(10 SECONDS)
else
affected_mob.visible_message("<span class='danger'>[affected_mob]'s form contorts into something more feline!</span>", \
"<span class='userdanger'>YOU TURN INTO A TAJARAN!</span>")
+6 -15
View File
@@ -22,34 +22,25 @@
if(prob(50))
affected_mob.emote("laugh")
if(prob(50))
affected_mob.Jitter(25)
affected_mob.Jitter(50 SECONDS)
if(2)
if(prob(50))
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.Jitter(250)
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
affected_mob.Weaken(20 SECONDS)
affected_mob.Jitter(500 SECONDS)
if(3)
if(prob(25))
to_chat(affected_mob, "<span class='danger'>You feel like you are about to drop dead!</span>")
to_chat(affected_mob, "<span class='danger'>Your body convulses painfully!</span>")
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
affected_mob.adjustBruteLoss(5)
affected_mob.adjustOxyLoss(5)
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.Jitter(250)
affected_mob.Weaken(20 SECONDS)
affected_mob.Jitter(500 SECONDS)
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
if(4)
if(prob(25))
to_chat(affected_mob, "<span class='danger'>You feel like you are going to die!</span>")
affected_mob.adjustOxyLoss(75)
affected_mob.adjustBruteLoss(75)
affected_mob.drop_l_hand()
affected_mob.drop_r_hand()
affected_mob.Stun(10)
affected_mob.Weaken(10)
affected_mob.Weaken(20 SECONDS)
affected_mob.visible_message("<span class='danger'>[affected_mob] laughs uncontrollably!</span>")
+1 -1
View File
@@ -33,7 +33,7 @@
if(prob(5))
affected_mob.visible_message("<span class='danger'>[affected_mob] howls!</span>", \
"<span class='userdanger'>You howl!</span>")
affected_mob.AdjustConfused(rand(6, 8))
affected_mob.AdjustConfused(rand(12 SECONDS, 16 SECONDS))
if(prob(3) && barklimit <= 10)
var/list/puppytype = list(/mob/living/simple_animal/pet/dog/corgi/puppy, /mob/living/simple_animal/pet/dog/pug, /mob/living/simple_animal/pet/dog/fox)
var/mob/living/puppypicked = pick(puppytype)
+1 -1
View File
@@ -52,7 +52,7 @@
to_chat(affected_mob, "You feel very strange.")
if(prob(4))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head!</span>")
affected_mob.Paralyse(2)
affected_mob.Paralyse(4 SECONDS)
if(prob(4))
to_chat(affected_mob, "<span class='danger'>Your stomach churns.</span>")
if(3)
+3 -3
View File
@@ -112,7 +112,7 @@
if(3)
if(prob(4))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.AdjustConfused(10)
affected_mob.AdjustConfused(20 SECONDS)
if(4)
if(prob(3))
affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."))
@@ -145,7 +145,7 @@
affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
if(prob(4))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Paralyse(2)
affected_mob.Paralyse(4 SECONDS)
if(4)
if(prob(20))
affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."))
@@ -175,7 +175,7 @@
if(3)
if(prob(4))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Paralyse(2)
affected_mob.Paralyse(4 SECONDS)
if(4)
if(prob(20))
affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
+3 -3
View File
@@ -27,7 +27,7 @@
if(4)
if(prob(2))
to_chat(affected_mob, "<span class='userdanger'>You see four of everything</span>")
affected_mob.Dizzy(5)
affected_mob.Dizzy(10 SECONDS)
if(prob(2))
to_chat(affected_mob, "<span class='danger'>You feel a sharp pain from your lower chest!</span>")
affected_mob.adjustOxyLoss(5)
@@ -43,10 +43,10 @@
if(prob(10))
affected_mob.adjustStaminaLoss(100)
affected_mob.visible_message("<span class='warning'>[affected_mob] faints!</span>", "<span class='userdanger'>You surrender yourself and feel at peace...</span>")
affected_mob.AdjustSleeping(5)
affected_mob.AdjustSleeping(10 SECONDS)
if(prob(2))
to_chat(affected_mob, "<span class='userdanger'>You feel your mind relax and your thoughts drift!</span>")
affected_mob.AdjustConfused(8, bound_lower = 0, bound_upper = 100)
affected_mob.AdjustConfused(16 SECONDS, bound_lower = 0, bound_upper = 200 SECONDS)
if(prob(10))
affected_mob.vomit(20)
if(prob(3))
-34
View File
@@ -1,34 +0,0 @@
/datum/disease/vampire
name = "Grave Fever"
max_stages = 3
stage_prob = 5
spread_text = "Non-Contagious"
spread_flags = SPECIAL
cure_text = "Antibiotics"
cures = list("spaceacillin")
agent = "Grave Dust"
cure_chance = 20
viable_mobtypes = list(/mob/living/carbon/human)
severity = DANGEROUS
disease_flags = CURABLE
spread_flags = NON_CONTAGIOUS
/datum/disease/vampire/stage_act()
..()
var/toxdamage = stage * 2
var/stuntime = stage * 2
if(prob(10))
affected_mob.emote(pick("cough","groan", "gasp"))
affected_mob.AdjustLoseBreath(1)
if(prob(15))
if(prob(33))
to_chat(affected_mob, "<span class='danger'>You feel sickly and weak.</span>")
affected_mob.AdjustSlowed(3)
affected_mob.adjustToxLoss(toxdamage)
if(prob(5))
to_chat(affected_mob, "<span class='danger'>Your joints ache horribly!</span>")
affected_mob.Weaken(stuntime)
affected_mob.Stun(stuntime)
+3 -4
View File
@@ -34,10 +34,9 @@
/mob/living/carbon/human/proc/bananatouched()
to_chat(src, "<font color='red' size='6'>HONK</font>")
Weaken(7)
Stun(7)
Stuttering(15)
do_jitter_animation(15)
Weaken(14 SECONDS)
Stuttering(30 SECONDS)
do_jitter_animation(30 SECONDS)
if(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE)) //Wizards get non-cursed clown robes and magical mask.
unEquip(shoes, TRUE)
+1 -1
View File
@@ -20,7 +20,7 @@
setBrainLoss(80, use_brain_mod = FALSE)
set_nutrition(9000)
overeatduration = 9000
Confused(30)
Confused(60 SECONDS)
if(mind)
mind.assigned_role = "Cluwne"
+2 -1
View File
@@ -75,7 +75,8 @@
var/mob/old_body = current_body
var/turf/body_turf = get_turf(old_body)
current_body = lich
lich.Weaken(10 + 10 * resurrections)
var/stun_time = (1 + resurrections) * 20 SECONDS
lich.Weaken(stun_time)
++resurrections
equip_lich(lich)
+4 -5
View File
@@ -42,8 +42,7 @@
if(damaging)
target.electrocute_act(energy, "Lightning Bolt", flags = SHOCK_NOGLOVES)
else
target.AdjustJitter(1000) //High numbers for violent convulsions
target.do_jitter_animation(target.jitteriness)
target.AdjustStuttering(2)
target.Slowed(3)
addtimer(CALLBACK(target, /mob/.proc/AdjustJitter, -1000, 10), 2 SECONDS) //Still jittery, but vastly less
target.AdjustJitter(2000 SECONDS) //High numbers for violent convulsions
target.AdjustStuttering(4 SECONDS)
target.Slowed(6 SECONDS)
addtimer(CALLBACK(target, /mob/living.proc/AdjustJitter, -2000 SECONDS, 10), 2 SECONDS) //Still jittery, but vastly less
+2 -3
View File
@@ -32,8 +32,7 @@
..()
/mob/living/carbon/human/proc/mimetouched()
Weaken(7)
Stun(7)
Weaken(14 SECONDS)
if(iswizard(src) || (mind && mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE)) //Wizards get non-cursed mime outfit. Replace with mime robes if we add those.
unEquip(wear_mask, TRUE)
unEquip(w_uniform, TRUE)
@@ -41,7 +40,7 @@
equip_to_slot_if_possible(new /obj/item/clothing/mask/gas/mime, slot_wear_mask, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/under/mime, slot_w_uniform, TRUE, TRUE)
equip_to_slot_if_possible(new /obj/item/clothing/suit/suspenders, slot_wear_suit, TRUE, TRUE)
Silence(7)
Silence(14 SECONDS)
else
qdel(wear_mask)
qdel(w_uniform)
+3 -3
View File
@@ -11,8 +11,8 @@
selection_deactivated_message = "<span class='notice'>You decide that your current form is good enough.</span>"
cooldown_min = 200 //100 deciseconds reduction per rank
var/list/protected_roles = list("Wizard","Changeling","Cultist") //which roles are immune to the spell
var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell
var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell
var/paralysis_amount_caster = 40 SECONDS //how much the caster is paralysed for after the spell
var/paralysis_amount_victim = 40 SECONDS //how much the victim is paralysed for after the spell
action_icon_state = "mindswap"
/obj/effect/proc_holder/spell/mind_transfer/create_new_targeting()
@@ -47,7 +47,7 @@ Also, you never added distance checking after target is selected. I've went ahea
return
var/mob/living/victim = target//The target of the spell whos body will be transferred to.
var/mob/caster = user//The wizard/whomever doing the body transferring.
var/mob/living/caster = user//The wizard/whomever doing the body transferring.
//MIND TRANSFER BEGIN
if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list.
+2 -2
View File
@@ -26,14 +26,14 @@
A.throw_at(get_edge_target_turf(H, pick(GLOB.alldirs)), rand(1, 10), 5)
H.visible_message("<span class='danger'>[H]'s [A.name] flies out of their body in a magical explosion!</span>",\
"<span class='danger'>Your [A.name] flies out of your body in a magical explosion!</span>")
H.Weaken(2)
H.Weaken(4 SECONDS)
else
var/obj/effect/decal/cleanable/blood/gibs/G = new/obj/effect/decal/cleanable/blood/gibs(get_turf(H))
spawn()
G.throw_at(get_edge_target_turf(H, pick(GLOB.alldirs)), rand(1, 10), 5)
H.apply_damage(10, BRUTE, "chest")
to_chat(H, "<span class='userdanger'>You have no appendix, but something had to give! Holy shit, what was that?</span>")
H.Weaken(3)
H.Weaken(6 SECONDS)
for(var/obj/item/organ/external/E in H.bodyparts)
if(istype(E, /obj/item/organ/external/head))
continue
+2 -2
View File
@@ -403,7 +403,7 @@
T.range = 5
return T
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr, stun_amt = 2)
/obj/effect/proc_holder/spell/aoe_turf/repulse/cast(list/targets, mob/user = usr, stun_amt = 4 SECONDS)
var/list/thrownatoms = list()
var/atom/throwtarget
var/distfromcaster
@@ -422,7 +422,7 @@
if(distfromcaster == 0)
if(isliving(AM))
var/mob/living/M = AM
M.Weaken(5)
M.Weaken(10 SECONDS)
M.adjustBruteLoss(5)
to_chat(M, "<span class='userdanger'>You're slammed into the floor by a mystical force!</span>")
else
+3 -3
View File
@@ -336,7 +336,7 @@
/datum/status_effect/speedlegs/tick()
if(owner.stat || owner.staminaloss >= 90 || owner.mind.changeling.chem_charges <= (stacks + 1) * 3)
to_chat(owner, "<span class='danger'>Our muscles relax without the energy to strengthen them.</span>")
owner.Weaken(3)
owner.Weaken(6 SECONDS)
owner.remove_status_effect(STATUS_EFFECT_SPEEDLEGS)
else
stacks++
@@ -352,10 +352,10 @@
/datum/status_effect/speedlegs/on_remove()
REMOVE_TRAIT(owner, TRAIT_GOTTAGOFAST, "changeling")
if(!owner.weakened)
if(!owner.IsWeakened())
to_chat(owner, "<span class='notice'>Our muscles relax.</span>")
if(stacks >= 7)
to_chat(owner, "<span class='danger'>We collapse in exhaustion.</span>")
owner.Weaken(3)
owner.Weaken(6 SECONDS)
owner.emote("gasp")
owner.mind.changeling.geneticdamage += stacks
+455
View File
@@ -148,3 +148,458 @@
/datum/status_effect/pacifism/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, id)
// start of `living` level status procs.
/**
* # Confusion
*
* Prevents moving straight, sometimes changing movement direction at random.
* Decays at a rate of 1 per second.
*/
/datum/status_effect/transient/confusion
id = "confusion"
var/image/overlay
/datum/status_effect/transient/confusion/tick()
. = ..()
if(!.)
return
if(!owner.stat) //add or remove the overlay if they are alive or unconscious/dead
add_overlay()
else if(overlay)
owner.cut_overlay(overlay)
overlay = null
/datum/status_effect/transient/confusion/proc/add_overlay()
if(overlay)
return
var/matrix/M = matrix()
M.Scale(0.6)
overlay = image('icons/effects/effects.dmi', "confusion", pixel_y = 20)
overlay.transform = M
owner.add_overlay(overlay)
/datum/status_effect/transient/confusion/on_remove()
owner.cut_overlay(overlay)
overlay = null
return ..()
/**
* # Dizziness
*
* Slightly offsets the client's screen randomly every tick.
* Decays at a rate of 1 per second, or 5 when resting.
*/
/datum/status_effect/transient/dizziness
id = "dizziness"
var/px_diff = 0
var/py_diff = 0
/datum/status_effect/transient/dizziness/on_remove()
if(owner.client)
// smoothly back to normal
animate(owner.client, 0.2 SECONDS, pixel_x = -px_diff, pixel_y = -py_diff, flags = ANIMATION_PARALLEL)
return ..()
/datum/status_effect/transient/dizziness/tick()
. = ..()
if(!.)
return
var/dir = sin(world.time)
px_diff = cos(world.time * 3) * min(strength * 0.2, 32) * dir
py_diff = sin(world.time * 3) * min(strength * 0.2, 32) * dir
owner.client?.pixel_x = px_diff
owner.client?.pixel_y = py_diff
/datum/status_effect/transient/dizziness/calc_decay()
return (-0.2 + (owner.resting ? -0.8 : 0)) SECONDS
/**
* # Drowsiness
*
* Slows down and causes eye blur, with a 5% chance of falling asleep for a short time.
* Decays at a rate of 1 per second, or 5 when resting.
*/
/datum/status_effect/transient/drowsiness
id = "drowsiness"
/datum/status_effect/transient/drowsiness/tick()
. = ..()
if(!.)
return
owner.EyeBlurry(4 SECONDS)
if(prob(5))
owner.AdjustSleeping(2 SECONDS)
owner.Paralyse(10 SECONDS)
/datum/status_effect/transient/drowsiness/calc_decay()
return (-0.2 + (owner.resting ? -0.8 : 0)) SECONDS
/**
* # Drukenness
*
* Causes a myriad of status effects and other afflictions the stronger it is.
* Decays at a rate of 1 per second if no alcohol remains inside.
*/
/datum/status_effect/transient/drunkenness
id = "drunkenness"
var/alert_thrown = FALSE
// the number of seconds of the status effect required for each effect to kick in.
#define THRESHOLD_SLUR 60 SECONDS
#define THRESHOLD_BRAWLING 60 SECONDS
#define THRESHOLD_CONFUSION 80 SECONDS
#define THRESHOLD_SPARK 100 SECONDS
#define THRESHOLD_VOMIT 120 SECONDS
#define THRESHOLD_BLUR 150 SECONDS
#define THRESHOLD_COLLAPSE 150 SECONDS
#define THRESHOLD_FAINT 180 SECONDS
#define THRESHOLD_BRAIN_DAMAGE 240 SECONDS
#define DRUNK_BRAWLING /datum/martial_art/drunk_brawling
/datum/status_effect/transient/drunkenness/on_remove()
if(alert_thrown)
alert_thrown = FALSE
owner.clear_alert("drunk")
owner.sound_environment_override = SOUND_ENVIRONMENT_NONE
return ..()
/datum/status_effect/transient/drunkenness/tick()
. = ..()
if(!.)
return
// Adjust actual drunkenness based on trait and organ presence
var/alcohol_resistance = 1
var/actual_strength = strength
var/datum/mind/M = owner.mind
var/is_ipc = ismachineperson(owner)
if(HAS_TRAIT(owner, TRAIT_ALCOHOL_TOLERANCE))
alcohol_resistance = 2
actual_strength /= alcohol_resistance
var/obj/item/organ/internal/liver/L
if(!is_ipc)
L = owner.get_int_organ(/obj/item/organ/internal/liver)
var/liver_multiplier = 5 // no liver? get shitfaced
if(L)
liver_multiplier = L.alcohol_intensity
actual_strength *= liver_multiplier
// THRESHOLD_SLUR (60 SECONDS)
if(actual_strength >= THRESHOLD_SLUR)
owner.Slur(actual_strength)
if(!alert_thrown)
alert_thrown = TRUE
owner.throw_alert("drunk", /obj/screen/alert/drunk)
owner.sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
// THRESHOLD_BRAWLING (60 SECONDS)
if(M)
if(actual_strength >= THRESHOLD_BRAWLING)
if(!istype(M.martial_art, DRUNK_BRAWLING))
var/datum/martial_art/MA = new
MA.teach(owner, TRUE)
else if(istype(M.martial_art, DRUNK_BRAWLING))
M.martial_art.remove(src)
// THRESHOLD_CONFUSION (80 SECONDS)
if(actual_strength >= THRESHOLD_CONFUSION && prob(3.3))
owner.AdjustConfused(6 SECONDS / alcohol_resistance, bound_lower = 2 SECONDS, bound_upper = 1 MINUTES)
owner.AdjustDizzy(6 SECONDS / alcohol_resistance, bound_lower = 2 SECONDS, bound_upper = 2 MINUTES)
// THRESHOLD_SPARK (100 SECONDS)
if(is_ipc && actual_strength >= THRESHOLD_SPARK && prob(2.5))
do_sparks(3, 1, owner)
// THRESHOLD_VOMIT (120 SECONDS)
if(!is_ipc && actual_strength >= THRESHOLD_VOMIT && prob(0.8))
owner.fakevomit()
// THRESHOLD_BLUR (150 SECONDS)
if(actual_strength >= THRESHOLD_BLUR)
owner.EyeBlurry(20 SECONDS / alcohol_resistance)
// THRESHOLD_COLLAPSE (150 SECONDS)
if(actual_strength >= THRESHOLD_COLLAPSE && prob(1))
owner.emote("collapse")
do_sparks(3, 1, src)
// THRESHOLD_FAINT (180 SECONDS)
if(actual_strength >= THRESHOLD_FAINT && prob(1))
owner.Paralyse(10 SECONDS / alcohol_resistance)
owner.Drowsy(60 SECONDS / alcohol_resistance)
if(L)
L.receive_damage(1, TRUE)
if(!is_ipc)
owner.adjustToxLoss(1)
// THRESHOLD_BRAIN_DAMAGE (240 SECONDS)
if(actual_strength >= THRESHOLD_BRAIN_DAMAGE && prob(1))
owner.adjustBrainLoss(1)
#undef THRESHOLD_SLUR
#undef THRESHOLD_BRAWLING
#undef THRESHOLD_CONFUSION
#undef THRESHOLD_SPARK
#undef THRESHOLD_VOMIT
#undef THRESHOLD_BLUR
#undef THRESHOLD_COLLAPSE
#undef THRESHOLD_FAINT
#undef THRESHOLD_BRAIN_DAMAGE
#undef DRUNK_BRAWLING
/datum/status_effect/transient/drunkenness/calc_decay()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(H.has_booze())
return 0
return -0.2 SECONDS
/datum/status_effect/transient/cult_slurring
id = "cult_slurring"
/datum/status_effect/incapacitating
tick_interval = 0
status_type = STATUS_EFFECT_REPLACE
alert_type = null
var/needs_update_stat = FALSE
/datum/status_effect/incapacitating/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
if(ishuman(new_owner))
var/mob/living/carbon/human/H = new_owner
set_duration = H.dna.species.spec_stun(H, set_duration)
duration = set_duration
if(!duration)
return FALSE
. = ..()
if(. && (needs_update_stat || issilicon(owner)))
owner.update_stat()
owner.update_canmove()
/datum/status_effect/incapacitating/on_remove()
if(needs_update_stat || issilicon(owner)) //silicons need stat updates in addition to normal canmove updates
owner.update_stat()
owner.update_canmove()
return ..()
//STUN - prevents movement and actions, victim stays standing
/datum/status_effect/incapacitating/stun
id = "stun"
//IMMOBILIZED - prevents movement, victim can still stand and act
/datum/status_effect/incapacitating/immobilized
id = "immobilized"
//WEAKENED - prevents movement and action, victim falls over
/datum/status_effect/incapacitating/weakened
id = "weakened"
//PARALYZED - prevents movement and action, victim falls over, victim cannot hear or see.
/datum/status_effect/incapacitating/paralyzed
id = "paralyzed"
needs_update_stat = TRUE
//SLEEPING - victim falls over, cannot act, cannot see or hear, heals under certain conditions.
/datum/status_effect/incapacitating/sleeping
id = "sleeping"
tick_interval = 2 SECONDS
needs_update_stat = TRUE
/datum/status_effect/incapacitating/sleeping/tick()
if(!iscarbon(owner))
return
var/mob/living/carbon/dreamer = owner
if(dreamer.mind?.has_antag_datum(/datum/antagonist/vampire))
if(istype(dreamer.loc, /obj/structure/closet/coffin))
dreamer.adjustBruteLoss(-1, FALSE)
dreamer.adjustFireLoss(-1, FALSE)
dreamer.adjustToxLoss(-1)
dreamer.handle_dreams()
dreamer.adjustStaminaLoss(-10)
var/comfort = 1
if(istype(dreamer.buckled, /obj/structure/bed))
var/obj/structure/bed/bed = dreamer.buckled
comfort += bed.comfort
for(var/obj/item/bedsheet/bedsheet in range(dreamer.loc,0))
if(bedsheet.loc != dreamer.loc) //bedsheets in your backpack/neck don't give you comfort
continue
comfort += bedsheet.comfort
break //Only count the first bedsheet
if(dreamer.get_drunkenness() > 0)
comfort += 1 //Aren't naps SO much better when drunk?
dreamer.AdjustDrunk(-0.4 SECONDS * comfort) //reduce drunkenness while sleeping.
if(comfort > 1 && prob(3))//You don't heal if you're just sleeping on the floor without a blanket.
dreamer.adjustBruteLoss(-1 * comfort, FALSE)
dreamer.adjustFireLoss(-1 * comfort)
if(prob(10) && dreamer.health && dreamer.health_hud_override != HEALTH_HUD_OVERRIDE_CRIT)
dreamer.emote("snore")
//SLOWED - slows down the victim for a duration and a given slowdown value.
/datum/status_effect/incapacitating/slowed
id = "slowed"
var/slowdown_value = 10 // defaults to this value if none is specified
/datum/status_effect/incapacitating/slowed/on_creation(mob/living/new_owner, set_duration, _slowdown_value)
. = ..()
if(isnum(_slowdown_value))
slowdown_value = _slowdown_value
/datum/status_effect/transient/silence
id = "silenced"
/datum/status_effect/transient/silence/on_apply()
. = ..()
ADD_TRAIT(owner, TRAIT_MUTE, id)
/datum/status_effect/transient/silence/on_remove()
. = ..()
REMOVE_TRAIT(owner, TRAIT_MUTE, id)
/datum/status_effect/transient/jittery
id = "jittering"
/datum/status_effect/transient/jittery/on_apply()
. = ..()
owner.do_jitter_animation(strength / 20, 1)
/datum/status_effect/transient/jittery/tick()
. = ..()
if(!.)
return
owner.do_jitter_animation(strength / 20, 1)
/datum/status_effect/transient/jittery/calc_decay()
return (-0.2 + (owner.resting ? -0.8 : 0)) SECONDS
/datum/status_effect/transient/stammering
id = "stammer"
/datum/status_effect/transient/slurring
id = "slurring"
/datum/status_effect/transient/lose_breath
id = "lose_breath"
#define HALLUCINATE_COOLDOWN_MIN 20 SECONDS
#define HALLUCINATE_COOLDOWN_MAX 50 SECONDS
/// This is multiplied with [/mob/var/hallucination] to determine the final cooldown. A higher hallucination value means shorter cooldown.
#define HALLUCINATE_COOLDOWN_FACTOR 0.003
/// Percentage defining the chance at which an hallucination may spawn past the cooldown.
#define HALLUCINATE_CHANCE 8
// Severity weights, should sum up to 100!
#define HALLUCINATE_MINOR_WEIGHT 60
#define HALLUCINATE_MODERATE_WEIGHT 30
#define HALLUCINATE_MAJOR_WEIGHT 10
/datum/status_effect/transient/hallucination
id = "hallucination"
var/next_hallucination = 0
/datum/status_effect/transient/hallucination/tick()
. = ..()
if(!.)
return
if(next_hallucination > world.time)
return
next_hallucination = world.time + rand(HALLUCINATE_COOLDOWN_MIN, HALLUCINATE_COOLDOWN_MAX) / (strength * HALLUCINATE_COOLDOWN_FACTOR)
if(!prob(HALLUCINATE_CHANCE))
return
// Pick a severity
var/severity = HALLUCINATE_MINOR
switch(rand(100))
if(0 to HALLUCINATE_MINOR_WEIGHT)
severity = HALLUCINATE_MINOR
if((HALLUCINATE_MINOR_WEIGHT + 1) to (HALLUCINATE_MINOR_WEIGHT + HALLUCINATE_MODERATE_WEIGHT))
severity = HALLUCINATE_MODERATE
if((HALLUCINATE_MINOR_WEIGHT + HALLUCINATE_MODERATE_WEIGHT + 1) to 100)
severity = HALLUCINATE_MAJOR
hallucinate(pickweight(GLOB.hallucinations[severity]))
/**
* Spawns an hallucination for the mob.
*
* Arguments:
* * H - The type path of the hallucination to spawn.
*/
/datum/status_effect/transient/hallucination/proc/hallucinate(hallucination_type)
ASSERT(ispath(hallucination_type))
if(owner.ckey)
add_attack_logs(null, owner, "Received hallucination [hallucination_type]", ATKLOG_ALL)
return new hallucination_type(get_turf(owner), owner)
#undef HALLUCINATE_COOLDOWN_MIN
#undef HALLUCINATE_COOLDOWN_MAX
#undef HALLUCINATE_COOLDOWN_FACTOR
#undef HALLUCINATE_CHANCE
#undef HALLUCINATE_MINOR_WEIGHT
#undef HALLUCINATE_MODERATE_WEIGHT
#undef HALLUCINATE_MAJOR_WEIGHT
/datum/status_effect/transient/eye_blurry
id = "eye_blurry"
/datum/status_effect/transient/eye_blurry/on_apply()
owner.update_blurry_effects()
. = ..()
/datum/status_effect/transient/eye_blurry/on_remove()
owner.update_blurry_effects()
/datum/status_effect/transient/eye_blurry/calc_decay()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(isnull(H.dna.species.vision_organ)) //species has no eyes
return ..()
var/obj/item/organ/vision = H.get_int_organ(H.dna.species.vision_organ)
if(!vision || vision.is_bruised() || vision.is_broken()) // doesn't decay if you have damaged eyesight.
return 0
if(istype(H.glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) // decays faster if you rest your eyes with a blindfold.
return -1 SECONDS
return ..() //default decay rate
/datum/status_effect/transient/blindness
id = "blindness"
/datum/status_effect/transient/blindness/on_apply()
. = ..()
owner.update_blind_effects()
/datum/status_effect/transient/blindness/on_remove()
owner.update_blind_effects()
/datum/status_effect/transient/blindness/calc_decay()
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(HAS_TRAIT(owner, TRAIT_BLIND))
return 0
if(isnull(H.dna.species.vision_organ)) // species that have no eyes
return ..()
var/obj/item/organ/vision = H.get_int_organ(H.dna.species.vision_organ)
if(!vision || vision.is_broken() || vision.is_bruised()) //got no eyes or broken eyes
return 0
return ..() //default decay rate
/datum/status_effect/transient/drugged
id = "drugged"
/datum/status_effect/transient/drugged/on_apply()
. = ..()
owner.update_druggy_effects()
/datum/status_effect/transient/drugged/on_remove()
owner.update_druggy_effects()
+33 -1
View File
@@ -51,7 +51,7 @@
if(!owner)
qdel(src)
return
if(tick_interval < world.time)
if(tick_interval <= world.time)
tick()
tick_interval = world.time + initial(tick_interval)
if(duration != -1 && duration < world.time)
@@ -272,3 +272,35 @@
/datum/status_effect/grouped/before_remove(source)
sources -= source
return !length(sources)
/**
* # Transient Status Effect (basetype)
*
* A status effect that works off a (possibly decimal) counter before expiring, rather than a specified world.time.
* This allows for a more precise tweaking of status durations at runtime (e.g. paralysis).
*/
/datum/status_effect/transient
tick_interval = 0.2 SECONDS // SSfastprocess interval
alert_type = null
/// How much strength left before expiring? time in deciseconds.
var/strength = 0
/datum/status_effect/transient/on_creation(mob/living/new_owner, set_duration)
if(isnum(set_duration))
strength = set_duration
. = ..()
/datum/status_effect/transient/tick()
if(QDELETED(src) || QDELETED(owner))
return FALSE
. = TRUE
strength += calc_decay()
if(strength <= 0)
qdel(src)
return FALSE
/**
* Returns how much strength should be adjusted per tick.
*/
/datum/status_effect/transient/proc/calc_decay()
return -0.2 SECONDS // 1 per second by default
+2 -4
View File
@@ -522,12 +522,10 @@
return
if((istype(M,/mob/living/carbon/human/)) && (M.m_intent == MOVE_INTENT_RUN))
M.Stun(5)
M.Weaken(5)
M.Weaken(10 SECONDS)
else if(istype(M,/mob/living/carbon/human/))
M.Stun(2)
M.Weaken(2)
M.Weaken(4 SECONDS)
to_chat(M, "Gravity!")
+9 -9
View File
@@ -24,7 +24,7 @@
/datum/mutation/disability/hallucinate/on_life(mob/living/carbon/human/H)
if(prob(1))
H.AdjustHallucinate(45)
H.AdjustHallucinate(45 SECONDS)
/datum/mutation/disability/epilepsy
name = "Epilepsy"
@@ -37,10 +37,10 @@
block = GLOB.epilepsyblock
/datum/mutation/disability/epilepsy/on_life(mob/living/carbon/human/H)
if((prob(1) && H.paralysis < 1))
if((prob(1) && !H.IsParalyzed()))
H.visible_message("<span class='danger'>[H] starts having a seizure!</span>","<span class='alert'>You have a seizure!</span>")
H.Paralyse(10)
H.Jitter(1000)
H.Paralyse(20 SECONDS)
H.Jitter(2000 SECONDS)
/datum/mutation/disability/cough
name = "Coughing"
@@ -53,7 +53,7 @@
block = GLOB.coughblock
/datum/mutation/disability/cough/on_life(mob/living/carbon/human/H)
if((prob(5) && H.paralysis <= 1))
if((prob(5) && H.AmountParalyzed() <= 1))
H.drop_item()
H.emote("cough")
@@ -79,8 +79,8 @@
block = GLOB.twitchblock
/datum/mutation/disability/tourettes/on_life(mob/living/carbon/human/H)
if((prob(10) && H.paralysis <= 1))
H.Stun(10)
if((prob(10) && H.AmountParalyzed() <= 1))
H.Stun(20 SECONDS)
switch(rand(1, 3))
if(1)
H.emote("twitch")
@@ -104,7 +104,7 @@
/datum/mutation/disability/nervousness/on_life(mob/living/carbon/human/H)
if(prob(10))
H.Stuttering(10)
H.Stuttering(20 SECONDS)
/datum/mutation/disability/blindness
name = "Blindness"
@@ -546,7 +546,7 @@
/datum/mutation/disability/dizzy/on_life(mob/living/carbon/human/M)
if(!istype(M))
return
M.Dizzy(300)
M.Dizzy(600 SECONDS)
/datum/mutation/disability/dizzy/deactivate(mob/living/M)
..()
+7 -8
View File
@@ -489,9 +489,9 @@
/obj/effect/proc_holder/spell/leap/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/leap/cast(list/targets, mob/user = usr)
/obj/effect/proc_holder/spell/leap/cast(list/targets, mob/living/user = usr)
var/failure = FALSE
if(istype(user.loc,/mob/) || user.lying || user.stunned || user.buckled || user.stat)
if(istype(user.loc,/mob/) || user.lying || user.IsStunned() || user.buckled || user.stat)
to_chat(user, "<span class='warning'>You can't jump right now!</span>")
return
@@ -507,8 +507,7 @@
user.visible_message("<span class='danger'>[user.name]</b> takes a huge leap!</span>")
playsound(user.loc, 'sound/weapons/thudswoosh.ogg', 50, 1)
if(failure)
user.Weaken(5)
user.Stun(5)
user.Weaken(10 SECONDS)
user.visible_message("<span class='warning'>[user] attempts to leap away but is slammed back down to the ground!</span>",
"<span class='warning'>You attempt to leap away but are suddenly slammed back down to the ground!</span>",
"<span class='notice'>You hear the flexing of powerful muscles and suddenly a crash as a body hits the floor.</span>")
@@ -528,16 +527,16 @@
if(HAS_TRAIT(user, TRAIT_FAT) && prob(66))
user.visible_message("<span class='danger'>[user.name]</b> crashes due to [user.p_their()] heavy weight!</span>")
//playsound(user.loc, 'zhit.wav', 50, 1)
user.AdjustWeakened(10)
user.AdjustStunned(5)
user.AdjustWeakened(20 SECONDS)
user.AdjustStunned(10 SECONDS)
user.layer = prevLayer
if(istype(user.loc,/obj/))
var/obj/container = user.loc
to_chat(user, "<span class='warning'>You leap and slam your head against the inside of [container]! Ouch!</span>")
user.AdjustParalysis(3)
user.AdjustWeakened(5)
user.AdjustParalysis(6 SECONDS)
user.AdjustWeakened(10 SECONDS)
container.visible_message("<span class='danger'>[user.loc]</b> emits a loud thump and rattles a bit.</span>")
playsound(user.loc, 'sound/effects/bang.ogg', 50, 1)
var/wiggle = 6
@@ -60,7 +60,7 @@
for(var/obj/item/grab/G in user.grabbed_by)
var/mob/living/carbon/M = G.assailant
user.visible_message("<span class='warning'>[user] spits acid at [M]'s face and slips out of their grab!</span>")
M.Stun(1) //Drops the grab
M.Stun(2 SECONDS) //Drops the grab
M.apply_damage(5, BURN, "head", M.run_armor_check("head", "melee"))
user.SetStunned(0) //This only triggers if they are grabbed, to have them break out of the grab, without the large stun time. If you use biodegrade as an antistun without being grabbed, it will not work
user.SetWeakened(0)
@@ -22,15 +22,15 @@
explosion(get_turf(user),0,0,2,0,silent=1)
for(var/mob/living/carbon/human/H in range(2,user))
to_chat(H, "<span class='userdanger'>You are blinded by a shower of blood!</span>")
H.Stun(1)
H.EyeBlurry(20)
H.Stun(2 SECONDS)
H.EyeBlurry(40 SECONDS)
var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes)
if(istype(E))
E.receive_damage(5, 1)
H.AdjustConfused(3)
H.AdjustConfused(6 SECONDS)
for(var/mob/living/silicon/S in range(2,user))
to_chat(S, "<span class='userdanger'>Your sensors are disabled by a shower of blood!</span>")
S.Weaken(3)
S.Weaken(6 SECONDS)
var/new_location = user.drop_location()
spawn(5) // So it's not killed in explosion
var/mob/living/simple_animal/hostile/headslug/crab = new(new_location)
@@ -11,7 +11,7 @@
for(var/obj/item/grab/G in user.grabbed_by)
var/mob/living/carbon/M = G.assailant
user.visible_message("<span class='warning'>[user] suddenly hits [M] in the face and slips out of their grab!</span>")
M.Stun(1) //Drops the grab
M.Stun(2 SECONDS) //Drops the grab
M.apply_damage(5, BRUTE, "head", M.run_armor_check("head", "melee"))
playsound(user.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
user.revive()
@@ -17,14 +17,14 @@
continue
if(!M.mind || !M.mind.changeling)
M.AdjustEarDamage(0, 30)
M.AdjustConfused(20)
M.Jitter(50)
M.AdjustConfused(40 SECONDS)
M.Jitter(100 SECONDS)
else
SEND_SOUND(M, sound('sound/effects/screech.ogg'))
if(issilicon(M))
SEND_SOUND(M, sound('sound/weapons/flash.ogg'))
M.Weaken(rand(5,10))
M.Weaken(rand(10 SECONDS, 20 SECONDS))
for(var/obj/machinery/light/L in range(4, user))
L.on = 1
@@ -35,8 +35,8 @@
var/datum/changeling/changeling = user.mind.changeling
to_chat(user, "<span class='notice'>We tighten our grip. We must hold still....</span>")
target.do_jitter_animation(500)
user.do_jitter_animation(500)
target.Jitter(1000 SECONDS)
user.Jitter(1000 SECONDS)
if(!do_mob(user, target, 10 SECONDS))
to_chat(user, "<span class='warning'>The body swap has been interrupted!</span>")
@@ -62,7 +62,7 @@
GLOB.non_respawnable_keys -= ghost.ckey //they have a new body, let them be able to re-enter their corpse if they die
user.key = ghost.key
qdel(ghost)
user.Paralyse(2)
user.Paralyse(4 SECONDS)
target.add_language("Changeling")
user.remove_language("Changeling")
user.regenerate_icons()
@@ -97,7 +97,7 @@
/datum/action/changeling/sting/mute/sting_action(mob/user, mob/living/carbon/target)
add_attack_logs(user, target, "Mute sting (changeling)")
target.AdjustSilence(30)
target.AdjustSilence(60 SECONDS)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))
return 1
@@ -114,8 +114,8 @@
add_attack_logs(user, target, "Blind sting (changeling)")
to_chat(target, "<span class='danger'>Your eyes burn horrifically!</span>")
target.become_nearsighted(EYE_DAMAGE)
target.EyeBlind(20)
target.EyeBlurry(40)
target.EyeBlind(40 SECONDS)
target.EyeBlurry(80 SECONDS)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))
return 1
@@ -132,7 +132,7 @@
add_attack_logs(user, target, "LSD sting (changeling)")
spawn(rand(300,600))
if(target)
target.Hallucinate(400)
target.Hallucinate(400 SECONDS)
SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]"))
return 1
+8 -9
View File
@@ -292,7 +292,7 @@
if(!ishuman(target) || iscultist(target))
return
var/mob/living/carbon/human/H = target
H.hallucination = max(H.hallucination, 120)
H.Hallucinate(120 SECONDS)
attached_action.charges--
attached_action.desc = attached_action.base_desc
attached_action.desc += "<br><b><u>Has [attached_action.charges] use\s remaining</u></b>."
@@ -447,18 +447,17 @@
else
to_chat(user, "<span class='cultitalic'>In a brilliant flash of red, [L] falls to the ground!</span>")
// These are in life cycles, so double the time that's stated.
L.Weaken(5)
L.Stun(5)
L.Weaken(10 SECONDS)
L.flash_eyes(1, TRUE)
if(issilicon(target))
var/mob/living/silicon/S = L
S.emp_act(EMP_HEAVY)
else if(iscarbon(target))
var/mob/living/carbon/C = L
C.Silence(3)
C.Stuttering(8)
C.CultSlur(10)
C.Jitter(8)
C.Silence(6 SECONDS)
C.Stuttering(16 SECONDS)
C.CultSlur(20 SECONDS)
C.Jitter(16 SECONDS)
uses--
..()
@@ -558,7 +557,7 @@
if(!C.handcuffed)
C.handcuffed = new /obj/item/restraints/handcuffs/energy/cult/used(C)
C.update_handcuffed()
C.Silence(6)
C.Silence(12 SECONDS)
to_chat(user, "<span class='notice'>You shackle [C].</span>")
add_attack_logs(user, C, "shackled")
uses--
@@ -796,7 +795,7 @@
if(H.stat == DEAD)
to_chat(user, "<span class='warning'>[H.p_their(TRUE)] blood has stopped flowing, you'll have to find another way to extract it.</span>")
return
if(H.cultslurring)
if(H.AmountCultSlurring())
to_chat(user, "<span class='danger'>[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!</span>")
return
if(H.dna && !(NO_BLOOD in H.dna.species.species_traits) && H.dna.species.exotic_blood == null)
+18 -18
View File
@@ -36,7 +36,7 @@
/obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
if(!iscultist(user))
user.Weaken(5)
user.Weaken(10 SECONDS)
user.unEquip(src, 1)
user.visible_message("<span class='warning'>A powerful force shoves [user] away from [target]!</span>",
"<span class='cultlarge'>\"You shouldn't play with sharp things. You'll poke someone's eye out.\"</span>")
@@ -53,8 +53,8 @@
if(!iscultist(user))
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.Confused(10)
user.Jitter(6)
user.Confused(20 SECONDS)
user.Jitter(12 SECONDS)
if(HAS_TRAIT(user, TRAIT_HULK))
to_chat(user, "<span class='danger'>You can't seem to hold the blade properly!</span>")
@@ -67,7 +67,7 @@
icon_state = "bola_cult"
item_state = "bola_cult"
breakouttime = 45
weaken = 1
weaken = 2 SECONDS
/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
if(iscultist(hit_atom))
@@ -159,8 +159,8 @@
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.unEquip(src, 1)
user.Confused(10)
user.Weaken(5)
user.Confused(20 SECONDS)
user.Weaken(10 SECONDS)
/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(current_charges && !owner.holy_check())
@@ -205,8 +205,8 @@
to_chat(user, "<span class='cultlarge'>\"I wouldn't advise that.\"</span>")
to_chat(user, "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>")
user.unEquip(src, 1)
user.Confused(10)
user.Weaken(5)
user.Confused(20 SECONDS)
user.Weaken(10 SECONDS)
else if(slot == slot_wear_suit)
ADD_TRAIT(user, TRAIT_GOTTAGOFAST, "cultrobes")
@@ -266,14 +266,14 @@
prescription = TRUE
origin_tech = null
/obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/user, slot)
/obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot)
..()
if(!iscultist(user))
to_chat(user, "<span class='cultlarge'>\"You want to be blind, do you?\"</span>")
user.unEquip(src, 1)
user.Confused(30)
user.Weaken(5)
user.EyeBlind(30)
user.Confused(60 SECONDS)
user.Weaken(10 SECONDS)
user.EyeBlind(60 SECONDS)
/obj/item/shuttle_curse
name = "cursed orb"
@@ -282,10 +282,10 @@
icon_state ="shuttlecurse"
var/global/curselimit = 0
/obj/item/shuttle_curse/attack_self(mob/user)
/obj/item/shuttle_curse/attack_self(mob/living/user)
if(!iscultist(user))
user.unEquip(src, 1)
user.Weaken(5)
user.Weaken(10 SECONDS)
to_chat(user, "<span class='warning'>A powerful force shoves you away from [src]!</span>")
return
if(curselimit > 1)
@@ -476,7 +476,7 @@
T.visible_message("<span class='warning'>The sheer force from [P] shatters the mirror shield!</span>")
new /obj/effect/temp_visual/cult/sparks(T)
playsound(T, 'sound/effects/glassbr3.ogg', 100)
owner.Weaken(3)
owner.Weaken(6 SECONDS)
qdel(src)
return FALSE
@@ -576,7 +576,7 @@
L.visible_message("<span class='warning'>[src] bounces off of [L], as if repelled by an unseen force!</span>")
else if(!..())
if(!L.null_rod_check())
L.Weaken(3)
L.Weaken(6 SECONDS)
break_spear(T)
else
..()
@@ -703,9 +703,9 @@
var/mob/living/carbon/M = user
to_chat(M, "<span class='cultlarge'>\"So, you want to explore space?\"</span>")
to_chat(M, "<span class='warning'>Space flashes around you as you are moved somewhere else!</span>")
M.Confused(10)
M.Confused(20 SECONDS)
M.flash_eyes(override_blindness_check = TRUE)
M.EyeBlind(10)
M.EyeBlind(20 SECONDS)
do_teleport(M, get_turf(M), 5, asoundin = 'sound/magic/cult_spell.ogg')
qdel(src)
return
+2 -2
View File
@@ -351,7 +351,7 @@ structure_check() searches for nearby cultist structures required for the invoca
crit.cure()
H.uncuff()
H.Silence(3) //Prevent "HALP MAINT CULT" before you realise you're converted
H.Silence(6 SECONDS) //Prevent "HALP MAINT CULT" before you realise you're converted
var/obj/item/melee/cultblade/dagger/D = new(get_turf(src))
if(H.equip_to_slot_if_possible(D, slot_in_backpack, FALSE, TRUE))
@@ -956,7 +956,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(user.key || QDELETED(src))
user.visible_message("<span class='warning'>[user] slowly relaxes, the glow around [user.p_them()] dimming.</span>",
"<span class='danger'>You are re-united with your physical form. [src] releases its hold over you.</span>")
user.Weaken(3)
user.Weaken(6 SECONDS)
break
if(user.health <= 10)
to_chat(ghost, "<span class='cultitalic'>Your body can no longer sustain the connection!</span>")
@@ -484,9 +484,9 @@ Congratulations! You are now trained for invasive xenobiology research!"}
L.lastattacker = user.real_name
L.lastattackerckey = user.ckey
L.Stun(7)
L.Weaken(7)
L.apply_effect(STUTTER, 7)
L.Stun(14 SECONDS)
L.Weaken(14 SECONDS)
L.Stuttering(14 SECONDS)
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
@@ -499,14 +499,14 @@ Congratulations! You are now trained for invasive xenobiology research!"}
add_attack_logs(user, L, "Stunned with [src]")
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
if(L.stunned || L.sleeping)
if(L.IsStunned() || L.IsSleeping())
L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \
"<span class='userdanger'>You suddenly feel very drowsy!</span>")
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
L.Sleeping(60)
L.Sleeping(120 SECONDS)
add_attack_logs(user, L, "Put to sleep with [src]")
else
L.AdjustDrowsy(1)
L.AdjustDrowsy(2 SECONDS)
to_chat(user, "<span class='warning'>Sleep inducement works fully only on stunned specimens! </span>")
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src]!</span>", \
"<span class='userdanger'>You suddenly feel drowsy!</span>")
@@ -159,13 +159,13 @@
switch(pick(1,3))
if(1)
to_chat(H, "<span class='userdanger'>You hear a loud buzz in your head, silencing your thoughts!</span>")
H.Stun(3)
H.Stun(6 SECONDS)
if(2)
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
H.AdjustConfused(15)
H.AdjustConfused(30 SECONDS)
H.adjustBrainLoss(5, 15)
if(3)
H.hallucination += 60
H.AdjustHallucinate(60 SECONDS)
/obj/item/organ/internal/heart/gland/pop
cooldown_low = 900
@@ -169,7 +169,7 @@
/obj/machinery/abductor/experiment/proc/SendBack(mob/living/carbon/human/H)
H.Sleeping(8)
H.Sleeping(16 SECONDS)
if(console && console.pad && console.pad.teleport_target)
H.forceMove(console.pad.teleport_target)
H.uncuff()
@@ -18,7 +18,7 @@
target.forceMove(teleport_target)
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(target), target.dir)
to_chat(target, "<span class='warning'>The instability of the warp leaves you disoriented!</span>")
target.Stun(3)
target.Stun(6 SECONDS)
/obj/machinery/abductor/pad/proc/Retrieve(mob/living/target)
flick("alien-pad", src)
@@ -528,7 +528,7 @@
to_chat(src, "<span class='warning'>You focus your psychic lance on [M] and freeze [M.p_their()] limbs with a wave of terrible dread.</span>")
to_chat(M, "<span class='warning'>You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.</span>")
M.Weaken(3)
M.Weaken(6 SECONDS)
used_dominate = world.time
attempting_to_dominate = FALSE
@@ -623,7 +623,7 @@
playsound(loc,'sound/effects/snap.ogg',50, 1, -1)
L.electrocute_act(100, src, 1, flags = SHOCK_NOGLOVES | SHOCK_ILLUSION)
if(isrobot(L) || ismachineperson(L))
L.Weaken(5)
L.Weaken(10 SECONDS)
qdel(src)
..()
@@ -158,7 +158,7 @@
/mob/living/simple_animal/hostile/guardian/gib()
if(summoner)
to_chat(summoner, "<span class='danger'>Your [src] was blown up!</span>")
summoner.Weaken(10)// your fermillier has died! ROLL FOR CON LOSS!
summoner.Weaken(20 SECONDS)// your fermillier has died! ROLL FOR CON LOSS!
ghostize()
qdel(src)
@@ -62,7 +62,7 @@
if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK))
blocked = TRUE
if(!blocked)
L.Stun(1)
L.Stun(2 SECONDS)
L.visible_message("<span class='danger'>[src] slams into [L]!</span>", "<span class='userdanger'>[src] slams into you!</span>")
L.apply_damage(20, BRUTE)
playsound(get_turf(L), 'sound/effects/meteorimpact.ogg', 100, 1)
@@ -43,7 +43,7 @@
/// How much damage a successful ambush attack does
var/ambush_damage = 25
/// How much weaken a successful ambush attack applies
var/ambush_weaken = 3
var/ambush_weaken = 6 SECONDS
/// The spell the morph uses to morph
var/obj/effect/proc_holder/spell/mimic/morph/mimic_spell
/// The ambush action used by the morph
@@ -351,7 +351,7 @@
to_chat(src, "<span class='warning'>You suddenly feel [pick("sick and tired", "tired and confused", "nauseated", "dizzy")].</span>")
adjustStaminaLoss(25)
adjustToxLoss(5)
AdjustConfused(20, bound_lower = 0, bound_upper = 30)
AdjustConfused(40 SECONDS, bound_lower = 0, bound_upper = 60 SECONDS)
new /obj/effect/temp_visual/revenant(loc)
/obj/structure/window/defile()
@@ -157,7 +157,7 @@
/obj/effect/proc_holder/spell/sense_victims/cast(list/targets, mob/user)
var/mob/living/victim = targets[1]
to_chat(victim, "<span class='userdanger'>You feel an awful sense of being watched...</span>")
victim.Stun(3) //HUE
victim.Stun(6 SECONDS) //HUE
var/area/A = get_area(victim)
if(!A)
to_chat(user, "<span class='warning'>You could not locate any sapient heretics for the Slaughter.</span>")
+3 -3
View File
@@ -241,9 +241,9 @@
revolutionaries += rev_mind
if(iscarbon(rev_mind.current))
var/mob/living/carbon/carbon_mob = rev_mind.current
carbon_mob.Silence(5)
carbon_mob.Silence(10 SECONDS)
carbon_mob.flash_eyes(1, 1)
rev_mind.current.Stun(5)
rev_mind.current.Stun(10 SECONDS)
to_chat(rev_mind.current, "<span class='danger'><FONT size = 3> You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!</FONT></span>")
rev_mind.current.create_attack_log("<font color='red'>Has been converted to the revolution!</font>")
rev_mind.current.create_log(CONVERSION_LOG, "converted to the revolution")
@@ -271,7 +271,7 @@
message_admins("[key_name_admin(rev_mind.current)] [ADMIN_QUE(rev_mind.current,"?")] ([ADMIN_FLW(rev_mind.current,"FLW")]) has been borged while being a [remove_head ? "leader" : " member"] of the revolution.")
else
rev_mind.current.Paralyse(5)
rev_mind.current.Paralyse(10 SECONDS)
to_chat(rev_mind.current, "<span class='danger'><FONT size = 3>You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you...</FONT></span>")
update_rev_icons_removed(rev_mind)
+2 -2
View File
@@ -814,7 +814,7 @@ GLOBAL_LIST_EMPTY(multiverse)
GiveHint(target)
else if(is_pointed(I))
to_chat(target, "<span class='userdanger'>You feel a stabbing pain in [parse_zone(user.zone_selected)]!</span>")
target.Weaken(2)
target.Weaken(4 SECONDS)
GiveHint(target)
else if(istype(I,/obj/item/bikehorn))
to_chat(target, "<span class='userdanger'>HONK</span>")
@@ -886,7 +886,7 @@ GLOBAL_LIST_EMPTY(multiverse)
GiveHint(target)
if("head")
to_chat(user, "<span class='notice'>You smack the doll's head with your hand.</span>")
target.Dizzy(10)
target.Dizzy(20 SECONDS)
to_chat(target, "<span class='warning'>You suddenly feel as if your head was hit with a hammer!</span>")
GiveHint(target,user)
cooldown = world.time + cooldown_time
+4 -4
View File
@@ -61,14 +61,14 @@
item_state = "fleshtostone"
/obj/item/melee/touch_attack/fleshtostone/afterattack(atom/target, mob/living/carbon/user, proximity)
if(!proximity || target == user || !ismob(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad
if(!proximity || target == user || !isliving(target) || !iscarbon(user) || user.lying || user.handcuffed) //getting hard after touching yourself would also be bad
return
if(user.lying || user.handcuffed)
to_chat(user, "<span class='warning'>You can't reach out!</span>")
return
var/mob/M = target
M.Stun(2)
new /obj/structure/closet/statue(M.loc, M)
var/mob/living/L = target
L.Stun(4 SECONDS)
new /obj/structure/closet/statue(L.loc, L)
..()
/obj/item/melee/touch_attack/fake_disintegrate
+9 -9
View File
@@ -67,12 +67,12 @@
return ..()
//////////////////////////////Capturing////////////////////////////////////////////////////////
/obj/item/soulstone/attack(mob/living/carbon/human/M, mob/user)
/obj/item/soulstone/attack(mob/living/carbon/human/M, mob/living/user)
if(M == user)
return
if(!can_use(user))
user.Weaken(5)
user.Weaken(10 SECONDS)
user.emote("scream")
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
@@ -203,12 +203,12 @@
else
..()
/obj/item/soulstone/attack_self(mob/user)
/obj/item/soulstone/attack_self(mob/living/user)
if(!in_range(src, user))
return
if(!can_use(user))
user.Weaken(5)
user.Weaken(10 SECONDS)
user.emote("scream")
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
@@ -249,12 +249,12 @@
. += "<span class='cultitalic'>A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.</span>"
. += "<span class='cultitalic'>A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.</span>"
/obj/structure/constructshell/attackby(obj/item/I, mob/user, params)
/obj/structure/constructshell/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/soulstone))
var/obj/item/soulstone/SS = I
if(!SS.can_use(user))
to_chat(user, "<span class='danger'>An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell.</span>")
user.Confused(10)
user.Confused(20 SECONDS)
return
SS.transfer_soul("CONSTRUCT", src, user)
SS.was_used()
@@ -263,7 +263,7 @@
////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
// this whole proc is pain
/obj/item/soulstone/proc/transfer_soul(choice, target, mob/user)
/obj/item/soulstone/proc/transfer_soul(choice, target, mob/living/user)
switch(choice)
if("FORCE")
var/mob/living/T = target
@@ -272,7 +272,7 @@
init_shade(T, user)
else // Poll ghosts
to_chat(user, "<span class='userdanger'>Capture failed!</span> The soul has already fled its mortal frame. You attempt to bring it back...")
T.Paralyse(20)
T.Paralyse(40 SECONDS)
if(!get_cult_ghost(T, user, TRUE))
T.dust() //If we can't get a ghost, kill the sacrifice anyway.
@@ -296,7 +296,7 @@
if("SHADE")
var/mob/living/simple_animal/shade/T = target
if(!can_use(user))
user.Weaken(5)
user.Weaken(10 SECONDS)
to_chat(user, "<span class='userdanger'>Your body is wracked with debilitating pain!</span>")
return
if(T.stat == DEAD)
+7 -5
View File
@@ -971,10 +971,12 @@
icon_state = "bookblind"
desc = "This book looks blurry, no matter how you look at it."
/obj/item/spellbook/oneuse/blind/recoil(mob/user as mob)
/obj/item/spellbook/oneuse/blind/recoil(mob/user)
..()
to_chat(user, "<span class='warning'>You go blind!</span>")
user.EyeBlind(10)
if(isliving(user))
var/mob/living/L = user
to_chat(user, "<span class='warning'>You go blind!</span>")
L.EyeBlind(20 SECONDS)
/obj/item/spellbook/oneuse/mindswap
spell = /obj/effect/proc_holder/spell/mind_transfer
@@ -1027,10 +1029,10 @@
icon_state = "bookknock"
desc = "This book is hard to hold closed properly."
/obj/item/spellbook/oneuse/knock/recoil(mob/user as mob)
/obj/item/spellbook/oneuse/knock/recoil(mob/living/user)
..()
to_chat(user, "<span class='warning'>You're knocked down!</span>")
user.Weaken(20)
user.Weaken(40 SECONDS)
/obj/item/spellbook/oneuse/horsemask
spell = /obj/effect/proc_holder/spell/horsemask
+1 -1
View File
@@ -175,7 +175,7 @@
occupantData["oxyLoss"] = occupant.getOxyLoss()
occupantData["toxLoss"] = occupant.getToxLoss()
occupantData["fireLoss"] = occupant.getFireLoss()
occupantData["paralysis"] = occupant.paralysis
occupantData["paralysis"] = occupant.AmountParalyzed()
occupantData["hasBlood"] = 0
occupantData["bodyTemperature"] = occupant.bodytemperature
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
+3 -3
View File
@@ -241,8 +241,8 @@
occupantData["radLoss"] = occupant.radiation
occupantData["cloneLoss"] = occupant.getCloneLoss()
occupantData["brainLoss"] = occupant.getBrainLoss()
occupantData["paralysis"] = occupant.paralysis
occupantData["paralysisSeconds"] = round(occupant.paralysis * 0.25)
occupantData["paralysis"] = occupant.AmountParalyzed()
occupantData["paralysisSeconds"] = round(occupant.AmountParalyzed() * 0.25)
occupantData["bodyTempC"] = occupant.bodytemperature-T0C
occupantData["bodyTempF"] = (((occupant.bodytemperature-T0C) * 1.8) + 32)
@@ -407,7 +407,7 @@
extra_font = (occupant.getBrainLoss() < 1 ?"<font color='blue'>" : "<font color='red'>")
dat += "[extra_font]\tApprox. Brain Damage %: [occupant.getBrainLoss()]<br>"
dat += "Paralysis Summary %: [occupant.paralysis] ([round(occupant.paralysis / 4)] seconds left!)<br>"
dat += "Paralysis Summary %: [occupant.IsParalyzed()] ([round(occupant.AmountParalyzed() / 10)] seconds left!)<br>"
dat += "Body Temperature: [occupant.bodytemperature-T0C]&deg;C ([occupant.bodytemperature*1.8-459.67]&deg;F)<br>"
dat += "<hr>"
+2 -2
View File
@@ -282,7 +282,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
check_brine()
//Get the clone body ready
maim_clone(H)
H.Paralyse(4)
H.Paralyse(8 SECONDS)
if(grab_ghost_when == CLONER_FRESH_CLONE)
clonemind.transfer_to(H)
@@ -327,7 +327,7 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\
connected_message("Clone Rejected: Deceased.")
else if(occupant.cloneloss > (100 - heal_level))
occupant.Paralyse(4)
occupant.Paralyse(8 SECONDS)
//Slowly get that clone healed and finished.
occupant.adjustCloneLoss(-((speed_coeff/2)))
@@ -530,7 +530,7 @@
to_chat(user, "<span class='warning'>You need a better grip to do that!</span>")
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
G.affecting.Weaken(10 SECONDS)
visible_message("<span class='warning'>[G.assailant] dunks [G.affecting] into [src]!</span>")
qdel(W)
return
+1 -1
View File
@@ -80,7 +80,7 @@
occupantData["oxyLoss"] = occupant.getOxyLoss()
occupantData["toxLoss"] = occupant.getToxLoss()
occupantData["fireLoss"] = occupant.getFireLoss()
occupantData["paralysis"] = occupant.paralysis
occupantData["paralysis"] = occupant.AmountParalyzed()
occupantData["hasBlood"] = 0
occupantData["bodyTemperature"] = occupant.bodytemperature
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
+7 -5
View File
@@ -449,7 +449,7 @@
if(ORION_TRAIL_RAIDERS)
if(prob(50))
to_chat(usr, "<span class='userdanger'>You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?</span>")
M.AdjustHallucinate(30)
M.AdjustHallucinate(30 SECONDS)
else
to_chat(usr, "<span class='userdanger'>Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there...</span>")
M.take_organ_damage(30)
@@ -461,10 +461,10 @@
if(severity == 2)
to_chat(usr, "<span class='userdanger'>You suddenly feel extremely nauseous and hunch over until it passes.</span>")
M.Stun(3)
M.Stun(6 SECONDS)
if(severity >= 3) //you didn't pray hard enough
to_chat(M, "<span class='warning'>An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit.</span>")
M.Stun(5)
M.Stun(10 SECONDS)
sleep(30)
atom_say("[M] violently throws up!")
playsound(loc, 'sound/effects/splat.ogg', 50, TRUE)
@@ -474,7 +474,7 @@
location.add_vomit_floor(TRUE)
if(ORION_TRAIL_FLUX)
if(prob(75))
M.Weaken(3)
M.Weaken(6 SECONDS)
atom_say("A sudden gust of powerful wind slams [M] into the floor!")
M.take_organ_damage(25)
playsound(loc, 'sound/weapons/genhit.ogg', 100, TRUE)
@@ -557,7 +557,9 @@
if(emagged) //has to be here because otherwise it doesn't work
playsound(loc, 'sound/effects/supermatter.ogg', 100, TRUE)
atom_say("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
usr.Stun(10) //you can't run :^)
if(isliving(usr))
var/mob/living/L = usr
L.Stun(20 SECONDS) //you can't run :^)
var/S = new /obj/singularity/onetile(usr.loc)
emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
sleep(50)
+2 -3
View File
@@ -199,7 +199,7 @@ About the new airlock wires panel:
return
else
return
else if(user.hallucination > 50 && prob(10) && !operating)
else if(user.AmountHallucinate() > 50 SECONDS && prob(10) && !operating)
if(user.electrocute_act(50, src, flags = SHOCK_ILLUSION)) // We'll just go with a flat 50 damage, instead of doing powernet checks
return
..(user)
@@ -693,8 +693,7 @@ About the new airlock wires panel:
if(!istype(H.head, /obj/item/clothing/head/helmet))
visible_message("<span class='warning'>[user] headbutts the airlock.</span>")
var/obj/item/organ/external/affecting = H.get_organ("head")
H.Stun(5)
H.Weaken(5)
H.Weaken(10 SECONDS)
if(affecting.receive_damage(10, 0))
H.UpdateDamageIcon()
else
+1 -1
View File
@@ -537,7 +537,7 @@
var/atom/throwtarget
throwtarget = get_edge_target_turf(src, get_dir(src, get_step_away(L, src)))
SEND_SOUND(L, pick(sound('sound/hallucinations/turn_around1.ogg', 0, 1, 50), sound('sound/hallucinations/turn_around2.ogg', 0, 1, 50)))
L.Weaken(2)
L.Weaken(4 SECONDS)
L.throw_at(throwtarget, 5, 1,src)
return FALSE
+1 -1
View File
@@ -350,7 +350,7 @@
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
if(L.stat == CONSCIOUS)
L.emote("scream")
L.Weaken(5)
L.Weaken(10 SECONDS)
else //for simple_animals & borgs
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
var/turf/location = get_turf(src)
+1 -1
View File
@@ -12,7 +12,7 @@
var/range = 2 //this is roughly the size of brig cell
var/disable = 0
var/last_flash = 0 //Don't want it getting spammed like regular flashes
var/strength = 5 //How weakened targets are when flashed.
var/strength = 10 SECONDS //How weakened targets are when flashed.
var/base_state = "mflash"
anchored = 1
+3 -3
View File
@@ -122,15 +122,15 @@
if(drownee.stat == DEAD) //Dead spacemen don't drown more
return
if(drownee.losebreath > 20) //You've probably got bigger problems than drowning at this point, so we won't add to it until you get that under control.
if(drownee.AmountLoseBreath() > 40 SECONDS) //You've probably got bigger problems than drowning at this point, so we won't add to it until you get that under control.
return
add_attack_logs(src, drownee, "Drowned", isLivingSSD(drownee) ? null : ATKLOG_ALL)
if(drownee.stat) //Mob is in critical.
drownee.AdjustLoseBreath(3, bound_lower = 0, bound_upper = 20)
drownee.AdjustLoseBreath(6 SECONDS, bound_lower = 0, bound_upper = 40 SECONDS)
drownee.visible_message("<span class='danger'>\The [drownee] appears to be drowning!</span>","<span class='userdanger'>You're quickly drowning!</span>") //inform them that they are fucked.
else
drownee.AdjustLoseBreath(2, bound_lower = 0, bound_upper = 20) //For every time you drown, you miss 2 breath attempts. Hope you catch on quick!
drownee.AdjustLoseBreath(4 SECONDS, bound_lower = 0, bound_upper = 40 SECONDS) //For every time you drown, you miss 2 breath attempts. Hope you catch on quick!
if(prob(35)) //35% chance to tell them what is going on. They should probably figure it out before then.
drownee.visible_message("<span class='danger'>\The [drownee] flails, almost like [drownee.p_they()] [drownee.p_are()] drowning!</span>","<span class='userdanger'>You're lacking air!</span>") //*gasp* *gasp* *gasp* *gasp* *gasp*
+1 -1
View File
@@ -183,7 +183,7 @@
eat(I, sound = 0)
// Instantly lie down, also go unconscious from the pain, before you die.
L.Paralyse(5)
L.Paralyse(10 SECONDS)
// For admin fun, var edit emagged to 2.
if(gib || emagged == 2)
+1 -1
View File
@@ -4,7 +4,7 @@
internal_damage_threshold = 50
maint_access = 0
armor = list(melee = 30, bullet = 30, laser = 15, energy = 20, bomb = 20, bio = 0, rad = 0, fire = 100, acid = 100)
destruction_sleep_duration = 2
destruction_sleep_duration = 4 SECONDS
var/am = "d3c2fbcadca903a41161ccc9df9cf948"
/obj/mecha/combat/moved_inside(mob/living/carbon/human/H as mob)
+1 -1
View File
@@ -48,7 +48,7 @@
max_equip = 4
maxsize = 2
starting_voice = /obj/item/mecha_modkit/voice/syndicate
destruction_sleep_duration = 1
destruction_sleep_duration = 2 SECONDS
/obj/mecha/combat/gygax/dark/GrantActions(mob/living/user, human_occupant = 0)
. = ..()
+1 -1
View File
@@ -17,7 +17,7 @@
force = 45
max_equip = 5
starting_voice = /obj/item/mecha_modkit/voice/nanotrasen
destruction_sleep_duration = 1
destruction_sleep_duration = 2 SECONDS
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
. = ..()
@@ -228,9 +228,8 @@
return
if(M.health > 0)
M.adjustOxyLoss(-1)
M.AdjustStunned(-4)
M.AdjustWeakened(-4)
M.AdjustStunned(-4)
M.AdjustStunned(-8 SECONDS)
M.AdjustWeakened(-8 SECONDS)
if(M.reagents.get_reagent_amount("epinephrine") < 5)
M.reagents.add_reagent("epinephrine", 5)
chassis.use_power(energy_drain)
+5 -5
View File
@@ -213,14 +213,14 @@
continue
to_chat(M, "<font color='red' size='7'>HONK</font>")
M.SetSleeping(0)
M.Stuttering(20)
M.Stuttering(40 SECONDS)
M.AdjustEarDamage(0, 30)
M.Weaken(3)
M.Weaken(6 SECONDS)
if(prob(30))
M.Stun(10)
M.Paralyse(4)
M.Stun(20 SECONDS)
M.Paralyse(8 SECONDS)
else
M.Jitter(500)
M.Jitter(1000 SECONDS)
///else the mousetraps are useless
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
+3 -4
View File
@@ -77,7 +77,7 @@
var/activated = FALSE
var/power_warned = FALSE
var/destruction_sleep_duration = 1 //Time that mech pilot is put to sleep for if mech is destroyed
var/destruction_sleep_duration = 2 SECONDS //Time that mech pilot is put to sleep for if mech is destroyed
var/melee_cooldown = 10
var/melee_can_hit = 1
@@ -390,9 +390,8 @@
L.take_overall_damage(5,0)
if(L.buckled)
L.buckled = 0
L.Stun(5)
L.Weaken(5)
L.apply_effect(STUTTER, 5)
L.Weaken(10 SECONDS)
L.apply_effect(STUTTER, 10 SECONDS)
playsound(src, pick(hit_sound), 50, 0, 0)
breakthrough = 1
+1 -1
View File
@@ -26,7 +26,7 @@
return FALSE
if(istype(mech, /obj/mecha/combat/honker) && user)
to_chat(user, "<span class='warning'>You attempt to install [src] into [mech], but you somehow trip before you get it in!</span>")
user.slip("your own foot", 8, 5, 0, 0, 1, "trip")
user.slip("your own foot", 16 SECONDS, 0, 0, 1, "trip")
return FALSE
mech.nominalsound = nominalsound
mech.zoomsound = zoomsound
+1 -1
View File
@@ -129,7 +129,7 @@
/obj/effect/anomaly/grav/proc/gravShock(mob/living/A)
if(boing && isliving(A) && !A.stat)
A.Weaken(2)
A.Weaken(4 SECONDS)
var/atom/target = get_edge_target_turf(A, get_dir(src, get_step_away(A, src)))
A.throw_at(target, 5, 1)
boing = FALSE
@@ -100,7 +100,7 @@
if(iscarbon(AM))
var/mob/living/carbon/M = AM
if(M.slip("foam", 5, 2))
if(M.slip("foam", 10 SECONDS))
if(reagents)
for(var/reagent_id in reagents.reagent_list)
var/amount = M.reagents.get_reagent_amount(reagent_id)
@@ -34,10 +34,10 @@
for(var/mob/M in viewers(5, location))
to_chat(M, "<span class='warning'>The solution violently explodes.</span>")
for(var/mob/M in viewers(1, location))
for(var/mob/living/L in viewers(1, location))
if(prob(50 * amount))
to_chat(M, "<span class='warning'>The explosion knocks you down.</span>")
M.Weaken(rand(1,5))
to_chat(L, "<span class='warning'>The explosion knocks you down.</span>")
L.Weaken(rand(2 SECONDS, 10 SECONDS))
return
else
var/devastation = -1
@@ -202,7 +202,7 @@
/obj/effect/particle_effect/smoke/sleeping/smoke_mob(mob/living/carbon/M)
if(..())
M.drop_item()
M.Sleeping(max(M.sleeping,10))
M.Sleeping(20 SECONDS)
M.emote("cough")
return 1
+1 -1
View File
@@ -47,7 +47,7 @@
/obj/effect/mine/stun
name = "stun mine"
var/stun_time = 8
var/stun_time = 16 SECONDS
/obj/effect/mine/stun/mineEffect(mob/living/victim)
if(isliving(victim))
+4 -4
View File
@@ -601,9 +601,9 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
if(M.stat != DEAD)
to_chat(M, "<span class='danger'>You drop what you're holding and clutch at your eyes!</span>")
M.drop_item()
M.AdjustEyeBlurry(10)
M.Paralyse(1)
M.Weaken(2)
M.AdjustEyeBlurry(20 SECONDS)
M.Paralyse(2 SECONDS)
M.Weaken(4 SECONDS)
if(eyes.damage >= eyes.min_broken_damage)
if(M.stat != 2)
to_chat(M, "<span class='danger'>You go blind!</span>")
@@ -612,7 +612,7 @@ GLOBAL_DATUM_INIT(fire_overlay, /image, image("icon" = 'icons/goonstation/effect
H.UpdateDamageIcon()
else
M.take_organ_damage(7)
M.AdjustEyeBlurry(rand(3,4))
M.AdjustEyeBlurry(rand(6 SECONDS, 8 SECONDS))
return
/obj/item/singularity_pull(S, current_size)
+4 -4
View File
@@ -289,11 +289,11 @@
var/mob/living/carbon/human/C = target
user.visible_message("<span class='danger'> [user] sprays [src] into the face of [target]!</span>")
if(C.client)
C.EyeBlurry(3)
C.EyeBlind(1)
C.EyeBlurry(6 SECONDS)
C.EyeBlind(2 SECONDS)
if(C.check_eye_prot() <= 0) // no eye protection? ARGH IT BURNS.
C.Confused(3)
C.Weaken(3)
C.Confused(6 SECONDS)
C.Weaken(6 SECONDS)
C.lip_style = "spray_face"
C.lip_color = colour
C.update_body()
+7 -7
View File
@@ -23,7 +23,7 @@
/obj/item/flash/proc/clown_check(mob/user)
if(user && HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))
flash_carbon(user, user, 15, 0)
flash_carbon(user, user, 30 SECONDS, 0)
return 0
return 1
@@ -86,14 +86,14 @@
return TRUE
/obj/item/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1)
/obj/item/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 10 SECONDS, targeted = 1)
if(user)
add_attack_logs(user, M, "Flashed with [src]")
if(targeted)
if(M.flash_eyes(1, 1))
M.AdjustConfused(power)
terrible_conversion_proc(M, user)
M.Stun(1)
M.Stun(2 SECONDS)
visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
to_chat(user, "<span class='danger'>You blind [M] with the flash!</span>")
to_chat(M, "<span class='userdanger'>[user] blinds you with the flash!</span>")
@@ -110,7 +110,7 @@
if(!try_use_flash(user))
return 0
if(iscarbon(M))
flash_carbon(M, user, 5, 1)
flash_carbon(M, user, 10 SECONDS, 1)
if(overcharged)
M.adjust_fire_stacks(6)
M.IgniteMob()
@@ -119,7 +119,7 @@
else if(issilicon(M))
add_attack_logs(user, M, "Flashed with [src]")
if(M.flash_eyes(affect_silicon = 1))
M.Weaken(rand(4, 6))
M.Weaken(rand(8 SECONDS, 12 SECONDS))
user.visible_message("<span class='disarm'>[user] overloads [M]'s sensors with [src]!</span>", "<span class='danger'>You overload [M]'s sensors with [src]!</span>")
return 1
user.visible_message("<span class='disarm'>[user] fails to blind [M] with [src]!</span>", "<span class='warning'>You fail to blind [M] with [src]!</span>")
@@ -130,14 +130,14 @@
return 0
user.visible_message("<span class='disarm'>[user]'s [src] emits a blinding light!</span>", "<span class='danger'>Your [src] emits a blinding light!</span>")
for(var/mob/living/carbon/M in oviewers(3, null))
flash_carbon(M, user, 3, 0)
flash_carbon(M, user, 6 SECONDS, 0)
/obj/item/flash/emp_act(severity)
if(!try_use_flash())
return 0
for(var/mob/living/carbon/M in viewers(3, null))
flash_carbon(M, null, 10, 0)
flash_carbon(M, null, 20 SECONDS, 0)
burn_out()
..()
@@ -63,10 +63,9 @@
else
to_chat(user, "<span class='danger'>[H] doesn't respond!</span>")
H.AdjustParalysis(3)
H.AdjustStunned(5)
H.AdjustWeakened(5)
H.AdjustStuttering(10)
H.AdjustParalysis(6 SECONDS)
H.AdjustWeakened(10 SECONDS)
H.AdjustStuttering(20 SECONDS)
to_chat(H, "<span class='danger'>You feel a powerful jolt!</span>")
SEND_SIGNAL(H, COMSIG_LIVING_MINOR_SHOCK, 100)
@@ -118,7 +118,7 @@
//20% chance to actually hit the sensors
if(prob(effectchance * diode.rating))
S.flash_eyes(affect_silicon = 1)
S.Weaken(rand(5,10))
S.Weaken(rand(10 SECONDS, 20 SECONDS))
to_chat(S, "<span class='warning'>Your sensors were overloaded by a laser!</span>")
outmsg = "<span class='notice'>You overload [S] by shining [src] at [S.p_their()] sensors.</span>"
@@ -57,8 +57,8 @@
if(!signal || signal.encryption != code)
return
if(ismob(loc) && on)
var/mob/M = loc
if(isliving(loc) && on)
var/mob/living/M = loc
var/turf/T = M.loc
if(istype(T, /turf))
if(!M.moved_recently && M.last_move)
@@ -70,7 +70,7 @@
to_chat(M, "<span class='danger'>You feel a sharp shock!</span>")
do_sparks(3, 1, M)
M.Weaken(5)
M.Weaken(10 SECONDS)
if(master)
master.receive_signal()

Some files were not shown because too many files have changed in this diff Show More