mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-21 21:17:44 +01:00
[MIRROR] Zombies can be decapped again, un-nerfs esword/armblade/etc wounding power, improvised cauterization tweaks (#676)
* Zombies can be decapped again, un-nerfs esword/armblade/etc wounding power, improvised cauterization tweaks (#53349) #53117 introduced a few minor bugs with the health system, in this case, zombies being un-decappable due to an oversight in the head/chest dismember requiring full death rather than either full crit or death. As zombies (or anything with TRAIT_NODEATH) can only reach hard crit and not death, this meant they couldn't be decapped/disemboweled. This fixes that. It also fixes krokodil addict zombies being unwoundable due to not having flesh or bone traits. Next up, I originally set really high negative wound bonuses for high damage weapons like eswords and armblades since they already had high damage and dismember power by themselves. Now that dismembering is tied to wounding power (and I have a better sense of balance values), these harsh nerfs are no longer needed or wanted, and you can actually dismember people worth a damn with an esword again. I also punched up the wounding power of a few other weapons like saws and scalpels to less awful (but still not optimal) against armor. Attacks currently have an 80% chance to hit the limb you're aiming at, which can make destroying a limb a complete pain even if the target is already down and out. As such, attacks against prone targets now have a 90% chance to hit the targeted limb, cutting the miss rate in half. Lastly, trying to cauterize bleeding wounds with improvised tools (anything hot that isn't a cautery) is now slightly less efficient than a real cautery and requires an aggro grab on the patient to apply. No more trying to cauterize the person you just attacked with an esword because you were on help intent! * Zombies can be decapped again, un-nerfs esword/armblade/etc wounding power, improvised cauterization tweaks Co-authored-by: Ryll Ryll <3589655+Ryll-Ryll@users.noreply.github.com>
This commit is contained in:
@@ -228,11 +228,8 @@
|
||||
var/bio_state = owner.get_biological_state()
|
||||
var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%)
|
||||
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
if(sharpness == SHARP_EDGED)
|
||||
wounding_type = WOUND_SLASH
|
||||
else if(sharpness == SHARP_POINTY)
|
||||
wounding_type = WOUND_PIERCE
|
||||
if(wounding_type == WOUND_BLUNT && sharpness)
|
||||
wounding_type = (sharpness == SHARP_EDGED ? WOUND_SLASH : WOUND_PIERCE)
|
||||
|
||||
//Handling for bone only/flesh only(none right now)/flesh and bone targets
|
||||
switch(bio_state)
|
||||
@@ -240,7 +237,7 @@
|
||||
if(BIO_JUST_BONE)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
wounding_type = WOUND_BLUNT
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.5)
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.6)
|
||||
else if(wounding_type == WOUND_PIERCE)
|
||||
wounding_type = WOUND_BLUNT
|
||||
wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
@@ -254,7 +251,7 @@
|
||||
if(mangled_state == BODYPART_MANGLED_FLESH && sharpness)
|
||||
playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100)
|
||||
if(wounding_type == WOUND_SLASH && !easy_dismember)
|
||||
wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
if(wounding_type == WOUND_PIERCE && !easy_dismember)
|
||||
wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated
|
||||
wounding_type = WOUND_BLUNT
|
||||
@@ -308,11 +305,8 @@
|
||||
var/bio_state = owner.get_biological_state()
|
||||
var/easy_dismember = HAS_TRAIT(owner, TRAIT_EASYDISMEMBER) // if we have easydismember, we don't reduce damage when redirecting damage to different types (slashing weapons on mangled/skinless limbs attack at 100% instead of 50%)
|
||||
|
||||
if(wounding_type == WOUND_BLUNT)
|
||||
if(sharpness == SHARP_EDGED)
|
||||
wounding_type = WOUND_SLASH
|
||||
else if(sharpness == SHARP_POINTY)
|
||||
wounding_type = WOUND_PIERCE
|
||||
if(wounding_type == WOUND_BLUNT && sharpness)
|
||||
wounding_type = (sharpness == SHARP_EDGED ? WOUND_SLASH : WOUND_PIERCE)
|
||||
|
||||
//Handling for bone only/flesh only(none right now)/flesh and bone targets
|
||||
switch(bio_state)
|
||||
@@ -320,7 +314,7 @@
|
||||
if(BIO_JUST_BONE)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
wounding_type = WOUND_BLUNT
|
||||
phantom_wounding_dmg *= (easy_dismember ? 1 : 0.5)
|
||||
phantom_wounding_dmg *= (easy_dismember ? 1 : 0.6)
|
||||
else if(wounding_type == WOUND_PIERCE)
|
||||
wounding_type = WOUND_BLUNT
|
||||
phantom_wounding_dmg *= (easy_dismember ? 1 : 0.75)
|
||||
@@ -334,7 +328,7 @@
|
||||
if(mangled_state == BODYPART_MANGLED_FLESH && sharpness)
|
||||
playsound(src, "sound/effects/wounds/crackandbleed.ogg", 100)
|
||||
if(wounding_type == WOUND_SLASH && !easy_dismember)
|
||||
phantom_wounding_dmg *= 0.5 // edged weapons pass along 50% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
phantom_wounding_dmg *= 0.6 // edged weapons pass along 60% of their wounding damage to the bone since the power is spread out over a larger area
|
||||
if(wounding_type == WOUND_PIERCE && !easy_dismember)
|
||||
phantom_wounding_dmg *= 0.75 // piercing weapons pass along 75% of their wounding damage to the bone since it's more concentrated
|
||||
wounding_type = WOUND_BLUNT
|
||||
@@ -356,23 +350,24 @@
|
||||
* * bare_wound_bonus- The bare_wound_bonus of an attack
|
||||
*/
|
||||
/obj/item/bodypart/proc/check_wounding(woundtype, damage, wound_bonus, bare_wound_bonus)
|
||||
// actually roll wounds if applicable
|
||||
// note that these are fed into an exponent, so these are magnified
|
||||
if(HAS_TRAIT(owner, TRAIT_EASYLIMBWOUND))
|
||||
damage *= 1.5
|
||||
else
|
||||
damage = min(damage, WOUND_MAX_CONSIDERED_DAMAGE)
|
||||
|
||||
if(HAS_TRAIT(owner,TRAIT_HARDLIMBWOUND))
|
||||
damage *= 0.9
|
||||
damage *= 0.85
|
||||
|
||||
if(HAS_TRAIT(owner, TRAIT_EASYDISMEMBER))
|
||||
damage *= 1.25
|
||||
damage *= 1.1
|
||||
|
||||
var/base_roll = rand(1, round(damage ** WOUND_DAMAGE_EXPONENT))
|
||||
var/injury_roll = base_roll
|
||||
injury_roll += check_woundings_mods(woundtype, damage, wound_bonus, bare_wound_bonus)
|
||||
var/list/wounds_checking = GLOB.global_wound_types[woundtype]
|
||||
|
||||
if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && (get_damage() / max_damage * 50))
|
||||
if(injury_roll > WOUND_DISMEMBER_OUTRIGHT_THRESH && prob(get_damage() / max_damage * 100))
|
||||
var/datum/wound/loss/dismembering = new
|
||||
dismembering.apply_dismember(src, woundtype, outright=TRUE)
|
||||
return
|
||||
@@ -446,9 +441,9 @@
|
||||
// unlike normal armor checks, we tabluate these piece-by-piece manually so we can also pass on appropriate damage the clothing's limbs if necessary
|
||||
armor_ablation += C.armor.getRating(WOUND)
|
||||
if(wounding_type == WOUND_SLASH)
|
||||
C.take_damage_zone(body_zone, damage, BRUTE, armour_penetration)
|
||||
C.take_damage_zone(body_zone, damage, BRUTE)
|
||||
else if(wounding_type == WOUND_BURN && damage >= 10) // lazy way to block freezing from shredding clothes without adding another var onto apply_damage()
|
||||
C.take_damage_zone(body_zone, damage, BURN, armour_penetration)
|
||||
C.take_damage_zone(body_zone, damage, BURN)
|
||||
|
||||
if(!armor_ablation)
|
||||
injury_mod += bare_wound_bonus
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
|
||||
return FALSE
|
||||
. = list()
|
||||
var/organ_spilled = 0
|
||||
var/turf/T = get_turf(C)
|
||||
C.add_splatter_floor(T)
|
||||
playsound(get_turf(C), 'sound/misc/splort.ogg', 80, TRUE)
|
||||
@@ -70,16 +69,11 @@
|
||||
continue
|
||||
O.Remove(C)
|
||||
O.forceMove(T)
|
||||
organ_spilled = 1
|
||||
. += X
|
||||
if(cavity_item)
|
||||
cavity_item.forceMove(T)
|
||||
. += cavity_item
|
||||
cavity_item = null
|
||||
organ_spilled = 1
|
||||
|
||||
if(organ_spilled)
|
||||
C.visible_message("<span class='danger'><B>[C]'s internal organs spill out onto the floor!</B></span>")
|
||||
|
||||
|
||||
|
||||
@@ -177,7 +171,7 @@
|
||||
/**
|
||||
* try_dismember() is used, once we've confirmed that a flesh and bone bodypart has both the skin and bone mangled, to actually roll for it
|
||||
*
|
||||
* Mangling is described in the above proc, [/obj/item/bodypart/proc/get_mangled_state()]. This simply makes the roll for whether we actually dismember or not
|
||||
* Mangling is described in the above proc, [/obj/item/bodypart/proc/get_mangled_state]. This simply makes the roll for whether we actually dismember or not
|
||||
* using how damaged the limb already is, and how much damage this blow was for. If we have a critical bone wound instead of just a severe, we add +10% to the roll.
|
||||
* Lastly, we choose which kind of dismember we want based on the wounding type we hit with. Note we don't care about all the normal mods or armor for this
|
||||
*
|
||||
@@ -191,17 +185,16 @@
|
||||
if(wounding_dmg < DISMEMBER_MINIMUM_DAMAGE)
|
||||
return
|
||||
|
||||
var/base_chance = wounding_dmg + (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart
|
||||
if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 10% more
|
||||
base_chance += 10
|
||||
var/base_chance = wounding_dmg
|
||||
base_chance += (get_damage() / max_damage * 50) // how much damage we dealt with this blow, + 50% of the damage percentage we already had on this bodypart
|
||||
|
||||
if(!prob(base_chance))
|
||||
return
|
||||
if(locate(/datum/wound/blunt/critical) in wounds) // we only require a severe bone break, but if there's a critical bone break, we'll add 15% more
|
||||
base_chance += 15
|
||||
|
||||
var/datum/wound/loss/dismembering = new
|
||||
dismembering.apply_dismember(src, wounding_type)
|
||||
|
||||
return TRUE
|
||||
if(prob(base_chance))
|
||||
var/datum/wound/loss/dismembering = new
|
||||
dismembering.apply_dismember(src, wounding_type)
|
||||
return TRUE
|
||||
|
||||
//when a limb is dropped, the internal organs are removed from the mob and put into the limb
|
||||
/obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/LB, mob/living/carbon/C)
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
|
||||
|
||||
/obj/item/bodypart/head/can_dismember(obj/item/I)
|
||||
if(owner && owner.stat <= HARD_CRIT)
|
||||
if(owner.stat < HARD_CRIT)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
wound_resistance = 10
|
||||
|
||||
/obj/item/bodypart/chest/can_dismember(obj/item/I)
|
||||
if(owner.stat <= HARD_CRIT || !get_organs())
|
||||
if(owner.stat < HARD_CRIT || !get_organs())
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -105,6 +105,9 @@
|
||||
attack_verb_simple = list("drill")
|
||||
tool_behaviour = TOOL_DRILL
|
||||
toolspeed = 1
|
||||
sharpness = SHARP_POINTY
|
||||
wound_bonus = 10
|
||||
bare_wound_bonus = 10
|
||||
|
||||
/obj/item/surgicaldrill/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] rams [src] into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
@@ -143,7 +146,8 @@
|
||||
sharpness = SHARP_EDGED
|
||||
tool_behaviour = TOOL_SCALPEL
|
||||
toolspeed = 1
|
||||
bare_wound_bonus = 20
|
||||
wound_bonus = 15
|
||||
bare_wound_bonus = 15
|
||||
|
||||
/obj/item/scalpel/Initialize()
|
||||
. = ..()
|
||||
@@ -180,8 +184,8 @@
|
||||
sharpness = SHARP_EDGED
|
||||
tool_behaviour = TOOL_SAW
|
||||
toolspeed = 1
|
||||
wound_bonus = 10
|
||||
bare_wound_bonus = 15
|
||||
wound_bonus = 15
|
||||
bare_wound_bonus = 10
|
||||
|
||||
/obj/item/circular_saw/Initialize()
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user