diff --git a/code/__defines/_macros.dm b/code/__defines/_macros.dm index ba0fda9e2a4..d45758236af 100644 --- a/code/__defines/_macros.dm +++ b/code/__defines/_macros.dm @@ -66,6 +66,8 @@ #define ismanipulator(A) istype(A, /obj/item/weapon/stock_parts/manipulator) +#define isprojectile(A) istype(A, /obj/item/projectile) + #define to_chat(target, message) target << message #define to_world(message) world << message #define sound_to(target, sound) target << sound diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 50636099049..53dfe5f4bba 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -63,6 +63,8 @@ var/list/genetic_markings // Markings (body_markings) to apply to the icon var/list/temporary_markings // Same as above, but not preserved when cloning var/list/cached_markings // The two above lists cached for perf. reasons. + var/maim_bonus = 0.75 //For special projectile gibbing calculation, dubbed "maiming" + var/can_be_maimed = TRUE //Can this limb be 'maimed'? /obj/item/organ/external/proc/invalidate_marking_cache() cached_markings = null @@ -301,22 +303,31 @@ //Check edge eligibility var/edge_eligible = 0 + var/gibs_traditionally = TRUE if(edge) if(istype(used_weapon,/obj/item)) var/obj/item/W = used_weapon - if(W.w_class >= w_class) - edge_eligible = 1 + + if(isprojectile(W)) //Maiming projectiles use a different method to calcualate gibbing. + var/obj/item/projectile/P = used_weapon + if(P.maiming) + gibs_traditionally = FALSE + + else + if(W.w_class >= w_class) + edge_eligible = 1 else edge_eligible = 1 - 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)) - droplimb(0, DROPLIMB_BURN) - else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute)) - droplimb(0, DROPLIMB_BLUNT) - else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF && prob(brute/3)) - droplimb(0, DROPLIMB_EDGE) + if(gibs_traditionally) + 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)) + droplimb(0, DROPLIMB_BURN) + else if(brute >= max_damage / DROPLIMB_THRESHOLD_DESTROY && prob(brute)) + droplimb(0, DROPLIMB_BLUNT) + else if(brute >= max_damage / DROPLIMB_THRESHOLD_TEAROFF && prob(brute/3)) + droplimb(0, DROPLIMB_EDGE) return update_icon() diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm index a0d35476ea8..6727925bfa5 100644 --- a/code/modules/organs/organ_stump.dm +++ b/code/modules/organs/organ_stump.dm @@ -2,6 +2,7 @@ name = "limb stump" icon_name = "" dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/stump/Initialize(mapload, var/internal, var/obj/item/organ/external/limb) if(istype(limb)) diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index f0aac616a16..5d20d5b405d 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -18,6 +18,7 @@ cannot_amputate = 1 parent_organ = null encased = "ribcage" + can_be_maimed = FALSE /obj/item/organ/external/groin name = "lower body" @@ -33,6 +34,7 @@ joint = "hip" dislocated = -1 gendered_icon = 1 + maim_bonus = 0.25 /obj/item/organ/external/arm limb_name = "l_arm" @@ -91,6 +93,7 @@ joint = "left ankle" amputation_point = "left ankle" can_stand = 1 + maim_bonus = 1 /obj/item/organ/external/foot/removed() if(owner) owner.drop_from_inventory(owner.shoes) @@ -118,6 +121,7 @@ joint = "left wrist" amputation_point = "left wrist" can_grasp = 1 + maim_bonus = 1 /obj/item/organ/external/hand/removed() owner.drop_from_inventory(owner.gloves) @@ -147,6 +151,7 @@ gendered_icon = 1 encased = "skull" var/can_intake_reagents = 1 + maim_bonus = 0.33 /obj/item/organ/external/head/removed() if(owner) diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm index 137249e7473..4ba7360e54d 100644 --- a/code/modules/organs/subtypes/unbreakable.dm +++ b/code/modules/organs/subtypes/unbreakable.dm @@ -6,39 +6,49 @@ /obj/item/organ/external/groin/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/arm/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/arm/right/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/leg/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/leg/right/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/foot/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/foot/right/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/hand/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/hand/right/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE /obj/item/organ/external/head/unbreakable cannot_break = 1 dislocated = -1 + can_be_maimed = FALSE diff --git a/code/modules/projectiles/guns/energy/mining.dm b/code/modules/projectiles/guns/energy/mining.dm index b8b3857b122..8334b3803df 100644 --- a/code/modules/projectiles/guns/energy/mining.dm +++ b/code/modules/projectiles/guns/energy/mining.dm @@ -320,12 +320,9 @@ muzzle_type = /obj/effect/projectile/trilaser/muzzle tracer_type = /obj/effect/projectile/trilaser/tracer impact_type = /obj/effect/projectile/trilaser/impact - + maiming = 1 + maim_rate = 3 /obj/item/projectile/beam/plasmacutter/on_impact(var/atom/A) - strike_thing(A) - . = ..() - -/obj/item/projectile/beam/plasmacutter/proc/strike_thing(var/atom/A) if(istype(A, /turf/simulated/mineral)) var/turf/simulated/mineral/M = A if(prob(33)) @@ -334,14 +331,4 @@ else if(prob(88)) M.emitter_blasts_taken += 2 M.emitter_blasts_taken += 1 - - else if(istype(A, /mob/living)) - var/mob/living/L = A - L.apply_damage(damage, BRUTE, def_zone) - if(istype(A, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = L - var/ultimate_def_zone = check_zone(def_zone) - if(H.has_organ(ultimate_def_zone)) - var/obj/item/organ/external/E = H.get_organ(ultimate_def_zone) - if(E.damage > 15 && prob((3*E.damage))) - E.droplimb(0,DROPLIMB_EDGE) + . = ..() \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 5bac8ad89af..c62c892de43 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -63,6 +63,17 @@ var/hitscan = 0 // whether the projectile should be hitscan var/step_delay = 1 // the delay between iterations if not a hitscan projectile + //For Maim / Maiming. + var/maiming = 0 //Enables special limb dismemberment calculation; used primarily for ranged weapons that can maim, but do not do brute damage. + var/maim_rate = 0 //Factor that the recipiant will be maimed by the projectile (NOT OUT OF 100%.) + var/clean_cut = 0 //Is the delimbning painful and unclean? Probably. Can be a function or proc, if you're doing something odd. + var/maim_type = DROPLIMB_EDGE + /*Does the projectile simply lop/tear the limb off, or does it vaporize it? + Set maim_type to DROPLIMB_EDGE to chop off the limb + set maim_type to DROPLIMB_BURN to vaporize it. + set maim_type to DROPLIMB_BLUNT to gib (Explode/Hamburger) the limb. + */ + // effect types to be used var/muzzle_type var/tracer_type @@ -75,24 +86,37 @@ //TODO: make it so this is called more reliably, instead of sometimes by bullet_act() and sometimes not /obj/item/projectile/proc/on_hit(var/atom/target, var/blocked = 0, var/def_zone = null) - if(blocked >= 100) return 0//Full block - if(!isliving(target)) return 0 - if(isanimal(target)) return 0 + if(blocked >= 100) + return 0//Full block + if(!isliving(target)) + return 0 + if(isanimal(target)) + return 0 + var/mob/living/L = target - if (agony && ishuman(target)) + + if (ishuman(target)) var/mob/living/carbon/human/H = target var/obj/item/organ/external/organ = H.get_organ(def_zone) var/armor = H.getarmor_organ(organ, check_armour) - agony = max(0, agony - armor) + if(agony) + agony = max(0, agony - armor) - L.apply_effects(stun, weaken, paralyze, 0, stutter, eyeblur, drowsy, agony, incinerate, blocked) // add in AGONY! - //radiation protection is handled separately from other armour types. - L.apply_effect(irradiate, IRRADIATE, L.getarmor(null, "rad")) + /* + Maim / Maiming check. Disembody a limb depending on several factors. + + can_be_maimed and maim_bonus are defined on 'obj/item/organ/external'. + */ + if(organ.can_be_maimed && maiming) + if(prob(maim_rate * (organ.get_damage() * organ.maim_bonus))) + organ.droplimb(clean_cut,maim_type) + L.apply_effects(stun, weaken, paralyze, 0, stutter, eyeblur, drowsy, agony, incinerate, blocked) + L.apply_effect(irradiate, IRRADIATE, L.getarmor(null, "rad")) //radiation protection is handled separately from other armour types. return 1 //called when the projectile stops flying because it collided with something /obj/item/projectile/proc/on_impact(var/atom/A) - impact_effect(effect_transform) // generate impact effect + impact_effect(effect_transform) // generate an impact effect return //Checks if the projectile is eligible for embedding. Not that it necessarily will. diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 66ca3ce3cb5..c7e3a61ac4b 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -135,6 +135,9 @@ /obj/item/projectile/bullet/pistol/strong //revolvers and matebas damage = 60 + maiming = 1 + maim_rate = 25 + maim_type = DROPLIMB_BLUNT /obj/item/projectile/bullet/pistol/rubber //"rubber" bullets name = "rubber bullet" @@ -149,6 +152,8 @@ /obj/item/projectile/bullet/shotgun name = "slug" damage = 60 + maiming = 1 //To prevent rando headgibbing, it uses the special headgib damage model. Don't get me wrong, it'll still kill the man, but could be cloned. + maim_rate = 25 /obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets name = "beanbag" @@ -175,6 +180,9 @@ pellets = 6 range_step = 1 spread_step = 10 + maiming = 1 + maim_rate = 1 //6% base chance of gib if all pellets hit. Likely to blow limbs at point blank. (As it should be.) + maim_type = DROPLIMB_BLUNT /* "Rifle" rounds */ @@ -199,6 +207,9 @@ penetrating = 5 armor_penetration = 80 hitscan = 1 //so the PTR isn't useless as a sniper weapon + maiming = 1 + maim_rate = 60 + maim_type = DROPLIMB_BLUNT /obj/item/projectile/bullet/rifle/vintage name = "vintage bullet" diff --git a/html/changelogs/chaoko99-plasma_cutter_burfs.yml b/html/changelogs/chaoko99-plasma_cutter_burfs.yml new file mode 100644 index 00000000000..8b5f1e46dce --- /dev/null +++ b/html/changelogs/chaoko99-plasma_cutter_burfs.yml @@ -0,0 +1,39 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +################################# + +# Your name. +author: Chaoko99 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added SUPER MAIM: A unified system for dice-roll gibbing per limb, rather than a flat chance without respect to body part." + - bugfix: "Fixed the plasma cutter's inability to dismember." + - experiment: "Changed the following weapons and their ammo to use SUPER MAIM: Desert Eagle (.50), Anti-Material Sniper Rifle (a145), Mateba (.357), Plasma Cutter. Buckshot."