De-retarded wound system.

This commit is contained in:
SkyMarshal
2012-06-23 16:35:25 -07:00
parent ce7db3f15e
commit 62c3d1d11d
32 changed files with 558 additions and 979 deletions

View File

@@ -192,29 +192,29 @@
// Gloves // Gloves
var/datum/organ/external/lo = organs["l_hand"] var/datum/organ/external/lo = organs["l_hand"]
var/datum/organ/external/ro = organs["r_hand"] var/datum/organ/external/ro = organs["r_hand"]
if (!lo.destroyed || !ro.destroyed) if (!(lo.status & DESTROYED && ro.status & DESTROYED))
if (gloves) if (gloves)
var/t1 = gloves.item_state var/t1 = gloves.item_state
if (!t1) if (!t1)
t1 = gloves.icon_state t1 = gloves.icon_state
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed) if(lo.status & DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image(gloves_icon, "layer" = MOB_LAYER) overlays += image(gloves_icon, "layer" = MOB_LAYER)
if (gloves.blood_DNA) if (gloves.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
else if (blood_DNA) else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
// Glasses // Glasses
@@ -231,19 +231,19 @@
// Shoes // Shoes
lo = organs["l_foot"] lo = organs["l_foot"]
ro = organs["r_foot"] ro = organs["r_foot"]
if ((!lo.destroyed || !ro.destroyed) && shoes) if (!(lo.status & DESTROYED && ro.status & DESTROYED) && shoes)
var/t1 = shoes.icon_state var/t1 = shoes.icon_state
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed && !lying) if(lo.status & DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY) shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
else if(ro.destroyed && !lying) else if(ro.status & DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY) shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
overlays += image(shoes_icon, "layer" = MOB_LAYER) overlays += image(shoes_icon, "layer" = MOB_LAYER)
if (shoes.blood_DNA) if (shoes.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
/* if (w_radio) /* if (w_radio)
@@ -355,7 +355,7 @@
head.screen_loc = ui_head head.screen_loc = ui_head
else else
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(!head.destroyed) if(!(head.status & DESTROYED))
//if not wearing anything on the head, show the ears //if not wearing anything on the head, show the ears
overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER) overlays += image("icon" = icon('tajaran.dmi', "ears_[gender==FEMALE ? "f" : "m"]_[lying ? "l" : "s"]"), "layer" = MOB_LAYER)
@@ -482,7 +482,7 @@
lying_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('tajaran.dmi', "chest_[g]_l"), ICON_OVERLAY)
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(!head.destroyed) if(!(head.status & DESTROYED))
stand_icon.Blend(new /icon('tajaran.dmi', "head_[g]_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('tajaran.dmi', "head_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('tajaran.dmi', "head_[g]_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('tajaran.dmi', "head_[g]_l"), ICON_OVERLAY)
@@ -491,12 +491,12 @@
if(!istype(part, /datum/organ/external/groin) \ if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \ && !istype(part, /datum/organ/external/head) \
&& !part.destroyed) && !(part.status & DESTROYED))
var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s") var/icon/temp = new /icon('tajaran.dmi', "[part.icon_name]_s")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
stand_icon.Blend(temp, ICON_OVERLAY) stand_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon('tajaran.dmi', "[part.icon_name]_l") temp = new /icon('tajaran.dmi', "[part.icon_name]_l")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
lying_icon.Blend(temp , ICON_OVERLAY) lying_icon.Blend(temp , ICON_OVERLAY)
stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('tajaran.dmi', "groin_[g]_s"), ICON_OVERLAY)
@@ -511,7 +511,7 @@
if(!istype(part, /datum/organ/external/groin) \ if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \ && !istype(part, /datum/organ/external/head) \
&& part.destroyed) && (part.status & DESTROYED))
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
@@ -539,7 +539,7 @@
if(organs) if(organs)
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(head) if(head)
if(head.destroyed) if(head.status & DESTROYED)
del(face_standing) del(face_standing)
del(face_lying) del(face_lying)
return return

View File

@@ -455,12 +455,12 @@ proc/airborne_can_reach(turf/source, turf/target)
var/name = pick(mob.organs) var/name = pick(mob.organs)
var/datum/organ/external/organ = mob.organs[name] var/datum/organ/external/organ = mob.organs[name]
if(!organ.broken && !organ.robot) if(!(organ.status & BROKEN) && !(organ.status & ROBOT))
mob.adjustBruteLoss(10) mob.adjustBruteLoss(10)
mob.visible_message("\red You hear a loud cracking sound coming from [mob.name].","\red <b>Something feels like it shattered in your [organ.display_name]!</b>","You hear a sickening crack.") mob.visible_message("\red You hear a loud cracking sound coming from [mob.name].","\red <b>Something feels like it shattered in your [organ.display_name]!</b>","You hear a sickening crack.")
mob.emote("scream") mob.emote("scream")
organ.broken = 1 organ.status |= BROKEN
organ.wound = pick("broken","fracture","hairline fracture") //Randomise in future. Edit: Randomized. --SkyMarshal organ.broken_description = pick("broken","fracture","hairline fracture") //Randomise in future. Edit: Randomized. --SkyMarshal
organ.perma_injury = 10 organ.perma_injury = 10

View File

@@ -247,17 +247,17 @@
var/infected = "" var/infected = ""
var/imp = "" var/imp = ""
var/bled = "" var/bled = ""
if(e.bleeding) if(e.status & BLEEDING)
bled = "Bleeding:" bled = "Bleeding:"
if(e.broken) if(e.status & BROKEN)
AN = "[e.wound]:" AN = "[e.broken_description]:"
if(e.open) if(e.open)
open = "OPEN:" open = "OPEN:"
if(e.implant && e.implant.len) if(e.implant && e.implant.len)
imp = "IMPLANT:" imp = "IMPLANT:"
if(!AN && !open && !infected & !imp) if(!AN && !open && !infected & !imp)
AN = "None" AN = "None"
if(!e.destroyed) if(!e.status & DESTROYED)
dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][open][infected][imp]</td>" dat += "<td>[e.display_name]</td><td>[e.burn_dam]</td><td>[e.brute_dam]</td><td>[bled][AN][open][infected][imp]</td>"
else else
dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>" dat += "<td>[e.display_name]</td><td>-</td><td>-</td><td>Not Found</td>"

View File

@@ -283,7 +283,7 @@ var/list/sacrificed = list()
del(ghost) del(ghost)
for(var/name in corpse_to_raise.organs) for(var/name in corpse_to_raise.organs)
var/datum/organ/external/affecting = corpse_to_raise.organs[name] var/datum/organ/external/affecting = corpse_to_raise.organs[name]
affecting.robot = 0 affecting.status &= ~ROBOT
affecting.heal_damage(1000, 1000) affecting.heal_damage(1000, 1000)
corpse_to_raise.setToxLoss(0) corpse_to_raise.setToxLoss(0)
corpse_to_raise.setOxyLoss(0) corpse_to_raise.setOxyLoss(0)

View File

@@ -119,8 +119,8 @@ MASS SPECTROMETER
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
for(var/name in H.organs) for(var/name in H.organs)
var/datum/organ/external/e = H.organs[name] var/datum/organ/external/e = H.organs[name]
if(e.broken) if(e.status & BROKEN)
user.show_message(text("\red Bone fractures detected. Advanced scanner required for location."), 1) user.show_message("\red Bone fractures detected. Advanced scanner required for location.", 1)
break break
if(ishuman(M)) if(ishuman(M))
if(M:vessel) if(M:vessel)

View File

@@ -398,7 +398,7 @@
return return
var/datum/organ/external/head = H.organs["head"] var/datum/organ/external/head = H.organs["head"]
if(head.destroyed) if(head.status & DESTROYED)
user << "\blue Put it where? There's no head." user << "\blue Put it where? There's no head."
//since these people will be dead M != usr //since these people will be dead M != usr

View File

@@ -97,13 +97,13 @@
if (user.hand) if (user.hand)
if(ishuman(user)) if(ishuman(user))
var/datum/organ/external/temp = user:organs["l_hand"] var/datum/organ/external/temp = user:organs["l_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
user << "\blue Yo- wait a minute." user << "\blue Yo- wait a minute."
return return
else else
if(ishuman(user)) if(ishuman(user))
var/datum/organ/external/temp = user:organs["r_hand"] var/datum/organ/external/temp = user:organs["r_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
user << "\blue Yo- wait a minute." user << "\blue Yo- wait a minute."
if (istype(src.loc, /obj/item/weapon/storage)) if (istype(src.loc, /obj/item/weapon/storage))
@@ -136,7 +136,7 @@
if (user.hand) if (user.hand)
if(ishuman(user)) if(ishuman(user))
var/datum/organ/external/temp = user:organs["l_hand"] var/datum/organ/external/temp = user:organs["l_hand"]
if(!temp.destroyed) if(!(temp.status & DESTROYED))
user.l_hand = src user.l_hand = src
else else
user << "\blue You pick \the [src] up with your ha- wait a minute." user << "\blue You pick \the [src] up with your ha- wait a minute."
@@ -148,7 +148,7 @@
else else
if(ishuman(user)) if(ishuman(user))
var/datum/organ/external/temp = user:organs["r_hand"] var/datum/organ/external/temp = user:organs["r_hand"]
if(!temp.destroyed) if(!(temp.status & DESTROYED))
user.r_hand = src user.r_hand = src
else else
user << "\blue You pick \the [src] up with your ha- wait a minute." user << "\blue You pick \the [src] up with your ha- wait a minute."
@@ -176,13 +176,13 @@
if (user.hand) if (user.hand)
if(ismonkey(user)) if(ismonkey(user))
var/datum/organ/external/temp = user:organs["l_hand"] var/datum/organ/external/temp = user:organs["l_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
user << "\blue Yo- wait a minute." user << "\blue Yo- wait a minute."
return return
else else
if(ismonkey(user)) if(ismonkey(user))
var/datum/organ/external/temp = user:organs["r_hand"] var/datum/organ/external/temp = user:organs["r_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
user << "\blue Yo- wait a minute." user << "\blue Yo- wait a minute."
if (istype(src.loc, /obj/item/weapon/storage)) if (istype(src.loc, /obj/item/weapon/storage))

View File

@@ -31,7 +31,7 @@
return return
if(hasorgans(M)) if(hasorgans(M))
var/datum/organ/external/target = M:get_organ(check_zone(user.zone_sel.selecting)) var/datum/organ/external/target = M:get_organ(check_zone(user.zone_sel.selecting))
if(target.destroyed) if(target.status & DESTROYED)
user << "What [target.display_name]?" user << "What [target.display_name]?"
return return
target.implant += imp target.implant += imp

View File

@@ -8,8 +8,22 @@ MEDICAL
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob) /obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
if (M.stat == 2) if (M.stat == 2)
user << "\red \The [M] is dead, you cannot help [M.get_gender_form("it")]!" var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return return
if (M.health < 50)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is wounded badly, this item cannot help [t_him]!"
return
if (!istype(M)) if (!istype(M))
user << "\red \The [src] cannot be applied to \the [M]!" user << "\red \The [src] cannot be applied to \the [M]!"
@@ -21,113 +35,64 @@ MEDICAL
user << "\red You don't have the dexterity to do this!" user << "\red You don't have the dexterity to do this!"
return 1 return 1
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/stoppedblood = 0 var/datum/organ/external/affecting = H.get_organ("chest")
if(hasorgans(M))
var/datum/organ/external/affecting = M:get_organ("chest")
if(istype(user, /mob/living/carbon/human)) if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user var/mob/living/carbon/human/user2 = user
affecting = M:get_organ(check_zone(user2.zone_sel.selecting)) affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
else else
if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0) if(!istype(affecting, /datum/organ/external))
affecting = M:get_organ("head") affecting = H.get_organ("head")
if(affecting.destroyed && !affecting.gauzed)
user.visible_message("\red \The [user] does [user.get_gender_form("its")] best to stem \the [M]'s bleeding from [M.get_gender_form("its")] stump.", "\red You do your best to stop the bleeding from \the [M]'s stump.", "\red You hear something like gauze being ripped.") if (affecting.heal_damage(src.heal_brute, src.heal_burn))
affecting.gauzed = 1 H.UpdateDamageIcon()
if (user)
if (M != user)
user.visible_message("\red \The [H]'s [affecting.display_name] has been bandaged with \a [src] by \the [user].",\
"\red You bandage \the [H]'s [affecting.display_name] with \the [src].",\
"You hear gauze being ripped.")
else
var/t_his = "its"
if (user.gender == MALE)
t_his = "his"
else if (user.gender == FEMALE)
t_his = "her"
user.visible_message("\red \The [user] bandages [t_his] [affecting.display_name] with \a [src].",\
"\red You bandage your [affecting.display_name] with \the [src].",\
"You hear gauze being ripped.")
use(1) use(1)
return else
user << "Nothing to patch up!"
if(affecting.robot) M.updatehealth()
user << "Medical equipment for a robot arm? Better get a welder..."
return
for(var/datum/organ/wound/W in affecting.wounds)
if(W.bleeding || !W.is_healing)
if(heal_brute && W.wound_type == 2)
continue
if(heal_burn && W.wound_type < 2)
continue
if(W.wound_size > 3 && (W.bleeding || !W.is_healing))
if(stoppedblood)
stoppedblood += 1
break
W.bleeding = 0
W.is_healing = 1
stoppedblood = 1
else if(W.wound_size <= 3)
if(stoppedblood)
stoppedblood += 1
break
W.stopbleeding()
stoppedblood = 1
if (user && stoppedblood)
if (M != user)
user.visible_message("\red \The [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] \the [M]'s cuts with \the [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] \the [M]'s [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else
user.visible_message("\red \The [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [user.get_gender_form("its")] own cuts with \the [src].", "\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] your [heal_burn? "burns" : "wounds"].", "\red You hear something like gauze being ripped.")
else if(user)
user << "\red Nothing to patch up!"
return
else else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
use(1) use(1)
// if (M.health < 50 && !stoppedblood)
// var/t_him = "it"
// if (M.gender == MALE)
// t_him = "him"
// else if (M.gender == FEMALE)
// t_him = "her"
// user << "\red \The [M] is wounded badly, this item cannot help [t_him]!"
// return
// if (user)
// if (M != user)
// user.visible_message( \
// "\blue [M] has been applied with [src] by [user].", \
// "\blue You apply \the [src] to [M]." \
// )
// else
// var/t_himself = "itself"
// if (user.gender == MALE)
// t_himself = "himself"
// else if (user.gender == FEMALE)
// t_himself = "herself"
// user.visible_message( \
// "\blue [M] applied [src] on [t_himself].", \
// "\blue You apply \the [src] on yourself." \
// )
// if (istype(M, /mob/living/carbon/human))
// 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 (affecting.heal_damage(src.heal_brute, src.heal_burn))
// H.UpdateDamageIcon()
// M.updatehealth()
/obj/item/stack/medical/advanced/attack(mob/living/carbon/M as mob, mob/user as mob) /obj/item/stack/medical/advanced/attack(mob/living/carbon/M as mob, mob/user as mob)
if (M.stat == 2) if (M.stat == 2)
user << "\red \The [M] is dead, you cannot help [M.get_gender_form("it")]!" var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is dead, you cannot help [t_him]!"
return
if (M.health < 0)
var/t_him = "it"
if (M.gender == MALE)
t_him = "him"
else if (M.gender == FEMALE)
t_him = "her"
user << "\red \The [M] is wounded badly, this item cannot help [t_him]!"
return return
if (!istype(M)) if (!istype(M))
user << "\red \The [src] cannot be applied to \the [M]!" user << "\red \The [src] cannot be applied to [M]!"
return 1 return 1
if ( ! (istype(user, /mob/living/carbon/human) || \ if ( ! (istype(user, /mob/living/carbon/human) || \
@@ -136,50 +101,37 @@ MEDICAL
user << "\red You don't have the dexterity to do this!" user << "\red You don't have the dexterity to do this!"
return 1 return 1
var/stoppedblood = 0 if (istype(M, /mob/living/carbon/human))
if(hasorgans(M)) var/mob/living/carbon/human/H = M
var/datum/organ/external/affecting = M:get_organ("chest") var/datum/organ/external/affecting = H.get_organ("chest")
if(istype(user, /mob/living/carbon/human)) if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/user2 = user var/mob/living/carbon/human/user2 = user
affecting = M:get_organ(check_zone(user2.zone_sel.selecting)) affecting = H.get_organ(check_zone(user2.zone_sel.selecting))
else else
if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0) if(!istype(affecting, /datum/organ/external) || affecting:burn_dam <= 0)
affecting = M:get_organ("head") affecting = H.get_organ("head")
if(affecting.destroyed && !affecting.gauzed)
M.visible_message("\red \The [user] does their best to stem \the [M]'s bleeding from [M.get_gender_form("its")] stump.", "\red You do your best to stop the bleeding from \the [M]'s stump.", "\red You hear something like gauze being ripped.") if (affecting.heal_damage(src.heal_brute, src.heal_burn))
affecting.gauzed = 1 H.UpdateDamageIcon()
if (user)
if (M != user)
user.visible_message("\red \The [H]'s [affecting.display_name] has been bandaged with \a [src] by \the [user].",\
"\red You bandage \the [H]'s [affecting.display_name] with \the [src].",\
"You hear gauze being ripped.")
else
var/t_his = "its"
if (user.gender == MALE)
t_his = "his"
else if (user.gender == FEMALE)
t_his = "her"
user.visible_message("\red \The [user] bandages [t_his] [affecting.display_name] with \a [src].",\
"\red You bandage your [affecting.display_name] with \the [src].",\
"You hear gauze being ripped.")
use(1) use(1)
return
if(affecting.robot)
user << "Medical equipment for a robot arm? Better get a welder..."
return
for(var/datum/organ/wound/W in affecting.wounds) M.updatehealth()
if(W.bleeding || !W.healing_state)
if(heal_brute && W.wound_type == 2)
continue
if(heal_burn && W.wound_type < 2)
continue
if(stoppedblood)
stoppedblood++
break
W.stopbleeding()
stoppedblood = 1
if (user && stoppedblood)
if (M != user)
user.visible_message("\red \The [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] \the [M]'s cuts with \the [src].",\
"\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] \the [M]'s [heal_burn? "burns" : "wounds"].",\
"\red You hear something like gauze being ripped.")
else
user.visible_message("\red \The [user] [heal_burn? "salves" : "bandages"] [stoppedblood - 1 ? "some of" : "the last of"] [user.get_gender_form("its")] own cuts with \the [src].",\
"\red You [heal_burn? "salve" : "bandage up"] [stoppedblood - 1 ? "some of" : "the last of"] your [heal_burn? "burns" : "wounds"].",\
"\red You hear something like gauze being ripped.")
else if(user)
user << "\red Nothing to patch up!"
return
else else
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2)) M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
use(1) use(1)

View File

@@ -23,9 +23,9 @@
return ..() return ..()
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting] var/datum/organ/external/S = H.organs[limbloc]
if(S.destroyed) if(S.status & DESTROYED)
if(!S.attachable) if(!(S.status & ATTACHABLE))
user << "\red The wound is not ready for a replacement!" user << "\red The wound is not ready for a replacement!"
return 0 return 0
if(M != user) if(M != user)
@@ -51,15 +51,10 @@
user << "\red You mess up!" user << "\red You mess up!"
S.take_damage(15) S.take_damage(15)
S.broken = 0 S.status &= ~BROKEN
S.attachable = 0 S.status &= ~ATTACHABLE
S.destroyed = 0 S.status &= ~DESTROYED
S.robot = 1 S.status |= ROBOT
var/datum/organ/external/T = H.organs["[limbloc]"]
T.attachable = 0
T.destroyed = 0
T.broken = 0
T.robot = 1
M.update_body() M.update_body()
M.updatehealth() M.updatehealth()
M.UpdateDamageIcon() M.UpdateDamageIcon()

View File

@@ -24,11 +24,11 @@ CIRCULAR SAW
if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human))) if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting] var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
if(S.destroyed) if(S.status & DESTROYED)
if(S.bleeding) if(S.status & BLEEDING)
user << "\red There's too much blood here!" user << "\red There's too much blood here!"
return 0 return 0
if(!S.cutaway) if(!(S.status & CUT_AWAY))
user << "\red The flesh hasn't been cleanly cut!" user << "\red The flesh hasn't been cleanly cut!"
return 0 return 0
if(M != user) if(M != user)
@@ -245,17 +245,17 @@ CIRCULAR SAW
if(!S || !istype(S)) if(!S || !istype(S))
return 0 return 0
if(S.destroyed) if(S.status & DESTROYED)
return ..() return ..()
if(S.robot) if(S.status & ROBOT)
user << "Medical equipment for a robot arm? How would that do any good..." user << "Medical equipment for a robot arm? How would that do any good..."
return return
if(!S.open) if(!S.open)
user << "\red There is skin in the way!" user << "\red There is skin in the way!"
return 0 return 0
if(S.bleeding) if(S.status & BLEEDING)
user << "\red [H] is profusely bleeding in \his [S.display_name]!" user << "\red [H] is profusely bleeding in \his [S.display_name]!"
return 0 return 0
@@ -303,11 +303,11 @@ CIRCULAR SAW
if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human))) if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting] var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
if(S.destroyed) if(S.status & DESTROYED)
if(!S.bleeding) if(!(S.status & BLEEDING))
user << "\red There is nothing bleeding here!" user << "\red There is nothing bleeding here!"
return 0 return 0
if(!S.cutaway) if(!(S.status & CUT_AWAY))
user << "\red The flesh hasn't been cleanly cut!" user << "\red The flesh hasn't been cleanly cut!"
return 0 return 0
if(M != user) if(M != user)
@@ -333,7 +333,7 @@ CIRCULAR SAW
user << "\red You mess up!" user << "\red You mess up!"
S.take_damage(15) S.take_damage(15)
S.bleeding = 0 S.status &= ~BLEEDING
M.updatehealth() M.updatehealth()
M.UpdateDamageIcon() M.UpdateDamageIcon()
@@ -559,10 +559,10 @@ CIRCULAR SAW
if(!S || !istype(S)) if(!S || !istype(S))
return 0 return 0
if(S.destroyed) if(S.status & DESTROYED)
return ..() return ..()
if(S.robot) if(S.status & ROBOT)
user << "Medical equipment for a robot arm? How would that do any good?" user << "Medical equipment for a robot arm? How would that do any good?"
return return
@@ -570,7 +570,7 @@ CIRCULAR SAW
user << "\red There is skin in the way!" user << "\red There is skin in the way!"
return 0 return 0
if(!S.bleeding) if(!(S.status & BLEEDING))
if(S.implant) if(S.implant)
if(H != user) if(H != user)
H.visible_message( \ H.visible_message( \
@@ -581,17 +581,18 @@ CIRCULAR SAW
"\red [user] attempts to remove the implant in \his [S.display_name] with \the [src]!", \ "\red [user] attempts to remove the implant in \his [S.display_name] with \the [src]!", \
"\red You attempt to remove the implant in your [S.display_name] with \the [src]!") "\red You attempt to remove the implant in your [S.display_name] with \the [src]!")
if(do_mob(user, H, 50)) do
if(prob(50)) if(do_mob(user, H, 50))
if(H != user) if(prob(50))
H.visible_message( \ if(H != user)
"\red [user] successfully removes the implant in [H]'s [S.display_name] with \the [src]!", \ H.visible_message( \
"\red [user] successfully removes the implant in your [S.display_name] with \the [src]!") "\red [user] successfully removes the implant in [H]'s [S.display_name] with \a [src]!", \
else "\red [user] successfully removes the implant in your [S.display_name] with \the [src]!")
H.visible_message( \ else
"\red [user] successfully removes the implant in \his [S.display_name] with \the [src]!", \ H.visible_message( \
"\red You successfully remove the implant in your [S.display_name] with \the [src]!") "\red [user] successfully removes the implant in \his [S.display_name] with \a [src]!", \
for(var/obj/item/weapon/implant/implant in S.implant) "\red You successfully remove the implant in your [S.display_name] with \the [src]!")
var/obj/item/weapon/implant/implant = pick(S.implant)
implant.loc = (get_turf(H)) implant.loc = (get_turf(H))
implant.implanted = 0 implant.implanted = 0
S.implant.Remove(implant) S.implant.Remove(implant)
@@ -599,15 +600,15 @@ CIRCULAR SAW
if(istype(implant, /obj/item/weapon/implant/explosive) || istype(implant, /obj/item/weapon/implant/uplink) || istype(implant, /obj/item/weapon/implant/dexplosive) || istype(implant, /obj/item/weapon/implant/explosive) || istype(implant, /obj/item/weapon/implant/compressed)) if(istype(implant, /obj/item/weapon/implant/explosive) || istype(implant, /obj/item/weapon/implant/uplink) || istype(implant, /obj/item/weapon/implant/dexplosive) || istype(implant, /obj/item/weapon/implant/explosive) || istype(implant, /obj/item/weapon/implant/compressed))
usr << "The implant disintegrates into nothing..." usr << "The implant disintegrates into nothing..."
del(implant) del(implant)
else if(!S.implant.len)
if(H != user) del S.implant
H.visible_message( \
"\red [user] fails to removes the implant!", \
"\red [user] fails to removes the implant!")
else else
H.visible_message( \ H.visible_message( \
"\red [user] fails to removes the implant!", \ "\red [user] fails to remove the implant!", \
"\red You fail to removes the implant!") "\red You fail to remove the implant!")
else
break
while (S.implant && S.implant.len)
return 1 return 1
else else
@@ -637,7 +638,7 @@ CIRCULAR SAW
user << "\red You mess up!" user << "\red You mess up!"
S.take_damage(15) S.take_damage(15)
S.bleeding = 0 S.status &= ~BLEEDING
H.updatehealth() H.updatehealth()
H.UpdateDamageIcon() H.UpdateDamageIcon()
@@ -813,7 +814,7 @@ CIRCULAR SAW
if(!S.open) if(!S.open)
usr << "<b>You have to cut the limb open first!</b>" usr << "<b>You have to cut the limb open first!</b>"
return return
if(S.robot) if(S.status & ROBOT)
user << "Medical equipment for a robot arm? How would that do any good?" user << "Medical equipment for a robot arm? How would that do any good?"
return return
for(var/mob/O in viewers(M)) for(var/mob/O in viewers(M))
@@ -837,11 +838,11 @@ CIRCULAR SAW
if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human))) if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting] var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
if(S.destroyed) if(S.status & DESTROYED)
if(S.bleeding) if(S.status & BLEEDING)
user << "\red There's too much blood here!" user << "\red There's too much blood here!"
return 0 return 0
if(!S.cutaway) if(!(S.status & CUT_AWAY))
user << "\red The flesh hasn't been cleanly cut!" user << "\red The flesh hasn't been cleanly cut!"
return 0 return 0
if(S.open != 3) if(S.open != 3)
@@ -872,7 +873,7 @@ CIRCULAR SAW
S.open = 0 S.open = 0
S.stage = 0 S.stage = 0
S.attachable = 1 S.status |= ATTACHABLE
M.updatehealth() M.updatehealth()
M.UpdateDamageIcon() M.UpdateDamageIcon()
@@ -1028,10 +1029,10 @@ CIRCULAR SAW
if(!S || !istype(S)) if(!S || !istype(S))
return 0 return 0
if(S.destroyed) if(S.status & DESTROYED)
user << "What [S.display_name]?" user << "What [S.display_name]?"
if(S.robot) if(S.status & ROBOT)
user << "Medical equipment for a robot arm? How would that do any good..." user << "Medical equipment for a robot arm? How would that do any good..."
return return
if(!S.open) if(!S.open)
@@ -1096,7 +1097,7 @@ CIRCULAR SAW
if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human))) if(((user.zone_sel.selecting == "l_arm") || (user.zone_sel.selecting == "r_arm") || (user.zone_sel.selecting == "l_leg") || (user.zone_sel.selecting == "r_leg")) & (istype(M, /mob/living/carbon/human)))
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
var/datum/organ/external/S = H.organs[user.zone_sel.selecting] var/datum/organ/external/S = H.organs[user.zone_sel.selecting]
if(S.destroyed) if(S.status & DESTROYED)
if(M != user) if(M != user)
M.visible_message( \ M.visible_message( \
"\red [user] is beginning to cut away at the flesh where [H]'s [S.display_name] used to be with [src].", \ "\red [user] is beginning to cut away at the flesh where [H]'s [S.display_name] used to be with [src].", \
@@ -1116,8 +1117,7 @@ CIRCULAR SAW
"\red [user] finishes cutting where \his [S.display_name] used to be with [src]!", \ "\red [user] finishes cutting where \his [S.display_name] used to be with [src]!", \
"\red You finish cutting where your [S.display_name] used to be with [src]!") "\red You finish cutting where your [S.display_name] used to be with [src]!")
S.cutaway = 1 S.status |= BLEEDING|CUT_AWAY
S.bleeding = 1
M.updatehealth() M.updatehealth()
M.UpdateDamageIcon() M.UpdateDamageIcon()
else else
@@ -1190,7 +1190,7 @@ CIRCULAR SAW
if(istype(H) && H.organs["head"]) if(istype(H) && H.organs["head"])
var/datum/organ/external/affecting = H.organs["head"] var/datum/organ/external/affecting = H.organs["head"]
if(affecting.destroyed) if(affecting.status & DESTROYED)
return ..() return ..()
if(istype(H) && ( \ if(istype(H) && ( \
@@ -1242,7 +1242,7 @@ CIRCULAR SAW
if(istype(M, /mob/living/carbon/human)) if(istype(M, /mob/living/carbon/human))
var/datum/organ/external/affecting = M:get_organ("head") var/datum/organ/external/affecting = M:get_organ("head")
affecting.take_damage(7) affecting.take_damage(7)
affecting.open = 1 affecting.status |= OPEN
else else
M.take_organ_damage(7) M.take_organ_damage(7)
@@ -1420,10 +1420,10 @@ CIRCULAR SAW
if(!S || !istype(S)) if(!S || !istype(S))
return 0 return 0
if(S.destroyed) if(S.status & DESTROYED)
return ..() return ..()
if(S.robot) if(S.status & ROBOT)
user << "Medical equipment for a robot arm? How would that do any good..." user << "Medical equipment for a robot arm? How would that do any good..."
return return
@@ -1454,8 +1454,7 @@ CIRCULAR SAW
user << "\red You mess up!" user << "\red You mess up!"
S.take_damage(15) S.take_damage(15)
S.open = 1 S.status |= OPEN|BLEEDING
S.bleeding = 1
if(S.display_name == "chest") if(S.display_name == "chest")
H:embryo_op_stage = 1.0 H:embryo_op_stage = 1.0
if(S.display_name == "groin") if(S.display_name == "groin")
@@ -1467,14 +1466,13 @@ CIRCULAR SAW
var/msg var/msg
if(a == 1) if(a == 1)
msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding" msg = "\red [user]'s move slices open [H]'s wound, causing massive bleeding"
S.brute_dam += 35 S.take_damage(35, 0, 1, "Malpractice")
S.createwound(rand(1,3))
else if(a == 2) else if(a == 2)
msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself" msg = "\red [user]'s move slices open [H]'s wound, and causes \him to accidentally stab himself"
S.brute_dam += 35 S.take_damage(35, 0, 1, "Malpractice")
var/datum/organ/external/userorgan = user:organs["chest"] var/datum/organ/external/userorgan = user:organs["chest"]
if(userorgan) if(userorgan)
userorgan.brute_dam += 35 userorgan.take_damage(35, 0, 1, "Malpractice")
else else
user.take_organ_damage(35) user.take_organ_damage(35)
else if(a == 3) else if(a == 3)
@@ -1524,7 +1522,7 @@ CIRCULAR SAW
if(!hasorgans(M)) if(!hasorgans(M))
return ..() return ..()
var/datum/organ/external/S = M:organs["head"] var/datum/organ/external/S = M:organs["head"]
if(S.destroyed) if(S.status & DESTROYED)
return return
for(var/mob/O in viewers(M, null)) for(var/mob/O in viewers(M, null))
O.show_message(text("\red [M] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1) O.show_message(text("\red [M] gets \his [S.display_name] sawed at with [src] by [user].... It looks like [user] is trying to cut it off!"), 1)
@@ -1534,7 +1532,7 @@ CIRCULAR SAW
return return
for(var/mob/O in viewers(M, null)) for(var/mob/O in viewers(M, null))
O.show_message(text("\red [M] gets \his [S.display_name] sawed off with [src] by [user]."), 1) O.show_message(text("\red [M] gets \his [S.display_name] sawed off with [src] by [user]."), 1)
S.destroyed = 1 S.status |= DESTROYED
S.droplimb() S.droplimb()
M:update_body() M:update_body()
if(1.0) if(1.0)
@@ -1624,10 +1622,10 @@ CIRCULAR SAW
else if(user.zone_sel.selecting != "chest" && hasorgans(M)) else if(user.zone_sel.selecting != "chest" && hasorgans(M))
var/mob/living/carbon/H = M var/mob/living/carbon/H = M
var/datum/organ/external/S = H:organs[user.zone_sel.selecting] var/datum/organ/external/S = H:organs[user.zone_sel.selecting]
if(S.destroyed) if(S.status & DESTROYED)
return return
if(S.robot) if(S.status & ROBOT)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, M) spark_system.set_up(5, 0, M)
spark_system.attach(M) spark_system.attach(M)
@@ -1688,32 +1686,32 @@ CIRCULAR SAW
var/datum/organ/external/temp = M.organs[zone] var/datum/organ/external/temp = M.organs[zone]
var/msg var/msg
if(temp.destroyed) if(temp.status & DESTROYED)
return ..() return ..()
// quickly convert embryo removal to bone surgery // quickly convert embryo removal to bone surgery
if(zone == "chest" && M.embryo_op_stage == 3) if(zone == "chest" && M.embryo_op_stage == 3)
M.embryo_op_stage = 0 M.embryo_op_stage = 0
temp.open = 2 temp.open = 2
temp.bleeding = 0 temp.status &= ~BLEEDING
// quickly convert appendectomy to bone surgery // quickly convert appendectomy to bone surgery
if(zone == "groin" && M.appendix_op_stage == 3) if(zone == "groin" && M.appendix_op_stage == 3)
M.appendix_op_stage = 0 M.appendix_op_stage = 0
temp.open = 2 temp.open = 2
temp.bleeding = 0 temp.status &= ~BLEEDING
msg = get_message(1,M,user,temp) msg = get_message(1,M,user,temp)
for(var/mob/O in viewers(M,null)) for(var/mob/O in viewers(M,null))
O.show_message("\red [msg]",1) O.show_message("\red [msg]",1)
if(do_mob(user,M,time)) if(do_mob(user,M,time))
if(temp.open == 2 && !temp.bleeding) if(temp.open == 2 && !(temp.status & BLEEDING))
if(temp.wound in wound) if(temp.broken_description in wound)
if(temp.stage in stage) if(temp.stage in stage)
temp.stage += 1 temp.stage += 1
if(IsFinalStage(temp.stage)) if(IsFinalStage(temp.stage))
temp.broken = 0 temp.status &= ~BROKEN
temp.stage = 0 temp.stage = 0
temp.perma_injury = 0 temp.perma_injury = 0
temp.brute_dam = temp.min_broken_damage -1 temp.brute_dam = temp.min_broken_damage -1
@@ -1811,16 +1809,16 @@ CIRCULAR SAW
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
for(var/name in H.organs) for(var/name in H.organs)
var/datum/organ/external/e = H.organs[name] var/datum/organ/external/e = H.organs[name]
if(e.destroyed) // this is nanites, not space magic if(e.status & DESTROYED) // this is nanites, not space magic
continue continue
e.brute_dam = 0.0 e.brute_dam = 0.0
e.burn_dam = 0.0 e.burn_dam = 0.0
e.bandaged = 0.0 e.status &= ~BANDAGED
e.max_damage = initial(e.max_damage) e.max_damage = initial(e.max_damage)
e.bleeding = 0 e.status &= ~BLEEDING
e.open = 0 e.open = 0
e.broken = 0 e.status &= ~BROKEN
e.destroyed = 0 e.status &= ~DESTROYED
e.perma_injury = 0 e.perma_injury = 0
e.update_icon() e.update_icon()
H.update_body() H.update_body()

View File

@@ -28,7 +28,7 @@ TILES
/obj/item/weapon/wire/attack(mob/M as mob, mob/user as mob) /obj/item/weapon/wire/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M)) if(hasorgans(M))
var/datum/organ/external/S = M:organs[user.zone_sel.selecting] var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
if(!S.robot || user.a_intent != "help") if(!(S.status & ROBOT) || user.a_intent != "help")
return ..() return ..()
if(S.brute_dam) if(S.brute_dam)
S.heal_damage(0,15,0,1) S.heal_damage(0,15,0,1)

View File

@@ -327,7 +327,7 @@ WELDINGTOOOL
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob) /obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M)) if(hasorgans(M))
var/datum/organ/external/S = M:organs[user.zone_sel.selecting] var/datum/organ/external/S = M:organs[user.zone_sel.selecting]
if(!S.robot || user.a_intent != "help") if(!(S.status & ROBOT) || user.a_intent != "help")
return ..() return ..()
if(S.brute_dam) if(S.brute_dam)
S.heal_damage(15,0,0,1) S.heal_damage(15,0,0,1)
@@ -404,4 +404,4 @@ WELDINGTOOOL
M.update_clothing() M.update_clothing()
return return
else else
..() ..()

View File

@@ -264,7 +264,7 @@ SHARDS
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if(!((H.shoes) || (H.wear_suit && H.wear_suit.body_parts_covered & FEET))) if(!((H.shoes) || (H.wear_suit && H.wear_suit.body_parts_covered & FEET)))
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot")) var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.robot) if(affecting.status & ROBOT)
return return
H.Weaken(3) H.Weaken(3)
affecting.take_damage(5, 0) affecting.take_damage(5, 0)

View File

@@ -375,7 +375,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/obj/item/weapon/implant/uplink/U = src.loc var/obj/item/weapon/implant/uplink/U = src.loc
var/mob/living/A = U.imp_in var/mob/living/A = U.imp_in
var/datum/organ/external/head = A:organs["head"] var/datum/organ/external/head = A:organs["head"]
head.destroyed = 1 head.status |= DESTROYED
spawn(2) spawn(2)
head.droplimb() head.droplimb()
del(src.master) del(src.master)

View File

@@ -130,12 +130,14 @@
if("feet") if("feet")
if(!H.shoes) if(!H.shoes)
affecting = H.get_organ(pick("l_leg", "r_leg")) affecting = H.get_organ(pick("l_leg", "r_leg"))
if(!affecting.robot) H.Weaken(3) if(!(affecting.status & ROBOT))
H.Weaken(3)
if("l_hand", "r_hand") if("l_hand", "r_hand")
if(!H.gloves) if(!H.gloves)
affecting = H.get_organ(type) affecting = H.get_organ(type)
if(!affecting.robot) H.Stun(3) if(!(affecting.status & ROBOT))
if(affecting && !affecting.robot) H.Stun(3)
if(affecting && !(affecting.status & ROBOT))
affecting.take_damage(1, 0) affecting.take_damage(1, 0)
H.UpdateDamageIcon() H.UpdateDamageIcon()
H.updatehealth() H.updatehealth()

View File

@@ -49,13 +49,13 @@
if (M.hand) if (M.hand)
if(ishuman(M) || ismonkey(M)) if(ishuman(M) || ismonkey(M))
var/datum/organ/external/temp = M:organs["l_hand"] var/datum/organ/external/temp = M:organs["l_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
M << "\red Yo- wait a minute." M << "\red Yo- wait a minute."
return return
else else
if(ishuman(M) || ismonkey(M)) if(ishuman(M) || ismonkey(M))
var/datum/organ/external/temp = M:organs["r_hand"] var/datum/organ/external/temp = M:organs["r_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
M << "\red Yo- wait a minute." M << "\red Yo- wait a minute."
return return
@@ -100,13 +100,13 @@
if (M.hand) if (M.hand)
if(ishuman(M) || ismonkey(M)) if(ishuman(M) || ismonkey(M))
var/datum/organ/external/temp = M:organs["l_hand"] var/datum/organ/external/temp = M:organs["l_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
M << "\red Yo- wait a minute." M << "\red Yo- wait a minute."
return return
else else
if(ishuman(M) || ismonkey(M)) if(ishuman(M) || ismonkey(M))
var/datum/organ/external/temp = M:organs["r_hand"] var/datum/organ/external/temp = M:organs["r_hand"]
if(temp.destroyed) if(temp.status & DESTROYED)
M << "\red Yo- wait a minute." M << "\red Yo- wait a minute."
return return
@@ -224,7 +224,7 @@
status = "blugeoned" status = "blugeoned"
if(brutedamage > 40) if(brutedamage > 40)
status = "mangled" status = "mangled"
if(org.bleeding && brutedamage) if(org.status & BLEEDING && brutedamage)
status += ",[burndamage ? "" : " and"] bleeding[burndamage ? "," : ""]" status += ",[burndamage ? "" : " and"] bleeding[burndamage ? "," : ""]"
if(brutedamage > 0 && burndamage > 0) if(brutedamage > 0 && burndamage > 0)
status += " and " status += " and "
@@ -235,7 +235,7 @@
status += "blistered" status += "blistered"
else if(burndamage > 0) else if(burndamage > 0)
status += "numb" status += "numb"
if(org.destroyed) if(org.status & DESTROYED)
status = "MISSING!" status = "MISSING!"
if(status == "") if(status == "")

View File

@@ -239,17 +239,17 @@
if (src.digitalcamo) if (src.digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n" msg += "[t_He] [t_is] repulsively uncanny!\n"
var/list/wound_descriptions = list()
var/list/wound_flavor_text = list() var/list/wound_flavor_text = list()
var/list/is_destroyed = list() var/list/is_destroyed = list()
var/list/is_bleeding = list()
for(var/named in organs) for(var/named in organs)
var/datum/organ/external/temp = organs[named] var/datum/organ/external/temp = organs[named]
if(temp) if(temp)
if(temp.destroyed) if(temp.status & DESTROYED)
is_destroyed["[temp.display_name]"] = 1 is_destroyed["[temp.display_name]"] = 1
wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>[t_He] is missing [t_his] [temp.display_name].</b></span>\n" wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>[t_He] is missing [t_his] [temp.display_name].</b></span>\n"
continue continue
if(temp.robot) if(temp.status & ROBOT)
if(!(temp.brute_dam + temp.burn_dam)) if(!(temp.brute_dam + temp.burn_dam))
wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]!</span>\n" wound_flavor_text["[temp.display_name]"] = "<span class='warning'>[t_He] has a robot [temp.display_name]!</span>\n"
continue continue
@@ -268,192 +268,52 @@
if(21 to INFINITY) if(21 to INFINITY)
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting") wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
wound_flavor_text["[temp.display_name]"] += "!</span>\n" wound_flavor_text["[temp.display_name]"] += "!</span>\n"
else if(temp.wounds) else if(temp.wound_descs)
var/list/wounds = list(list(),list(),list(),list(),list(),list()) var/list/wound_descriptors = list()
for(var/datum/organ/wound/w in temp.wounds) for(var/time in temp.wound_descs)
switch(w.healing_state) for(var/wound in temp.wound_descs[time])
if(0) if(wound in wound_descriptors)
var/list/cut = wounds[1] wound_descriptors[wound]++
cut += w
wounds[1] = cut
if(1)
var/list/cut = wounds[2]
cut += w
wounds[2] = cut
if(2)
var/list/cut = wounds[3]
cut += w
wounds[3] = cut
if(3)
var/list/cut = wounds[4]
cut += w
wounds[4] = cut
if(4)
var/list/cut = wounds[5]
cut += w
wounds[5] = cut
if(5)
var/list/cut = wounds[6]
cut += w
wounds[6] = cut
wound_descriptions["[temp.display_name]"] = wounds
else
wound_flavor_text["[temp.display_name]"] = ""
//Now that we have a big list of all the wounds, on all the limbs.
var/list/is_bleeding = list()
for(var/named in wound_descriptions)
var/list/wound_states = wound_descriptions[named]
var/list/flavor_text = list()
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,\
"tiny bruise" = 0, "small bruise" = 0, "moderate bruise" = 0, "large bruise" = 0, "huge bruise" = 0, "monumental bruise" = 0,\
"small burn" = 0, "moderate burn" = 0, "large burn" = 0, "severe burn" = 0, "deep burn" = 0, "carbonised area" = 0) //How many wounds of what size.
for(var/datum/organ/wound/w in wound_state)
if(w.bleeding && !is_bleeding[named]) is_bleeding[named] = 1
switch(w.wound_size)
if(1)
switch(w.wound_type)
if(0)
tally["cut"] += 1
if(1)
tally["tiny bruise"] += 1
if(2)
tally["small burn"] += 1
if(2)
switch(w.wound_type)
if(0)
tally["deep cut"] += 1
if(1)
tally["small bruise"] += 1
if(2)
tally["moderate burn"] += 1
if(3)
switch(w.wound_type)
if(0)
tally["flesh wound"] += 1
if(1)
tally["moderate bruise"] += 1
if(2)
tally["large burn"] += 1
if(4)
switch(w.wound_type)
if(0)
tally["gaping wound"] += 1
if(1)
tally["large bruise"] += 1
if(2)
tally["severe burn"] += 1
if(5)
switch(w.wound_type)
if(0)
tally["big gaping wound"] += 1
if(1)
tally["huge bruise"] += 1
if(2)
tally["deep burn"] += 1
if(6)
switch(w.wound_type)
if(0)
tally["massive wound"] += 1
if(1)
tally["monumental bruise"] += 1
if(2)
tally["carbonised area"] += 1
for(var/tallied in tally)
if(!tally[tallied])
continue
//if(flavor_text_string && tally[tallied])
// for(
// flavor_text_string += pick(list(", as well as", ", in addition to")) //add more later.
var/tallied_rename = list("cut" = "cut","deep cut" = "deep cut", "flesh wound" = "flesh wound",\
"gaping wound" = "gaping wound", "big gaping wound" = "big gaping wound", "massive wound" = "massive wound",\
"tiny bruise" = "tiny bruise", "small bruise" = "small bruise", "moderate bruise" = "moderate bruise",\
"large bruise" = "large bruise", "huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
"small burn" = "small burn", "moderate burn" = "moderate burn", "large burn" = "large burn",\
"severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area")
switch(i)
if(2) //Healing wounds.
if(tallied in list("cut","small burn"))
continue continue
tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\ wound_descriptors[wound] = 1
"gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\ var/list/flavor_text = list()
"massive wound" = "massive blood soaked bandage", "tiny bruise" = "tiny bruise", "small bruise" = "small bruise",\
"moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\
"huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
"moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\
"severe burn" = "severe salved burn", "deep burn" = "deep salved burn",\
"carbonised area" = "treated carbonised area")
if(3)
if(tallied in list("cut","tiny bruise","small burn"))
continue
tallied_rename = list("deep cut" = "fading cut", "flesh wound" = "small healing wound",\
"gaping wound" = "healing wound", "big gaping wound" = "big healing wound",\
"massive wound" = "massive healing wound", "small bruise" = "tiny bruise",\
"moderate bruise" = "small bruise", "large bruise" = "moderate bruise",\
"huge bruise" = "large bruise", "monumental bruise" = "huge bruise",\
"moderate burn" = "healing moderate burn", "large burn" = "healing large burn",\
"severe burn" = "healing severe burn", "deep burn" = "healing deep burn",\
"carbonised area" = "slowly healing carbonised area")
if(4)
if(tallied in list("cut","deep cut","tiny bruise", "small bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small red scar", "gaping wound" = "angry straight scar",\
"big gaping wound" = "jagged angry scar", "massive wound" = "gigantic angry scar",\
"moderate bruise" = "tiny bruise", "large bruise" = "small bruise",\
"huge bruise" = "moderate bruise", "monumental bruise" = "large bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area")
if(5)
if(tallied in list("cut","deep cut","tiny bruise", "moderate bruise", "small bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"large bruise" = "tiny bruise",\
"huge bruise" = "small bruise", "monumental bruise" = "moderate bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
if(6)
if(tallied in list("cut","deep cut","flesh wound","tiny bruise", "small bruise", "moderate bruise", "large bruise", "huge bruise","small burn", "moderate burn"))
continue
tallied_rename = list("gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"monumental bruise" = "tiny bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\ var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
switch(tally[tallied]) for(var/wound in wound_descriptors)
if(1) switch(wound_descriptors[wound])
if(!flavor_text.len) if(1)
flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" if(!flavor_text.len)
else flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
flavor_text += "[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" else
if(2) flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
if(!flavor_text.len) if(2)
flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>[t_He] has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
flavor_text += "[prob(10) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" else
if(3 to 5) flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
if(!flavor_text.len) if(3 to 5)
flavor_text += "<span class='warning'>[t_He] has several [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>[t_He] has several [wound]s"
flavor_text += " several [tallied_rename[tallied]]s" else
if(6 to INFINITY) flavor_text += " several [wound]s"
if(!flavor_text.len) if(6 to INFINITY)
flavor_text += "<span class='warning'>[t_He] has a bunch of [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>[t_He] has a bunch of [wound]s"
flavor_text += " a ton of [tallied_rename[tallied]]s" else
if(flavor_text.len) flavor_text += " a ton of [wound]\s"
var/flavor_text_string = "" var/flavor_text_string = ""
for(var/text = 1, text <= flavor_text.len, text++) for(var/text = 1, text <= flavor_text.len, text++)
if(text == flavor_text.len && flavor_text.len > 1) if(text == flavor_text.len && flavor_text.len > 1)
flavor_text_string += ", and" flavor_text_string += ", and"
else if(flavor_text.len > 1 && text > 1) else if(flavor_text.len > 1 && text > 1)
flavor_text_string += "," flavor_text_string += ","
flavor_text_string += flavor_text[text] flavor_text_string += flavor_text[text]
flavor_text_string += " on [t_his] [named].</span><br>" flavor_text_string += " on [t_his] [named].</span><br>"
wound_flavor_text["[named]"] = flavor_text_string wound_flavor_text["[named]"] = flavor_text_string
if(temp.status & BLEEDING)
is_bleeding["[named]"] = 1
else
wound_flavor_text["[temp.display_name]"] = ""
//Handles the text strings being added to the actual description. //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. //If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.

View File

@@ -57,7 +57,6 @@
var/mutantrace = null var/mutantrace = null
var/bloodloss = 0
var/datum/reagents/vessel var/datum/reagents/vessel
var/pale = 0 var/pale = 0
var/examine_text = "" var/examine_text = ""
@@ -285,7 +284,7 @@
for(var/organ in list("l_leg","l_foot","r_leg","r_foot")) for(var/organ in list("l_leg","l_foot","r_leg","r_foot"))
var/datum/organ/external/o = organs["[organ]"] var/datum/organ/external/o = organs["[organ]"]
if(o.broken) if(o.status & BROKEN)
tally += 6 tally += 6
if(wear_suit) if(wear_suit)
@@ -778,7 +777,7 @@
M.show_message(text("\red [] has been hit by []", src, O), 1) M.show_message(text("\red [] has been hit by []", src, O), 1)
if (health > 0) if (health > 0)
var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head")) var/datum/organ/external/affecting = get_organ(pick("chest", "chest", "chest", "head"))
if(!affecting || affecting.destroyed) return if(!affecting || affecting.status & DESTROYED) return
if (istype(O, /obj/effect/immovablerod)) if (istype(O, /obj/effect/immovablerod))
affecting.take_damage(101, 0) affecting.take_damage(101, 0)
else else
@@ -948,29 +947,29 @@
// Gloves // Gloves
var/datum/organ/external/lo = organs["l_hand"] var/datum/organ/external/lo = organs["l_hand"]
var/datum/organ/external/ro = organs["r_hand"] var/datum/organ/external/ro = organs["r_hand"]
if (!lo.destroyed || !ro.destroyed) if (!(lo.status & DESTROYED && ro.status & DESTROYED))
if (gloves) if (gloves)
var/t1 = gloves.item_state var/t1 = gloves.item_state
if (!t1) if (!t1)
t1 = gloves.icon_state t1 = gloves.icon_state
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed) if(lo.status & DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
if(ro.destroyed) if(ro.status & DESTROYED)
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
clothing_overlays += image(gloves_icon, "layer" = GLOVES_LAYER) clothing_overlays += image(gloves_icon, "layer" = GLOVES_LAYER)
if (gloves.blood_DNA) if (gloves.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
clothing_overlays += image("icon" = stain_icon, "layer" = B_GLOVES_LAYER) clothing_overlays += image("icon" = stain_icon, "layer" = B_GLOVES_LAYER)
else if (blood_DNA) else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
clothing_overlays += image("icon" = stain_icon, "layer" = B_GLOVES_LAYER) clothing_overlays += image("icon" = stain_icon, "layer" = B_GLOVES_LAYER)
@@ -990,19 +989,19 @@
// Shoes // Shoes
lo = organs["l_foot"] lo = organs["l_foot"]
ro = organs["r_foot"] ro = organs["r_foot"]
if ((!lo.destroyed || !ro.destroyed) && shoes) if (!(lo.status & DESTROYED && ro.status & DESTROYED) && shoes)
var/t1 = shoes.icon_state var/t1 = shoes.icon_state
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2"))) var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed && !lying) if(lo.status & DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY) shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
else if(ro.destroyed && !lying) else if(ro.status & DESTROYED && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY) shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
clothing_overlays += image(shoes_icon, "layer" = SHOES_LAYER) clothing_overlays += image(shoes_icon, "layer" = SHOES_LAYER)
if (shoes.blood_DNA) if (shoes.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "shoeblood[!lying ? "" : "2"]") var/icon/stain_icon = icon('blood.dmi', "shoeblood[!lying ? "" : "2"]")
if(lo.destroyed) if(lo.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed) else if(ro.status & DESTROYED)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY) stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
clothing_overlays += image("icon" = stain_icon, "layer" = B_SHOES_LAYER) // Radio clothing_overlays += image("icon" = stain_icon, "layer" = B_SHOES_LAYER) // Radio
@@ -1389,7 +1388,7 @@
lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY)
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(!head.destroyed) if(!(head.status & DESTROYED))
stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY)
@@ -1398,12 +1397,12 @@
if(!istype(part, /datum/organ/external/groin) \ if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \ && !istype(part, /datum/organ/external/head) \
&& !part.destroyed) && !(part.status & DESTROYED))
var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s") var/icon/temp = new /icon('human.dmi', "[part.icon_name]_s")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
stand_icon.Blend(temp, ICON_OVERLAY) stand_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon('human.dmi', "[part.icon_name]_l") temp = new /icon('human.dmi', "[part.icon_name]_l")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
lying_icon.Blend(temp , ICON_OVERLAY) lying_icon.Blend(temp , ICON_OVERLAY)
stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
@@ -1443,7 +1442,7 @@
if(!istype(part, /datum/organ/external/groin) \ if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \ && !istype(part, /datum/organ/external/head) \
&& part.destroyed) && (part.status & DESTROYED))
husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT) husk_s.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_SUBTRACT)
husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT) husk_l.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_SUBTRACT)
@@ -1473,7 +1472,7 @@
if(organs) if(organs)
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(head) if(head)
if(head.destroyed) if(head.status & DESTROYED)
del(face_standing) del(face_standing)
del(face_lying) del(face_lying)
return return
@@ -2598,7 +2597,7 @@ It can still be worn/put on as normal.
var/amount = 0.0 var/amount = 0.0
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/O = organs[name] var/datum/organ/external/O = organs[name]
if(!O.robot) amount+= O.brute_dam if(!(O.status & ROBOT)) amount+= O.brute_dam
return amount return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount, var/used_weapon = null) /mob/living/carbon/human/adjustBruteLoss(var/amount, var/used_weapon = null)
@@ -2611,7 +2610,7 @@ It can still be worn/put on as normal.
var/amount = 0.0 var/amount = 0.0
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/O = organs[name] var/datum/organ/external/O = organs[name]
if(!O.robot) amount+= O.burn_dam if(!(O.status & ROBOT)) amount+= O.burn_dam
return amount return amount
/mob/living/carbon/human/adjustFireLoss(var/amount,var/used_weapon = null) /mob/living/carbon/human/adjustFireLoss(var/amount,var/used_weapon = null)

View File

@@ -41,7 +41,7 @@
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/O = organs[name] var/datum/organ/external/O = organs[name]
if(!O.destroyed) if(!(O.status & DESTROYED))
O.update_icon() O.update_icon()
var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human var/icon/DI = new /icon('dam_human.dmi', O.damage_state) // the damage icon for whole human
DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels DI.Blend(new /icon('dam_mask.dmi', O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
@@ -68,7 +68,7 @@
else else
if(!def_zone) def_zone = ran_zone(def_zone) if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone)) organ = get_organ(check_zone(def_zone))
if(!organ || organ.destroyed) return 0 if(!organ || organ.status & DESTROYED) return 0
if(blocked) if(blocked)
damage = (damage/(blocked+1)) damage = (damage/(blocked+1))

View File

@@ -110,7 +110,7 @@ emp_act
O.emp_act(severity) O.emp_act(severity)
for(var/named in organs) for(var/named in organs)
var/datum/organ/external/O = organs[named] var/datum/organ/external/O = organs[named]
if(O.destroyed) continue if(O.status & DESTROYED) continue
O.emp_act(severity) O.emp_act(severity)
..() ..()
@@ -125,7 +125,7 @@ emp_act
if((user != src) && check_shields(I.force, "the [I.name]")) if((user != src) && check_shields(I.force, "the [I.name]"))
return 0 return 0
if(!affecting.destroyed) if(!(affecting.status & DESTROYED))
visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>") visible_message("\red <B>[src] has been attacked in the [hit_area] with [I.name] by [user]!</B>")
else else
user << "What [affecting]?" user << "What [affecting]?"

View File

@@ -209,11 +209,6 @@
adjustToxLoss(-2) adjustToxLoss(-2)
adjustOxyLoss(-2) adjustOxyLoss(-2)
adjustFireLoss(-2) adjustFireLoss(-2)
for(var/datum/organ/external/org in organs)
if(org.robot) continue
org.brute_dam = max(org.brute_dam - 2, 0)
org.burn_dam = max(org.burn_dam - 2, 0)
updatehealth() updatehealth()
if(!(/mob/living/carbon/human/proc/morph in src.verbs)) if(!(/mob/living/carbon/human/proc/morph in src.verbs))
@@ -909,7 +904,7 @@
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/E = organs[name] var/datum/organ/external/E = organs[name]
E.process() E.process()
if(E.robot && prob(E.brute_dam + E.burn_dam)) if(E.status & ROBOT && prob(E.brute_dam + E.burn_dam))
if(E.name == "l_hand" || E.name == "l_arm") if(E.name == "l_hand" || E.name == "l_arm")
if(hand && equipped()) if(hand && equipped())
drop_item() drop_item()
@@ -933,7 +928,7 @@
else if(E.name == "l_leg" || E.name == "l_foot" \ else if(E.name == "l_leg" || E.name == "l_foot" \
|| E.name == "r_leg" || E.name == "r_foot" && !lying) || E.name == "r_leg" || E.name == "r_foot" && !lying)
leg_tally-- // let it fail even if just foot&leg leg_tally-- // let it fail even if just foot&leg
if(E.broken || E.destroyed) if(E.status & BROKEN || E.status & DESTROYED)
if(E.name == "l_hand" || E.name == "l_arm") if(E.name == "l_hand" || E.name == "l_arm")
if(hand && equipped()) if(hand && equipped())
drop_item() drop_item()
@@ -970,9 +965,7 @@
//At this point, we dun care which blood we are adding to, as long as they get more blood. //At this point, we dun care which blood we are adding to, as long as they get more blood.
B.volume = max(min(B.volume + 560/blood_volume,560), 0) //Less blood = More blood generated per tick B.volume = max(min(B.volume + 560/blood_volume,560), 0) //Less blood = More blood generated per tick
if(!blood_volume) // what is this for? if their blood_volume is 0, they'll die anyway if(blood_volume > 448)
bloodloss = 0
else if(blood_volume > 448)
if(pale) if(pale)
pale = 0 pale = 0
update_body() update_body()
@@ -1096,15 +1089,12 @@
var/blood_max = 0 var/blood_max = 0
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/temp = organs[name] var/datum/organ/external/temp = organs[name]
if(!temp.bleeding || temp.robot) if(!(temp.status & BLEEDING) || temp.status & ROBOT)
continue continue
var/lose_blood = temp.total_wound_bleeding() blood_max += 2
if(lose_blood) if(temp.status & DESTROYED && !(temp.status & GAUZED))
drip(lose_blood)
blood_max += lose_blood
if(temp.destroyed && !temp.gauzed)
blood_max += 10 //Yer missing a fucking limb. blood_max += 10 //Yer missing a fucking limb.
bloodloss = min(bloodloss+1,sqrt(blood_max)) drip(blood_max)
if (eye_blind) if (eye_blind)
eye_blind-- eye_blind--
blinded = 1 blinded = 1

View File

@@ -22,200 +22,80 @@
msg += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n" msg += "<span class='deadsay'>It is limp and unresponsive, with no signs of life.</span>\n"
else else
msg += "<span class='warning'>" msg += "<span class='warning'>"
var/list/wound_descriptions = list()
var/list/wound_flavor_text = list() var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
for(var/named in organs) for(var/named in organs)
var/datum/organ/external/temp = organs[named] var/datum/organ/external/temp = organs[named]
if(temp) if(temp)
if(temp.destroyed) if(temp.status & DESTROYED)
is_destroyed["[temp.display_name]"] = 1
wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>It is missing its [temp.display_name].</b></span>\n" wound_flavor_text["[temp.display_name]"] = "<span class='warning'><b>It is missing its [temp.display_name].</b></span>\n"
continue continue
if(temp.wounds) if(temp.status & ROBOT)
var/list/wounds = list(list(),list(),list(),list(),list(),list()) if(!(temp.brute_dam + temp.burn_dam))
for(var/datum/organ/wound/w in temp.wounds) wound_flavor_text["[temp.display_name]"] = "<span class='warning'>It has a robot [temp.display_name]!</span>\n"
switch(w.healing_state)
if(0)
var/list/cut = wounds[1]
cut += w
wounds[1] = cut
if(1)
var/list/cut = wounds[2]
cut += w
wounds[2] = cut
if(2)
var/list/cut = wounds[3]
cut += w
wounds[3] = cut
if(3)
var/list/cut = wounds[4]
cut += w
wounds[4] = cut
if(4)
var/list/cut = wounds[5]
cut += w
wounds[5] = cut
if(5)
var/list/cut = wounds[6]
cut += w
wounds[6] = cut
wound_descriptions["[temp.display_name]"] = wounds
else
wound_flavor_text["[temp.display_name]"] = ""
//Now that we have a big list of all the wounds, on all the limbs.
var/list/is_bleeding = list()
for(var/named in wound_descriptions)
var/list/wound_states = wound_descriptions[named]
var/list/flavor_text = list()
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,\
"tiny bruise" = 0, "small bruise" = 0, "moderate bruise" = 0, "large bruise" = 0, "huge bruise" = 0, "monumental bruise" = 0,\
"small burn" = 0, "moderate burn" = 0, "large burn" = 0, "severe burn" = 0, "deep burn" = 0, "carbonised area" = 0) //How many wounds of what size.
for(var/datum/organ/wound/w in wound_state)
if(w.bleeding && !is_bleeding[named]) is_bleeding[named] = 1
switch(w.wound_size)
if(1)
switch(w.wound_type)
if(0)
tally["cut"] += 1
if(1)
tally["tiny bruise"] += 1
if(2)
tally["small burn"] += 1
if(2)
switch(w.wound_type)
if(0)
tally["deep cut"] += 1
if(1)
tally["small bruise"] += 1
if(2)
tally["moderate burn"] += 1
if(3)
switch(w.wound_type)
if(0)
tally["flesh wound"] += 1
if(1)
tally["moderate bruise"] += 1
if(2)
tally["large burn"] += 1
if(4)
switch(w.wound_type)
if(0)
tally["gaping wound"] += 1
if(1)
tally["large bruise"] += 1
if(2)
tally["severe burn"] += 1
if(5)
switch(w.wound_type)
if(0)
tally["big gaping wound"] += 1
if(1)
tally["huge bruise"] += 1
if(2)
tally["deep burn"] += 1
if(6)
switch(w.wound_type)
if(0)
tally["massive wound"] += 1
if(1)
tally["monumental bruise"] += 1
if(2)
tally["carbonised area"] += 1
for(var/tallied in tally)
if(!tally[tallied])
continue continue
//if(flavor_text_string && tally[tallied]) else
// for( wound_flavor_text["[temp.display_name]"] = "<span class='warning'>It has a robot [temp.display_name], it has"
// flavor_text_string += pick(list(", as well as", ", in addition to")) //add more later. if(temp.brute_dam) switch(temp.brute_dam)
var/tallied_rename = list("cut" = "cut","deep cut" = "deep cut", "flesh wound" = "flesh wound",\ if(0 to 20)
"gaping wound" = "gaping wound", "big gaping wound" = "big gaping wound", "massive wound" = "massive wound",\ wound_flavor_text["[temp.display_name]"] += " some dents"
"tiny bruise" = "tiny bruise", "small bruise" = "small bruise", "moderate bruise" = "moderate bruise",\ if(21 to INFINITY)
"large bruise" = "large bruise", "huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\ wound_flavor_text["[temp.display_name]"] += pick(" a lot of dents"," severe denting")
"small burn" = "small burn", "moderate burn" = "moderate burn", "large burn" = "large burn",\ if(temp.brute_dam && temp.burn_dam)
"severe burn" = "severe burn", "deep burn" = "deep burn", "carbonised area" = "carbonised area") wound_flavor_text["[temp.display_name]"] += " and"
switch(i) if(temp.burn_dam) switch(temp.burn_dam)
if(2) //Healing wounds. if(0 to 20)
if(tallied in list("cut","small burn")) wound_flavor_text["[temp.display_name]"] += " some burns"
if(21 to INFINITY)
wound_flavor_text["[temp.display_name]"] += pick(" a lot of burns"," severe melting")
wound_flavor_text["[temp.display_name]"] += "!</span>\n"
else if(temp.wound_descs)
var/list/wound_descriptors = list()
for(var/time in temp.wound_descs)
for(var/wound in temp.wound_descs[time])
if(wound in wound_descriptors)
wound_descriptors[wound]++
continue continue
tallied_rename = list("deep cut" = "clotted cut", "flesh wound" = "small bandaged wound",\ wound_descriptors[wound] = 1
"gaping wound" = "bandaged wound", "big gaping wound" = "gauze wrapped wound",\ var/list/flavor_text = list()
"massive wound" = "massive blood soaked bandage", "tiny bruise" = "tiny bruise", "small bruise" = "small bruise",\
"moderate bruise" = "moderate bruise", "large bruise" = "large bruise",\
"huge bruise" = "huge bruise", "monumental bruise" = "monumental bruise",\
"moderate burn" = "moderate salved burn", "large burn" = "large salved burn",\
"severe burn" = "severe salved burn", "deep burn" = "deep salved burn",\
"carbonised area" = "treated carbonised area")
if(3)
if(tallied in list("cut","tiny bruise","small burn"))
continue
tallied_rename = list("deep cut" = "fading cut", "flesh wound" = "small healing wound",\
"gaping wound" = "healing wound", "big gaping wound" = "big healing wound",\
"massive wound" = "massive healing wound", "small bruise" = "tiny bruise",\
"moderate bruise" = "small bruise", "large bruise" = "moderate bruise",\
"huge bruise" = "large bruise", "monumental bruise" = "huge bruise",\
"moderate burn" = "healing moderate burn", "large burn" = "healing large burn",\
"severe burn" = "healing severe burn", "deep burn" = "healing deep burn",\
"carbonised area" = "slowly healing carbonised area")
if(4)
if(tallied in list("cut","deep cut","tiny bruise", "small bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small red scar", "gaping wound" = "angry straight scar",\
"big gaping wound" = "jagged angry scar", "massive wound" = "gigantic angry scar",\
"moderate bruise" = "tiny bruise", "large bruise" = "small bruise",\
"huge bruise" = "moderate bruise", "monumental bruise" = "large bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "healing carbonised area")
if(5)
if(tallied in list("cut","deep cut","tiny bruise", "moderate bruise", "small bruise","small burn", "moderate burn"))
continue
tallied_rename = list("flesh wound" = "small scar", "gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"large bruise" = "tiny bruise",\
"huge bruise" = "small bruise", "monumental bruise" = "moderate bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
if(6)
if(tallied in list("cut","deep cut","flesh wound","tiny bruise", "small bruise", "moderate bruise", "large bruise", "huge bruise","small burn", "moderate burn"))
continue
tallied_rename = list("gaping wound" = "straight scar",\
"big gaping wound" = "jagged scar", "massive wound" = "gigantic scar",\
"monumental bruise" = "tiny bruise",\
"large burn" = "large burn scar", "severe burn" = "severe burn scar",\
"deep burn" = "deep burn scar", "carbonised area" = "large scarred area")
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\ var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area") "huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
switch(tally[tallied]) for(var/wound in wound_descriptors)
if(1) switch(wound_descriptors[wound])
if(!flavor_text.len) if(1)
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" if(!flavor_text.len)
else flavor_text += "<span class='warning'>It has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a [tallied_rename[tallied]]" else
if(2) flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
if(!flavor_text.len) if(2)
flavor_text += "<span class='warning'>\The [src] has[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>It has[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
flavor_text += "[prob(4) && !(tallied in no_exclude) ? " what might be" : ""] a pair of [tallied_rename[tallied]]s" else
if(3 to 5) flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
if(!flavor_text.len) if(3 to 5)
flavor_text += "<span class='warning'>\The [src] has several [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>It has several [wound]s"
flavor_text += " several [tallied_rename[tallied]]s" else
if(6 to INFINITY) flavor_text += " several [wound]s"
if(!flavor_text.len) if(6 to INFINITY)
flavor_text += "<span class='warning'>\The [src] has a bunch of [tallied_rename[tallied]]s" if(!flavor_text.len)
else flavor_text += "<span class='warning'>It has a bunch of [wound]s"
flavor_text += " a ton of [tallied_rename[tallied]]s" else
if(flavor_text.len) flavor_text += " a ton of [wound]\s"
var/flavor_text_string = "" var/flavor_text_string = ""
for(var/text = 1, text <= flavor_text.len, text++) for(var/text = 1, text <= flavor_text.len, text++)
if(text == flavor_text.len && flavor_text.len > 1) if(text == flavor_text.len && flavor_text.len > 1)
flavor_text_string += ", and" flavor_text_string += ", and"
else if(flavor_text.len > 1 && text > 1) else if(flavor_text.len > 1 && text > 1)
flavor_text_string += "," flavor_text_string += ","
flavor_text_string += flavor_text[text] flavor_text_string += flavor_text[text]
flavor_text_string += " on its [named].</span><br>" flavor_text_string += " on its [named].</span><br>"
wound_flavor_text["[named]"] = flavor_text_string wound_flavor_text["[named]"] = flavor_text_string
else
wound_flavor_text["[temp.display_name]"] = ""
//Handles the text strings being added to the actual description.
if(wound_flavor_text["head"]) if(wound_flavor_text["head"])
msg += wound_flavor_text["head"] msg += wound_flavor_text["head"]
if(wound_flavor_text["chest"]) if(wound_flavor_text["chest"])

View File

@@ -431,7 +431,7 @@
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/E = organs[name] var/datum/organ/external/E = organs[name]
E.process() E.process()
if(E.broken || E.destroyed) if(E.status & BROKEN || E.status & DESTROYED)
if(E.name == "l_hand" || E.name == "l_arm") if(E.name == "l_hand" || E.name == "l_arm")
if(hand && equipped()) if(hand && equipped())
drop_item() drop_item()

View File

@@ -585,7 +585,7 @@
lying_icon.Blend(new /icon('monkey.dmi', "chest_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('monkey.dmi', "chest_l"), ICON_OVERLAY)
var/datum/organ/external/head = organs["head"] var/datum/organ/external/head = organs["head"]
if(!head.destroyed) if(!(head.status & DESTROYED))
stand_icon.Blend(new /icon('monkey.dmi', "head_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('monkey.dmi', "head_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('monkey.dmi', "head_l"), ICON_OVERLAY) lying_icon.Blend(new /icon('monkey.dmi', "head_l"), ICON_OVERLAY)
@@ -594,12 +594,12 @@
if(!istype(part, /datum/organ/external/groin) \ if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \ && !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \ && !istype(part, /datum/organ/external/head) \
&& !part.destroyed) && !(part.status & DESTROYED))
var/icon/temp = new /icon('monkey.dmi', "[part.icon_name]_s") var/icon/temp = new /icon('monkey.dmi', "[part.icon_name]_s")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
stand_icon.Blend(temp, ICON_OVERLAY) stand_icon.Blend(temp, ICON_OVERLAY)
temp = new /icon('monkey.dmi', "[part.icon_name]_l") temp = new /icon('monkey.dmi', "[part.icon_name]_l")
if(part.robot) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) if(part.status & ROBOT) temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
lying_icon.Blend(temp , ICON_OVERLAY) lying_icon.Blend(temp , ICON_OVERLAY)
stand_icon.Blend(new /icon('monkey.dmi', "groin_s"), ICON_OVERLAY) stand_icon.Blend(new /icon('monkey.dmi', "groin_s"), ICON_OVERLAY)
@@ -915,7 +915,7 @@
else else
if(!def_zone) def_zone = ran_zone(def_zone) if(!def_zone) def_zone = ran_zone(def_zone)
organ = get_organ(check_zone(def_zone)) organ = get_organ(check_zone(def_zone))
if(!organ || organ.destroyed) return 0 if(!organ || organ.status & DESTROYED) return 0
if(blocked) if(blocked)
damage = (damage/(blocked+1)) damage = (damage/(blocked+1))
@@ -1038,7 +1038,7 @@
var/amount = 0.0 var/amount = 0.0
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/O = organs[name] var/datum/organ/external/O = organs[name]
if(!O.robot) amount+= O.brute_dam if(!(O.status & ROBOT)) amount+= O.brute_dam
return amount return amount
/mob/living/carbon/monkey/adjustBruteLoss(var/amount, var/used_weapon = null) /mob/living/carbon/monkey/adjustBruteLoss(var/amount, var/used_weapon = null)
@@ -1051,7 +1051,7 @@
var/amount = 0.0 var/amount = 0.0
for(var/name in organs) for(var/name in organs)
var/datum/organ/external/O = organs[name] var/datum/organ/external/O = organs[name]
if(!O.robot) amount+= O.burn_dam if(!(O.status & ROBOT)) amount+= O.burn_dam
return amount return amount
/mob/living/carbon/monkey/adjustFireLoss(var/amount,var/used_weapon = null) /mob/living/carbon/monkey/adjustFireLoss(var/amount,var/used_weapon = null)

View File

@@ -22,9 +22,9 @@
var/mob/living/carbon/human/M = src var/mob/living/carbon/human/M = src
for(var/name in M.organs) for(var/name in M.organs)
var/datum/organ/external/organ = M.organs[name] var/datum/organ/external/organ = M.organs[name]
if(organ.destroyed) if(organ.status & DESTROYED)
src.traumatic_shock += 60 src.traumatic_shock += 60
else if(organ.broken || organ.open) else if(organ.status & BROKEN || organ.open)
src.traumatic_shock += 30 src.traumatic_shock += 30
if(src.traumatic_shock < 0) if(src.traumatic_shock < 0)

View File

@@ -181,11 +181,9 @@
affecting = H.organs[A] affecting = H.organs[A]
if(!istype(affecting, /datum/organ/external)) continue if(!istype(affecting, /datum/organ/external)) continue
affecting.heal_damage(1000, 1000) //fixes getting hit after ingestion, killing you when game updates organ health affecting.heal_damage(1000, 1000) //fixes getting hit after ingestion, killing you when game updates organ health
affecting.broken = 0 affecting.status &= ~BROKEN
affecting.destroyed = 0 affecting.status &= ~DESTROYED
for(var/datum/organ/wound/W in affecting.wounds) del affecting.wound_descs
W.stopbleeding()
del(W)
H.UpdateDamageIcon() H.UpdateDamageIcon()
H.update_body() H.update_body()
//src.fireloss = 0 //src.fireloss = 0
@@ -210,17 +208,15 @@
var/datum/organ/external/e = H.organs[name] var/datum/organ/external/e = H.organs[name]
e.brute_dam = 0.0 e.brute_dam = 0.0
e.burn_dam = 0.0 e.burn_dam = 0.0
e.bandaged = 0.0 e.status &= ~BANDAGED
e.max_damage = initial(e.max_damage) e.max_damage = initial(e.max_damage)
e.bleeding = 0 e.status &= ~BLEEDING
e.open = 0 e.open = 0
e.broken = 0 e.status &= ~BROKEN
e.destroyed = 0 e.status &= ~DESTROYED
e.perma_injury = 0 e.perma_injury = 0
e.update_icon() e.update_icon()
for(var/datum/organ/wound/W in e.wounds) del e.wound_descs
if(W.bleeding || !W.is_healing)
W.stopbleeding()
del(H.vessel) del(H.vessel)
H.vessel = new/datum/reagents(560) H.vessel = new/datum/reagents(560)
H.vessel.my_atom = H H.vessel.my_atom = H

View File

@@ -701,12 +701,12 @@
if(ishuman(usr)) if(ishuman(usr))
if(usr.hand) // if he's using his left hand. if(usr.hand) // if he's using his left hand.
var/datum/organ/external/temp = usr:get_organ("l_hand") var/datum/organ/external/temp = usr:get_organ("l_hand")
if(temp.destroyed) if(temp.status & DESTROYED)
usr << "\blue You look at your stump." usr << "\blue You look at your stump."
return return
else else
var/datum/organ/external/temp = usr:get_organ("r_hand") var/datum/organ/external/temp = usr:get_organ("r_hand")
if(temp.destroyed) if(temp.status & DESTROYED)
usr << "\blue You look at your stump." usr << "\blue You look at your stump."
return return

View File

@@ -1,4 +1,43 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05 ///////////////////////////////
//CONTAINS: ORGANS AND WOUNDS//
///////////////////////////////
var/list/wound_progressions = list(
//cut healing path"
"cut" = "healing cut", "healing cut" = "small scab",\
//deep cut healing path
"deep cut" = "clotted cut", "clotted cut" = "scab", "scab" = "fresh skin",\
//flesh wound healing path
"flesh wound" = "blood soaked clot", "blood soaked clot" = "large scab", "large scab" = "fresh skin",\
//gaping wound healing path
"gaping wound" = "large blood soaked clot", "large blood soaked clot" = "large clot", "large clot" = "small angry scar",\
"small angry scar" = "small straight scar",\
//big gaping wound healing path
"big gaping wound" = "gauze wrapped wound", "gauze wrapped wound" = "blood soaked bandage", "blood soaked bandage" = "large angry scar",\
"large angry scar" = "large straight scar",\
//massive wound healing path
"massive wound" = "massive blood soaked bandage", "massive blood soaked bandage" = "huge bloody mess", "huge bloody mess" = "massive angry scar",\
"massive angry scar" = "massive jagged scar",\
//bruise healing path
"monumental bruise" = "large bruise", "huge bruise" = "large bruise", "large bruise" = "moderate bruise",\
"moderate bruise" = "small bruise", "small bruise" = "tiny bruise",\
//moderate burn healing path
"moderate burn" = "moderate salved burn", "moderate salved burn" = "fresh skin",\
"large burn" = "large salved burn", "large salved burn" = "moderate salved burn",\
"severe burn" = "severe salved burn", "severe salved burn" = "burn scar",\
"deep burn" = "deep salved burn", "deep salved burn" = "large burn scar",\
"carbonised area" = "treated carbonised area", "treated carbonised area" = "massive burn scar")
/datum/organ /datum/organ
var/name = "organ" var/name = "organ"
@@ -31,6 +70,10 @@
W.time_inflicted = time_inflicted W.time_inflicted = time_inflicted
return W return W
#define CUT 0
#define BRUISE 1
#define BURN 2
/**************************************************** /****************************************************
EXTERNAL ORGANS EXTERNAL ORGANS
****************************************************/ ****************************************************/
@@ -42,31 +85,29 @@
var/damage_state = "00" var/damage_state = "00"
var/brute_dam = 0 var/brute_dam = 0
var/burn_dam = 0 var/burn_dam = 0
var/bandaged = 0
var/max_damage = 0 var/max_damage = 0
var/max_size = 0 var/max_size = 0
var/tmp/list/obj/item/weapon/implant/implant = list() var/tmp/list/obj/item/weapon/implant/implant
var/display_name var/display_name
var/tmp/list/wounds = list()
var/tmp/bleeding = 0 var/tmp/list/wound_descs = list()
var/tmp/next_wound_update = 0
var/tmp/perma_injury = 0 var/tmp/perma_injury = 0
var/tmp/perma_dmg = 0 var/tmp/perma_dmg = 0
var/tmp/broken = 0
var/tmp/destroyed = 0
var/tmp/destspawn = 0 //Has it spawned the broken limb? var/tmp/destspawn = 0 //Has it spawned the broken limb?
var/tmp/gauzed = 0 //Has the missing limb been patched?
var/tmp/robot = 0 //ROBOT ARM MAN!
var/tmp/cutaway = 0 //First part of limb reattachment.
var/tmp/attachable = 0 //Can limb be attached?
var/min_broken_damage = 30 var/min_broken_damage = 30
var/datum/organ/external/parent var/datum/organ/external/parent
var/list/datum/organ/external/children var/list/datum/organ/external/children
var/damage_msg = "\red You feel a intense pain" var/damage_msg = "\red You feel a intense pain"
var/status = 0
var/broken_description
var/open = 0 var/open = 0
var/stage = 0 var/stage = 0
var/wound = 0
New(mob/living/carbon/H) New(mob/living/carbon/H)
..(H) ..(H)
@@ -76,59 +117,43 @@
owner = H owner = H
H.organs[name] = src H.organs[name] = src
Del() proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
for(var/datum/organ/wound/W in wounds)
del(W)
..()
proc/total_wound_bleeding()
// Get the total amount and size of bleeding wounds
var/rval = 0
for(var/datum/organ/wound/W in wounds) if(W.bleeding)
rval += W.wound_size
// bandages reduce bleeding
if(bandaged) return rval / 8
return rval
proc/take_damage(brute, burn, sharp, used_weapon = null, spread=0)
if((brute <= 0) && (burn <= 0)) if((brute <= 0) && (burn <= 0))
return 0 return 0
if(destroyed) if(status & DESTROYED)
return 0 return 0
if(robot) if(status & ROBOT)
brute *= 0.66 //~2/3 damage for ROBOLIMBS brute *= 0.66 //~2/3 damage for ROBOLIMBS
burn *= 0.66 //~2/3 damage for ROBOLIMBS burn *= 0.66 //~2/3 damage for ROBOLIMBS
if(owner && !robot) if(owner && !(status & ROBOT))
owner.pain(display_name, (brute+burn)*3, 1, burn > brute) owner.pain(display_name, (brute+burn)*3, 1, burn > brute)
if(sharp) if(sharp)
var/nux = brute * rand(10,15) var/nux = brute * rand(10,15)
if(brute_dam >= max_damage) if(brute_dam >= max_damage)
if(prob(5 * brute)) if(prob(5 * brute))
// for(var/mob/M in viewers(owner)) status |= DESTROYED
// M.show_message("\red [owner.name]'s [display_name] flies off.")
destroyed = 1
droplimb() droplimb()
return return
else if(prob(nux)) else if(prob(nux))
createwound(max(1,min(6,round(brute/10) + rand(0,1))),0,brute) createwound( CUT, brute )
if(!robot) owner << "You feel something wet on your [display_name]" if(!(status & ROBOT))
owner << "You feel something wet on your [display_name]"
if((brute_dam + burn_dam + brute + burn) < max_damage) if((brute_dam + burn_dam + brute + burn) < max_damage)
if(brute) if(brute)
brute_dam += brute brute_dam += brute
if(prob(brute*2) && !sharp) if( (prob(brute*2) && !sharp) || sharp )
createwound(rand(4,6),0,brute) createwound( CUT, brute )
else if(!sharp) else if(!sharp)
createwound(max(1,min(6,round(brute/10) + rand(1,2))),1,brute) createwound( BRUISE, brute )
if(burn) if(burn)
burn_dam += burn burn_dam += burn
createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn) createwound( BURN, burn )
else else
var/can_inflict = max_damage - (brute_dam + burn_dam) var/can_inflict = max_damage - (brute_dam + burn_dam) //How much damage can we actually cause?
if(can_inflict) if(can_inflict)
if (brute > 0 && burn > 0) if (brute > 0 && burn > 0)
brute = can_inflict/2 brute = can_inflict/2
@@ -146,87 +171,52 @@
burn = can_inflict burn = can_inflict
burn_dam += burn burn_dam += burn
createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn) createwound(max(1,min(6,round(burn/10) + rand(0,1))),2,burn)
else if(!robot) else if(!(status & ROBOT))
var/passed_dam = (brute + burn) - can_inflict //Getting how much overdamage we have. var/passed_dam = (brute + burn) - can_inflict //Getting how much overdamage we have.
var/list/datum/organ/external/possible_points = list() var/list/datum/organ/external/possible_points = list()
if(parent) if(parent)
possible_points += parent possible_points += parent
if(children) if(children)
possible_points += children possible_points += children
if(forbidden_limbs.len)
possible_points -= forbidden_limbs
if(!possible_points.len) if(!possible_points.len)
message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage too!") message_admins("Oh god WHAT! [owner]'s [src] was unable to find an organ to pass overdamage too!")
else else
if(!spread) var/datum/organ/external/target = pick(possible_points)
var/datum/organ/external/target = pick(possible_points) if(brute)
if(brute) target.take_damage(passed_dam, 0, sharp, used_weapon, forbidden_limbs + src)
target.take_damage(passed_dam, 0, sharp, used_weapon,1) else
else target.take_damage(0, passed_dam, sharp, used_weapon, forbidden_limbs + src)
target.take_damage(0, passed_dam, sharp, used_weapon,1)
else else
droplimb(1) //Robot limbs just kinda fail at full damage. droplimb(1) //Robot limbs just kinda fail at full damage.
if(broken) if(status & BROKEN)
owner.emote("scream") owner.emote("scream")
if(used_weapon) add_wound(used_weapon, brute + burn) if(used_weapon) add_wound(used_weapon, brute + burn)
owner.updatehealth()
var/result = update_icon() var/result = update_icon()
return result return result
proc/heal_damage(brute, burn, internal = 0, robo_repair = 0) proc/heal_damage(brute, burn, internal = 0, robo_repair = 0)
if(robot && !robo_repair) if(status & ROBOT && !robo_repair)
return return
var/brute_to_heal = 0 // var/brute_to_heal = 0
var/brute_wounds = list() // var/brute_wounds = list()
var/burn_to_heal = 0 // var/burn_to_heal = 0
var/burn_wounds = list() // var/burn_wounds = list()
for(var/datum/organ/wound/W in wounds) // for(var/datum/organ/wound/W in brute_wounds)
if(W.wound_type > 1 && W.damage)
burn_to_heal += W.damage brute_dam = max(0, brute_dam-brute)
burn_wounds += W burn_dam = max(0, burn_dam-burn)
else if(W.damage)
brute_to_heal += W.damage
brute_wounds += W
if(brute && brute <= brute_to_heal)
for(var/datum/organ/wound/W in brute_wounds)
if(brute >= W.damage)
brute_dam -= W.damage
brute -= W.damage
W.damage = 0
W.initial_dmg = 0
W.stopbleeding(1)
else
W.damage -= brute
W.initial_dmg -= brute
W.stopbleeding()
else if(brute)
for(var/datum/organ/wound/W in brute_wounds)
W.damage = 0
W.initial_dmg = 0
W.stopbleeding(1)
brute_dam = 0
if(burn && burn <= burn_to_heal)
for(var/datum/organ/wound/W in burn_wounds)
if(burn >= W.damage)
burn_dam -= W.damage
burn -= W.damage
W.damage = 0
W.initial_dmg = 0
W.stopbleeding()
else
W.damage -= burn
W.initial_dmg -= burn
W.stopbleeding()
else if(burn)
for(var/datum/organ/wound/W in burn_wounds)
W.damage = 0
W.initial_dmg = 0
W.stopbleeding()
burn_dam = 0
if(internal) if(internal)
broken = 0 status &= ~BROKEN
perma_injury = 0 perma_injury = 0
// if all damage is healed, replace the wounds with scars // if all damage is healed, replace the wounds with scars
if(brute_dam + burn_dam == 0) if(brute_dam + burn_dam == 0)
@@ -234,6 +224,7 @@
var/datum/autopsy_data/W = autopsy_data[V] var/datum/autopsy_data/W = autopsy_data[V]
del W del W
autopsy_data = list() autopsy_data = list()
owner.updatehealth()
var/result = update_icon() var/result = update_icon()
return result return result
@@ -252,35 +243,36 @@
proc/get_damage() //returns total damage proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury,perma_injury) //could use health? return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
proc/get_damage_brute() proc/get_damage_brute()
return max(brute_dam+perma_injury,perma_injury) return max(brute_dam+perma_injury, perma_injury)
proc/get_damage_fire() proc/get_damage_fire()
return burn_dam return burn_dam
process() process()
if(destroyed) if(next_wound_update && world.time > next_wound_update)
update_wounds()
if(status & DESTROYED)
if(!destspawn) if(!destspawn)
droplimb() droplimb()
return return
if(broken == 0) if(!(status & BROKEN))
perma_dmg = 0 perma_dmg = 0
if(parent) if(parent)
if(parent.destroyed) if(parent.status & DESTROYED)
destroyed = 1 status |= DESTROYED
owner:update_body() owner:update_body()
return return
if(brute_dam > min_broken_damage && !robot) if(brute_dam > min_broken_damage && !(status & ROBOT))
if(broken == 0) if(!(status & BROKEN))
//owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy") //owner.unlock_medal("Broke Yarrr Bones!", 0, "Break a bone.", "easy")
owner.visible_message("\red You hear a loud cracking sound coming from [owner.name].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.") owner.visible_message("\red You hear a loud cracking sound coming from \the [owner].","\red <b>Something feels like it shattered in your [display_name]!</b>","You hear a sickening crack.")
owner.emote("scream") owner.emote("scream")
broken = 1 status |= BROKEN
wound = pick("broken","fracture","hairline fracture") //Randomise in future. Edit: Randomized. --SkyMarshal broken_description = pick("broken","fracture","hairline fracture")
perma_injury = brute_dam perma_injury = brute_dam
return
return return
// new damage icon system // new damage icon system
@@ -321,15 +313,15 @@
proc/droplimb(var/override = 0,var/no_explode = 0) proc/droplimb(var/override = 0,var/no_explode = 0)
if(override) if(override)
destroyed = 1 status |= DESTROYED
if(destroyed) if(status & DESTROYED)
if(implant) if(implant)
for(var/implants in implant) for(var/implants in implant)
del(implants) del(implants)
//owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy") //owner.unlock_medal("Lost something?", 0, "Lose a limb.", "easy")
for(var/datum/organ/external/I in children) for(var/datum/organ/external/I in children)
if(I && !I.destroyed) if(I && !(I.status & DESTROYED))
I.droplimb(1,1) I.droplimb(1,1)
var/obj/item/weapon/organ/H var/obj/item/weapon/organ/H
switch(body_part) switch(body_part)
@@ -395,12 +387,8 @@
var/lol = pick(cardinal) var/lol = pick(cardinal)
step(H,lol) step(H,lol)
destspawn = 1 destspawn = 1
if(!robot) if(status & ROBOT)
owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\ owner.visible_message("\red \The [owner]'s [display_name] explodes violently!",\
"<span class='moderate'><b>Your [display_name] goes flying off!</b></span>",\
"You hear a terrible sound of ripping tendons and flesh.")
else
owner.visible_message("\red [owner.name]'s [display_name] explodes violently!",\
"\red <b>Your [display_name] explodes!</b>",\ "\red <b>Your [display_name] explodes!</b>",\
"You hear an explosion followed by a scream!") "You hear an explosion followed by a scream!")
if(!no_explode) if(!no_explode)
@@ -411,51 +399,81 @@
spark_system.start() spark_system.start()
spawn(10) spawn(10)
del(spark_system) del(spark_system)
for(var/datum/organ/wound/W in wounds) else
W.update_health() owner.visible_message("\red [owner.name]'s [display_name] flies off in an arc.",\
del(W) "<span class='moderate'><b>Your [display_name] goes flying off!</b></span>",\
"You hear a terrible sound of ripping tendons and flesh.")
owner.update_body_appearance() owner.update_body_appearance()
owner.update_clothing() owner.update_clothing()
proc/createwound(var/size = 1, var/type = 0, var/damage) proc/createwound(var/type = CUT, var/damage)
var/list/datum/organ/wound/possible_wounds = list()
for(var/datum/organ/wound/W in wounds)
if(W.wound_type == type && W.wound_size <= 3 && size <= 3 && ((!W.is_healing && type == 1) || (!W.healing_state && type != 1)))
possible_wounds += W
if(hasorgans(owner)) if(hasorgans(owner))
if(!possible_wounds.len || prob(20)) var/wound_name
var/datum/organ/wound/W = new(src) var/update_time = world.time + damage*100
W.bleeding = !type || (size > 2) // large wounds always cause bleeding var/size = min( max( 0, damage/10 ) , 6)
switch(type)
if(CUT)
var/list/size_names = list("cut", "deep cut", "flesh wound", "gaping wound", "big gaping wound", "massive wound")
wound_name = size_names[size]
if(wound_descs["[update_time]"])
var/list/update_next = wound_descs["[update_time]"]
update_next += wound_name
else
if (next_wound_update > update_time)
next_wound_update = update_time
wound_descs["[update_time]"] = list(wound_name)
if(BRUISE)
var/list/size_names = list("tiny bruise", "small bruise", "moderate bruise", "large bruise", "huge bruise", "monumental bruise")
wound_name = size_names[size]
if(wound_descs["[update_time]"])
var/list/update_next = wound_descs["[update_time]"]
update_next += wound_name
else
if (next_wound_update > update_time)
next_wound_update = update_time
wound_descs["[update_time]"] = list(wound_name)
if(BURN)
var/list/size_names = list("small burn", "moderate burn", "large burn", "severe burn", "deep burn", "carbonised area")
wound_name = size_names[size]
update_time += damage*300
if(wound_descs["[update_time]"])
var/list/update_next = wound_descs["[update_time]"]
update_next += wound_name
else
if (next_wound_update > update_time)
next_wound_update = update_time
wound_descs["[update_time]"] = list(wound_name)
W.damage = damage proc/update_wounds()
W.initial_dmg = damage var/list/wounds_to_update = wound_descs["[next_wound_update]"]
W.wound_type = type for(var/wound in wounds_to_update)
W.wound_size = size if(wound_progressions[wound])
W.owner = owner var/wound_name = wound_progressions[wound]
W.parent = src var/next_update = world.time + 600*rand(5,13)
if(type == 1) if(wound_descs["[next_update]"])
spawn W.become_scar() var/list/update_next = wound_descs["[next_update]"]
update_next += wound_name
else else
spawn W.start_close() //Let small cuts close themselves. wound_descs["[next_update]"] = list(wound_name)
wounds += W wound_descs.Remove("[next_wound_update]")
else if(wound_descs.len)
var/datum/organ/wound/W = pick(possible_wounds) var/next_update = text2num(wound_descs[1])
bleeding = max(!type,bleeding) //Sharp objects cause bleeding. for(var/wound in wound_descs)
W.bleeding = max(!type,W.bleeding) next_update = min(next_update, text2num(wound))
next_wound_update = next_update
W.damage += damage else
W.initial_dmg += damage next_wound_update = 0
W.wound_size = max(1,min(6,round(W.damage/10) + rand(0,1)))
proc/emp_act(severity) proc/emp_act(severity)
if(!robot) return if(!(status & ROBOT))
return
if(prob(30*severity)) if(prob(30*severity))
take_damage(4(4-severity), 0, 1, used_weapon = "EMP") take_damage(4(4-severity), 0, 1, used_weapon = "EMP")
else else
droplimb(1) droplimb(1)
proc/getDisplayName() proc/getDisplayName()
switch(src.name) switch(name)
if("l_leg") if("l_leg")
return "left leg" return "left leg"
if("r_leg") if("r_leg")
@@ -473,127 +491,7 @@
if("r_hand") if("r_hand")
return "right hand" return "right hand"
else else
return src.name return name
/datum/organ/wound
name = "wound"
var/wound_type = 0 //0 = cut, 1 = bruise, 2 = burn
var/damage = 0 //How much damage it caused.
var/initial_dmg = 0
var/wound_size = 1
var/datum/organ/external/parent
var/bleeding = 0 //You got wounded, of course it's bleeding. -- Scratch that. Rewrote it.
var/healing_state = 0
var/is_healing = 0
var/slowheal = 3
proc/start_close()
if(parent.robot)
return
spawn(rand(1800,3000)) //3-5 minutes
if(prob(50) && wound_size == 1)
parent.wounds.Remove(src)
update_health(1)
del(src)
else if(prob(33) && wound_size < 3)
stopbleeding()
else
spawn(rand(1800,3000))
if(wound_size == 1) //Small cuts heal in 6-10 minutes.
parent.wounds.Remove(src)
update_health(1)
del(src)
else if(prob(50) && wound_size < 3 && bleeding)
stopbleeding()
return
proc/stopbleeding(var/bleed = 0)
if(is_healing)
return 0
// owner:bloodloss -= 10 * src.wound_size
parent.bleeding = min(bleed,bleeding)
for(var/datum/organ/wound/W in parent)
if(W.bleeding && W != src)
parent.bleeding = 1
break
bleeding = min(bleed,bleeding)
is_healing = 1
slowheal = 1
if(!healing_state)
spawn become_scar() //spawn off the process of becoming a scar.
return 1
proc/become_scar()
if(parent.robot || healing_state)
return
healing_state = 1 //Patched
spawn(200*slowheal) //~20-60 seconds
update_health(5) //Heals some.
spawn(rand(180,300)*slowheal) //18-30 second
if(!parent || !parent.owner || parent.owner.stat == 2)
if(!parent || !parent.owner)
del(parent)
del(src)
return
if(prob(80) && wound_size < 2) //Small cuts heal.
update_health(1)
parent.wounds.Remove(src)
del(src)
healing_state = 2 //Noticibly healing.
update_health(2) //Heals more.
spawn(rand(1200,1800)*slowheal) //2-3 minutes
if(!parent || !parent.owner || parent.owner.stat == 2)
if(!parent || !parent.owner)
del(parent)
del(src)
return
if(prob(60) && wound_size < 3) //Cuts heal up
parent.wounds.Remove(src)
del(src)
healing_state = 3 //Angry red scar
update_health(1) //Heals the rest of the way.
spawn(rand(6000,9000)*slowheal) //10-15 minutes
if(!parent || !parent.owner || parent.owner.stat == 2)
if(!parent || !parent.owner)
del(parent)
del(src)
return
if(prob(80) && wound_size < 4) //Minor wounds heal up fully.
parent.wounds.Remove(src)
del(src)
healing_state = 4 //Scar.
spawn(rand(6000,9000)*slowheal) //10-15 minutes
if(!parent || !parent.owner || parent.owner.stat == 2)
if(!parent || !parent.owner)
del(parent)
del(src)
return
if(prob(30) || wound_size < 4 || wound_type == 1) //Small chance for the scar to disappear, any small remaining wounds deleted.
parent.wounds.Remove(src)
del(src)
healing_state = 5 //Faded scar
return
proc/update_health(var/percent = 1)
if(!owner || owner.stat == 2)
return
damage = max(damage - damage/percent,0) //Remove that amount of the damage
if(wound_type > 1)
parent.burn_dam = max(parent.burn_dam - (initial_dmg - damage),0)
else
parent.brute_dam = max(parent.brute_dam - (initial_dmg - damage),0)
initial_dmg = damage //reset it for further updates.
parent.owner.updatehealth()
if(percent == 1 && wound_type == 1)
parent.wounds.Remove(src)
del(src)

