From 01d2d5f33942c256751586e7da4e6e6b90cf72ae Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Sun, 25 Mar 2012 20:45:00 -0700 Subject: [PATCH] WIP bloodloss and scaring system. --- code/defines/obj/decal.dm | 9 ++ code/game/objects/devices/scanners.dm | 13 ++- code/game/objects/items/weapons/medical.dm | 110 ++++++++++-------- .../objects/items/weapons/surgery_tools.dm | 1 - code/game/objects/radio/headset.dm | 2 + code/modules/admin/verbs/randomverbs.dm | 6 +- code/modules/chemical/Chemistry-Tools.dm | 87 ++++++++------ .../mob/living/carbon/human/examine.dm | 68 ++++++++--- code/modules/mob/living/carbon/human/human.dm | 67 +++++++++-- code/modules/mob/living/carbon/human/life.dm | 51 ++++++-- code/modules/mob/living/living.dm | 3 +- code/modules/mob/organ/organ.dm | 49 +++++--- icons/effects/drip.dmi | Bin 0 -> 3953 bytes 13 files changed, 326 insertions(+), 140 deletions(-) create mode 100644 icons/effects/drip.dmi diff --git a/code/defines/obj/decal.dm b/code/defines/obj/decal.dm index 4ec6f400cb6..72bc25d60ee 100644 --- a/code/defines/obj/decal.dm +++ b/code/defines/obj/decal.dm @@ -62,6 +62,15 @@ D.cure(0) ..() +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's red." + density = 0 + anchored = 1 + layer = 2 + icon = 'drip.dmi' + icon_state = "1" + /obj/effect/decal/cleanable/mucus name = "Mucus" desc = "Disgusting mucus." diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm index 686d4749161..4cd9c6a796c 100644 --- a/code/game/objects/devices/scanners.dm +++ b/code/game/objects/devices/scanners.dm @@ -308,13 +308,24 @@ proc/analyze_health_less_info(mob/living/carbon/M as mob, mob/user as mob) user.show_message(text("\red Significant brain damage detected. Subject may have had a concussion."), 1) if (M.virus2 || M.reagents.reagent_list.len > 0) user.show_message(text("\red Unknown substance detected in blood."), 1) - if(istype(M,/mob/living/carbon/human)) + if(ishuman(M)) var/mob/living/carbon/human/H = M for(var/name in H.organs) var/datum/organ/external/e = H.organs[name] if(e.broken) user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) break + if(ishuman(M)) + if(M:vessel) + var/blood_volume = round(M:vessel.get_reagent_amount("blood")) + var/blood_percent = blood_volume / 560 + blood_percent *= 100 + if(blood_volume <= 448) + user.show_message("\red Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl") + else if(blood_volume <= 336) + user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl") + else + user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl") return /obj/item/device/healthanalyzer/attack(mob/M as mob, mob/user as mob) diff --git a/code/game/objects/items/weapons/medical.dm b/code/game/objects/items/weapons/medical.dm index 25ebeda3703..f76ec048fe7 100644 --- a/code/game/objects/items/weapons/medical.dm +++ b/code/game/objects/items/weapons/medical.dm @@ -15,7 +15,35 @@ MEDICAL t_him = "her" user << "\red \The [M] is dead, you cannot help [t_him]!" return - if (M.health < 50) + + var/stoppedblood = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/external/affecting = H.get_organ("chest") + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/user2 = user + affecting = H.get_organ(check_zone(user2.zone_sel.selecting)) + else + if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0) + affecting = H.get_organ("head") + + if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack + for(var/datum/organ/wound/W in affecting.wounds) + if(W.bleeding) + if(stoppedblood) + stoppedblood = 2 + break + W.stopbleeding() + stoppedblood = 1 + + if (user) + if (M != user) + H.visible_message("\red [user] patches [stoppedblood - 1 ? "some of" : "the last of"] [H]'s wounds with [src]", "\red You patch up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s wounds", "\red You hear something like gauze being ripped.") + else + H.visible_message("\red [user] patches [stoppedblood - 1 ? "some of" : "the last of"] their own wounds with [src]", "\red You patch up [stoppedblood - 1 ? "some of" : "the last of"] your wounds", "\red You hear something like gauze being ripped.") + + if (M.health < 50 && !stoppedblood) var/t_him = "it" if (M.gender == MALE) t_him = "him" @@ -66,36 +94,14 @@ MEDICAL if (affecting.heal_damage(src.heal_brute, src.heal_burn)) H.UpdateDamageIcon() - - if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack - var/stoped = 0 - for(var/datum/organ/external/wound/W in affecting.wounds) - if(W.bleeding) - W.stopbleeding() - stoped = 0 - break - if(!stoped) - // user << "There is no bleeding wound at [t]" //code no longer in a dedicated obj, thus this doesn't really matter - return - if (user) - if (M != user) - for (var/mob/O in viewers(H, null)) - O.show_message("\red [H] has been bandaged with [src] by [user]", 1) - else - var/t_himself = "itself" - if (user.gender == MALE) - t_himself = "himself" - else if (user.gender == FEMALE) - t_himself = "herself" - for (var/mob/O in viewers(H, null)) - O.show_message("\red [H] bandaged [t_himself] with [src]", 1) - M.updatehealth() else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) use(1) + + /obj/item/stack/medical/advanced/attack(mob/living/carbon/M as mob, mob/user as mob) if (M.stat == 2) var/t_him = "it" @@ -105,7 +111,35 @@ MEDICAL t_him = "her" user << "\red \The [M] is dead, you cannot help [t_him]!" return - if (M.health < 0) + + var/stoppedblood = 0 + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/external/affecting = H.get_organ("chest") + + if(istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/user2 = user + affecting = H.get_organ(check_zone(user2.zone_sel.selecting)) + else + if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0) + affecting = H.get_organ("head") + + if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack + for(var/datum/organ/wound/W in affecting.wounds) + if(W.bleeding) + if(stoppedblood) + stoppedblood = 2 + break + W.stopbleeding() + stoppedblood = 1 + + if (user) + if (M != user) + H.visible_message("\red [user] patches [stoppedblood - 1 ? "some of" : "the last of"] [H]'s wounds with [src]", "\red You patch up [stoppedblood - 1 ? "some of" : "the last of"] [H]'s wounds", "\red You hear something like gauze being ripped.") + else + H.visible_message("\red [user] patches [stoppedblood - 1 ? "some of" : "the last of"] their own wounds with [src]", "\red You patch up [stoppedblood - 1 ? "some of" : "the last of"] your wounds", "\red You hear something like gauze being ripped.") + + if (M.health < 0 && !stoppedblood) var/t_him = "it" if (M.gender == MALE) t_him = "him" @@ -156,30 +190,6 @@ MEDICAL if (affecting.heal_damage(src.heal_brute, src.heal_burn)) H.UpdateDamageIcon() - - if(H.bloodloss > 0 && heal_brute > 0) // fix wounds too if bruise pack - var/stoped = 0 - for(var/datum/organ/external/wound/W in affecting.wounds) - if(W.bleeding) - W.stopbleeding() - stoped = 0 - break - if(!stoped) - // user << "There is no bleeding wound at [t]" //code no longer in a dedicated obj, thus this doesn't really matter - return - if (user) - if (M != user) - for (var/mob/O in viewers(H, null)) - O.show_message("\red [H] has been bandaged with [src] by [user]", 1) - else - var/t_himself = "itself" - if (user.gender == MALE) - t_himself = "himself" - else if (user.gender == FEMALE) - t_himself = "herself" - for (var/mob/O in viewers(H, null)) - O.show_message("\red [H] bandaged [t_himself] with [src]", 1) - M.updatehealth() else M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index c00997e3504..f6185bd6837 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -1565,7 +1565,6 @@ CIRCULAR SAW e.brute_dam = 0.0 e.burn_dam = 0.0 e.bandaged = 0.0 - e.wound_size = 0.0 e.max_damage = initial(e.max_damage) e.bleeding = 0 e.open = 0 diff --git a/code/game/objects/radio/headset.dm b/code/game/objects/radio/headset.dm index dfd8fd08690..0f7fea4fc16 100644 --- a/code/game/objects/radio/headset.dm +++ b/code/game/objects/radio/headset.dm @@ -171,9 +171,11 @@ if(keyslot1) user.put_in_hands(keyslot1) + keyslot1 = null if(keyslot2) user.put_in_hands(keyslot2) + keyslot2 = null recalculateChannels() user << "You pop out the encryption keys in the headset!" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 38735065726..715f4d50601 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -503,7 +503,6 @@ Traitors and the like can also be revived with the previous role mostly intact. e.brute_dam = 0.0 e.burn_dam = 0.0 e.bandaged = 0.0 - e.wound_size = 0.0 e.max_damage = initial(e.max_damage) e.bleeding = 0 e.open = 0 @@ -511,6 +510,11 @@ Traitors and the like can also be revived with the previous role mostly intact. e.destroyed = 0 e.perma_injury = 0 e.update_icon() + H.vessel = new/datum/reagents(560) + H.vessel.my_atom = H + H.vessel.add_reagent("blood",560) + spawn(1) + H.fixblood() H.update_body() H.update_face() H.UpdateDamageIcon() diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index 6b53b44aa78..e680d750743 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -965,55 +965,60 @@ if(istype(target, /mob/living/carbon))//maybe just add a blood reagent to all mobs. Then you can suck them dry...With hundreds of syringes. Jolly good idea. var/amount = src.reagents.maximum_volume - src.reagents.total_volume var/mob/living/carbon/T = target - var/datum/reagent/B = new /datum/reagent/blood if(!T.dna) usr << "You are unable to locate any blood. (To be specific, your target seems to be missing their DNA datum)" return if(T.mutations & HUSK) //target done been et, no more blood in him user << "\red You are unable to locate any blood." return - B.holder = src - B.volume = amount - //set reagent data - B.data["donor"] = T - /* - if(T.virus && T.virus.spread_type != SPECIAL) - B.data["virus"] = new T.virus.type(0) - */ + if(ishuman(T)) + if(T:vessel.get_reagent_amount("blood") < amount) + return + T:vessel.trans_to(src, amount) + else + var/datum/reagent/B = new /datum/reagent/blood + B.holder = src + B.volume = amount + //set reagent data + B.data["donor"] = T + /* + if(T.virus && T.virus.spread_type != SPECIAL) + B.data["virus"] = new T.virus.type(0) + */ - for(var/datum/disease/D in T.viruses) - if(!B.data["viruses"]) - B.data["viruses"] = list() + for(var/datum/disease/D in T.viruses) + if(!B.data["viruses"]) + B.data["viruses"] = list() - B.data["viruses"] += new D.type + B.data["viruses"] += new D.type - // not sure why it was checking if(B.data["virus2"]), but it seemed wrong - if(T.virus2) - B.data["virus2"] = T.virus2.getcopy() + // not sure why it was checking if(B.data["virus2"]), but it seemed wrong + if(T.virus2) + B.data["virus2"] = T.virus2.getcopy() - B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) - if(T.resistances&&T.resistances.len) - B.data["resistances"] = T.resistances.Copy() - if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation... - B.data["blood_type"] = copytext(T.dna.b_type,1,0) - var/list/temp_chem = list() - for(var/datum/reagent/R in target.reagents.reagent_list) - temp_chem += R.name - temp_chem[R.name] = R.volume - B.data["trace_chem"] = list2params(temp_chem) - B.data["antibodies"] = T.antibodies - //debug - //for(var/D in B.data) - // world << "Data [D] = [B.data[D]]" - //debug + B.data["blood_DNA"] = copytext(T.dna.unique_enzymes,1,0) + if(T.resistances&&T.resistances.len) + B.data["resistances"] = T.resistances.Copy() + if(istype(target, /mob/living/carbon/human))//I wish there was some hasproperty operation... + B.data["blood_type"] = copytext(T.dna.b_type,1,0) + var/list/temp_chem = list() + for(var/datum/reagent/R in target.reagents.reagent_list) + temp_chem += R.name + temp_chem[R.name] = R.volume + B.data["trace_chem"] = list2params(temp_chem) + B.data["antibodies"] = T.antibodies + //debug + //for(var/D in B.data) + // world << "Data [D] = [B.data[D]]" + //debug - src.reagents.reagent_list += B - src.reagents.update_total() - src.on_reagent_change() - src.reagents.handle_reactions() + src.reagents.reagent_list += B + src.reagents.update_total() + src.on_reagent_change() + src.reagents.handle_reactions() user << "\blue You take a blood sample from [target]" for(var/mob/O in viewers(4, user)) O.show_message("\red [user] takes a blood sample from [target].", 1) @@ -1068,7 +1073,17 @@ if(ismob(target) && target == user) src.reagents.reaction(target, INGEST) spawn(5) - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/datum/reagent/blood/B + for(var/datum/reagent/blood/d in src.reagents.reagent_list) + B = d + break + var/trans + if(B && ishuman(target)) + var/mob/living/carbon/human/H = target + H.vessel.add_reagent("blood",5,B) + src.reagents.remove_reagent("blood",5) + else + trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index ae98f374f1d..077cb399f6c 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -179,31 +179,71 @@ usr << "\red [src.name] doesn't seem as though they want to talk." spawn(10) // I think we might be overloading the clients. + var/list/wound_descriptions = list() for(var/named in organs) var/datum/organ/external/temp = organs[named] if(temp) if(temp.destroyed) usr << "\red [src.name] is missing [t_his] [temp.display_name]." + continue if(temp.wounds) - for(var/datum/organ/external/wound/w in temp.wounds) - var/size = w.wound_size - var/sizetext - switch(size) + var/list/wounds = list(list(),list(),list(),list(),list(),list()) + for(var/datum/organ/wound/w in temp.wounds) + switch(w.healing_state) + if(0) + var/list/cut = wounds[1] + cut += w + wounds[1] = cut if(1) - sizetext = "cut" + var/list/cut = wounds[2] + cut += w + wounds[2] = cut if(2) - sizetext = "deep cut" + var/list/cut = wounds[3] + cut += w + wounds[3] = cut if(3) - sizetext = "flesh wound" + var/list/cut = wounds[4] + cut += w + wounds[4] = cut if(4) - sizetext = "gaping wound" + var/list/cut = wounds[5] + cut += w + wounds[5] = cut if(5) - sizetext = "big gaping wound" - if(6) - sizetext = "massive wound" - if(w.bleeding) - usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]." - continue + var/list/cut = wounds[6] + cut += w + wounds[6] = cut + wound_descriptions["[temp.display_name]"] = wounds + //Now that we have a big list of all the wounds, on all the limbs. + var/list/wound_flavor_text = list() + for(var/named in wound_descriptions) + var/list/wound_states = wound_descriptions[named] + for(var/i = 1, i <= 6, i++) + var/list/wound_state = wound_states[i] //All wounds at this level of healing. + var/list/tally = list("cut" = 0, "deep cut" = 0, "flesh wound" = 0, "gaping wound" = 0, "big gaping wound" = 0, "massive wound" = 0) //How many wounds of what size. + for(var/datum/organ/wound/w in wound_state) + switch(w.wound_size) + if(1) + tally["cut"] += 1 + if(2) + tally["deep cut"] += 1 + if(3) + tally["flesh wound"] += 1 + if(4) + tally["gaping wound"] += 1 + if(5) + tally["big gaping wound"] += 1 + if(6) + tally["massive wound"] += 1 + for(var/tallied in tally) + if(!tally[tallied]) + continue + + +// if(w.bleeding) +// usr << "\red [src.name] is bleeding from a [sizetext] on [t_his] [temp.display_name]." +// continue print_flavor_text() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c92fa7bd87a..ea9af2d5969 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -54,12 +54,13 @@ var/list/body_standing = list() var/list/body_lying = list() + var/organs2 = list() var/mutantrace = null var/bloodloss = 0 - var/debug_leftarm - var/debug_lefthand + var/datum/reagents/vessel + var/pale = 0 /mob/living/carbon/human/dummy real_name = "Test Dummy" @@ -75,25 +76,26 @@ if(!dna) dna = new /datum/dna(null) - new /datum/organ/external/chest(src) - new /datum/organ/external/groin(src) - new /datum/organ/external/head(src) - new /datum/organ/external/l_arm(src) - new /datum/organ/external/r_arm(src) - new /datum/organ/external/r_leg(src) - new /datum/organ/external/l_leg(src) + organs2 += new /datum/organ/external/chest(src) + organs2 += new /datum/organ/external/groin(src) + organs2 += new /datum/organ/external/head(src) + organs2 += new /datum/organ/external/l_arm(src) + organs2 += new /datum/organ/external/r_arm(src) + organs2 += new /datum/organ/external/r_leg(src) + organs2 += new /datum/organ/external/l_leg(src) var/datum/organ/external/part = new /datum/organ/external/l_hand(src) part.parent = organs["l_arm"] + organs2 += part part = new /datum/organ/external/l_foot(src) part.parent = organs["l_leg"] + organs2 += part part = new /datum/organ/external/r_hand(src) part.parent = organs["r_arm"] + organs2 += part part = new /datum/organ/external/r_foot(src) part.parent = organs["r_leg"] - - debug_leftarm = organs["l_arm"] - debug_lefthand = organs["l_hand"] + organs2 += part var/g = "m" if (gender == MALE) @@ -113,12 +115,50 @@ update_clothing() src << "\blue Your icons have been generated!" + vessel = new/datum/reagents(560) + vessel.my_atom = src + vessel.add_reagent("blood",560) + spawn(1) fixblood() + ..() /*var/known_languages = list() known_languages.Add("english")*/ // organStructure = new /obj/effect/organstructure/human(src) +/mob/living/carbon/human/proc/fixblood() + for(var/datum/reagent/blood/B in vessel.reagent_list) + if(B.id == "blood") + B.data["blood_type"] = dna.b_type + B.data["blood_DNA"] = dna.unique_enzymes + B.data["donor"] = src + if(virus2) + B.data["virus2"] = virus2.getcopy() + +/mob/living/carbon/human/proc/drip(var/amt as num) + if(!amt) + return + var/turf/T = get_turf(src) + var/list/obj/effect/decal/cleanable/blood/drip/nums + var/amm = 0.1 * amt + vessel.remove_reagent("blood",amm) + for(var/obj/effect/decal/cleanable/blood/drip/G in T) + nums += G + if(nums.len >= 3) + var/obj/effect/decal/cleanable/blood/drip/D = pick(nums) + D.blood_DNA.len++ + D.blood_DNA[D.blood_DNA.len] = list(dna.unique_enzymes,dna.b_type) + if(virus2) + D.virus2 += virus2.getcopy() + return + var/obj/effect/decal/cleanable/blood/this = new(T) + var/hax = pick("1","2","3","4","5") + this.icon_state = hax + this.blood_DNA = list(list(dna.unique_enzymes,dna.b_type)) + this.blood_owner = src + if(virus2) + this.virus2 = virus2.getcopy() + /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return @@ -1351,6 +1391,9 @@ else stand_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) lying_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + if(pale) + stand_icon.Blend(rgb(100,100,100)) + lying_icon.Blend(rgb(100,100,100)) if (underwear > 0) //if(!obese) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7ec31ec32bb..9120b7d659d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -750,6 +750,7 @@ handle_chemicals_in_body() if(reagents && stat != 2) reagents.metabolize(src) + if(vessel && stat != 2) vessel.metabolize(src) if(mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing @@ -826,6 +827,10 @@ return //TODO: DEFERRED + updatepale() + pale = !pale + update_body() + handle_regular_status_updates() var/leg_tally = 2 for(var/name in organs) @@ -850,6 +855,39 @@ emote("collapse") paralysis = 10 + if(stat < 2) + var/blood_volume = round(vessel.get_reagent_amount("blood")) + if(bloodloss) + drip(bloodloss) + if(!blood_volume) + bloodloss = 0 + else if(blood_volume > 448) + if(pale) + pale = 0 + updatepale() + else if(blood_volume <= 448 && blood_volume > 336) + if(!pale) + updatepale() + pale = 1 + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + if(prob(1)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + else if(blood_volume <= 336 && blood_volume > 244) + if(!pale) + updatepale() + pale = 1 + eye_blurry += 6 + if(prob(15)) + paralysis += rand(1,3) + else if(blood_volume <= 244 && blood_volume > 122) + if(toxloss <= 100) + toxloss = 100 + else if(blood_volume <= 122) + death() + //src.unlock_medal("We're all sold out on blood", 0, "You bled to death..", "easy") + updatehealth() // health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) @@ -924,16 +962,13 @@ var/datum/organ/external/temp = organs[name] if(!temp.bleeding) continue - else - if(prob(35)) - bloodloss += rand(1,10) + // else + // if(prob(35)) + // bloodloss += rand(1,10) if(temp.wounds) for(var/datum/organ/external/wound/W in temp.wounds) - if(!temp.bleeding) - continue - else - if(prob(25)) - bloodloss++ + if(prob(10*W.woundsize) && W.bleeding) + bloodloss++ if (eye_blind) eye_blind-- blinded = 1 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c3607a1637e..6a868ca1c37 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -175,8 +175,9 @@ affecting.heal_damage(1000, 1000) //fixes getting hit after ingestion, killing you when game updates organ health affecting.broken = 0 affecting.destroyed = 0 - for(var/datum/organ/external/wound/W in affecting.wounds) + for(var/datum/organ/wound/W in affecting.wounds) W.stopbleeding() + del(W) H.UpdateDamageIcon() H.update_body() //src.fireloss = 0 diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 892d32419b7..e38087f4d62 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -45,7 +45,6 @@ burn_dam = 0 bandaged = 0 max_damage = 0 - wound_size = 0 max_size = 0 obj/item/weapon/implant/implant = null @@ -301,27 +300,45 @@ proc/createwound(var/size = 1) if(ishuman(src.owner)) - var/datum/organ/external/wound/W = new(src) - W.bleeding = 1 - src.owner:bloodloss += 10 * size + var/datum/organ/wound/W = new(src) + bleeding = 1 + owner:bloodloss += 10 * size W.wound_size = size W.owner = src.owner - src.wounds += W + W.parent = src + wounds += W -/datum/organ/external/wound +/datum/organ/wound name = "wound" - wound_size = 1 - icon_name = "wound" - display_name = "wound" - parent = null + var/wound_size = 1 + var/datum/organ/external/parent + var/bleeding = 1 //You got wounded, of course it's bleeding. + var/healing_state = 0 proc/stopbleeding() - if(!src.bleeding) - return - var/t = 10 * src.wound_size - src.owner:bloodloss -= t - src.bleeding = 0 - del(src) + if(!bleeding) + return 0 + owner:bloodloss -= 10 * src.wound_size + parent.bleeding = 0 + for(var/datum/organ/wound/W in parent) + if(W.bleeding && W != src) + parent.bleeding = 1 + bleeding = 0 + spawn become_scar() //spawn off the process of becoming a scar. + return 1 + + proc/become_scar() + healing_state = 1 //Patched + sleep(rand(1800,3000)) //3-5 minutes + healing_state = 2 //Noticibly healing. + sleep(rand(1800,3000)) //3-5 minutes + healing_state = 3 //Angry red scar + sleep(rand(6000,9000)) //10-15 minutes + healing_state = 4 //Scar + sleep(rand(6000,9000)) //10-15 minutes + healing_state = 5 //Faded scar + return + /**************************************************** INTERNAL ORGANS diff --git a/icons/effects/drip.dmi b/icons/effects/drip.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c78843e5863f0b2c2d342df205ffd4acc392c91a GIT binary patch literal 3953 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