mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-22 12:41:09 +01:00
Adds mob bleeding overlays, tweaks some bleeding balance (#65371)
This commit is contained in:
+32
-30
@@ -511,65 +511,67 @@
|
||||
|
||||
// Mob Overlays Indexes
|
||||
/// Total number of layers for mob overlays
|
||||
#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
|
||||
#define TOTAL_LAYERS 32 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_;
|
||||
/// Mutations layer - Tk headglows, cold resistance glow, etc
|
||||
#define MUTATIONS_LAYER 31
|
||||
#define MUTATIONS_LAYER 32
|
||||
/// Mutantrace features (tail when looking south) that must appear behind the body parts
|
||||
#define BODY_BEHIND_LAYER 30
|
||||
#define BODY_BEHIND_LAYER 31
|
||||
/// Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag
|
||||
#define BODYPARTS_LAYER 29
|
||||
#define BODYPARTS_LAYER 30
|
||||
/// Mutantrace features (snout, body markings) that must appear above the body parts
|
||||
#define BODY_ADJ_LAYER 28
|
||||
#define BODY_ADJ_LAYER 29
|
||||
/// Underwear, undershirts, socks, eyes, lips(makeup)
|
||||
#define BODY_LAYER 27
|
||||
#define BODY_LAYER 28
|
||||
/// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes)
|
||||
#define FRONT_MUTATIONS_LAYER 26
|
||||
#define FRONT_MUTATIONS_LAYER 27
|
||||
/// Damage indicators (cuts and burns)
|
||||
#define DAMAGE_LAYER 25
|
||||
#define DAMAGE_LAYER 26
|
||||
/// Jumpsuit clothing layer
|
||||
#define UNIFORM_LAYER 24
|
||||
#define UNIFORM_LAYER 25
|
||||
/// ID card layer (might be deprecated)
|
||||
#define ID_LAYER 23
|
||||
#define ID_LAYER 24
|
||||
/// ID card layer
|
||||
#define ID_CARD_LAYER 22
|
||||
#define ID_CARD_LAYER 23
|
||||
/// Hands body part layer (or is this for the arm? not sure...)
|
||||
#define HANDS_PART_LAYER 21
|
||||
#define HANDS_PART_LAYER 22
|
||||
/// Gloves layer
|
||||
#define GLOVES_LAYER 20
|
||||
#define GLOVES_LAYER 21
|
||||
/// Shoes layer
|
||||
#define SHOES_LAYER 19
|
||||
#define SHOES_LAYER 20
|
||||
/// Ears layer (Spessmen have ears? Wow)
|
||||
#define EARS_LAYER 18
|
||||
#define EARS_LAYER 19
|
||||
/// Suit layer (armor, hardsuits, etc.)
|
||||
#define SUIT_LAYER 17
|
||||
#define SUIT_LAYER 18
|
||||
/// Glasses layer
|
||||
#define GLASSES_LAYER 16
|
||||
#define GLASSES_LAYER 17
|
||||
/// Belt layer
|
||||
#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt?
|
||||
#define BELT_LAYER 16 //Possible make this an overlay of somethign required to wear a belt?
|
||||
/// Suit storage layer (tucking a gun or baton underneath your armor)
|
||||
#define SUIT_STORE_LAYER 14
|
||||
#define SUIT_STORE_LAYER 15
|
||||
/// Neck layer (for wearing ties and bedsheets)
|
||||
#define NECK_LAYER 13
|
||||
#define NECK_LAYER 14
|
||||
/// Back layer (for backpacks and equipment on your back)
|
||||
#define BACK_LAYER 12
|
||||
#define BACK_LAYER 13
|
||||
/// Hair layer (mess with the fro and you got to go!)
|
||||
#define HAIR_LAYER 11 //TODO: make part of head layer?
|
||||
#define HAIR_LAYER 12 //TODO: make part of head layer?
|
||||
/// Facemask layer (gas masks, breath masks, etc.)
|
||||
#define FACEMASK_LAYER 10
|
||||
#define FACEMASK_LAYER 11
|
||||
/// Head layer (hats, helmets, etc.)
|
||||
#define HEAD_LAYER 9
|
||||
#define HEAD_LAYER 10
|
||||
/// Handcuff layer (when your hands are cuffed)
|
||||
#define HANDCUFF_LAYER 8
|
||||
#define HANDCUFF_LAYER 9
|
||||
/// Legcuff layer (when your feet are cuffed)
|
||||
#define LEGCUFF_LAYER 7
|
||||
#define LEGCUFF_LAYER 8
|
||||
/// Hands layer (for the actual hand, not the arm... I think?)
|
||||
#define HANDS_LAYER 6
|
||||
#define HANDS_LAYER 7
|
||||
/// Body front layer. Usually used for mutant bodyparts that need to be in front of stuff (e.g. cat ears)
|
||||
#define BODY_FRONT_LAYER 5
|
||||
#define BODY_FRONT_LAYER 6
|
||||
/// Special body layer that actually require to be above the hair (e.g. lifted welding goggles)
|
||||
#define ABOVE_BODY_FRONT_GLASSES_LAYER 4
|
||||
#define ABOVE_BODY_FRONT_GLASSES_LAYER 5
|
||||
/// Special body layer for the rare cases where something on the head needs to be above everything else (e.g. flowers)
|
||||
#define ABOVE_BODY_FRONT_HEAD_LAYER 3
|
||||
#define ABOVE_BODY_FRONT_HEAD_LAYER 4
|
||||
/// Bleeding wound icons
|
||||
#define WOUND_LAYER 3
|
||||
/// Blood cult ascended halo layer, because there's currently no better solution for adding/removing
|
||||
#define HALO_LAYER 2
|
||||
/// Fire layer when you're on fire
|
||||
|
||||
@@ -77,10 +77,12 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu
|
||||
// ~random wound balance defines
|
||||
/// how quickly sanitization removes infestation and decays per second
|
||||
#define WOUND_BURN_SANITIZATION_RATE 0.075
|
||||
/// how much blood you can lose per second per slash max. 4 is a LOT of blood for one cut so don't worry about hitting it easily
|
||||
#define WOUND_SLASH_MAX_BLOODFLOW 4
|
||||
/// how much blood you can lose per tick per slash max.
|
||||
#define WOUND_SLASH_MAX_BLOODFLOW 4.5
|
||||
/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people
|
||||
#define WOUND_SLASH_DEAD_CLOT_MIN 0.025
|
||||
/// further slash attacks on a bodypart with a slash wound have their blood_flow further increased by damage * this (10 damage slash adds .25 flow)
|
||||
#define WOUND_SLASH_DAMAGE_FLOW_COEFF 0.025
|
||||
/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
|
||||
#define WOUND_BONE_HEAD_TIME_VARIANCE 20
|
||||
|
||||
|
||||
@@ -243,7 +243,9 @@
|
||||
owner.add_filter("stasis_status_ripple", 2, list("type" = "ripple", "flags" = WAVE_BOUNDED, "radius" = 0, "size" = 2))
|
||||
var/filter = owner.get_filter("stasis_status_ripple")
|
||||
animate(filter, radius = 32, time = 15, size = 0, loop = -1)
|
||||
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/carbon_owner = owner
|
||||
carbon_owner.update_bodypart_bleed_overlays()
|
||||
|
||||
/datum/status_effect/grouped/stasis/tick()
|
||||
update_time_of_death()
|
||||
@@ -253,6 +255,9 @@
|
||||
REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id))
|
||||
owner.remove_filter("stasis_status_ripple")
|
||||
update_time_of_death()
|
||||
if(iscarbon(owner))
|
||||
var/mob/living/carbon/carbon_owner = owner
|
||||
carbon_owner.update_bodypart_bleed_overlays()
|
||||
return ..()
|
||||
|
||||
/atom/movable/screen/alert/status_effect/stasis
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
if(severity == WOUND_SEVERITY_TRIVIAL)
|
||||
return
|
||||
|
||||
if(!(silent || demoted))
|
||||
if(!silent && !demoted)
|
||||
var/msg = span_danger("[victim]'s [limb.name] [occur_text]!")
|
||||
var/vis_dist = COMBAT_MESSAGE_RANGE
|
||||
|
||||
@@ -158,8 +158,8 @@
|
||||
if(sound_effect)
|
||||
playsound(L.owner, sound_effect, 70 + 20 * severity, TRUE)
|
||||
|
||||
wound_injury(old_wound, attack_direction = attack_direction)
|
||||
if(!demoted)
|
||||
wound_injury(old_wound, attack_direction = attack_direction)
|
||||
second_wind()
|
||||
|
||||
/datum/wound/proc/null_victim()
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
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)
|
||||
/// How much our blood_flow will naturally decrease per second, 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
|
||||
@@ -31,14 +31,15 @@
|
||||
var/datum/scar/highest_scar
|
||||
|
||||
/datum/wound/slash/wound_injury(datum/wound/slash/old_wound = null, attack_direction = null)
|
||||
blood_flow = initial_flow
|
||||
if(old_wound)
|
||||
blood_flow = max(old_wound.blood_flow, initial_flow)
|
||||
if(old_wound.severity > severity && old_wound.highest_scar)
|
||||
set_highest_scar(old_wound.highest_scar)
|
||||
old_wound.clear_highest_scar()
|
||||
else if(attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY)
|
||||
victim.spray_blood(attack_direction, severity)
|
||||
else
|
||||
blood_flow = initial_flow
|
||||
if(attack_direction && victim.blood_volume > BLOOD_VOLUME_OKAY)
|
||||
victim.spray_blood(attack_direction, severity)
|
||||
|
||||
if(!highest_scar)
|
||||
var/datum/scar/new_scar = new
|
||||
@@ -83,7 +84,7 @@
|
||||
|
||||
/datum/wound/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
|
||||
blood_flow += WOUND_SLASH_DAMAGE_FLOW_COEFF * wounding_dmg
|
||||
|
||||
/datum/wound/slash/drag_bleed_amount()
|
||||
// say we have 3 severe cuts with 3 blood flow each, pretty reasonable
|
||||
@@ -252,6 +253,7 @@
|
||||
|
||||
if(!do_after(user, base_treat_time * self_penalty_mult, target=victim, extra_checks = CALLBACK(src, .proc/still_exists)))
|
||||
return
|
||||
|
||||
user.visible_message(span_green("[user] stitches up some of the bleeding on [victim]."), span_green("You stitch up some of the bleeding on [user == victim ? "yourself" : "[victim]"]."))
|
||||
var/blood_sutured = I.stop_bleeding / self_penalty_mult
|
||||
blood_flow -= blood_sutured
|
||||
@@ -274,7 +276,7 @@
|
||||
severity = WOUND_SEVERITY_MODERATE
|
||||
initial_flow = 2
|
||||
minimum_flow = 0.5
|
||||
clot_rate = 0.06
|
||||
clot_rate = 0.05
|
||||
threshold_minimum = 20
|
||||
threshold_penalty = 10
|
||||
status_effect_type = /datum/status_effect/wound/slash/moderate
|
||||
@@ -305,9 +307,9 @@
|
||||
occur_text = "is torn open, spraying blood wildly"
|
||||
sound_effect = 'sound/effects/wounds/blood3.ogg'
|
||||
severity = WOUND_SEVERITY_CRITICAL
|
||||
initial_flow = 4.25
|
||||
minimum_flow = 4
|
||||
clot_rate = -0.025 // critical cuts actively get worse instead of better
|
||||
initial_flow = 4
|
||||
minimum_flow = 3.85
|
||||
clot_rate = -0.015 // critical cuts actively get worse instead of better
|
||||
threshold_minimum = 80
|
||||
threshold_penalty = 40
|
||||
demotes_to = /datum/wound/slash/severe
|
||||
|
||||
@@ -10,65 +10,83 @@
|
||||
if(NOBLOOD in dna.species.species_traits || HAS_TRAIT(src, TRAIT_NOBLEED) || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
return
|
||||
|
||||
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
|
||||
if(bodytemperature < TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
|
||||
return
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
nutrition_ratio = 0.2
|
||||
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
|
||||
nutrition_ratio = 0.4
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
|
||||
nutrition_ratio = 0.6
|
||||
if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
|
||||
nutrition_ratio = 0.8
|
||||
else
|
||||
nutrition_ratio = 1
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * delta_time)
|
||||
blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * nutrition_ratio * delta_time), BLOOD_VOLUME_NORMAL)
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
nutrition_ratio = 0.2
|
||||
if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
|
||||
nutrition_ratio = 0.4
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED)
|
||||
nutrition_ratio = 0.6
|
||||
if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED)
|
||||
nutrition_ratio = 0.8
|
||||
else
|
||||
nutrition_ratio = 1
|
||||
if(satiety > 80)
|
||||
nutrition_ratio *= 1.25
|
||||
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * delta_time)
|
||||
blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * nutrition_ratio * delta_time), BLOOD_VOLUME_NORMAL)
|
||||
|
||||
//Effects of bloodloss
|
||||
var/word = pick("dizzy","woozy","faint")
|
||||
switch(blood_volume)
|
||||
if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL)
|
||||
if(DT_PROB(7.5, delta_time))
|
||||
to_chat(src, span_userdanger("Blood starts to tear your skin apart. You're going to burst!"))
|
||||
inflate_gib()
|
||||
if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS)
|
||||
if(DT_PROB(5, delta_time))
|
||||
to_chat(src, span_warning("You feel terribly bloated."))
|
||||
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
to_chat(src, span_warning("You feel [word]."))
|
||||
adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
|
||||
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
blur_eyes(6)
|
||||
to_chat(src, span_warning("You feel very [word]."))
|
||||
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
|
||||
adjustOxyLoss(2.5 * delta_time)
|
||||
if(DT_PROB(7.5, delta_time))
|
||||
Unconscious(rand(20,60))
|
||||
to_chat(src, span_warning("You feel extremely [word]."))
|
||||
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
|
||||
if(!HAS_TRAIT(src, TRAIT_NODEATH))
|
||||
death()
|
||||
//Effects of bloodloss
|
||||
var/word = pick("dizzy","woozy","faint")
|
||||
switch(blood_volume)
|
||||
if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL)
|
||||
if(DT_PROB(7.5, delta_time))
|
||||
to_chat(src, span_userdanger("Blood starts to tear your skin apart. You're going to burst!"))
|
||||
inflate_gib()
|
||||
if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS)
|
||||
if(DT_PROB(5, delta_time))
|
||||
to_chat(src, span_warning("You feel terribly bloated."))
|
||||
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
to_chat(src, span_warning("You feel [word]."))
|
||||
adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
|
||||
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
|
||||
adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
blur_eyes(6)
|
||||
to_chat(src, span_warning("You feel very [word]."))
|
||||
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
|
||||
adjustOxyLoss(2.5 * delta_time)
|
||||
if(DT_PROB(7.5, delta_time))
|
||||
Unconscious(rand(20,60))
|
||||
to_chat(src, span_warning("You feel extremely [word]."))
|
||||
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
|
||||
if(!HAS_TRAIT(src, TRAIT_NODEATH))
|
||||
death()
|
||||
|
||||
var/temp_bleed = 0
|
||||
//Bleeding out
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
temp_bleed += BP.get_bleed_rate() * delta_time
|
||||
BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
|
||||
var/temp_bleed = 0
|
||||
var/update_bleed_icons = FALSE
|
||||
//Bleeding out
|
||||
for(var/obj/item/bodypart/iter_part as anything in bodyparts)
|
||||
var/iter_bleed_rate = iter_part.get_part_bleed_rate()
|
||||
temp_bleed += iter_bleed_rate * delta_time
|
||||
iter_part.generic_bleedstacks = max(0, iter_part.generic_bleedstacks - 1)
|
||||
if(iter_part.update_part_wound_overlay())
|
||||
update_bleed_icons = TRUE
|
||||
|
||||
if(temp_bleed)
|
||||
bleed(temp_bleed)
|
||||
bleed_warn(temp_bleed)
|
||||
if(update_bleed_icons)
|
||||
update_wound_overlays()
|
||||
|
||||
if(temp_bleed)
|
||||
bleed(temp_bleed)
|
||||
bleed_warn(temp_bleed)
|
||||
|
||||
/// Has each bodypart update its bleed/wound overlay icon states. If any have changed, it has the owner update wound overlays and returns TRUE
|
||||
/mob/living/carbon/proc/update_bodypart_bleed_overlays()
|
||||
var/update_bleed_icons
|
||||
for(var/obj/item/bodypart/iter_part as anything in bodyparts)
|
||||
if(iter_part.update_part_wound_overlay())
|
||||
update_bleed_icons = TRUE
|
||||
|
||||
if(update_bleed_icons)
|
||||
update_wound_overlays()
|
||||
return update_bleed_icons
|
||||
|
||||
//Makes a blood drop, leaking amt units of blood from the mob
|
||||
/mob/living/carbon/proc/bleed(amt)
|
||||
@@ -92,7 +110,7 @@
|
||||
var/bleed_amt = 0
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/iter_bodypart = X
|
||||
bleed_amt += iter_bodypart.get_bleed_rate()
|
||||
bleed_amt += iter_bodypart.get_part_bleed_rate()
|
||||
return bleed_amt
|
||||
|
||||
/mob/living/carbon/human/get_bleed_rate()
|
||||
|
||||
@@ -1216,7 +1216,7 @@
|
||||
/mob/living/carbon/proc/is_bleeding()
|
||||
for(var/i in bodyparts)
|
||||
var/obj/item/bodypart/BP = i
|
||||
if(BP.get_bleed_rate())
|
||||
if(BP.get_part_bleed_rate())
|
||||
return TRUE
|
||||
|
||||
/// get our total bleedrate
|
||||
@@ -1224,7 +1224,7 @@
|
||||
var/total_bleed_rate = 0
|
||||
for(var/i in bodyparts)
|
||||
var/obj/item/bodypart/BP = i
|
||||
total_bleed_rate += BP.get_bleed_rate()
|
||||
total_bleed_rate += BP.get_part_bleed_rate()
|
||||
|
||||
return total_bleed_rate
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
else if (human_user == src)
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Check injuries"
|
||||
|
||||
if (get_bodypart(human_user.zone_selected)?.get_bleed_rate())
|
||||
if (get_bodypart(human_user.zone_selected)?.get_part_bleed_rate())
|
||||
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Grab limb"
|
||||
|
||||
if (human_user != src)
|
||||
|
||||
@@ -651,7 +651,7 @@
|
||||
return ..()
|
||||
|
||||
var/obj/item/bodypart/grasped_part = get_bodypart(zone_selected)
|
||||
if(!grasped_part?.get_bleed_rate())
|
||||
if(!grasped_part?.get_part_bleed_rate())
|
||||
return
|
||||
var/starting_hand_index = active_hand_index
|
||||
if(starting_hand_index == grasped_part.held_index)
|
||||
@@ -659,7 +659,7 @@
|
||||
return
|
||||
|
||||
to_chat(src, span_warning("You try grasping at your [grasped_part.name], trying to stop the bleeding..."))
|
||||
if(!do_after(src, 1.5 SECONDS))
|
||||
if(!do_after(src, 0.75 SECONDS))
|
||||
to_chat(src, span_danger("You fail to grasp your [grasped_part.name]."))
|
||||
return
|
||||
|
||||
@@ -676,7 +676,7 @@
|
||||
desc = "Sometimes all you can do is slow the bleeding."
|
||||
icon_state = "latexballon"
|
||||
inhand_icon_state = "nothing"
|
||||
slowdown = 1
|
||||
slowdown = 0.5
|
||||
item_flags = DROPDEL | ABSTRACT | NOBLUDGEON | SLOWS_WHILE_IN_HAND | HAND_ITEM
|
||||
/// The bodypart we're staunching bleeding on, which also has a reference to us in [/obj/item/bodypart/var/grasped_by]
|
||||
var/obj/item/bodypart/grasped_part
|
||||
|
||||
@@ -92,16 +92,26 @@
|
||||
var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER)
|
||||
overlays_standing[DAMAGE_LAYER] = damage_overlay
|
||||
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
if(BP.dmg_overlay_type)
|
||||
if(BP.brutestate)
|
||||
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_[BP.brutestate]0") //we're adding icon_states of the base image as overlays
|
||||
if(BP.burnstate)
|
||||
damage_overlay.add_overlay("[BP.dmg_overlay_type]_[BP.body_zone]_0[BP.burnstate]")
|
||||
for(var/obj/item/bodypart/iter_part as anything in bodyparts)
|
||||
if(iter_part.dmg_overlay_type)
|
||||
if(iter_part.brutestate)
|
||||
damage_overlay.add_overlay("[iter_part.dmg_overlay_type]_[iter_part.body_zone]_[iter_part.brutestate]0") //we're adding icon_states of the base image as overlays
|
||||
if(iter_part.burnstate)
|
||||
damage_overlay.add_overlay("[iter_part.dmg_overlay_type]_[iter_part.body_zone]_0[iter_part.burnstate]")
|
||||
|
||||
apply_overlay(DAMAGE_LAYER)
|
||||
|
||||
/mob/living/carbon/update_wound_overlays()
|
||||
remove_overlay(WOUND_LAYER)
|
||||
|
||||
var/mutable_appearance/wound_overlay = mutable_appearance('icons/mob/bleed_overlays.dmi', "blank", -WOUND_LAYER)
|
||||
overlays_standing[WOUND_LAYER] = wound_overlay
|
||||
|
||||
for(var/obj/item/bodypart/iter_part as anything in bodyparts)
|
||||
if(iter_part.bleed_overlay_icon)
|
||||
wound_overlay.add_overlay(iter_part.bleed_overlay_icon)
|
||||
|
||||
apply_overlay(WOUND_LAYER)
|
||||
|
||||
/mob/living/carbon/update_inv_wear_mask()
|
||||
remove_overlay(FACEMASK_LAYER)
|
||||
@@ -254,6 +264,7 @@
|
||||
|
||||
apply_overlay(BODYPARTS_LAYER)
|
||||
update_damage_overlays()
|
||||
update_wound_overlays()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
|
||||
for(var/i in bodyparts)
|
||||
var/obj/item/bodypart/body_part = i
|
||||
if(body_part.get_bleed_rate())
|
||||
if(body_part.get_part_bleed_rate())
|
||||
bleeding_limbs += body_part
|
||||
if(body_part.grasped_by)
|
||||
grasped_limbs += body_part
|
||||
|
||||
@@ -809,7 +809,7 @@
|
||||
var/list/obj/item/bodypart/bleeding_limbs = list()
|
||||
for(var/i in bodyparts)
|
||||
var/obj/item/bodypart/BP = i
|
||||
if(BP.get_bleed_rate())
|
||||
if(BP.get_part_bleed_rate())
|
||||
bleeding_limbs += BP
|
||||
|
||||
var/num_bleeds = LAZYLEN(bleeding_limbs)
|
||||
|
||||
@@ -859,6 +859,10 @@
|
||||
/mob/living/proc/update_damage_overlays()
|
||||
return
|
||||
|
||||
/// Proc that only really gets called for humans, to handle bleeding overlays.
|
||||
/mob/living/proc/update_wound_overlays()
|
||||
return
|
||||
|
||||
/mob/living/Move(atom/newloc, direct, glide_size_override)
|
||||
if(lying_angle != 0)
|
||||
lying_angle_on_movement(direct)
|
||||
|
||||
@@ -76,6 +76,8 @@
|
||||
var/species_flags_list = list()
|
||||
///the type of damage overlay (if any) to use when this bodypart is bruised/burned.
|
||||
var/dmg_overlay_type
|
||||
/// If we're bleeding, which icon are we displaying on this part
|
||||
var/bleed_overlay_icon
|
||||
|
||||
//Damage messages used by help_shake_act()
|
||||
var/light_brute_msg = "bruised"
|
||||
@@ -969,8 +971,13 @@
|
||||
|
||||
wound_damage_multiplier = dam_mul
|
||||
|
||||
|
||||
/obj/item/bodypart/proc/get_bleed_rate()
|
||||
/**
|
||||
* Calculates how much blood this limb is losing per life tick
|
||||
*
|
||||
* Arguments:
|
||||
* * ignore_modifiers - If TRUE, ignore the bleed reduction for laying down and grabbing your limb
|
||||
*/
|
||||
/obj/item/bodypart/proc/get_part_bleed_rate(ignore_modifiers = FALSE)
|
||||
if(HAS_TRAIT(owner, TRAIT_NOBLEED))
|
||||
return
|
||||
if(status != BODYPART_ORGANIC) // maybe in the future we can bleed oil from aug parts, but not now
|
||||
@@ -986,20 +993,61 @@
|
||||
if(!embeddies.isEmbedHarmless())
|
||||
bleed_rate += 0.25
|
||||
|
||||
for(var/datum/wound/wound as anything in wounds)
|
||||
bleed_rate += wound.blood_flow
|
||||
for(var/datum/wound/iter_wound as anything in wounds)
|
||||
bleed_rate += iter_wound.blood_flow
|
||||
|
||||
if(owner.body_position == LYING_DOWN)
|
||||
bleed_rate *= 0.75
|
||||
|
||||
if(grasped_by)
|
||||
bleed_rate *= 0.7
|
||||
if(!ignore_modifiers)
|
||||
if(owner.body_position == LYING_DOWN)
|
||||
bleed_rate *= 0.75
|
||||
if(grasped_by)
|
||||
bleed_rate *= 0.7
|
||||
|
||||
if(!bleed_rate)
|
||||
QDEL_NULL(grasped_by)
|
||||
|
||||
return bleed_rate
|
||||
|
||||
// how much blood the limb needs to be losing per tick (not counting laying down/self grasping modifiers) to get the different bleed icons
|
||||
#define BLEED_OVERLAY_LOW 0.5
|
||||
#define BLEED_OVERLAY_MED 1.5
|
||||
#define BLEED_OVERLAY_GUSH 3.25
|
||||
|
||||
/obj/item/bodypart/proc/update_part_wound_overlay()
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(HAS_TRAIT(owner, TRAIT_NOBLEED) || status != BODYPART_ORGANIC)
|
||||
if(bleed_overlay_icon)
|
||||
bleed_overlay_icon = null
|
||||
owner.update_wound_overlays()
|
||||
return FALSE
|
||||
|
||||
var/bleed_rate = get_part_bleed_rate(ignore_modifiers = TRUE)
|
||||
var/new_bleed_icon
|
||||
|
||||
switch(bleed_rate)
|
||||
if(-INFINITY to BLEED_OVERLAY_LOW)
|
||||
new_bleed_icon = null
|
||||
if(BLEED_OVERLAY_LOW to BLEED_OVERLAY_MED)
|
||||
new_bleed_icon = "[body_zone]_1"
|
||||
if(BLEED_OVERLAY_MED to BLEED_OVERLAY_GUSH)
|
||||
if(owner.body_position == LYING_DOWN || IS_IN_STASIS(owner) || owner.stat == DEAD)
|
||||
new_bleed_icon = "[body_zone]_2s"
|
||||
else
|
||||
new_bleed_icon = "[body_zone]_2"
|
||||
if(BLEED_OVERLAY_GUSH to INFINITY)
|
||||
if(IS_IN_STASIS(owner) || owner.stat == DEAD)
|
||||
new_bleed_icon = "[body_zone]_2s"
|
||||
else
|
||||
new_bleed_icon = "[body_zone]_3"
|
||||
|
||||
if(new_bleed_icon != bleed_overlay_icon)
|
||||
bleed_overlay_icon = new_bleed_icon
|
||||
return TRUE
|
||||
|
||||
#undef BLEED_OVERLAY_LOW
|
||||
#undef BLEED_OVERLAY_MED
|
||||
#undef BLEED_OVERLAY_GUSH
|
||||
|
||||
/**
|
||||
* apply_gauze() is used to- well, apply gauze to a bodypart
|
||||
*
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
Reference in New Issue
Block a user