From f56e32ab97e69ec92223474b22fea9dc0f6d5cce Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Mon, 7 Sep 2020 04:12:52 +0200
Subject: [PATCH] [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>
---
code/datums/wounds/_wounds.dm | 6 ++--
code/datums/wounds/pierce.dm | 20 +++++++----
code/datums/wounds/slash.dm | 14 +++++---
code/game/objects/items/dualsaber.dm | 2 +-
code/game/objects/items/melee/transforming.dm | 3 +-
code/game/objects/items/powerfist.dm | 3 +-
.../changeling/powers/mutations.dm | 2 +-
code/modules/antagonists/cult/cult_items.dm | 8 ++---
.../food_and_drinks/food/snacks_other.dm | 2 +-
.../mob/living/carbon/carbon_defense.dm | 5 ++-
.../mob/living/carbon/human/human_defense.dm | 5 ++-
.../human/species_types/shadowpeople.dm | 2 +-
.../carbon/human/species_types/zombies.dm | 2 ++
code/modules/surgery/bodyparts/_bodyparts.dm | 35 ++++++++-----------
.../surgery/bodyparts/dismemberment.dm | 25 +++++--------
code/modules/surgery/bodyparts/head.dm | 2 +-
code/modules/surgery/bodyparts/parts.dm | 2 +-
code/modules/surgery/tools.dm | 10 ++++--
18 files changed, 80 insertions(+), 68 deletions(-)
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 3ec83cbf535..833631aa3cb 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -228,8 +228,10 @@
var/allowed = FALSE
- // check if we have a valid treatable tool (or, if cauteries are allowed, if we have something hot)
- if((I.tool_behaviour == treatable_tool) || (treatable_tool == TOOL_CAUTERY && I.get_temperature()))
+ // check if we have a valid treatable tool
+ if(I.tool_behaviour == treatable_tool)
+ allowed = TRUE
+ else if(treatable_tool == TOOL_CAUTERY && I.get_temperature() && user == victim) // allow improvised cauterization on yourself without an aggro grab
allowed = TRUE
// failing that, see if we're aggro grabbing them and if we have an item that works for aggro grabs only
else if(user.pulling == victim && user.grab_state >= GRAB_AGGRESSIVE && check_grab_treatments(I, user))
diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm
index 6ef74bee556..d589c9f199b 100644
--- a/code/datums/wounds/pierce.dm
+++ b/code/datums/wounds/pierce.dm
@@ -72,10 +72,14 @@
if(blood_flow <= 0)
qdel(src)
+/datum/wound/pierce/check_grab_treatments(obj/item/I, mob/user)
+ if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording
+ return TRUE
+
/datum/wound/pierce/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/medical/suture))
suture(I, user)
- else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
+ else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature())
tool_cauterize(I, user)
/datum/wound/pierce/on_xadone(power)
@@ -86,14 +90,14 @@
. = ..()
blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
-/// If someone is using a suture to close this cut
+/// If someone is using a suture to close this puncture
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1.4 : 1)
user.visible_message("[user] begins stitching [victim]'s [limb.name] with [I]...", "You begin stitching [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("[user] stitches up some of the bleeding on [victim].", "You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"].")
- var/blood_sutured = I.stop_bleeding / self_penalty_mult * 0.5
+ var/blood_sutured = I.stop_bleeding / self_penalty_mult
blood_flow -= blood_sutured
limb.heal_damage(I.heal_brute, I.heal_burn)
I.use(1)
@@ -105,16 +109,18 @@
/// If someone is using either a cautery tool or something with heat to cauterize this pierce
/datum/wound/pierce/proc/tool_cauterize(obj/item/I, mob/user)
- var/self_penalty_mult = (user == victim ? 1.5 : 1)
- user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
- if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery
+ var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself
+
+ user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].")
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(30))
victim.emote("scream")
- var/blood_cauterized = (0.6 / self_penalty_mult) * 0.5
+ var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
blood_flow -= blood_cauterized
if(blood_flow > 0)
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index 039d4e393b9..20a3220e42e 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -131,11 +131,13 @@
/datum/wound/slash/check_grab_treatments(obj/item/I, mob/user)
if(istype(I, /obj/item/gun/energy/laser))
return TRUE
+ if(I.get_temperature()) // if we're using something hot but not a cautery, we need to be aggro grabbing them first, so we don't try treating someone we're eswording
+ return TRUE
/datum/wound/slash/treat(obj/item/I, mob/user)
if(istype(I, /obj/item/gun/energy/laser))
las_cauterize(I, user)
- else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature() > 300)
+ else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature())
tool_cauterize(I, user)
else if(istype(I, /obj/item/stack/medical/suture))
suture(I, user)
@@ -201,16 +203,18 @@
/// If someone is using either a cautery tool or something with heat to cauterize this cut
/datum/wound/slash/proc/tool_cauterize(obj/item/I, mob/user)
- var/self_penalty_mult = (user == victim ? 1.5 : 1)
- user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
- if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
+ var/improv_penalty_mult = (I.tool_behaviour == TOOL_CAUTERY ? 1 : 1.25) // 25% longer and less effective if you don't use a real cautery
+ var/self_penalty_mult = (user == victim ? 1.5 : 1) // 50% longer and less effective if you do it to yourself
+
+ user.visible_message("[user] begins cauterizing [victim]'s [limb.name] with [I]...", "You begin cauterizing [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...")
+ if(!do_after(user, base_treat_time * self_penalty_mult * improv_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
return
user.visible_message("[user] cauterizes some of the bleeding on [victim].", "You cauterize some of the bleeding on [victim].")
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(30))
victim.emote("scream")
- var/blood_cauterized = (0.6 / self_penalty_mult)
+ var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
blood_flow -= blood_cauterized
if(blood_flow > minimum_flow)
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index 6df92f87367..c72bf2811e9 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -26,7 +26,7 @@
max_integrity = 200
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70)
resistance_flags = FIRE_PROOF
- wound_bonus = -110
+ wound_bonus = -10
bare_wound_bonus = 20
var/w_class_on = WEIGHT_CLASS_BULKY
var/saber_color = "green"
diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm
index 17640b3ef59..72e5e4d0979 100644
--- a/code/game/objects/items/melee/transforming.dm
+++ b/code/game/objects/items/melee/transforming.dm
@@ -1,5 +1,6 @@
/obj/item/melee/transforming
sharpness = SHARP_EDGED
+ bare_wound_bonus = 20
var/active = FALSE
var/force_on = 30 //force when active
var/faction_bonus_force = 0 //Bonus force dealt against certain factions
@@ -13,8 +14,6 @@
var/list/nemesis_factions //Any mob with a faction that exists in this list will take bonus damage/effects
var/w_class_on = WEIGHT_CLASS_BULKY
var/clumsy_check = TRUE
- wound_bonus = -30
- bare_wound_bonus = 40
/obj/item/melee/transforming/Initialize()
. = ..()
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index bfe8af29a33..0d3b54867bf 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -97,7 +97,8 @@
target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \
"[user]'s punch strikes with force!")
return
- target.apply_damage(force * fisto_setting, BRUTE, wound_bonus = -25*fisto_setting**2)
+
+ target.apply_damage(force * fisto_setting, BRUTE, wound_bonus = CANT_WOUND)
target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \
"You cry out in pain as [user]'s punch flings you backwards!")
new /obj/effect/temp_visual/kinetic_blast(target.loc)
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index b69a2a5b286..97be416f04f 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -163,7 +163,7 @@
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
sharpness = SHARP_EDGED
- wound_bonus = -60
+ wound_bonus = -20
bare_wound_bonus = 20
var/can_drop = FALSE
var/fake = FALSE
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
index d7ff7ad1411..c6945877265 100644
--- a/code/modules/antagonists/cult/cult_items.dm
+++ b/code/modules/antagonists/cult/cult_items.dm
@@ -19,8 +19,8 @@
w_class = WEIGHT_CLASS_SMALL
force = 15
throwforce = 25
- wound_bonus = -30
- bare_wound_bonus = 30
+ wound_bonus = -10
+ bare_wound_bonus = 20
armour_penetration = 35
actions_types = list(/datum/action/item_action/cult_dagger)
var/drawing_rune = FALSE
@@ -43,8 +43,8 @@
w_class = WEIGHT_CLASS_BULKY
force = 30 // whoever balanced this got beat in the head by a bible too many times good lord
throwforce = 10
- wound_bonus = -80
- bare_wound_bonus = 30
+ wound_bonus = -50
+ bare_wound_bonus = 20
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends")
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend")
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 652176caa70..2232ddb2a5d 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -463,7 +463,7 @@
throwforce = 15
block_chance = 55
armour_penetration = 80
- wound_bonus = -70
+ wound_bonus = -50
attack_verb_continuous = list("slaps", "slathers")
attack_verb_simple = list("slap", "slather")
w_class = WEIGHT_CLASS_BULKY
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 6bc7ea0cd90..44fa6b96a54 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -73,7 +73,10 @@
if(user == src)
affecting = get_bodypart(check_zone(user.zone_selected)) //we're self-mutilating! yay!
else
- affecting = get_bodypart(ran_zone(user.zone_selected))
+ var/zone_hit_chance = 80
+ if(!(mobility_flags & MOBILITY_STAND)) // half as likely to hit a different zone if they're on the ground
+ zone_hit_chance += 10
+ affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance))
if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest)
affecting = bodyparts[1]
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 5cbc75c2467..951558b3e6d 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -173,7 +173,10 @@
if(user == src)
affecting = get_bodypart(check_zone(user.zone_selected)) //stabbing yourself always hits the right target
else
- affecting = get_bodypart(ran_zone(user.zone_selected))
+ var/zone_hit_chance = 80
+ if(!(mobility_flags & MOBILITY_STAND)) // half as likely to hit a different zone if they're on the ground
+ zone_hit_chance += 10
+ affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance))
var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target
SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index da5b764730a..931fe4eb369 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -173,7 +173,7 @@
item_flags = ABSTRACT | DROPDEL
w_class = WEIGHT_CLASS_HUGE
sharpness = SHARP_EDGED
- wound_bonus = -60
+ wound_bonus = -30
bare_wound_bonus = 20
/obj/item/light_eater/Initialize()
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index a2b3d7e2dbe..38633d2e3a8 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -99,5 +99,7 @@
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
mutanttongue = /obj/item/organ/tongue/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
+ species_traits = list(HAS_FLESH, HAS_BONE)
+ inherent_traits = list(TRAIT_EASYLIMBWOUND)
#undef REGENERATION_DELAY
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 4fa2479164d..d5907ce04b6 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -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
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 37668288362..07b5bff1253 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -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("[C]'s internal organs spill out onto the floor!")
@@ -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)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index aa35dd70646..a9d377f0d8d 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -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 ..()
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index a84cb1a2c2f..40cf4b50b16 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -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 ..()
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index bd58c70c3f9..2a32e3b1887 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -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("[user] rams [src] into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")
@@ -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()
. = ..()