diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index ea883c5637..16d61c29f9 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -37,7 +37,7 @@
D.apply_damage(damage, STAMINA, affecting, armor_block)
log_combat(A, D, "punched (boxing) ")
- if(D.getStaminaLoss() > 100)
+ if(D.getStaminaLoss() > 100 && istype(D.mind?.martial_art, /datum/martial_art/boxing))
var/knockout_prob = (D.getStaminaLoss() + rand(-15,15))*0.75
if((D.stat != DEAD) && prob(knockout_prob))
D.visible_message("[A] has knocked [D] out with a haymaker!", \
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 938f6531f1..b9ff07fe46 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -580,7 +580,7 @@
/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(CHECK_MOBILITY(src, MOBILITY_STAND))
to_chat(src, "You're too exhausted to keep going...")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 57667293e7..f12ac14ece 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -769,7 +769,7 @@
return
else
if(hud_used.healths)
- var/health_amount = health - CLAMP(getStaminaLoss()-50, 0, 80)//CIT CHANGE - makes staminaloss have less of an impact on the health hud
+ var/health_amount = min(health, maxHealth - CLAMP(getStaminaLoss()-50, 0, 80))//CIT CHANGE - makes staminaloss have less of an impact on the health hud
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 9a8882a0be..a6689927f5 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -62,9 +62,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/coldmod = 1 // multiplier for cold damage
var/heatmod = 1 // multiplier for heat damage
var/stunmod = 1 // multiplier for stun duration
- var/punchdamagelow = 0 //lowest possible punch damage
- var/punchdamagehigh = 9 //highest possible punch damage
- var/punchstunthreshold = 9//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
+ var/punchdamagelow = 1 //lowest possible punch damage. if this is set to 0, punches will always miss
+ var/punchdamagehigh = 10 //highest possible punch damage
+ var/punchstunthreshold = 10//damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
var/siemens_coeff = 1 //base electrocution coefficient
var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded?
var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"]
@@ -1464,15 +1464,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
else
var/atk_verb = user.dna.species.attack_verb
- if(target.lying)
- atk_verb = "kick"
+ if(!(target.mobility_flags & MOBILITY_STAND))
+ atk_verb = ATTACK_EFFECT_KICK
switch(atk_verb)
- if("kick")
+ if(ATTACK_EFFECT_KICK)
user.do_attack_animation(target, ATTACK_EFFECT_KICK)
- if("slash")
+ if(ATTACK_EFFECT_CLAW)
user.do_attack_animation(target, ATTACK_EFFECT_CLAW)
- if("smash")
+ if(ATTACK_EFFECT_SMASH)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
else
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
@@ -1492,10 +1492,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected))
- if(!damage || !affecting)
- playsound(target.loc, user.dna.species.miss_sound, 25, 1, -1)
- target.visible_message("[user] has attempted to [atk_verb] [target]!",\
- "[user] has attempted to [atk_verb] [target]!", null, COMBAT_MESSAGE_RANGE)
+ var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
+ if(user.dna.species.punchdamagelow)
+ if(atk_verb == ATTACK_EFFECT_KICK) //kicks never miss (provided your species deals more than 0 damage)
+ miss_chance = 0
+ else
+ miss_chance = min((user.dna.species.punchdamagehigh/user.dna.species.punchdamagelow) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob()
+
+ if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted
+ playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1)
+ target.visible_message("[user]'s [atk_verb] misses [target]!", \
+ "You avoid [user]'s [atk_verb]!", "You hear a swoosh!", COMBAT_MESSAGE_RANGE, user)
+ to_chat(user, "Your [atk_verb] misses [target]!")
+ log_combat(user, target, "attempted to punch")
return FALSE
@@ -1512,14 +1521,25 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(user.limb_destroyer)
target.dismembering_strike(user, affecting.body_zone)
- target.apply_damage(damage, BRUTE, affecting, armor_block)
- log_combat(user, target, "punched")
+
+ if(atk_verb == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + 0.5x stamina damage
+ target.apply_damage(damage*1.5, BRUTE, affecting, armor_block)
+ target.apply_damage(damage*0.5, STAMINA, affecting, armor_block)
+ log_combat(user, target, "kicked")
+ else//other attacks deal full raw damage + 2x in stamina damage
+ target.apply_damage(damage, BRUTE, affecting, armor_block)
+ target.apply_damage(damage*2, STAMINA, affecting, armor_block)
+ log_combat(user, target, "punched")
+
if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
- target.visible_message("[user] has knocked [target] down!", \
- "[user] has knocked [target] down!", null, COMBAT_MESSAGE_RANGE)
- target.apply_effect(80, EFFECT_KNOCKDOWN, armor_block)
+ target.visible_message("[user] knocks [target] down!", \
+ "You're knocked down by [user]!", "You hear aggressive shuffling followed by a loud thud!", COMBAT_MESSAGE_RANGE, user)
+ to_chat(user, "You knock [target] down!")
+ var/knockdown_duration = 40 + (target.getStaminaLoss() + (target.getBruteLoss()*0.5))*0.8 - armor_block
+ target.DefaultCombatKnockdown(knockdown_duration)
target.forcesay(GLOB.hit_appends)
- else if(target.lying)
+ log_combat(user, target, "got a stun punch with their previous punch")
+ else if(!(target.mobility_flags & MOBILITY_STAND))
target.forcesay(GLOB.hit_appends)
/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
index 0b634ba2d8..bf090302c8 100644
--- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm
@@ -467,7 +467,9 @@
if(H.physiology)
H.physiology.stamina_mod *= 0.5
if(H.dna && H.dna.species)
- H.dna.species.punchdamagehigh *= 5
+ H.dna.species.punchdamagehigh *= 4
+ H.dna.species.punchdamagelow *= 4
+ H.dna.species.punchstunthreshold *= 2
/datum/reagent/drug/skooma/on_mob_end_metabolize(mob/living/L)
. = ..()
@@ -478,7 +480,9 @@
if(H.physiology)
H.physiology.stamina_mod *= 2
if(H.dna && H.dna.species)
- H.dna.species.punchdamagehigh *= 0.2
+ H.dna.species.punchdamagehigh *= 0.25
+ H.dna.species.punchdamagelow *= 0.25
+ H.dna.species.punchstunthreshold *= 0.5
/datum/reagent/drug/skooma/on_mob_life(mob/living/carbon/M)
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index f26898f2c5..8e79771b62 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -23,7 +23,7 @@
var/disabled = BODYPART_NOT_DISABLED //If disabled, limb is as good as missing
var/body_damage_coeff = 1 //Multiplier of the limb's damage that gets applied to the mob
- var/stam_damage_coeff = 0.5
+ var/stam_damage_coeff = 0.75
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0