Merge pull request #7762 from Fox-McCloud/blood-refactor-fixes

Blood Refactor Fixes
This commit is contained in:
tigercat2000
2017-07-13 14:37:07 -07:00
committed by GitHub
17 changed files with 122 additions and 120 deletions
+1
View File
@@ -8,6 +8,7 @@
#define OXY "oxy"
#define CLONE "clone"
#define STAMINA "stamina"
#define BRAIN "brain"
#define STUN "stun"
#define WEAKEN "weaken"
-4
View File
@@ -421,8 +421,6 @@
organStatus["robotic"] = 1
if(E.status & ORGAN_SPLINTED)
organStatus["splinted"] = 1
if(E.status & ORGAN_BLEEDING)
organStatus["bleeding"] = 1
if(E.status & ORGAN_DEAD)
organStatus["dead"] = 1
@@ -589,8 +587,6 @@
lung_ruptured = "Lung ruptured:"
if(e.status & ORGAN_SPLINTED)
splint = "Splinted:"
if(e.status & ORGAN_BLEEDING)
bled = "Bleeding:"
if(e.status & ORGAN_BROKEN)
AN = "[e.broken_description]:"
if(e.status & ORGAN_ROBOT)
+2 -2
View File
@@ -113,8 +113,8 @@
if(beaker)
// Give blood
if(mode)
if(beaker.volume > 0)
var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume
if(beaker.reagents.total_volume)
var/fraction = min(transfer_amount/beaker.reagents.total_volume, 1) //the fraction that is transfered of the total volume
beaker.reagents.reaction(attached, INGEST, fraction) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
+12 -14
View File
@@ -165,15 +165,9 @@ REAGENT SCANNER
var/mob/living/carbon/human/H = M
var/list/damaged = H.get_damaged_organs(1,1)
user.show_message("<span class='notice'>Localized Damage, Brute/Burn:</span>",1)
if(length(damaged)>0)
if(length(damaged) > 0)
for(var/obj/item/organ/external/org in damaged)
user.show_message(text("<span class='notice'>\t []: [][] - []</span>", \
capitalize(org.name), \
(org.brute_dam > 0) ? "<span class='warning'>[org.brute_dam]</span>" :0, \
(org.status & ORGAN_BLEEDING)?"<span class='danger'>\[Bleeding\]</span>":"\t", \
(org.burn_dam > 0) ? "<font color='#FFA500'>[org.burn_dam]</font>" :0),1)
else
user.show_message("<span class='notice'>\t Limbs are OK.</span>",1)
user.show_message("\t\t<span class='info'>[capitalize(org.name)]: [(org.brute_dam > 0) ? "<font color='red'>[org.brute_dam]</font></span>" : "<font color='red'>0</font>"]-[(org.burn_dam > 0) ? "<font color='#FF8000'>[org.burn_dam]</font>" : "<font color='#FF8000'>0</font>"]")
OX = M.getOxyLoss() > 50 ? "<font color='blue'><b>Severe oxygen deprivation detected</b></font>" : "Subject bloodstream oxygen level normal"
TX = M.getToxLoss() > 50 ? "<font color='green'><b>Dangerous amount of toxins detected</b></font>" : "Subject bloodstream toxin level minimal"
@@ -188,7 +182,7 @@ REAGENT SCANNER
for(var/thing in M.viruses)
var/datum/disease/D = thing
if(!(D.visibility_flags & HIDDEN_SCANNER))
to_chat(user, "<span class='alert'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</span>")
user.show_message("<span class='alert'><b>Warning: [D.form] detected</b>\nName: [D.name].\nType: [D.spread_text].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure_text]</span>")
if(M.getStaminaLoss())
user.show_message("<span class='info'>Subject appears to be suffering from fatigue.</span>")
if(M.getCloneLoss())
@@ -228,17 +222,21 @@ REAGENT SCANNER
var/blood_id = H.get_blood_id()
if(blood_id)
if(H.bleed_rate)
to_chat(user, "<span class='danger'>Subject is bleeding!</span>")
user.show_message("<span class='danger'>Subject is bleeding!</span>")
var/blood_percent = round((H.blood_volume / BLOOD_VOLUME_NORMAL)*100)
var/blood_type = H.b_type
if(blood_id != "blood")//special blood substance
blood_type = blood_id
var/datum/reagent/R = chemical_reagents_list[blood_id]
if(R)
blood_type = R.name
else
blood_type = blood_id
if(H.blood_volume <= BLOOD_VOLUME_SAFE && H.blood_volume > BLOOD_VOLUME_OKAY)
user.show_message("<span class='danger'>LOW blood level [blood_percent] %, [H.blood_volume] cl,</span> <span class='info'>type: [blood_type]</span>")
else if(H.blood_volume <= BLOOD_VOLUME_OKAY)
to_chat(user, "<span class='danger'>CRITICAL blood level [blood_percent] %, [H.blood_volume] cl,</span> <span class='info'>type: [blood_type]</span>")
user.show_message("<span class='warning'>blood type: [blood_type].</span>")
user.show_message("<span class='danger'>CRITICAL blood level [blood_percent] %, [H.blood_volume] cl,</span> <span class='info'>type: [blood_type]</span>")
else
user.show_message("<span class='info'>Blood level [blood_percent] %, [H.blood_volume] cl, type: [blood_type]</span>")
if(H.undergoing_cardiac_arrest() && H.stat != DEAD)
user.show_message("<span class='userdanger'>Subject suffering from heart attack: Apply defibrillator immediately.</span>")
+18 -23
View File
@@ -96,22 +96,18 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
var/bandaged = affecting.bandage()
var/disinfected = affecting.disinfect()
affecting.bandage()
affecting.disinfect()
if(!(bandaged || disinfected))
to_chat(user, "<span class='warning'>The wounds on [H]'s [affecting.name] have already been bandaged.</span>")
return 1
else
user.visible_message("<span class='green'>[user] bandages the wounds on [H]'s [affecting.name].", \
"<span class='green'>You bandage the wounds on [H]'s [affecting.name].</span>" )
user.visible_message("<span class='green'>[user] bandages the wounds on [H]'s [affecting.name].</span>", \
"<span class='green'>You bandage the wounds on [H]'s [affecting.name].</span>" )
if(stop_bleeding)
if(!H.bleedsuppress) //so you can't stack bleed suppression
H.suppress_bloodloss(stop_bleeding)
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
if(stop_bleeding)
if(!H.bleedsuppress) //so you can't stack bleed suppression
H.suppress_bloodloss(stop_bleeding)
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
else
to_chat(user, "<span class='warning'>[affecting] is cut open, you'll need more than a bandage!</span>")
@@ -122,6 +118,7 @@
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
heal_brute = 25
stop_bleeding = 0
@@ -145,15 +142,13 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
if(!affecting.salve())
to_chat(user, "<span class='warning'>The wounds on [H]'s [affecting.name] have already been salved.</span>")
return 1
else
user.visible_message("<span class='green'>[user] salves the wounds on [H]'s [affecting.name].", \
"<span class='green'>You salve the wounds on [H]'s [affecting.name].</span>" )
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
affecting.salve()
user.visible_message("<span class='green'>[user] salves the wounds on [H]'s [affecting.name].</span>", \
"<span class='green'>You salve the wounds on [H]'s [affecting.name].</span>" )
affecting.heal_damage(heal_brute, heal_burn)
H.UpdateDamageIcon()
use(1)
else
to_chat(user, "<span class='warning'>[affecting] is cut open, you'll need more than some ointment!</span>")
+2
View File
@@ -247,6 +247,8 @@
for(var/obj/item/I in org.embedded_objects)
to_chat(src, "\t <a href='byond://?src=[UID()];embedded_object=[I.UID()];embedded_limb=[org.UID()]' class='warning'>There is \a [I] embedded in your [org.name]!</a>")
if(H.bleed_rate)
to_chat(src, "<span class='danger'>You are bleeding!</span>")
if(staminaloss)
if(staminaloss > 30)
to_chat(src, "<span class='info'>You're completely exhausted.</span>")
@@ -288,7 +288,6 @@
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
var/list/is_bleeding = list()
for(var/organ_tag in species.has_limbs)
var/list/organ_data = species.has_limbs[organ_tag]
@@ -332,8 +331,6 @@
if(W.internal && !temp.open) continue // can't see internal wounds
var/this_wound_desc = W.desc
if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
if(this_wound_desc in wound_descriptors)
@@ -377,8 +374,6 @@
wound_flavor_text["[temp.limb_name]"] = flavor_text_string
else
wound_flavor_text["[temp.limb_name]"] = ""
if(temp.status & ORGAN_BLEEDING)
is_bleeding["[temp.limb_name]"] = 1
else
wound_flavor_text["[temp.limb_name]"] = ""
@@ -387,64 +382,39 @@
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
var/display_chest = 0
var/display_shoes = 0
var/display_gloves = 0
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
msg += wound_flavor_text["head"]
else if(is_bleeding["head"])
msg += "<span class='warning'>[src] has blood running down [t_his] face!</span>\n"
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
msg += wound_flavor_text["chest"]
else if(is_bleeding["chest"])
display_chest = 1
if(wound_flavor_text["l_arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["l_arm"]
else if(is_bleeding["l_arm"])
display_chest = 1
if(wound_flavor_text["l_hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["l_hand"]
else if(is_bleeding["l_hand"])
display_gloves = 1
if(wound_flavor_text["r_arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["r_arm"]
else if(is_bleeding["r_arm"])
display_chest = 1
if(wound_flavor_text["r_hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
msg += wound_flavor_text["r_hand"]
else if(is_bleeding["r_hand"])
display_gloves = 1
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["groin"]
else if(is_bleeding["groin"])
display_chest = 1
if(wound_flavor_text["l_leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["l_leg"]
else if(is_bleeding["l_leg"])
display_chest = 1
if(wound_flavor_text["l_foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["l_foot"]
else if(is_bleeding["l_foot"])
display_shoes = 1
if(wound_flavor_text["r_leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
msg += wound_flavor_text["r_leg"]
else if(is_bleeding["r_leg"])
display_chest = 1
if(wound_flavor_text["r_foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["r_foot"]
else if(is_bleeding["r_foot"])
display_shoes = 1
if(display_chest)
msg += "<span class='warning'><b>[src] has blood soaking through from under [t_his] clothing!</b></span>\n"
if(display_shoes)
msg += "<span class='warning'><b>[src] has blood running from [t_his] shoes!</b></span>\n"
if(display_gloves)
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
if(blood_volume < BLOOD_VOLUME_SAFE)
msg += "[t_He] [t_has] pale skin.\n"
if(bleedsuppress)
msg += "[t_He] [t_is] bandaged with something.\n"
else if(bleed_rate)
if(reagents.has_reagent("heparin"))
msg += "<B>[t_He] [t_is] bleeding uncontrollably!</B>\n"
else
msg += "<B>[t_He] [t_is] bleeding!</B>\n"
if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n"
@@ -309,7 +309,7 @@ emp_act
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/organ/external/L = pick(bodyparts)
L.embedded_objects |= I
// I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
I.forceMove(src)
L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("<span class='danger'>[I] embeds itself in [src]'s [L.name]!</span>","<span class='userdanger'>[I] embeds itself in your [L.name]!</span>")
@@ -76,6 +76,8 @@
var/brain_mod = 1 // Brain damage damage reduction/amplification
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood?
var/total_health = 100
var/punchdamagelow = 0 //lowest possible punch damage
var/punchdamagehigh = 9 //highest possible punch damage
@@ -464,7 +466,11 @@
// Return 1 if it should do normal processing too
// Return 0 if it shouldn't deplete and do its normal effect
// Other return values will cause weird badness
/datum/species/proc/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == exotic_blood)
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_MAXIMUM)
H.reagents.del_reagent(R.id)
return 0
return 1
// For special snowflake species effects
@@ -548,9 +548,11 @@
bodyflags = HAS_SKIN_COLOR | NO_EYES
dietflags = DIET_CARN
reagent_tag = PROCESS_ORG
blood_color = "#0064C8"
exotic_blood = "water"
//ventcrawler = 1 //ventcrawling commented out
blood_damage_type = TOX
butt_sprite = "slime"
//Has default darksight of 2.
+16
View File
@@ -27,6 +27,22 @@
updatehealth()
return 1
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
switch(damagetype)
if(BRUTE)
return adjustBruteLoss(damage)
if(BURN)
return adjustFireLoss(damage)
if(TOX)
return adjustToxLoss(damage)
if(OXY)
return adjustOxyLoss(damage)
if(CLONE)
return adjustCloneLoss(damage)
if(STAMINA)
return adjustStaminaLoss(damage)
if(BRAIN)
return adjustBrainLoss(damage)
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0)
if(blocked >= 100) return 0
@@ -493,9 +493,6 @@ var/const/INGEST = 2
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
can_process = 1
if(H.species && H.species.exotic_blood)
if(R.id == H.species.exotic_blood)
can_process = 0
//We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
else
if(R.process_flags != SYNTHETIC)
@@ -848,6 +848,21 @@
M.AdjustLoseBreath(1)
..()
/datum/reagent/heparin //Based on a real-life anticoagulant.
name = "Heparin"
id = "heparin"
description = "A powerful anticoagulant. Victims will bleed uncontrollably and suffer scaling bruising."
reagent_state = LIQUID
color = "#C8C8C8" //RGB: 200, 200, 200
metabolization_rate = 0.2 * REAGENTS_METABOLISM
/datum/reagent/heparin/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.bleed_rate = min(H.bleed_rate + 2, 8)
H.adjustBruteLoss(1)
..()
/datum/reagent/sarin
name = "Sarin"
id = "sarin"
@@ -190,6 +190,7 @@
id = "blood"
reagent_state = LIQUID
color = "#C80000" // rgb: 200, 0, 0
metabolization_rate = 5 //fast rate so it disappears fast.
drink_icon = "glass_red"
drink_name = "Glass of Tomato juice"
drink_desc = "Are you sure this is tomato juice?"
@@ -154,4 +154,13 @@
result = "mutagen"
required_reagents = list("radium" = 1, "plasma" = 1, "chlorine" = 1)
result_amount = 3
mix_message = "The substance turns neon green and bubbles unnervingly."
mix_message = "The substance turns neon green and bubbles unnervingly."
/datum/chemical_reaction/heparin
name = "Heparin"
id = "Heparin"
result = "heparin"
required_reagents = list("formaldehyde" = 1, "sodium" = 1, "chlorine" = 1, "lithium" = 1)
result_amount = 4
mix_message = "The mixture thins and loses all color."
mix_sound = 'sound/goonstation/misc/drinkfizz.ogg'
+28 -33
View File
@@ -1,17 +1,18 @@
/****************************************************
BLOOD SYSTEM
****************************************************/
/mob/living/carbon/human/proc/suppress_bloodloss(amount)
if(bleedsuppress)
return
else
bleedsuppress = 1
spawn(amount)
bleedsuppress = 0
if(stat != DEAD && bleed_rate)
to_chat(src, "<span class='warning'>The blood soaks through your bandage.</span>")
bleedsuppress = TRUE
addtimer(src, "resume_bleeding", amount)
/mob/living/carbon/human/proc/resume_bleeding()
bleedsuppress = FALSE
if(stat != DEAD && bleed_rate)
to_chat(src, "<span class='warning'>The blood soaks through your bandage.</span>")
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
@@ -40,52 +41,47 @@
//Effects of bloodloss
var/oxy_immune = species.flags & NO_BREATHE //Some species have blood, but don't breathe; they should still suffer the effects of bloodloss.
var/word = pick("dizzy","woozy","faint")
switch(blood_volume)
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(5))
to_chat(src, "<span class='warning'>You feel [pick("dizzy","woozy","faint")].</span>")
if(oxy_immune)
adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
else
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
to_chat(src, "<span class='warning'>You feel [word].</span>")
apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), species.blood_damage_type)
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
if(oxy_immune)
adjustToxLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
else
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), species.blood_damage_type)
if(prob(5))
EyeBlurry(6)
var/word = pick("dizzy","woozy","faint")
to_chat(src, "<span class='warning'>You feel very [word].</span>")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
if(oxy_immune)
adjustToxLoss(5)
else
adjustOxyLoss(5)
apply_damage_type(5, species.blood_damage_type)
if(prob(15))
Paralyse(rand(1,3))
var/word = pick("dizzy","woozy","faint")
to_chat(src, "<span class='warning'>You feel extremely [word].</span>")
if(0 to BLOOD_VOLUME_SURVIVE)
death()
//Bleeding out
var/temp_bleed = 0
for(var/obj/item/organ/external/temp in bodyparts)
if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT)
//Bleeding out
for(var/X in bodyparts)
var/obj/item/organ/external/BP = X
var/brutedamage = BP.brute_dam
if(BP.status & ORGAN_ROBOT)
continue
for(var/datum/wound/W in temp.wounds)
if(W.bleeding())
temp_bleed += W.damage / 4
if(temp.open)
//We want an accurate reading of .len
listclearnulls(BP.embedded_objects)
temp_bleed += 0.5*BP.embedded_objects.len
if(brutedamage >= 20)
temp_bleed += (brutedamage * 0.013)
if(BP.open)
temp_bleed += 0.5
bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
if(bleed_rate && !bleedsuppress)
if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH))
bleed(bleed_rate)
//Makes a blood drop, leaking amt units of blood from the mob
@@ -232,7 +228,6 @@
/mob/living/proc/add_splatter_floor(turf/T, small_drip)
if(get_blood_id() != "blood")//is it blood or welding fuel?
return
if(!T)
T = get_turf(src)
-1
View File
@@ -152,7 +152,6 @@ Used In File(s): \code\game\machinery\adv_med.dm
<td>
<span class='average'>
{{if value.status.destroyed}} DESTROYED <br> {{/if}}
{{if value.status.bleeding}} external bleeding <br> {{/if}}
{{if value.internalBleeding}} internal bleeding <br> {{/if}}
{{if value.lungRuptured}} lung ruptured <br> {{/if}}
{{if value.status.broken}} {{:value.status.broken}} <br> {{/if}}