diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 97486374e99..7d0b57ded51 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -71,6 +71,8 @@ #define HUMAN_MAX_OXYLOSS 3 #define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30) +#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS) + #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point #define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index ecbf24dc8a7..2c4429be292 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -57,7 +57,7 @@ Bonus var/get_damage = rand(15,25) * power M.take_overall_damage(brute = get_damage, required_status = BODYPART_ORGANIC) if(pain) - M.adjustStaminaLoss(get_damage) + M.adjustStaminaLoss(get_damage * 2) if(bleed) if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -127,4 +127,4 @@ Bonus M.reagents.add_reagent_list(list(/datum/reagent/toxin/heparin = 2, /datum/reagent/toxin/lipolicide = 2)) if(zombie) M.reagents.add_reagent(/datum/reagent/romerol, 1) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index ef8947da226..7fe8ec57872 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -467,7 +467,7 @@ "[user] has touched [M] with [src]!") M.adjustStaminaLoss(50) M.Paralyze(100) - M.updatehealth() //forces health update before next life tick + M.updatehealth() //forces health update before next life tick //isn't this done by adjustStaminaLoss anyway? playsound(src, 'sound/machines/defib_zap.ogg', 50, 1, -1) M.emote("gasp") log_combat(user, M, "stunned", src) diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 66ce3c303d9..7c07103d625 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -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) diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index 6a984e66a23..e5754329979 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -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) diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 5f1b1f59edd..4040dfc031a 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -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 diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 36d0a2ef4d0..3c789f339f7 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -32,7 +32,7 @@ if(prob(stage*3)) to_chat(affected_mob, "You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...") 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++ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a8fa0266b4e..e25f4f37c4c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -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, "You're too exhausted to keep going...") Paralyze(100) + stam_paralysed = TRUE update_health_hud() /mob/living/carbon/update_sight() diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 10389b32103..ae84700f492 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index be172bcf0fb..35a17b8984a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index aa09b227456..b8a15478912 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -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) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index c9bf7bce150..0e63ad65f96 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -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) diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 41644ec234a..447cbe339d3 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -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" diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ded512afcd9..92b83aeea00 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -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' diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index a019c05ef19..1cd5a9f0bbb 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -12,5 +12,5 @@ /obj/item/projectile/bullet/a762_enchanted name = "enchanted 7.62 bullet" - damage = 5 + damage = 20 stamina = 80 diff --git a/code/modules/projectiles/projectile/energy/ebow.dm b/code/modules/projectiles/projectile/energy/ebow.dm index cf0e6f81dcc..c83668df16a 100644 --- a/code/modules/projectiles/projectile/energy/ebow.dm +++ b/code/modules/projectiles/projectile/energy/ebow.dm @@ -4,7 +4,7 @@ damage = 15 damage_type = TOX nodamage = FALSE - stamina = 50 + stamina = 60 eyeblur = 10 knockdown = 10 slur = 5 diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 62264588997..a8374ddffaf 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -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)) diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm index 21b96404e32..fcaef81376f 100644 --- a/code/modules/surgery/bodyparts/bodyparts.dm +++ b/code/modules/surgery/bodyparts/bodyparts.dm @@ -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))