From 37a8410d38ad1d9c2adeba525cc90c4b373781b2 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Thu, 17 May 2018 17:52:24 -0700 Subject: [PATCH] Tweak Prometheans, Again. --- code/modules/organs/organ_external.dm | 32 ++++++++++++++++------- code/modules/organs/subtypes/slime.dm | 31 +++++++++++++++------- html/changelogs/Mechoid - Prometheans.yml | 9 +++++++ 3 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 html/changelogs/Mechoid - Prometheans.yml diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 57c06cbb8ec..4bc94770878 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -24,6 +24,7 @@ var/brute_dam = 0 // Actual current brute damage. var/burn_dam = 0 // Actual current burn damage. var/last_dam = -1 // used in healing/processing calculations. + var/spread_dam = 0 // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. @@ -253,7 +254,7 @@ //Continued damage to vital organs can kill you, and robot organs don't count towards total damage so no need to cap them. return (vital || (robotic >= ORGAN_ROBOT) || brute_dam + burn_dam + additional_damage < max_damage) -/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) +/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list(), permutation = 0) brute = round(brute * brute_mod, 0.1) burn = round(burn * burn_mod, 0.1) @@ -280,6 +281,8 @@ // If the limbs can break, make sure we don't exceed the maximum damage a limb can take before breaking // Non-vital organs are limited to max_damage. You can't kill someone by bludeonging their arm all the way to 200 -- you can // push them faster into paincrit though, as the additional damage is converted into shock. + var/brute_overflow = 0 + var/burn_overflow = 0 if(is_damageable(brute + burn) || !config.limbs_can_break) if(brute) if(can_cut) @@ -306,20 +309,22 @@ createwound( CUT, min(brute,can_inflict) ) else createwound( BRUISE, min(brute,can_inflict) ) - var/temp = can_inflict - //How much mroe damage can we inflict - can_inflict = max(0, can_inflict - brute) + //How much more damage can we inflict + brute_overflow = max(0, brute - can_inflict) //How much brute damage is left to inflict - spillover += max(0, brute - temp) + spillover += max(0, brute - can_inflict) + + can_inflict = max_damage * config.organ_health_multiplier - (brute_dam + burn_dam) //Refresh the can_inflict var, so burn doesn't overload the limb if it is set to take both. if (burn > 0 && can_inflict) //Inflict all burn damage we can createwound(BURN, min(burn,can_inflict)) //How much burn damage is left to inflict - spillover += max(0, burn - can_inflict) + burn_overflow = max(0, burn - can_inflict) + spillover += burn_overflow - //If there are still hurties to dispense - if (spillover) + //If there is pain to dispense. + if(spillover) owner.shock_stage += spillover * config.organ_damage_spillover_multiplier // sync the organ's damage with its wounds @@ -348,12 +353,19 @@ if(edge_eligible && brute >= max_damage / DROPLIMB_THRESHOLD_EDGE && prob(brute)) droplimb(0, DROPLIMB_EDGE) - else if(burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(burn/3)) + else if((burn >= max_damage / DROPLIMB_THRESHOLD_DESTROY) || (nonsolid && burn >= 5 && (burn_dam + burn >= max_damage)) && prob(burn/3)) droplimb(0, DROPLIMB_BURN) - else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute)) + else if((brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute)) || (nonsolid && brute >= 5 && (brute_dam + brute >= max_damage) && prob(brute/2))) droplimb(0, DROPLIMB_BLUNT) else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF && prob(brute/3)) droplimb(0, DROPLIMB_EDGE) + else if(spread_dam && owner && parent && (brute_overflow || burn_overflow) && (brute_overflow >= 5 || burn_overflow >= 5) && !permutation) //No infinite damage loops. + if(children && children.len) + spawn() + for(var/obj/item/organ/external/C in children) + if(!C.is_stump()) + C.take_damage(brute_overflow / children.len / 3, burn_overflow / children.len / 3, 0, 0, null, forbidden_limbs, 1) //Splits the damage to each individual 'child', incase multiple exist. + parent.take_damage(brute_overflow / 3, burn_overflow / 3, 0, 0, null, forbidden_limbs, 1) return update_icon() diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index 1c9c11d75bc..f22b90caea2 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -2,46 +2,57 @@ nonsolid = 1 max_damage = 50 encased = 0 + spread_dam = 1 /obj/item/organ/external/groin/unbreakable/slime nonsolid = 1 max_damage = 30 + spread_dam = 1 /obj/item/organ/external/arm/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/arm/right/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/leg/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/leg/right/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/foot/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/foot/right/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/hand/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/hand/right/unbreakable/slime nonsolid = 1 - max_damage = 5 + max_damage = 20 + spread_dam = 1 /obj/item/organ/external/head/unbreakable/slime //They don't need this anymore. nonsolid = 1 cannot_gib = 0 vital = 0 - max_damage = 5 - encased = 0 \ No newline at end of file + max_damage = 30 + encased = 0 + spread_dam = 1 diff --git a/html/changelogs/Mechoid - Prometheans.yml b/html/changelogs/Mechoid - Prometheans.yml new file mode 100644 index 00000000000..fa812e227e5 --- /dev/null +++ b/html/changelogs/Mechoid - Prometheans.yml @@ -0,0 +1,9 @@ + +author: Mechoid + +delete-after: True + +changes: + - rsctweak: "Promethean limbs store more damage." + - rsctweak: "Promethean limbs, in addition to normal severing rules, have a higher chance to be splattered or ashed once they reach maximum damage." + - rscadd: "Limbs can now spread their damage with the spread_dam var, when reaching max damage."