Stamina changes [TMC] (#43966)

About The Pull Request

Stamina damage no longer stacks with regular damage.
Stamina regen is paused for 10 seconds every time you take stamina damage
Stamina damage is purged if stamina regen resumes after you enter stamcrit

changes to make this work:
disablers knocked down to 30
punch damage changed to full raw, 1.5x stamina.
flesh-eating symptom deals 2x stamina damage
CQC unchanged
Bostaff manually stacks
Energised jelly blob deals full stamina damage
Pressurised slime blob deals full stamina damage
Blood boil deals 1.5x stamina damage to servants of ratvar (why do I bother?)
Revenant blight now deals 20 stamina damage
Space carp no longer deal stamina damage, but deal 20 brute.
Enchanted bullets deal 20 brute damage
Beanbags reduced to 55 stamina damage
Rubbershot damage untouched
Ebow stamina damage increased to 60

bone hurting juice deals 7.5 stamina damage per tick, down from 15
Why It's Good For The Game

Stamina damage not stacking with regular damage is meant to make disablers less good as a weapon for all-out firefights, but remain good for arresting criminals as a sec squad.

The stamina regen pause allows for chemicals that deal stamina damage to be effective even if they don't only target one body part (as in #43924), and gets rid of the counterintuitive speedy regeneration if multiple bodyparts are damaged. It also makes stamina damage calculations more straightforward - currently 4 damage/tick to the chest is really 1, and adding 25% more damage to the chem deals 100% more damage per tick.

The stamina purge is to make stamcrit less of a confirmed win - several times as sec officer I've succumbed to poison, run out of charge, etc only for the rest of sec to arrive before the perp awakes from his 3 hour sleep. Stamina damage is fully purged to make keeping someone down require more attention, since under the current system even if they somehow get up they'll be so slow it'll be trivial to put them down again. Basically, makes handcuffs more useful again.
Changelog

cl
add: stamina damage now pauses natural stamina regen for 10 seconds
add: stamina regenerates fully when it can.
balance: disabler damage reduced
tweak: stamina damage no longer stacks with normal damage for the purposes of damage slowdown and crit
balance: many sources of stamina damage have been adjusted, check PR for details
/cl
This commit is contained in:
4dplanner
2019-06-03 00:16:56 +01:00
committed by oranges
parent 062a8581c7
commit 15825997b8
18 changed files with 39 additions and 36 deletions
@@ -29,6 +29,6 @@
/datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.losebreath += round(0.2*reac_volume)
M.adjustStaminaLoss(0.4*reac_volume)
M.adjustStaminaLoss(reac_volume)
if(M)
M.apply_damage(0.6*reac_volume, OXY)
@@ -48,4 +48,4 @@
if(M)
M.apply_damage(0.4*reac_volume, OXY)
if(M)
M.adjustStaminaLoss(0.2*reac_volume)
M.adjustStaminaLoss(reac_volume)
+1 -1
View File
@@ -800,7 +800,7 @@ structure_check() searches for nearby cultist structures required for the invoca
continue
L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
if(is_servant_of_ratvar(L))
L.adjustStaminaLoss(tick_damage*0.5)
L.adjustStaminaLoss(tick_damage*multiplier*1.5)
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
@@ -32,7 +32,7 @@
if(prob(stage*3))
to_chat(affected_mob, "<span class='revennotice'>You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...</span>")
affected_mob.confused += 8
affected_mob.adjustStaminaLoss(8)
affected_mob.adjustStaminaLoss(20)
new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(stagedamage < stage)
stagedamage++
+2 -1
View File
@@ -530,11 +530,12 @@
/mob/living/carbon/update_stamina()
var/stam = getStaminaLoss()
if(stam > DAMAGE_PRECISION)
var/total_health = (health - stam)
var/total_health = (maxHealth - stam)
if(total_health <= crit_threshold && !stat)
if(!IsParalyzed())
to_chat(src, "<span class='notice'>You're too exhausted to keep going...</span>")
Paralyze(100)
stam_paralysed = TRUE
update_health_hud()
/mob/living/carbon/update_sight()
@@ -61,3 +61,5 @@
var/damageoverlaytemp = 0
var/drunkenness = 0 //Overall drunkenness - check handle_alcohol() in life.dm for effects
var/stam_regen_start_time = 0 //used to halt stamina regen temporarily
var/stam_paralysed = FALSE //so we get back up if we regen during a paralyse
@@ -732,7 +732,7 @@
return
else
if(hud_used.healths)
var/health_amount = health - getStaminaLoss()
var/health_amount = min(health, maxHealth - getStaminaLoss())
if(..(health_amount)) //not dead
switch(hal_screwyhud)
if(SCREWYHUD_CRIT)
@@ -1102,7 +1102,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(I.item_flags & SLOWS_WHILE_IN_HAND)
. += I.slowdown
if(!HAS_TRAIT(H, TRAIT_IGNOREDAMAGESLOWDOWN))
var/health_deficiency = (H.maxHealth - H.health + H.staminaloss)
var/health_deficiency = max(H.maxHealth - H.health, H.staminaloss)
if(health_deficiency >= 40)
if(flight)
. += (health_deficiency / 75)
@@ -1235,9 +1235,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage
target.apply_damage(damage*1.5, attack_type, affecting, armor_block)
log_combat(user, target, "kicked")
else//other attacks to 1/2 raw damage + full in stamina damage
target.apply_damage(damage*0.5, attack_type, affecting, armor_block)
target.apply_damage(damage, STAMINA, affecting, armor_block)
else//other attacks deal full raw damage + 1.5x in stamina damage
target.apply_damage(damage, attack_type, affecting, armor_block)
target.apply_damage(damage*1.5, STAMINA, affecting, armor_block)
log_combat(user, target, "punched")
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
+8 -1
View File
@@ -312,10 +312,17 @@
return
/mob/living/carbon/proc/handle_bodyparts()
var/stam_regen = FALSE
if(stam_regen_start_time <= world.time)
stam_regen = TRUE
if(stam_paralysed)
stam_paralysed = FALSE
SetParalyzed(0) //Really we should have sources for status effects
update_health_hud()
for(var/I in bodyparts)
var/obj/item/bodypart/BP = I
if(BP.needs_processing)
. |= BP.on_life()
. |= BP.on_life(stam_regen)
/mob/living/carbon/proc/handle_organs()
for(var/V in internal_organs)
@@ -23,8 +23,8 @@
harm_intent_damage = 8
obj_damage = 50
melee_damage_lower = 15
melee_damage_upper = 15
melee_damage_lower = 20
melee_damage_upper = 20
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("gnashes")
@@ -38,12 +38,6 @@
pressure_resistance = 200
gold_core_spawnable = HOSTILE_SPAWN
/mob/living/simple_animal/hostile/carp/AttackingTarget()
. = ..()
if(. && ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
icon_living = "holocarp"
+1 -1
View File
@@ -69,7 +69,7 @@
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
damage = 40
damage = 30
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
@@ -12,5 +12,5 @@
/obj/item/projectile/bullet/a762_enchanted
name = "enchanted 7.62 bullet"
damage = 5
damage = 20
stamina = 80
@@ -4,7 +4,7 @@
damage = 15
damage_type = TOX
nodamage = FALSE
stamina = 50
stamina = 60
eyeblur = 10
knockdown = 10
slur = 5
@@ -852,7 +852,7 @@
M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice)
/datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M)
M.adjustStaminaLoss(15, 0)
M.adjustStaminaLoss(7.5, 0)
if(HAS_TRAIT(M, TRAIT_CALCIUM_HEALER))
M.adjustBruteLoss(0.5, 0)
if(prob(20))
+7 -10
View File
@@ -31,7 +31,6 @@
var/stamina_dam = 0
var/max_stamina_damage = 0
var/max_damage = 0
var/stam_heal_tick = 3 //per Life().
var/brute_reduction = 0 //Subtracted to brute damage taken
var/burn_reduction = 0 //Subtracted to burn damage taken
@@ -134,10 +133,10 @@
needs_processing = .
//Return TRUE to get whatever mob this is in to update health.
/obj/item/bodypart/proc/on_life()
if(stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life.
if(heal_damage(0, 0, stam_heal_tick, null, FALSE))
. |= BODYPART_LIFE_UPDATE_HEALTH
/obj/item/bodypart/proc/on_life(stam_regen)
if(stamina_dam > DAMAGE_PRECISION && stam_regen) //DO NOT update health here, it'll be done in the carbon's life.
heal_damage(0, 0, INFINITY, null, FALSE)
. |= BODYPART_LIFE_UPDATE_HEALTH
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
@@ -185,10 +184,12 @@
var/available_damage = max_damage - current_damage
stamina_dam += round(CLAMP(stamina, 0, min(max_stamina_damage - stamina_dam, available_damage)), DAMAGE_PRECISION)
if(owner && updating_health)
owner.updatehealth()
if(stamina > DAMAGE_PRECISION)
owner.update_stamina()
owner.stam_regen_start_time = world.time + STAMINA_REGEN_BLOCK_TIME
consider_processing()
update_disabled()
return update_bodypart_damage_state()
@@ -214,7 +215,7 @@
/obj/item/bodypart/proc/get_damage(include_stamina = FALSE)
var/total = brute_dam + burn_dam
if(include_stamina)
total += stamina_dam
total = max(total, stamina_dam)
return total
//Checks disabled status thresholds
@@ -502,7 +503,6 @@
held_index = 1
px_x = -6
px_y = 0
stam_heal_tick = 2
/obj/item/bodypart/l_arm/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_L_ARM))
@@ -566,7 +566,6 @@
held_index = 2
px_x = 6
px_y = 0
stam_heal_tick = 2
max_stamina_damage = 50
/obj/item/bodypart/r_arm/is_disabled()
@@ -628,7 +627,6 @@
body_damage_coeff = 0.75
px_x = -2
px_y = 12
stam_heal_tick = 2
max_stamina_damage = 50
/obj/item/bodypart/l_leg/is_disabled()
@@ -688,7 +686,6 @@
px_x = 2
px_y = 12
max_stamina_damage = 50
stam_heal_tick = 2
/obj/item/bodypart/r_leg/is_disabled()
if(HAS_TRAIT(owner, TRAIT_PARALYSIS_R_LEG))