diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index f5fa2f582c..61b13316b8 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -245,10 +245,6 @@ emp_act var/soaked = get_armor_soak(hit_zone, "melee", I.armor_penetration) - if(soaked >= effective_force) - src << "Your armor absorbs the force of [I.name]!" - return - var/blocked = run_armor_check(hit_zone, "melee", I.armor_penetration, "Your armor has protected your [affecting.name].", "Your armor has softened the blow to your [affecting.name].") standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) @@ -266,9 +262,8 @@ emp_act for(var/obj/item/clothing/C in clothing) C.clothing_impact(I, effective_force) - if(soaked >= effective_force) - return 0 - + if(soaked >= round(effective_force*0.8)) + effective_force -= round(effective_force*0.8) // Handle striking to cripple. if(user.a_intent == I_DISARM) effective_force *= 0.5 //reduced effective force... @@ -329,12 +324,15 @@ emp_act return 1 /mob/living/carbon/human/proc/attack_joint(var/obj/item/organ/external/organ, var/obj/item/W, var/effective_force, var/dislocate_mult, var/blocked, var/soaked) - if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100 || soaked > effective_force) + if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1) || blocked >= 100) return 0 if(W.damtype != BRUTE) return 0 + if(soaked >= round(effective_force*0.8)) + effective_force -= round(effective_force*0.8) + //want the dislocation chance to be such that the limb is expected to dislocate after dealing a fraction of the damage needed to break the limb var/dislocate_chance = effective_force/(dislocate_mult * organ.min_broken_damage * config.organ_health_multiplier)*100 if(prob(dislocate_chance * (100 - blocked)/100)) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 552319e6fe..0fa139c36f 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -11,10 +11,13 @@ /mob/living/proc/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/soaked = 0, var/used_weapon = null, var/sharp = 0, var/edge = 0) if(Debug2) world.log << "## DEBUG: apply_damage() was called on [src], with [damage] damage, and an armor value of [blocked]." - if(!damage || (blocked >= 100) || soaked >= damage) + if(!damage || (blocked >= 100)) return 0 if(soaked) - damage -= soaked + if(soaked >= round(damage*0.8)) + damage -= round(damage*0.8) + else + damage -= soaked blocked = (100-blocked)/100 switch(damagetype) if(BRUTE) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 8a49ed8922..b60ff078a3 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -107,6 +107,11 @@ var/absorb = run_armor_check(def_zone, P.check_armour, P.armor_penetration) var/proj_sharp = is_sharp(P) var/proj_edge = has_edge(P) + + if ((proj_sharp || proj_edge) && (soaked >= round(P.damage*0.8))) + proj_sharp = 0 + proj_edge = 0 + if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.check_armour))) proj_sharp = 0 proj_edge = 0 @@ -167,13 +172,11 @@ var/soaked = get_armor_soak(hit_zone, "melee") var/blocked = run_armor_check(hit_zone, "melee") - //If the armor absorbs all of the damage, skip the damage calculation and the blood - if(!(soaked > effective_force)) - standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) + standard_weapon_hit_effects(I, user, effective_force, blocked, soaked, hit_zone) - if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too - var/turf/simulated/location = get_turf(src) - if(istype(location)) location.add_blood_floor(src) + if(I.damtype == BRUTE && prob(33)) // Added blood for whacking non-humans too + var/turf/simulated/location = get_turf(src) + if(istype(location)) location.add_blood_floor(src) return blocked @@ -186,13 +189,14 @@ if(HULK in user.mutations) effective_force *= 2 - //Armor soak - if(soaked >= effective_force) - return 0 - //Apply weapon damage var/weapon_sharp = is_sharp(I) var/weapon_edge = has_edge(I) + + if(getsoak(hit_zone, "melee",) - (I.armor_penetration/5) > round(effective_force*0.8)) //soaking a hit turns sharp attacks into blunt ones + weapon_sharp = 0 + weapon_edge = 0 + if(prob(max(getarmor(hit_zone, "melee") - I.armor_penetration, 0))) //melee armour provides a chance to turn sharp/edge weapon attacks into blunt ones weapon_sharp = 0 weapon_edge = 0 @@ -251,7 +255,7 @@ if(!O || !src) return if(O.sharp) //Projectile is suitable for pinning. - if(soaked >= throw_damage) //Don't embed if it didn't actually damage + if(soaked >= round(throw_damage*0.8)) return //Handles embedding for non-humans and simple_animals.