Stamina Damage Rework (#12591)

This commit is contained in:
Fox McCloud
2019-10-27 00:23:22 -04:00
committed by variableundefined
parent 573d390d93
commit 00f5e0613c
39 changed files with 91 additions and 67 deletions
@@ -13,7 +13,7 @@
desc = "It looks pretty sciency."
icon = 'icons/obj/rig_modules.dmi'
icon_state = "module"
toolspeed = 1
var/damage = 0
@@ -155,7 +155,7 @@
to_chat(usr, "<span class='warning'>The suit is not initialized.</span>")
return 0
if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened)
if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.IsWeakened())
to_chat(usr, "<span class='warning'>You cannot use the suit in this state.</span>")
return 0
+1 -1
View File
@@ -1052,7 +1052,7 @@
if(user.restrained())
to_chat(user, "<span class='notice'>You need your hands free for this.</span>")
return 0
if(user.stat || user.paralysis || user.sleeping || user.lying || user.weakened)
if(user.stat || user.paralysis || user.sleeping || user.lying || user.IsWeakened())
return 0
return 1
#undef ONLY_DEPLOY
+6 -6
View File
@@ -53,7 +53,7 @@
/datum/martial_art/cqc/proc/Slam(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!can_use(A))
return FALSE
if(!D.weakened && !D.resting && !D.lying)
if(!D.IsWeakened() && !D.resting && !D.lying)
D.visible_message("<span class='warning'>[A] slams [D] into the ground!</span>", \
"<span class='userdanger'>[A] slams you into the ground!</span>")
playsound(get_turf(A), 'sound/weapons/slam.ogg', 50, 1, -1)
@@ -70,7 +70,7 @@
if(!can_use(A))
return FALSE
var/success = FALSE
if(!D.stat || !D.weakened)
if(!D.stat || !D.IsWeakened())
D.visible_message("<span class='warning'>[A] kicks [D] back!</span>", \
"<span class='userdanger'>[A] kicks you back!</span>")
playsound(get_turf(A), 'sound/weapons/cqchit1.ogg', 50, 1, -1)
@@ -79,7 +79,7 @@
D.apply_damage(10, BRUTE)
add_attack_logs(A, D, "Melee attacked with martial-art [src] : Kick", ATKLOG_ALL)
success = TRUE
if(D.weakened && !D.stat)
if(D.IsWeakened() && !D.stat)
D.visible_message("<span class='warning'>[A] kicks [D]'s head, knocking [D.p_them()] out!</span>", \
"<span class='userdanger'>[A] kicks your head, knocking you out!</span>")
playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, 1, -1)
@@ -164,7 +164,7 @@
A.do_attack_animation(D)
var/picked_hit_type = pick("CQC'd", "neck chopped", "gut punched", "Big Bossed")
var/bonus_damage = 13
if(D.weakened || D.resting || D.lying)
if(D.IsWeakened() || D.resting || D.lying)
bonus_damage += 5
picked_hit_type = "stomps on"
D.apply_damage(bonus_damage, BRUTE)
@@ -175,7 +175,7 @@
D.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>", \
"<span class='userdanger'>[A] [picked_hit_type] you!</span>")
add_attack_logs(A, D, "Melee attacked with martial-art [src] : [picked_hit_type]", ATKLOG_ALL)
if(A.resting && !D.stat && !D.weakened)
if(A.resting && !D.stat && !D.IsWeakened())
D.visible_message("<span class='warning'>[A] leg sweeps [D]!", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
playsound(get_turf(A), 'sound/effects/hit_kick.ogg', 50, 1, -1)
@@ -204,7 +204,7 @@
restraining = FALSE
if(prob(65))
if(!D.stat || !D.weakened || !restraining)
if(!D.stat || !D.IsWeakened() || !restraining)
I = D.get_active_hand()
D.visible_message("<span class='warning'>[A] strikes [D]'s jaw with their hand!</span>", \
"<span class='userdanger'>[A] strikes your jaw, disorienting you!</span>")
+2 -2
View File
@@ -75,7 +75,7 @@
return 0
/datum/martial_art/krav_maga/proc/leg_sweep(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.stat || D.weakened)
if(D.stat || D.IsWeakened())
return 0
D.visible_message("<span class='warning'>[A] leg sweeps [D]!</span>", \
"<span class='userdanger'>[A] leg sweeps you!</span>")
@@ -111,7 +111,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
add_attack_logs(A, D, "Melee attacked with [src]")
var/picked_hit_type = pick("punches", "kicks")
var/bonus_damage = 10
if(D.weakened || D.resting || D.lying)
if(D.IsWeakened() || D.resting || D.lying)
bonus_damage += 5
picked_hit_type = "stomps on"
D.apply_damage(bonus_damage, BRUTE)
+2 -2
View File
@@ -22,7 +22,7 @@
return 0
/datum/martial_art/mimejutsu/proc/mimeChuck(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
@@ -54,7 +54,7 @@
return basic_hit(A,D)
/datum/martial_art/mimejutsu/proc/mimePalm(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
D.visible_message("<span class='danger'>[A] has barely touched [D] with [A.p_their()] palm!</span>", \
"<span class='userdanger'>[A] hovers [A.p_their()] palm over your face!</span>")
+5 -5
View File
@@ -35,7 +35,7 @@
return 0
/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
if(!D.stat && !D.stunned && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("<span class='warning'>[A] grabs [D]'s wrist and wrenches it sideways!</span>", \
"<span class='userdanger'>[A] grabs your wrist and violently wrenches it to the side!</span>")
@@ -50,7 +50,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(A.dir == D.dir && !D.stat && !D.weakened)
if(A.dir == D.dir && !D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] kicks [D] in the back!</span>", \
"<span class='userdanger'>[A] kicks you in the back, making you stumble and fall!</span>")
@@ -63,7 +63,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
if(!D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] knees [D] in the stomach!</span>", \
"<span class='userdanger'>[A] winds you with a knee in the stomach!</span>")
@@ -77,7 +77,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.weakened)
if(!D.stat && !D.IsWeakened())
A.do_attack_animation(D, ATTACK_EFFECT_KICK)
D.visible_message("<span class='warning'>[A] kicks [D] in the head!</span>", \
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
@@ -91,7 +91,7 @@
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(D.weakened || D.resting || D.stat)
if(D.IsWeakened() || D.resting || D.stat)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("<span class='warning'>[A] elbow drops [D]!</span>", \
"<span class='userdanger'>[A] piledrives you with [A.p_their()] elbow!</span>")
@@ -25,7 +25,7 @@
icon_state = "alien[caste]_dead"
pixel_y = 0
else if(stat == UNCONSCIOUS || weakened)
else if(stat == UNCONSCIOUS || IsWeakened())
icon_state = "alien[caste]_unconscious"
pixel_y = 0
else if(leap_on_click)
@@ -383,7 +383,7 @@
message = "<B>[src]</B> flips in [M]'s general direction."
SpinAnimation(5,1)
else
if(lying || weakened)
if(lying || IsWeakened())
message = "<B>[src]</B> flops and flails around on the floor."
else
var/obj/item/grab/G
@@ -633,7 +633,7 @@ emp_act
if("brute")
if(M.force > 35) // durand and other heavy mechas
Paralyse(1)
else if(M.force > 20 && !weakened) // lightweight mechas like gygax
else if(M.force > 20 && !IsWeakened()) // lightweight mechas like gygax
Weaken(2)
update |= affecting.receive_damage(dmg, 0)
playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE)
@@ -246,7 +246,7 @@
if(H.r_hand && (H.r_hand.flags & HANDSLOW))
. += H.r_hand.slowdown
var/health_deficiency = (H.maxHealth - H.health + H.staminaloss)
var/health_deficiency = max(H.maxHealth - H.health, H.staminaloss)
var/hungry = (500 - H.nutrition)/5 // So overeat would be 100 and default level would be 80
if(H.reagents)
for(var/datum/reagent/R in H.reagents.reagent_list)
@@ -751,7 +751,7 @@
return FALSE //Unsupported slot
/datum/species/proc/get_perceived_trauma(mob/living/carbon/human/H)
return H.health - H.getStaminaLoss()
return min(H.health, H.maxHealth - H.getStaminaLoss())
/datum/species/proc/handle_hud_icons(mob/living/carbon/human/H)
if(!H.client)
+4 -2
View File
@@ -258,8 +258,10 @@
//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
/mob/living/carbon/handle_status_effects()
..()
setStaminaLoss(max((staminaloss - 3), 0))
if(stam_regen_start_time <= world.time)
if(stam_paralyzed)
update_stamina()
setStaminaLoss(0, FALSE)
var/restingpwr = 1 + 4 * resting
@@ -0,0 +1,15 @@
/mob/living/carbon/IsWeakened(include_stamcrit = TRUE)
return ..() || (include_stamcrit && stam_paralyzed)
/mob/living/carbon/proc/enter_stamcrit()
if(!(status_flags & CANWEAKEN))
return
if(absorb_stun(0)) //continuous effect, so we don't want it to increment the stuns absorbed.
return
if(!IsWeakened())
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
var/prev = stam_paralyzed
stam_paralyzed = TRUE
update_canmove()
if(!prev && getStaminaLoss() < 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems.
adjustStaminaLoss(30, FALSE)
@@ -18,15 +18,13 @@
create_debug_log("woke up, trigger reason: [reason]")
/mob/living/carbon/update_stamina()
..()
if(staminaloss)
var/total_health = (health - staminaloss)
if(total_health <= HEALTH_THRESHOLD_CRIT && !stat)
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
Weaken(5)
setStaminaLoss(health - 2)
handle_hud_icons_health()
return
var/stam = getStaminaLoss()
if(stam > DAMAGE_PRECISION && (maxHealth - stam) <= HEALTH_THRESHOLD_CRIT && !stat)
enter_stamcrit()
else if(stam_paralyzed)
stam_paralyzed = FALSE
update_canmove()
handle_hud_icons_health()
/mob/living/carbon/can_hear()
. = FALSE
+6 -4
View File
@@ -260,28 +260,30 @@
if(status_flags & GODMODE)
return FALSE
var/old_stamloss = staminaloss
staminaloss = max(staminaloss + amount, 0)
staminaloss = min(max(staminaloss + amount, 0), 120)
if(old_stamloss == staminaloss)
updating = FALSE
. = STATUS_UPDATE_NONE
else
. = STATUS_UPDATE_STAMINA
if(amount > 0)
stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME
if(updating)
handle_hud_icons_health()
update_stamina()
/mob/living/proc/setStaminaLoss(amount, updating = TRUE)
if(status_flags & GODMODE)
return FALSE
var/old_stamloss = staminaloss
staminaloss = amount
staminaloss = min(max(amount, 0), 120)
if(old_stamloss == staminaloss)
updating = FALSE
. = STATUS_UPDATE_NONE
else
. = STATUS_UPDATE_STAMINA
if(amount > 0)
stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME
if(updating)
handle_hud_icons_health()
update_stamina()
/mob/living/proc/getMaxHealth()
@@ -69,3 +69,5 @@
var/deathgasp_on_death = FALSE
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
var/stam_regen_start_time = 0 //used to halt stamina regen temporarily
var/stam_paralyzed = FALSE //knocks you down
+2 -2
View File
@@ -318,7 +318,7 @@
set category = "pAI Commands"
set name = "Unfold Chassis"
if(stat || sleeping || paralysis || weakened)
if(stat || sleeping || paralysis || IsWeakened())
return
if(loc != card)
@@ -353,7 +353,7 @@
set category = "pAI Commands"
set name = "Collapse Chassis"
if(stat || sleeping || paralysis || weakened)
if(stat || sleeping || paralysis || IsWeakened())
return
if(loc == card)
@@ -169,7 +169,7 @@
weaponlock_time = 120
/mob/living/silicon/robot/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || buckled || lockcharge || stat)
if(paralysis || stunned || IsWeakened() || buckled || lockcharge || stat)
canmove = 0
else
canmove = 1
@@ -906,7 +906,7 @@ var/list/robot_verbs_default = list(
/mob/living/silicon/robot/update_icons()
overlays.Cut()
if(stat != DEAD && !(paralysis || stunned || weakened || low_power_mode)) //Not dead, not stunned.
if(stat != DEAD && !(paralysis || stunned || IsWeakened() || low_power_mode)) //Not dead, not stunned.
if(custom_panel in custom_eye_names)
overlays += "eyes-[custom_panel]"
else
@@ -1,6 +1,6 @@
// No args for restraints because robots don't have those
/mob/living/silicon/robot/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
if(stat || lockcharge || IsWeakened() || stunned || paralysis || !is_component_functioning("actuator"))
return TRUE
/mob/living/silicon/robot/has_vision(information_only = FALSE)
@@ -14,7 +14,7 @@
death()
create_debug_log("died of damage, trigger reason: [reason]")
return
if(!is_component_functioning("actuator") || !is_component_functioning("power cell") || paralysis || sleeping || resting || stunned || weakened || getOxyLoss() > maxHealth * 0.5)
if(!is_component_functioning("actuator") || !is_component_functioning("power cell") || paralysis || sleeping || resting || stunned || IsWeakened() || getOxyLoss() > maxHealth * 0.5)
if(stat == CONSCIOUS)
KnockOut()
create_debug_log("fell unconscious, trigger reason: [reason]")
@@ -500,7 +500,7 @@
. |= pcollar.GetAccess()
/mob/living/simple_animal/update_canmove(delay_action_updates = 0)
if(paralysis || stunned || weakened || stat || resting)
if(paralysis || stunned || IsWeakened() || stat || resting)
drop_r_hand()
drop_l_hand()
canmove = 0
+2 -2
View File
@@ -62,11 +62,11 @@
// Whether the mob is capable of standing or not
/mob/living/proc/can_stand()
return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
return !(IsWeakened() || paralysis || stat || (status_flags & FAKEDEATH))
// Whether the mob is capable of actions or not
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
if(stat || paralysis || stunned || IsWeakened() || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
return TRUE
// wonderful proc names, I know - used to check whether the blur overlay
+3
View File
@@ -190,6 +190,9 @@
return
/mob/proc/IsWeakened()
return weakened
/mob/proc/Weaken()
return
+1 -1
View File
@@ -317,7 +317,7 @@
src.add_fingerprint(user)
if(target == user && !user.incapacitated())
visible_message("<span class='warning'>[usr] jumps onto [src]!</span>")
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
else if(target != user && !user.restrained() && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis)
if(target.anchored) return
if(!ishuman(user)) return
visible_message("<span class='warning'>[usr] drags [target.name] onto [src]!</span>")
+1 -1
View File
@@ -47,7 +47,7 @@
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
damage = 36
damage = 30
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
@@ -314,7 +314,6 @@ var/const/INGEST = 2
if(update_flags & STATUS_UPDATE_CANMOVE)
M.update_canmove()
if(update_flags & STATUS_UPDATE_STAMINA)
M.handle_hud_icons_health()
M.update_stamina()
if(update_flags & STATUS_UPDATE_BLIND)
M.update_blind_effects()
@@ -25,7 +25,7 @@
if(method == TOUCH)
volume = ..()
M.apply_damage(0.6*volume, BRUTE)
M.adjustStaminaLoss(0.4*volume)
M.adjustStaminaLoss(volume)
if(iscarbon(M))
M.emote("scream")
@@ -105,7 +105,7 @@
if(method == TOUCH)
volume = ..()
M.apply_damage(0.4*volume, BURN)
M.adjustStaminaLoss(0.4*volume)
M.adjustStaminaLoss(volume)
if(M.reagents)
M.reagents.add_reagent("frostoil", 0.4*volume)
+4 -4
View File
@@ -189,20 +189,20 @@
var/target_loc = target.loc
var/msg
for(var/mob/V in viewers(usr))
if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
if(target == user && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis)
V.show_message("[usr] starts climbing into the disposal.", 3)
if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
if(target != user && !user.restrained() && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis)
if(target.anchored) return
V.show_message("[usr] starts stuffing [target.name] into the disposal.", 3)
if(!do_after(usr, 20, target = target))
return
if(target_loc != target.loc)
return
if(target == user && !user.stat && !user.weakened && !user.stunned && !user.paralysis) // if drop self, then climbed in
if(target == user && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis) // if drop self, then climbed in
// must be awake, not stunned or whatever
msg = "[user.name] climbs into the [src]."
to_chat(user, "You climb into the [src].")
else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis)
else if(target != user && !user.restrained() && !user.stat && !user.IsWeakened() && !user.stunned && !user.paralysis)
msg = "[user.name] stuffs [target.name] into the [src]!"
to_chat(user, "You stuff [target.name] into the [src]!")
+2 -2
View File
@@ -144,9 +144,9 @@
/proc/can_operate(mob/living/carbon/M)
if(locate(/obj/machinery/optable, M.loc) && (M.lying || M.resting))
return TRUE
if(locate(/obj/structure/bed, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat))
if(locate(/obj/structure/bed, M.loc) && (M.buckled || M.lying || M.IsWeakened() || M.stunned || M.paralysis || M.sleeping || M.stat))
return TRUE
if(locate(/obj/structure/table, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat))
if(locate(/obj/structure/table, M.loc) && (M.lying || M.IsWeakened() || M.stunned || M.paralysis || M.sleeping || M.stat))
return TRUE
return FALSE