mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-25 06:00:16 +01:00
This reverts commit 34b8d43390.
This commit is contained in:
@@ -65,19 +65,6 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu
|
||||
/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate,
|
||||
/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate, /datum/wound/muscle/severe, /datum/wound/muscle/moderate))
|
||||
|
||||
//SKYRAT EDIT BEGIN
|
||||
GLOBAL_LIST_INIT(global_wound_types_synth, list(WOUND_BLUNT = list(),
|
||||
WOUND_SLASH = list(/datum/wound/synthetic/slash/critical, /datum/wound/synthetic/slash/severe, /datum/wound/synthetic/slash/moderate),
|
||||
WOUND_PIERCE = list(/datum/wound/synthetic/pierce/critical, /datum/wound/synthetic/pierce/severe, /datum/wound/synthetic/pierce/moderate),
|
||||
WOUND_BURN = list(/datum/wound/synthetic/burn/critical, /datum/wound/synthetic/burn/severe, /datum/wound/synthetic/burn/moderate),
|
||||
WOUND_MUSCLE = list(/datum/wound/synthetic/muscle/severe, /datum/wound/synthetic/muscle/moderate)
|
||||
))
|
||||
// every single type of wound that can be rolled naturally, in case you need to pull a random one
|
||||
GLOBAL_LIST_INIT(global_all_wound_types_synth, list(/datum/wound/synthetic/slash/critical, /datum/wound/synthetic/slash/severe, /datum/wound/synthetic/slash/moderate,
|
||||
/datum/wound/synthetic/pierce/critical, /datum/wound/synthetic/pierce/severe, /datum/wound/synthetic/pierce/moderate,
|
||||
/datum/wound/synthetic/burn/critical, /datum/wound/synthetic/burn/severe, /datum/wound/synthetic/burn/moderate,
|
||||
/datum/wound/synthetic/muscle/severe, /datum/wound/synthetic/muscle/moderate))
|
||||
//SKYRAT EDIT END
|
||||
|
||||
// ~burn wound infection defines
|
||||
// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
* * smited- If this is a smite, we don't care about this wound for stat tracking purposes (not yet implemented)
|
||||
*/
|
||||
/datum/wound/proc/apply_wound(obj/item/bodypart/L, silent = FALSE, datum/wound/old_wound = null, smited = FALSE)
|
||||
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED)) //SKYRAT EDIT
|
||||
if(!istype(L) || !L.owner || !(L.body_zone in viable_zones) || !L.is_organic_limb() || HAS_TRAIT(L.owner, TRAIT_NEVER_WOUNDED))
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -1209,13 +1209,8 @@
|
||||
else
|
||||
wound_type = forced_type
|
||||
else
|
||||
//SKYRAT EDIT BEGIN
|
||||
switch(scar_part.status)
|
||||
if(BODYPART_ROBOTIC)
|
||||
wound_type = pick(GLOB.global_all_wound_types_synth)
|
||||
if(BODYPART_ORGANIC)
|
||||
wound_type = pick(GLOB.global_all_wound_types)
|
||||
//SKYRAT EDIT END
|
||||
wound_type = pick(GLOB.global_all_wound_types)
|
||||
|
||||
var/datum/wound/phantom_wound = new wound_type
|
||||
scaries.generate(scar_part, phantom_wound)
|
||||
scaries.fake = TRUE
|
||||
|
||||
@@ -448,14 +448,8 @@
|
||||
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] SKRYAT EDIT ORIGINAL
|
||||
//SKYRAT EDIT CHANGE START
|
||||
var/list/wounds_checking
|
||||
if((owner.mob_biotypes & (MOB_ROBOTIC)) || src.status == BODYPART_ROBOTIC)
|
||||
wounds_checking = GLOB.global_wound_types_synth[woundtype]
|
||||
if((owner.mob_biotypes & MOB_ORGANIC) || !src.status == BODYPART_ROBOTIC)
|
||||
wounds_checking = GLOB.global_wound_types[woundtype]
|
||||
//SKYRAT EDIT END
|
||||
var/list/wounds_checking = GLOB.global_wound_types[woundtype]
|
||||
|
||||
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)
|
||||
@@ -1015,10 +1009,9 @@
|
||||
/obj/item/bodypart/proc/get_bleed_rate()
|
||||
if(HAS_TRAIT(owner, TRAIT_NOBLEED))
|
||||
return
|
||||
/* SKYRAT EDIT REMOVAL
|
||||
if(status != BODYPART_ORGANIC) // maybe in the future we can bleed oil from aug parts, but not now
|
||||
return
|
||||
*/ //SKYRAT EDIT END
|
||||
|
||||
var/bleed_rate = 0
|
||||
if(generic_bleedstacks > 0)
|
||||
bleed_rate += 0.5
|
||||
|
||||
+5
-10
@@ -2,7 +2,6 @@
|
||||
say_mod = "beeps"
|
||||
default_color = "00FF00"
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
species_traits = list(HAS_FLESH)
|
||||
inherent_traits = list(
|
||||
TRAIT_CAN_STRIP,
|
||||
TRAIT_ADVANCEDTOOLUSER,
|
||||
@@ -20,10 +19,10 @@
|
||||
mutant_bodyparts = list()
|
||||
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT
|
||||
reagent_flags = PROCESS_SYNTHETIC
|
||||
burnmod = 1 // Every 0.1% is 10% above the base.
|
||||
brutemod = 1
|
||||
coldmod = 0.6 //Synths take less burn from cold.
|
||||
heatmod = 1.4 //But slightly more from burn
|
||||
burnmod = 1.5 // Every 0.1% is 10% above the base.
|
||||
brutemod = 1.6
|
||||
coldmod = 1.2
|
||||
heatmod = 2
|
||||
siemens_coeff = 1.4 //Not more because some shocks will outright crit you, which is very unfun
|
||||
payday_modifier = 0.5 //Robots are cheep labor
|
||||
species_language_holder = /datum/language_holder/machine
|
||||
@@ -41,7 +40,7 @@
|
||||
|
||||
/datum/species/robotic/spec_life(mob/living/carbon/human/H)
|
||||
if(H.stat == SOFT_CRIT || H.stat == HARD_CRIT)
|
||||
H.adjustFireLoss(0.7)
|
||||
H.adjustFireLoss(1) //Still deal some damage in case a cold environment would be preventing us from the sweet release to robot heaven
|
||||
H.adjust_bodytemperature(13) //We're overheating!!
|
||||
if(prob(10))
|
||||
to_chat(H, "<span class='warning'>Alert: Critical damage taken! Cooling systems failing!</span>")
|
||||
@@ -67,7 +66,6 @@
|
||||
name = "I.P.C."
|
||||
id = "ipc"
|
||||
species_traits = list(
|
||||
HAS_FLESH,
|
||||
ROBOTIC_DNA_ORGANS,
|
||||
MUTCOLORS_PARTSONLY,
|
||||
EYECOLOR,
|
||||
@@ -145,7 +143,6 @@
|
||||
name = "Synthetic Lizardperson"
|
||||
id = "synthliz"
|
||||
species_traits = list(
|
||||
HAS_FLESH,
|
||||
ROBOTIC_DNA_ORGANS,
|
||||
MUTCOLORS,EYECOLOR,
|
||||
LIPS,
|
||||
@@ -181,7 +178,6 @@
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
default_color = "4B4B4B"
|
||||
species_traits = list(
|
||||
HAS_FLESH,
|
||||
ROBOTIC_DNA_ORGANS,
|
||||
MUTCOLORS,EYECOLOR,
|
||||
LIPS,HAIR,
|
||||
@@ -266,7 +262,6 @@
|
||||
say_mod = "states"
|
||||
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
|
||||
species_traits = list(
|
||||
HAS_FLESH,
|
||||
ROBOTIC_DNA_ORGANS,
|
||||
EYECOLOR,
|
||||
LIPS,
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
https://github.com/Skyrat-SS13/Skyrat-tg/pull/6359
|
||||
|
||||
## Title: Synthetic Wounds
|
||||
|
||||
MODULE ID: SYNTHETICWOUNDS
|
||||
|
||||
### Description:
|
||||
|
||||
Synthetic wounds.
|
||||
|
||||
### TG Proc Changes:
|
||||
|
||||
- TBD
|
||||
|
||||
### Defines:
|
||||
|
||||
- N/A
|
||||
|
||||
### Master file additions
|
||||
|
||||
- N/A
|
||||
|
||||
### Included files that are not contained in this module:
|
||||
|
||||
- N/A
|
||||
|
||||
### Credits:
|
||||
- Yawet330, original code
|
||||
- Gandalf, additional changes
|
||||
- Tf4, more changes
|
||||
@@ -1,241 +0,0 @@
|
||||
/*
|
||||
Burn wounds
|
||||
*/
|
||||
|
||||
// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code
|
||||
/datum/wound/synthetic/burn
|
||||
name = "Burn Wound"
|
||||
a_or_from = "from"
|
||||
wound_type = WOUND_BURN
|
||||
processes = TRUE
|
||||
sound_effect = 'sound/effects/wounds/sizzle1.ogg'
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
treatable_by = list(/obj/item/stack/cable_coil, /obj/item/stack/sticky_tape/surgical) // sterilizer and alcohol will require reagent treatments, coming soon
|
||||
|
||||
// Flesh damage vars
|
||||
/// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed
|
||||
var/flesh_damage = 5
|
||||
/// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage
|
||||
var/flesh_healing = 0
|
||||
|
||||
// Infestation vars (only for severe and critical)
|
||||
/// How quickly infection breeds on this burn if we don't have disinfectant
|
||||
var/infestation_rate = 0
|
||||
/// Our current level of infection
|
||||
var/infestation = 0
|
||||
/// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infestation effects each tick
|
||||
var/sanitization = 0
|
||||
|
||||
/// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen)
|
||||
var/strikes_to_lose_limb = 3
|
||||
|
||||
|
||||
/datum/wound/synthetic/burn/handle_process()
|
||||
. = ..()
|
||||
if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do
|
||||
if(prob(1))
|
||||
victim.adjustStaminaLoss(10)
|
||||
victim.visible_message("<span class='danger'>The heat damage on the remnants of [victim]'s melted [limb.name] arc violently and creak dangerously!</span>", "<span class='warning'>You feel a sudden drain from your [limb.name]; causing a heavy sense of exhaustion to rush through your circuitry.</span>", vision_distance = COMBAT_MESSAGE_RANGE)
|
||||
return
|
||||
|
||||
// here's the check to see if we're cleared up
|
||||
if(flesh_damage <= 0)
|
||||
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
infestation += infestation_rate //Infestation rate is indicative of burns getting worse due to short circuits
|
||||
|
||||
switch(infestation)
|
||||
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
|
||||
if(prob(30))
|
||||
victim.adjustStaminaLoss(2)
|
||||
if(prob(6))
|
||||
to_chat(victim, "<span class='warning'>The melted circuitry on your [limb.name] spark and zap weakly...</span>")
|
||||
if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
|
||||
if(!disabling && prob(2))
|
||||
to_chat(victim, "<span class='warning'><b>Your [limb.name] completely locks up, as you struggle to regain control over your circuitry!</b></span>")
|
||||
set_disabling(TRUE)
|
||||
else if(disabling && prob(8))
|
||||
to_chat(victim, "<span class='notice'>You regain sensation in your [limb.name], but it's still in terrible shape!</span>")
|
||||
set_disabling(FALSE)
|
||||
else if(prob(20))
|
||||
victim.adjustStaminaLoss(3)
|
||||
if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
|
||||
if(!disabling && prob(3))
|
||||
to_chat(victim, "<span class='warning'><b>You suddenly lose all sensation in your [limb.name]; the wiring far too damaged to sustain operation!</b></span>")
|
||||
set_disabling(TRUE)
|
||||
else if(disabling && prob(3))
|
||||
to_chat(victim, "<span class='notice'>You can barely feel your [limb.name] again, and you have to strain your processing core to retain motor control!</span>")
|
||||
set_disabling(FALSE)
|
||||
else if(prob(1))
|
||||
to_chat(victim, "<span class='warning'>You attempt diagnostics on your [limb.name]; and all it reports are dull errors...</span>")
|
||||
victim.adjustStaminaLoss(5)
|
||||
else if(prob(4))
|
||||
victim.adjustStaminaLoss(4)
|
||||
if(WOUND_INFECTION_SEPTIC to INFINITY)
|
||||
if(prob(infestation))
|
||||
switch(strikes_to_lose_limb)
|
||||
if(3 to INFINITY)
|
||||
to_chat(victim, "<span class='deadsay'>The metal and plastic sheathing on your [limb.name] is literally boiling off; you're in terrible shape!</span>")
|
||||
if(2)
|
||||
to_chat(victim, "<span class='deadsay'><b>The arcing in your [limb.name] is audibly buzzing, you feel as if the malfunctions are ever so slightly getting worse.</b></span>")
|
||||
if(1)
|
||||
to_chat(victim, "<span class='deadsay'><b>Your limb is all but unresponsive; [limb.name] is almost completely useless!</b></span>")
|
||||
if(0)
|
||||
to_chat(victim, "<span class='deadsay'><b>The last of the control circuits in your [limb.name] wither away beneath the heat, as the arcing and fire finally subsides; having destroyed all connection to the main housing.</b></span>")
|
||||
threshold_penalty = 120 // piss easy to destroy
|
||||
var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone)
|
||||
victim.gain_trauma(sepsis)
|
||||
strikes_to_lose_limb--
|
||||
|
||||
/datum/wound/synthetic/burn/get_examine_description(mob/user)
|
||||
if(strikes_to_lose_limb <= 0)
|
||||
return "<span class='deadsay'><B>[victim.p_their(TRUE)] [limb.name] has locked up completely and is non-functional.</B></span>"
|
||||
|
||||
var/list/condition = list("[victim.p_their(TRUE)] [limb.name] [examine_desc]")
|
||||
if(limb.current_gauze)
|
||||
var/bandage_condition
|
||||
switch(limb.current_gauze.absorption_capacity)
|
||||
if(0 to 1.25)
|
||||
bandage_condition = "nearly ruined"
|
||||
if(1.25 to 2.75)
|
||||
bandage_condition = "badly worn"
|
||||
if(2.75 to 4)
|
||||
bandage_condition = "slightly burnt"
|
||||
if(4 to INFINITY)
|
||||
bandage_condition = "clean"
|
||||
|
||||
condition += " underneath a dressing of [bandage_condition] [limb.current_gauze.name]"
|
||||
else
|
||||
switch(infestation)
|
||||
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
|
||||
condition += ", <span class='deadsay'>with small spots of flaked metal along the nearby support structure!</span>"
|
||||
if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
|
||||
condition += ", <span class='deadsay'>with growing lines of destroyed wiring.</span>"
|
||||
if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
|
||||
condition += ", <span class='deadsay'>with violent arcs of electricity!</span>"
|
||||
if(WOUND_INFECTION_SEPTIC to INFINITY)
|
||||
return "<span class='deadsay'><B>[victim.p_their(TRUE)] [limb.name] is a mess of charred metal and slagged plastic!</B></span>"
|
||||
else
|
||||
condition += "!"
|
||||
|
||||
return "<B>[condition.Join()]</B>"
|
||||
|
||||
/datum/wound/synthetic/burn/get_scanner_description(mob/user)
|
||||
if(strikes_to_lose_limb == 0)
|
||||
var/oopsie = "Type: [name]\nSeverity: [severity_text()]"
|
||||
oopsie += "<div class='ml-3'>Infection Level: <span class='deadsay'>The bodypart has suffered complete degredation and must be replaced. Amputate or augment limb immediately.</span></div>"
|
||||
return oopsie
|
||||
|
||||
. = ..()
|
||||
. += "<div class='ml-3'>"
|
||||
|
||||
if(infestation <= sanitization && flesh_damage <= flesh_healing)
|
||||
. += "No further treatment required: Burns will automatically repair shortly."
|
||||
else
|
||||
switch(infestation)
|
||||
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
|
||||
. += "Infection Level: Moderate\n"
|
||||
if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
|
||||
. += "Infection Level: Severe\n"
|
||||
if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
|
||||
. += "Infection Level: <span class='deadsay'>CRITICAL</span>\n"
|
||||
if(WOUND_INFECTION_SEPTIC to INFINITY)
|
||||
. += "Infection Level: <span class='deadsay'>LOSS IMMINENT</span>\n"
|
||||
if(infestation > sanitization)
|
||||
. += "\tCable coils, tape, or otherwise complete replacement of the limb will be effective.\n"
|
||||
|
||||
if(flesh_damage > 0)
|
||||
. += "Limb damage detected: Application of cable coil and tape will encourage automated repair systems to handle further damage.\n"
|
||||
. += "</div>"
|
||||
|
||||
/*
|
||||
new burn common procs
|
||||
*/
|
||||
|
||||
/// if someone is using ointment or mesh on our burns
|
||||
/datum/wound/synthetic/burn/proc/cablecoil(obj/item/I, mob/user)
|
||||
user.visible_message("<span class='notice'>[user] begins applying [I] to [victim]'s [limb.name]...</span>", "<span class='notice'>You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
|
||||
if(!do_after(user, (user == victim ? 10 : 5), extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] applies [I] to [victim].</span>", "<span class='green'>You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
|
||||
I.use(1)
|
||||
sanitization += 1
|
||||
flesh_healing += 3
|
||||
|
||||
if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage))
|
||||
to_chat(user, "<span class='notice'>You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.</span>")
|
||||
else
|
||||
try_treating(I, user)
|
||||
|
||||
/datum/wound/synthetic/burn/treat(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/cable_coil))
|
||||
cablecoil(I, user)
|
||||
else if(istype(I, /obj/item/stack/sticky_tape/surgical))
|
||||
var/obj/item/stack/sticky_tape/surgical = I
|
||||
cablecoil(surgical, user)
|
||||
|
||||
// people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored
|
||||
/datum/wound/synthetic/burn/on_stasis()
|
||||
. = ..()
|
||||
if(flesh_healing > 0)
|
||||
flesh_damage = max(0, flesh_damage - 0.2)
|
||||
if((flesh_damage <= 0) && (infestation <= WOUND_INFECTION_MODERATE))
|
||||
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if(sanitization > 0)
|
||||
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE * 0.2)
|
||||
|
||||
/datum/wound/synthetic/burn/on_synthflesh(amount)
|
||||
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
|
||||
|
||||
// we don't even care about first degree burns, straight to second
|
||||
/datum/wound/synthetic/burn/moderate
|
||||
name = "Minor Heatwarping"
|
||||
desc = "Synthetic is suffering minor damage to the outer-shell of their limb, usually caused by high-intensity heating."
|
||||
treat_text = "Recommended application of cable coil or tape to affected region."
|
||||
examine_desc = "is somewhat charred; sparking beneath its covering"
|
||||
occur_text = "sparks and smokes violently, small arcs coming from the surface"
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
damage_mulitplier_penalty = 1.1
|
||||
threshold_minimum = 40
|
||||
threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds
|
||||
status_effect_type = /datum/status_effect/wound/burn/moderate
|
||||
flesh_damage = 5
|
||||
scar_keyword = "burnmoderate"
|
||||
|
||||
/datum/wound/synthetic/burn/severe
|
||||
name = "Major Heatwarping"
|
||||
desc = "Synthetic is suffering major damage caused by heat exposure to the limb, repairs are essential for continued operation."
|
||||
treat_text = "Recommended immediate repair and replacement of damaged cables, followed by taping."
|
||||
examine_desc = "appears seriously charred, many areas melted beyond recognition"
|
||||
occur_text = "chars rapidly, several high-voltage arcs sparking from their limbs."
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
damage_mulitplier_penalty = 1.2
|
||||
threshold_minimum = 80
|
||||
threshold_penalty = 40
|
||||
status_effect_type = /datum/status_effect/wound/burn/severe
|
||||
treatable_by = list(/obj/item/stack/cable_coil, /obj/item/stack/sticky_tape/surgical)
|
||||
infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment
|
||||
flesh_damage = 12.5
|
||||
scar_keyword = "burnsevere"
|
||||
|
||||
/datum/wound/synthetic/burn/critical
|
||||
name = "Catastrophic Heatwarping"
|
||||
desc = "Synthetic has had their limb charred to the point of near-destruction, very little remains of the original design."
|
||||
treat_text = "Immediate intervention, usually by entirely replacing the burnt segments of their limb, followed by intense monitoring to ensure further damage does not occur"
|
||||
examine_desc = "is a horrifying mess of metal and plastic, the cabling having melted together"
|
||||
occur_text = "vaporizes as metal, plastic and cabling melts into one amorphous mass"
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
damage_mulitplier_penalty = 1.3
|
||||
sound_effect = 'sound/effects/wounds/sizzle2.ogg'
|
||||
threshold_minimum = 140
|
||||
threshold_penalty = 80
|
||||
status_effect_type = /datum/status_effect/wound/burn/critical
|
||||
treatable_by = list(/obj/item/stack/cable_coil, /obj/item/stack/sticky_tape/surgical)
|
||||
infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment
|
||||
flesh_damage = 20
|
||||
scar_keyword = "burncritical"
|
||||
@@ -1,206 +0,0 @@
|
||||
/*
|
||||
Muscle wounds. There is a chance to roll a muscle wound instead of others while doing brute damage
|
||||
*/
|
||||
|
||||
/datum/wound/synthetic/muscle
|
||||
name = "Muscle Wound"
|
||||
sound_effect = 'sound/effects/wounds/blood1.ogg'
|
||||
wound_type = WOUND_MUSCLE
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_SPLINT)
|
||||
viable_zones = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
processes = TRUE
|
||||
/// How much do we need to regen. Will regen faster if we're splinted and or laying down
|
||||
var/regen_ticks_needed
|
||||
/// Our current counter for healing
|
||||
var/regen_ticks_current = 0
|
||||
|
||||
/*
|
||||
Overwriting of base procs
|
||||
*/
|
||||
/datum/wound/synthetic/muscle/wound_injury(datum/wound/old_wound = null)
|
||||
// hook into gaining/losing gauze so crit muscle wounds can re-enable/disable depending if they're slung or not
|
||||
RegisterSignal(limb, list(COMSIG_BODYPART_SPLINTED, COMSIG_BODYPART_SPLINT_DESTROYED), .proc/update_inefficiencies)
|
||||
|
||||
RegisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/attack_with_hurt_hand)
|
||||
if(limb.held_index && victim.get_item_for_held_index(limb.held_index) && (disabling || prob(30 * severity)))
|
||||
var/obj/item/I = victim.get_item_for_held_index(limb.held_index)
|
||||
if(istype(I, /obj/item/offhand))
|
||||
I = victim.get_inactive_held_item()
|
||||
|
||||
if(I && victim.dropItemToGround(I))
|
||||
victim.visible_message("<span class='danger'>[victim] drops [I] as their limb malfunctions!</span>", "<span class='warning'><b>The force on your [limb.name] causes you to drop [I]!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
|
||||
update_inefficiencies()
|
||||
|
||||
/datum/wound/synthetic/muscle/remove_wound(ignore_limb, replaced)
|
||||
limp_slowdown = 0
|
||||
if(limb)
|
||||
UnregisterSignal(limb, list(COMSIG_BODYPART_GAUZED, COMSIG_BODYPART_GAUZE_DESTROYED))
|
||||
if(victim)
|
||||
UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
|
||||
return ..()
|
||||
|
||||
/datum/wound/synthetic/muscle/handle_process()
|
||||
. = ..()
|
||||
|
||||
regen_ticks_current++
|
||||
if(victim.body_position == LYING_DOWN)
|
||||
if(prob(50))
|
||||
regen_ticks_current += 0.5
|
||||
if(victim.IsSleeping())
|
||||
regen_ticks_current += 0.5
|
||||
|
||||
if(limb.current_splint)
|
||||
regen_ticks_current += (1-limb.current_splint.splint_factor)
|
||||
|
||||
if(regen_ticks_current > regen_ticks_needed)
|
||||
if(!victim || !limb)
|
||||
qdel(src)
|
||||
return
|
||||
to_chat(victim, "<span class='green'>Your [limb.name] has repaired its hydraulics!</span>")
|
||||
remove_wound()
|
||||
|
||||
/// If we're a human who's punching something with a broken arm, we might hurt ourselves doing so
|
||||
/datum/wound/synthetic/muscle/proc/attack_with_hurt_hand(mob/M, atom/target, proximity)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(victim.get_active_hand() != limb || !victim.combat_mode || !ismob(target) || severity <= WOUND_SEVERITY_MODERATE)
|
||||
return
|
||||
|
||||
// 15% of 30% chance to proc pain on hit
|
||||
if(prob(severity * 15))
|
||||
// And you have a 70% or 50% chance to actually land the blow, respectively
|
||||
if(prob(70 - 20 * severity))
|
||||
to_chat(victim, "<span class='userdanger'>The control circuits in your [limb.name] malfunction as you strike [target], electricity arcing violently!</span>")
|
||||
limb.receive_damage(brute=rand(1,5))
|
||||
else
|
||||
victim.visible_message("<span class='danger'>[victim] weakly strikes [target] with [victim.p_their()] malfunctioning [limb.name], recoiling as it smokes and pops weakly!</span>", \
|
||||
"<span class='userdanger'>You fail to strike [target] as the fractured hydraulics in your [limb.name] light up with multiple warnings: your internals failing!</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
INVOKE_ASYNC(victim, /mob.proc/emote, "scream")
|
||||
victim.Stun(0.5 SECONDS)
|
||||
limb.receive_damage(brute=rand(3,7))
|
||||
return COMPONENT_CANCEL_ATTACK_CHAIN
|
||||
|
||||
/datum/wound/synthetic/muscle/get_examine_description(mob/user)
|
||||
if(!limb.current_splint)
|
||||
return ..()
|
||||
|
||||
var/list/msg = list()
|
||||
if(!limb.current_splint)
|
||||
msg += "[victim.p_their(TRUE)] [limb.name] [examine_desc]"
|
||||
else
|
||||
var/sling_condition = ""
|
||||
// how much life we have left in these bandages
|
||||
switch(limb.current_splint.sling_condition)
|
||||
if(0 to 1.25)
|
||||
sling_condition = "just barely"
|
||||
if(1.25 to 2.75)
|
||||
sling_condition = "loosely"
|
||||
if(2.75 to 4)
|
||||
sling_condition = "mostly"
|
||||
if(4 to INFINITY)
|
||||
sling_condition = "tightly"
|
||||
|
||||
msg += "[victim.p_their(TRUE)] [limb.name] is [sling_condition] fastened with a [limb.current_splint.name]!"
|
||||
|
||||
return "<B>[msg.Join()]</B>"
|
||||
|
||||
/*
|
||||
Common procs mostly copied from bone wounds, as their behaviour is very similar
|
||||
*/
|
||||
|
||||
/datum/wound/synthetic/muscle/proc/update_inefficiencies()
|
||||
SIGNAL_HANDLER
|
||||
if(limb.body_zone in list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
|
||||
if(limb.current_splint)
|
||||
limp_slowdown = initial(limp_slowdown) * limb.current_splint.splint_factor
|
||||
else
|
||||
limp_slowdown = initial(limp_slowdown)
|
||||
victim.apply_status_effect(STATUS_EFFECT_LIMP)
|
||||
else if(limb.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
|
||||
if(limb.current_splint)
|
||||
interaction_efficiency_penalty = 1 + ((interaction_efficiency_penalty - 1) * limb.current_splint.splint_factor)
|
||||
else
|
||||
interaction_efficiency_penalty = interaction_efficiency_penalty
|
||||
|
||||
if(initial(disabling))
|
||||
if(limb.current_splint && limb.current_splint.helps_disabled)
|
||||
set_disabling(FALSE)
|
||||
else
|
||||
set_disabling(TRUE)
|
||||
|
||||
limb.update_wounds()
|
||||
|
||||
/// Moderate (Muscle Tear)
|
||||
/datum/wound/synthetic/muscle/moderate
|
||||
name = "Hydraulic Damage"
|
||||
desc = "Patient's hydraulics have been damaged, severely reducing limb functionality"
|
||||
treat_text = "Splinting of the limb, allowing it to properly self-repair"
|
||||
examine_desc = "appears to have been damaged, its hydraulics leaking fluid"
|
||||
occur_text = "sparks, beginning to leak oil"
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
interaction_efficiency_penalty = 1.5
|
||||
limp_slowdown = 2
|
||||
threshold_minimum = 35
|
||||
threshold_penalty = 15
|
||||
status_effect_type = /datum/status_effect/wound/synthetic/muscle/moderate
|
||||
regen_ticks_needed = 90
|
||||
|
||||
/*
|
||||
Severe (Ruptured Tendon)
|
||||
*/
|
||||
|
||||
/datum/wound/synthetic/muscle/severe
|
||||
name = "Shattered Hydraulics"
|
||||
sound_effect = 'sound/effects/wounds/blood2.ogg'
|
||||
desc = "Patient's Hydraulic Line has been severed, causing loss of pressure, and loss of use of the limb."
|
||||
treat_text = "Splint and non-use of the limb"
|
||||
examine_desc = "is limp, weakly sparking and leaking oil"
|
||||
occur_text = "twists; violently screeching as several internal components twist in the wrong ways"
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
interaction_efficiency_penalty = 2
|
||||
limp_slowdown = 5
|
||||
threshold_minimum = 80
|
||||
threshold_penalty = 35
|
||||
disabling = TRUE
|
||||
status_effect_type = /datum/status_effect/wound/synthetic/muscle/severe
|
||||
regen_ticks_needed = 150
|
||||
|
||||
/datum/status_effect/wound/synthetic/muscle
|
||||
|
||||
/datum/status_effect/wound/synthetic/muscle/on_apply()
|
||||
. = ..()
|
||||
RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, .proc/on_swap_hands)
|
||||
on_swap_hands()
|
||||
|
||||
/datum/status_effect/wound/synthetic/muscle/on_remove()
|
||||
. = ..()
|
||||
UnregisterSignal(owner, COMSIG_MOB_SWAP_HANDS)
|
||||
var/mob/living/carbon/wound_owner = owner
|
||||
wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/muscle_wound)
|
||||
|
||||
/datum/status_effect/wound/synthetic/muscle/proc/on_swap_hands()
|
||||
SIGNAL_HANDLER
|
||||
|
||||
var/mob/living/carbon/wound_owner = owner
|
||||
if(wound_owner.get_active_hand() == linked_limb)
|
||||
wound_owner.add_actionspeed_modifier(/datum/actionspeed_modifier/muscle_wound, (linked_wound.interaction_efficiency_penalty - 1))
|
||||
else
|
||||
wound_owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/muscle_wound)
|
||||
|
||||
/datum/status_effect/wound/synthetic/muscle/nextmove_modifier()
|
||||
var/mob/living/carbon/C = owner
|
||||
|
||||
if(C.get_active_hand() == linked_limb)
|
||||
return linked_wound.interaction_efficiency_penalty
|
||||
|
||||
return 1
|
||||
|
||||
// muscle
|
||||
/datum/status_effect/wound/synthetic/muscle/moderate
|
||||
id = "torn muscle"
|
||||
/datum/status_effect/wound/synthetic/muscle/severe
|
||||
id = "ruptured tendon"
|
||||
|
||||
/datum/actionspeed_modifier/muscle_wound
|
||||
variable = TRUE
|
||||
@@ -1,196 +0,0 @@
|
||||
|
||||
/*
|
||||
Piercing wounds
|
||||
*/
|
||||
|
||||
/datum/wound/synthetic/pierce
|
||||
name = "Piercing Wound"
|
||||
sound_effect = 'sound/weapons/slice.ogg'
|
||||
processes = TRUE
|
||||
wound_type = WOUND_PIERCE
|
||||
treatable_by = list(/obj/item/stack/sticky_tape/surgical)
|
||||
treatable_tool = TOOL_CAUTERY
|
||||
base_treat_time = 3 SECONDS
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
/// How much blood we start losing when this wound is first applied
|
||||
var/initial_flow
|
||||
/// If gauzed, what percent of the internal bleeding actually clots of the total absorption rate
|
||||
var/gauzed_clot_rate
|
||||
|
||||
/// When hit on this bodypart, we have this chance of losing some blood + the incoming damage
|
||||
var/internal_bleeding_chance
|
||||
/// If we let off blood when hit, the max blood lost is this * the incoming damage
|
||||
var/internal_bleeding_coefficient
|
||||
|
||||
/datum/wound/synthetic/slash/show_wound_topic(mob/user)
|
||||
return (user == victim && blood_flow)
|
||||
|
||||
/datum/wound/synthetic/slash/Topic(href, href_list)
|
||||
. = ..()
|
||||
if(href_list["wound_topic"])
|
||||
if(!usr == victim)
|
||||
return
|
||||
victim.self_grasp_bleeding_limb(limb)
|
||||
|
||||
/datum/wound/synthetic/pierce/wound_injury(datum/wound/old_wound)
|
||||
blood_flow = initial_flow
|
||||
|
||||
/datum/wound/synthetic/pierce/receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
if(victim.stat == DEAD || wounding_dmg < 5)
|
||||
return
|
||||
if(victim.blood_volume && prob(internal_bleeding_chance + wounding_dmg))
|
||||
if(limb.current_splint && limb.current_splint.splint_factor)
|
||||
wounding_dmg *= (1 - limb.current_splint.splint_factor)
|
||||
var/blood_bled = rand(1, wounding_dmg * internal_bleeding_coefficient) // 12 brute toolbox can cause up to 15/18/21 bloodloss on mod/sev/crit
|
||||
switch(blood_bled)
|
||||
if(-INFINITY to 6)
|
||||
victim.bleed(blood_bled, TRUE)
|
||||
if(7 to 13)
|
||||
victim.visible_message("<span class='smalldanger'>Oil droplets fly from the hole in [victim]'s [limb.name].</span>", "<span class='danger'>You eject some of your oil; the blow to your [limb.name] jarring your systems!.</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
victim.bleed(blood_bled, TRUE)
|
||||
if(14 to 19)
|
||||
victim.visible_message("<span class='smalldanger'>A small stream of oil spurts from the hole in [victim]'s [limb.name]!</span>", "<span class='danger'>You eject out a string of oil from the blow to your [limb.name]!</span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
|
||||
victim.bleed(blood_bled)
|
||||
if(20 to INFINITY)
|
||||
victim.visible_message("<span class='danger'>A spray of oil streams from the gash in [victim]'s [limb.name]!</span>", "<span class='danger'><b>You gush out a spray of oil from the blow to your [limb.name]!</b></span>", vision_distance=COMBAT_MESSAGE_RANGE)
|
||||
victim.bleed(blood_bled)
|
||||
new /obj/effect/temp_visual/dir_setting/bloodsplatter(victim.loc, victim.dir)
|
||||
victim.add_splatter_floor(get_step(victim.loc, victim.dir))
|
||||
else
|
||||
return
|
||||
|
||||
/datum/wound/synthetic/pierce/get_bleed_rate_of_change()
|
||||
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
|
||||
return BLOOD_FLOW_INCREASING
|
||||
if(limb.current_gauze)
|
||||
return BLOOD_FLOW_DECREASING
|
||||
return BLOOD_FLOW_STEADY
|
||||
|
||||
/datum/wound/synthetic/pierce/handle_process()
|
||||
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
|
||||
|
||||
if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
|
||||
blood_flow -= 0.2
|
||||
if(prob(5))
|
||||
to_chat(victim, "<span class='notice'>You feel the [lowertext(name)] in your [limb.name] firming up from the cold!</span>")
|
||||
|
||||
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
|
||||
blood_flow += 0.5 // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
|
||||
|
||||
if(limb.current_gauze && limb.current_gauze.seep_gauze(limb.current_gauze.absorption_rate, GAUZE_STAIN_BLOOD))
|
||||
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate
|
||||
|
||||
if(blood_flow <= 0)
|
||||
qdel(src)
|
||||
|
||||
/datum/wound/synthetic/pierce/on_stasis()
|
||||
. = ..()
|
||||
if(blood_flow <= 0)
|
||||
qdel(src)
|
||||
|
||||
/datum/wound/synthetic/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/synthetic/pierce/treat(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/sticky_tape/surgical))
|
||||
tapepierce(I, user)
|
||||
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature())
|
||||
tool_cauterize(I, user)
|
||||
|
||||
/datum/wound/synthetic/pierce/on_xadone(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
|
||||
|
||||
/datum/wound/synthetic/pierce/on_synthflesh(power)
|
||||
. = ..()
|
||||
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 puncture
|
||||
/datum/wound/synthetic/pierce/proc/tapepierce(obj/item/stack/sticky_tape/surgical/A, mob/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.4 : 1)
|
||||
user.visible_message("<span class='notice'>[user] begins taping over [victim]'s [limb.name] with [A]...</span>", "<span class='notice'>You begin taping over [user == victim ? "your" : "[victim]'s"] [limb.name] with [A]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] tapes up over some of the leaking on [victim].</span>", "<span class='green'>You tape up some of the leaking on [user == victim ? "yourself" : "[victim]"].</span>")
|
||||
var/blood_sutured = 0.5 / self_penalty_mult
|
||||
blood_flow -= blood_sutured
|
||||
var/obj/item/stack/used_stack = A
|
||||
used_stack.use(1)
|
||||
if(blood_flow > 0)
|
||||
try_treating(A, user)
|
||||
else
|
||||
to_chat(user, "<span class='green'>You successfully close the hole in [user == victim ? "your" : "[victim]'s"] [limb.name].</span>")
|
||||
|
||||
/// If someone is using either a cautery tool or something with heat to cauterize this pierce
|
||||
/datum/wound/synthetic/pierce/proc/tool_cauterize(obj/item/I, mob/user)
|
||||
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("<span class='danger'>[user] begins welding shut [victim]'s [limb.name] with [I]...</span>", "<span class='warning'>You begin welding shut [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
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("<span class='green'>[user] welds shut some of the leaking on [victim].</span>", "<span class='green'>You weld shut some of the leaking on [victim].</span>")
|
||||
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
|
||||
if(prob(30))
|
||||
victim.emote("scream")
|
||||
var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
|
||||
blood_flow -= blood_cauterized
|
||||
|
||||
if(blood_flow > 0)
|
||||
try_treating(I, user)
|
||||
|
||||
/datum/wound/synthetic/pierce/moderate
|
||||
name = "Minor Puncture"
|
||||
desc = "Patient's hydraulic lines have been punctured, causing leaking."
|
||||
treat_text = "Treat affected site with bandaging to help stem the flow before welding and taping." // space is cold in ss13, so it's like an ice pack!
|
||||
examine_desc = "has a small, circular hole piercing a vital line, hydraulic fluid slowly leaking out"
|
||||
occur_text = "spurts out a thin stream of oil"
|
||||
sound_effect = 'sound/effects/wounds/pierce1.ogg'
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
initial_flow = 1.5
|
||||
gauzed_clot_rate = 0.8
|
||||
internal_bleeding_chance = 30
|
||||
internal_bleeding_coefficient = 1.25
|
||||
threshold_minimum = 30
|
||||
threshold_penalty = 20
|
||||
status_effect_type = /datum/status_effect/wound/pierce/moderate
|
||||
scar_keyword = "piercemoderate"
|
||||
|
||||
/datum/wound/synthetic/pierce/severe
|
||||
name = "Open Puncture"
|
||||
desc = "Patient's internal mechanics are heavily perforated causing sizeable internal leaking and reduced limb stability."
|
||||
treat_text = "Repair punctures in hydraulic lines through welding. Exposure to extreme cold may work in a pinch."
|
||||
examine_desc = "is pierced clear through, bits of mangled metal obscuring the open hole"
|
||||
occur_text = "looses a violent spray of oil, a clear hole being revealed"
|
||||
sound_effect = 'sound/effects/wounds/pierce2.ogg'
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
initial_flow = 2.25
|
||||
gauzed_clot_rate = 0.6
|
||||
internal_bleeding_chance = 60
|
||||
internal_bleeding_coefficient = 1.5
|
||||
threshold_minimum = 50
|
||||
threshold_penalty = 35
|
||||
status_effect_type = /datum/status_effect/wound/pierce/severe
|
||||
scar_keyword = "piercesevere"
|
||||
|
||||
/datum/wound/synthetic/pierce/critical
|
||||
name = "Internal Cavity"
|
||||
desc = "Patient's internal structure has been heavily compromised causing massive hydraulic fluid loss."
|
||||
treat_text = "Heavy welding and potential mechanical intervention required to ensure limb operability"
|
||||
examine_desc = "is torn through almost in twain, leaking oil and shuddering violently"
|
||||
occur_text = "blasts apart, chunks of shrapnel flying in all directions"
|
||||
sound_effect = 'sound/effects/wounds/pierce3.ogg'
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
initial_flow = 3
|
||||
gauzed_clot_rate = 0.4
|
||||
internal_bleeding_chance = 80
|
||||
internal_bleeding_coefficient = 1.75
|
||||
threshold_minimum = 100
|
||||
threshold_penalty = 50
|
||||
status_effect_type = /datum/status_effect/wound/pierce/critical
|
||||
scar_keyword = "piercecritical"
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
|
||||
@@ -1,273 +0,0 @@
|
||||
/*
|
||||
Slashing wounds
|
||||
*/
|
||||
|
||||
/datum/wound/synthetic/slash
|
||||
name = "Slashing (Cut) Wound"
|
||||
sound_effect = 'sound/weapons/slice.ogg'
|
||||
processes = TRUE
|
||||
wound_type = WOUND_SLASH
|
||||
treatable_by = list(/obj/item/stack/sticky_tape/surgical)
|
||||
treatable_by_grabbed = list(/obj/item/gun/energy/laser)
|
||||
treatable_tool = TOOL_CAUTERY
|
||||
base_treat_time = 3 SECONDS
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE)
|
||||
|
||||
/// How much blood we start losing when this wound is first applied
|
||||
var/initial_flow
|
||||
/// When we have less than this amount of flow, either from treatment or clotting, we demote to a lower cut or are healed of the wound
|
||||
var/minimum_flow
|
||||
/// How much our blood_flow will naturally decrease per tick, not only do larger cuts bleed more blood faster, they clot slower (higher number = clot quicker, negative = opening up)
|
||||
var/clot_rate
|
||||
|
||||
/// Once the blood flow drops below minimum_flow, we demote it to this type of wound. If there's none, we're all better
|
||||
var/demotes_to
|
||||
|
||||
/// The maximum flow we've had so far
|
||||
var/highest_flow
|
||||
|
||||
/// A bad system I'm using to track the worst scar we earned (since we can demote, we want the biggest our wound has been, not what it was when it was cured (probably moderate))
|
||||
var/datum/scar/highest_scar
|
||||
|
||||
/datum/wound/synthetic/slash/show_wound_topic(mob/living/user)
|
||||
return (user == victim && blood_flow)
|
||||
|
||||
/datum/wound/synthetic/slash/Topic(href, href_list)
|
||||
. = ..()
|
||||
if(href_list["wound_topic"])
|
||||
if(!usr == victim)
|
||||
return
|
||||
victim.self_grasp_bleeding_limb(limb)
|
||||
|
||||
/datum/wound/synthetic/slash/wound_injury(datum/wound/slash/old_wound = null)
|
||||
blood_flow = initial_flow
|
||||
if(!highest_scar)
|
||||
highest_scar = new
|
||||
highest_scar.generate(limb, src, add_to_scars=FALSE)
|
||||
if(!old_wound)
|
||||
return
|
||||
blood_flow = max(old_wound.blood_flow, initial_flow)
|
||||
if(old_wound.severity > severity && old_wound.highest_scar)
|
||||
highest_scar = old_wound.highest_scar
|
||||
old_wound.highest_scar = null
|
||||
|
||||
/datum/wound/synthetic/slash/remove_wound(ignore_limb, replaced)
|
||||
if(!replaced && highest_scar)
|
||||
already_scarred = TRUE
|
||||
highest_scar.lazy_attach(limb)
|
||||
return ..()
|
||||
|
||||
/datum/wound/synthetic/slash/get_examine_description(mob/living/user)
|
||||
if(!limb.current_gauze)
|
||||
return ..()
|
||||
|
||||
var/list/msg = list("The slashed hydraulics on [victim.p_their()] [limb.name] are wrapped with ")
|
||||
// how much life we have left in these bandages
|
||||
switch(limb.current_gauze.absorption_capacity)
|
||||
if(0 to 1.25)
|
||||
msg += "nearly ruined"
|
||||
if(1.25 to 2.75)
|
||||
msg += "badly worn"
|
||||
if(2.75 to 4)
|
||||
msg += "slightly stained"
|
||||
if(4 to INFINITY)
|
||||
msg += "clean"
|
||||
msg += " [limb.current_gauze.name]!"
|
||||
|
||||
return "<B>[msg.Join()]</B>"
|
||||
|
||||
/datum/wound/synthetic/slash/receive_damage(wounding_type, wounding_dmg, wound_bonus)
|
||||
if(victim.stat != DEAD && wound_bonus != CANT_WOUND && wounding_type == WOUND_SLASH) // can't stab dead bodies to make it bleed faster this way
|
||||
blood_flow += 0.05 * wounding_dmg
|
||||
|
||||
/datum/wound/synthetic/slash/drag_bleed_amount()
|
||||
// say we have 3 severe cuts with 3 blood flow each, pretty reasonable
|
||||
// compare with being at 100 brute damage before, where you bled (brute/100 * 2), = 2 blood per tile
|
||||
var/bleed_amount = min(blood_flow * 0.1, 1) // 3 * 3 * 0.1 = 0.9 blood total, less than before! the share here is .3 blood of course.
|
||||
|
||||
if(limb.current_gauze && limb.current_gauze.seep_gauze(bleed_amount * 0.33, GAUZE_STAIN_BLOOD)) // gauze stops all bleeding from dragging on this limb, but wears the gauze out quicker
|
||||
return 0
|
||||
|
||||
return bleed_amount
|
||||
|
||||
/datum/wound/synthetic/slash/get_bleed_rate_of_change()
|
||||
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
|
||||
return BLOOD_FLOW_INCREASING
|
||||
if(limb.current_gauze || clot_rate > 0)
|
||||
return BLOOD_FLOW_DECREASING
|
||||
if(clot_rate < 0)
|
||||
return BLOOD_FLOW_INCREASING
|
||||
|
||||
/datum/wound/synthetic/slash/handle_process()
|
||||
if(victim.stat == DEAD)
|
||||
blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN)
|
||||
if(blood_flow < minimum_flow)
|
||||
if(demotes_to)
|
||||
replace_wound(demotes_to)
|
||||
return
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
|
||||
|
||||
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
|
||||
blood_flow += 0.5 // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
|
||||
|
||||
if(limb.current_gauze)
|
||||
if(clot_rate > 0)
|
||||
blood_flow -= clot_rate
|
||||
if(limb.current_gauze && limb.current_gauze.seep_gauze(limb.current_gauze.absorption_rate, GAUZE_STAIN_BLOOD))
|
||||
blood_flow -= limb.current_gauze.absorption_rate
|
||||
else
|
||||
blood_flow -= clot_rate
|
||||
|
||||
if(blood_flow > highest_flow)
|
||||
highest_flow = blood_flow
|
||||
|
||||
if(blood_flow < minimum_flow)
|
||||
if(demotes_to)
|
||||
replace_wound(demotes_to)
|
||||
else
|
||||
to_chat(victim, "<span class='green'>The destroyed hydraulics on your [limb.name] have stopped leaking!</span>")
|
||||
qdel(src)
|
||||
|
||||
|
||||
/datum/wound/synthetic/slash/on_stasis()
|
||||
if(blood_flow >= minimum_flow)
|
||||
return
|
||||
if(demotes_to)
|
||||
replace_wound(demotes_to)
|
||||
return
|
||||
qdel(src)
|
||||
|
||||
/* BEWARE, THE BELOW NONSENSE IS MADNESS. bones.dm looks more like what I have in mind and is sufficiently clean, don't pay attention to this messiness */
|
||||
|
||||
/datum/wound/synthetic/slash/check_grab_treatments(obj/item/I, mob/living/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/synthetic/slash/treat(obj/item/I, mob/living/user)
|
||||
if(istype(I, /obj/item/gun/energy/laser))
|
||||
las_cauterize(I, user)
|
||||
else if(I.tool_behaviour == TOOL_CAUTERY || I.get_temperature())
|
||||
tool_cauterize(I, user)
|
||||
else if(istype(I, /obj/item/stack/sticky_tape/surgical))
|
||||
slashtape(I, user)
|
||||
|
||||
/datum/wound/synthetic/slash/on_xadone(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.03 * power // i think it's like a minimum of 3 power, so .09 blood_flow reduction per tick is pretty good for 0 effort
|
||||
|
||||
/datum/wound/synthetic/slash/on_synthflesh(power)
|
||||
. = ..()
|
||||
blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow, pretty good for how little effort it is
|
||||
|
||||
/// If someone's putting a laser gun up to our cut to cauterize it
|
||||
/datum/wound/synthetic/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/living/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.25 : 1)
|
||||
user.visible_message("<span class='warning'>[user] begins aiming [lasgun] directly at [victim]'s [limb.name]...</span>", "<span class='userdanger'>You begin aiming [lasgun] directly at [user == victim ? "your" : "[victim]'s"] [limb.name]...</span>")
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
var/damage = lasgun.chambered.loaded_projectile.damage
|
||||
lasgun.chambered.loaded_projectile.wound_bonus -= 30
|
||||
lasgun.chambered.loaded_projectile.damage *= self_penalty_mult
|
||||
if(!lasgun.process_fire(victim, victim, TRUE, null, limb.body_zone))
|
||||
return
|
||||
victim.emote("scream")
|
||||
blood_flow -= damage / (5 * self_penalty_mult) // 20 / 5 = 4 bloodflow removed, p good
|
||||
victim.visible_message("<span class='warning'>The leaking on [victim]'s [limb.name] slows, and then stops!</span>")
|
||||
|
||||
/// If someone is using either a cautery tool or something with heat to cauterize this cut
|
||||
/datum/wound/synthetic/slash/proc/tool_cauterize(obj/item/I, mob/living/user)
|
||||
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("<span class='danger'>[user] begins welding over [user == victim ? "[user.p_their()]" : "[victim]'s"] [limb.name] with [I]...</span>", "<span class='warning'>You begin welding over [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...</span>")
|
||||
|
||||
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("<span class='green'>[user] welds over some of the leaking on [user == victim ? "[user.p_their()]" : "[victim]'s"] [limb.name].</span>", "<span class='green'>You weld over some of the leaking on [user == victim ? "[user.p_their()]" : "[victim]'s"] [limb.name].</span>")
|
||||
|
||||
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
|
||||
if(prob(30))
|
||||
victim.emote("scream")
|
||||
var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
|
||||
blood_flow -= blood_cauterized
|
||||
|
||||
if(blood_flow > minimum_flow)
|
||||
try_treating(I, user)
|
||||
else if(demotes_to)
|
||||
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] leaking.</span>")
|
||||
|
||||
/// If someone is using a suture to close this cut
|
||||
/datum/wound/synthetic/slash/proc/slashtape(obj/item/stack/sticky_tape/surgical/B, mob/living/user)
|
||||
var/self_penalty_mult = (user == victim ? 1.4 : 1)
|
||||
user.visible_message("<span class='notice'>[user] begins taping over [victim]'s [limb.name] with [B]...</span>", "<span class='notice'>You begin taping over [user == victim ? "your" : "[victim]'s"] [limb.name] with [B]...</span>")
|
||||
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
user.visible_message("<span class='green'>[user] tapes up some of the leaking on [victim].</span>", "<span class='green'>You tape up some of the leaking on [user == victim ? "yourself" : "[victim]"].</span>")
|
||||
var/blood_sutured = 0.5/ self_penalty_mult
|
||||
blood_flow -= blood_sutured
|
||||
B.use(1)
|
||||
|
||||
if(blood_flow > minimum_flow)
|
||||
try_treating(B, user)
|
||||
else if(demotes_to)
|
||||
to_chat(user, "<span class='green'>You successfully lower the severity of [user == victim ? "your" : "[victim]'s"] leaking.</span>")
|
||||
|
||||
|
||||
/datum/wound/synthetic/slash/moderate
|
||||
name = "Rough Shear"
|
||||
desc = "Patient's metallic coating has been sheared, causing internal leaking."
|
||||
treat_text = "Liberal application of surgical tape and welding"
|
||||
examine_desc = "has a torn panel, oil leaking out slowly."
|
||||
occur_text = "is sheared in twain, leaking oil"
|
||||
sound_effect = 'sound/effects/wounds/blood1.ogg'
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
initial_flow = 2
|
||||
minimum_flow = 0.5
|
||||
clot_rate = 0.12
|
||||
threshold_minimum = 20
|
||||
threshold_penalty = 10
|
||||
status_effect_type = /datum/status_effect/wound/slash/moderate
|
||||
scar_keyword = "slashmoderate"
|
||||
|
||||
/datum/wound/synthetic/slash/severe
|
||||
name = "Destroyed Panel"
|
||||
desc = "Patient's metallic outer coating has been entirely ripped open, exposing sensitive hydraulics."
|
||||
treat_text = "Speedy application of surgical tape to stem the initial bleeding, followed by welding over the affected area"
|
||||
examine_desc = "has severe damage to their limb, oil leaking heavily"
|
||||
occur_text = "is ripped open, its panel sparking and its hydraulics leaking oil"
|
||||
sound_effect = 'sound/effects/wounds/blood2.ogg'
|
||||
severity = WOUND_SEVERITY_SEVERE
|
||||
initial_flow = 3.25
|
||||
minimum_flow = 2.75
|
||||
clot_rate = 0.06
|
||||
threshold_minimum = 50
|
||||
threshold_penalty = 25
|
||||
demotes_to = /datum/wound/synthetic/slash/moderate
|
||||
status_effect_type = /datum/status_effect/wound/slash/severe
|
||||
scar_keyword = "slashsevere"
|
||||
|
||||
/datum/wound/synthetic/slash/critical
|
||||
name = "Destroyed Hydraulics"
|
||||
desc = "Patient has experienced an extremely damaging incident, resulting in their internal hydraulics being entirely shredded. Deactivation will commence once their oil and reguating fluids have ran out."
|
||||
treat_text = "Immediate patching with tape, followed by heavy welding"
|
||||
examine_desc = "has been absolutely destroyed, sparking electronics protruding from their limb"
|
||||
occur_text = "is torn open, multiple hydraulics falling out of place"
|
||||
sound_effect = 'sound/effects/wounds/blood3.ogg'
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
initial_flow = 4.25
|
||||
minimum_flow = 4
|
||||
clot_rate = -0.05 // critical cuts actively get worse instead of better
|
||||
threshold_minimum = 80
|
||||
threshold_penalty = 40
|
||||
demotes_to = /datum/wound/synthetic/slash/severe
|
||||
status_effect_type = /datum/status_effect/wound/slash/critical
|
||||
scar_keyword = "slashcritical"
|
||||
wound_flags = (FLESH_WOUND | ACCEPTS_GAUZE | MANGLES_FLESH)
|
||||
@@ -4363,10 +4363,6 @@
|
||||
#include "modular_skyrat\modules\modular_weapons\code\modules\projectiles\guns\energy\energy.dm"
|
||||
#include "modular_skyrat\modules\modular_weapons\code\modules\projectiles\projectile\bullets\modular_projectiles.dm"
|
||||
#include "modular_skyrat\modules\modular_weapons\code\modules\research\designs\autolathe_designs.dm"
|
||||
#include "modular_skyrat\modules\more_wounds\code\synthetic\burn.dm"
|
||||
#include "modular_skyrat\modules\more_wounds\code\synthetic\muscle.dm"
|
||||
#include "modular_skyrat\modules\more_wounds\code\synthetic\pierce.dm"
|
||||
#include "modular_skyrat\modules\more_wounds\code\synthetic\slash.dm"
|
||||
#include "modular_skyrat\modules\morenarcotics\chemistry\reagents\cocaine.dm"
|
||||
#include "modular_skyrat\modules\morenarcotics\chemistry\reagents\opium.dm"
|
||||
#include "modular_skyrat\modules\morenarcotics\chemistry\reagents\pcp.dm"
|
||||
|
||||
Reference in New Issue
Block a user