View File

@@ -1,4 +1,8 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05 //This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:05
#define STATE_DEFAULT 1
#define STATE_INJECTOR 2
#define STATE_ENGINE 3
/obj/machinery/computer/am_engine /obj/machinery/computer/am_engine
name = "Antimatter Engine Console" name = "Antimatter Engine Console"
@@ -10,9 +14,6 @@
var/obj/machinery/power/am_engine/engine/connected_E = null var/obj/machinery/power/am_engine/engine/connected_E = null
var/obj/machinery/power/am_engine/injector/connected_I = null var/obj/machinery/power/am_engine/injector/connected_I = null
var/state = STATE_DEFAULT var/state = STATE_DEFAULT
var/const/STATE_DEFAULT = 1
var/const/STATE_INJECTOR = 2
var/const/STATE_ENGINE = 3
/obj/machinery/computer/am_engine/New() /obj/machinery/computer/am_engine/New()
..() ..()

View File

@@ -55,9 +55,6 @@
affecting = H.organs[A] affecting = H.organs[A]
if(!istype(affecting, /datum/organ/external)) continue if(!istype(affecting, /datum/organ/external)) continue
affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health affecting.heal_damage(25, 25) //fixes getting hit after ingestion, killing you when game updates organ health
for(var/datum/organ/wound/W in affecting.wounds)
W.stopbleeding()
W.is_healing = 1
//user:heal_organ_damage(25, 25) //user:heal_organ_damage(25, 25)
// //
user.adjustOxyLoss(-25) user.adjustOxyLoss(-25)

View File

@@ -397,7 +397,6 @@ var/static/list/scarySounds = list('thudswoosh.ogg','Taser.ogg','armbomb.ogg','h
#define TRANSITIONEDGE 7 //Distance from edge to move to another z-level #define TRANSITIONEDGE 7 //Distance from edge to move to another z-level
#define OPEN 1
#define CLOSED 0 #define CLOSED 0
// Maximum and minimum character ages. // Maximum and minimum character ages.
@@ -459,4 +458,16 @@ var/list/liftable_structures = list(\
#define RADIO_SECBOT "7" #define RADIO_SECBOT "7"
#define RADIO_MULEBOT "8" #define RADIO_MULEBOT "8"
#define RADIO_MAGNETS "9" #define RADIO_MAGNETS "9"
#define RADIO_POWER "10" #define RADIO_POWER "10"
/////////////////
//ORGAN DEFINES//
/////////////////
#define CUT_AWAY 1
#define GAUZED 2
#define ATTACHABLE 4
#define BLEEDING 8
#define BANDAGED 16
#define BROKEN 32
#define DESTROYED 64
#define ROBOT 128