bones and dismemberment

This commit is contained in:
Tastyfish
2012-01-08 20:05:54 -05:00
parent ffe6ac7935
commit ce9042ae20
18 changed files with 527 additions and 98 deletions

View File

@@ -494,6 +494,24 @@ Traitors and the like can also be revived with the previous role mostly intact.
//M.updatehealth()
M.buckled = initial(M.buckled)
M.handcuffed = initial(M.handcuffed)
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
for(var/name in H.organs)
var/datum/organ/external/e = H.organs[name]
e.brute_dam = 0.0
e.burn_dam = 0.0
e.bandaged = 0.0
e.wound_size = 0.0
e.max_damage = initial(e.max_damage)
e.bleeding = 0
e.open = 0
e.broken = 0
e.destroyed = 0
e.perma_injury = 0
e.update_icon()
H.update_body()
H.update_face()
H.UpdateDamageIcon()
if (M.stat > 1)
M.stat=0
..()

View File

@@ -131,7 +131,6 @@ proc/move_mining_shuttle()
throwforce = 4.0
item_state = "pickaxe"
w_class = 4.0
slash = 1
m_amt = 3750 //one sheet, but where can you make them?
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = "materials=1;engineering=1"

View File

@@ -891,17 +891,33 @@
//because theyre located on the 'other' inventory bar.
// Gloves
if (gloves)
var/t1 = gloves.item_state
if (!t1)
t1 = gloves.icon_state
overlays += image("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
if (gloves.blood_DNA)
var/datum/organ/external/lo = organs["l_hand"]
var/datum/organ/external/ro = organs["r_hand"]
if (!lo.destroyed || !ro.destroyed)
if (gloves)
var/t1 = gloves.item_state
if (!t1)
t1 = gloves.icon_state
var/icon/gloves_icon = new /icon("icon" = 'hands.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed)
gloves_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed)
gloves_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image(gloves_icon, "layer" = MOB_LAYER)
if (gloves.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
if(lo.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
else if (blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "bloodyhands[!lying ? "" : "2"]")
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER)
// Glasses
if (glasses)
var/t1 = glasses.icon_state
@@ -914,11 +930,22 @@
var/t1 = r_ear.icon_state
overlays += image("icon" = 'ears.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
// Shoes
if (shoes)
lo = organs["l_foot"]
ro = organs["r_foot"]
if ((!lo.destroyed || !ro.destroyed) && shoes)
var/t1 = shoes.icon_state
overlays += image("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")), "layer" = MOB_LAYER)
var/icon/shoes_icon = new /icon("icon" = 'feet.dmi', "icon_state" = text("[][]", t1, (!( lying ) ? null : "2")))
if(lo.destroyed && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "right[lying?"_l":""]"), ICON_MULTIPLY)
else if(ro.destroyed && !lying)
shoes_icon.Blend(new /icon('limb_mask.dmi', "left[lying?"_l":""]"), ICON_MULTIPLY)
overlays += image(shoes_icon, "layer" = MOB_LAYER)
if (shoes.blood_DNA)
var/icon/stain_icon = icon('blood.dmi', "shoesblood[!lying ? "" : "2"]")
if(lo.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "right_[lying?"l":"s"]"), ICON_MULTIPLY)
else if(ro.destroyed)
stain_icon.Blend(new /icon('limb_mask.dmi', "left_[lying?"l":"s"]"), ICON_MULTIPLY)
overlays += image("icon" = stain_icon, "layer" = MOB_LAYER) // Radio
/* if (w_radio)
overlays += image("icon" = 'ears.dmi', "icon_state" = "headset[!lying ? "" : "2"]", "layer" = MOB_LAYER) */
@@ -1248,26 +1275,50 @@
else if (gender == FEMALE)
g = "f"
stand_icon = new /icon('human.dmi', "body_[g]_s")
lying_icon = new /icon('human.dmi', "body_[g]_l")
stand_icon = new /icon('human.dmi', "torso_s")
lying_icon = new /icon('human.dmi', "torso_l")
var/husk = (mutations & HUSK)
//var/obese = (mutations & FAT)
stand_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "chest_[g]_l"), ICON_OVERLAY)
var/datum/organ/external/head = organs["head"]
if(!head.destroyed)
stand_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "head_[g]_l"), ICON_OVERLAY)
for(var/name in organs)
var/datum/organ/external/part = organs[name]
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& !part.destroyed)
stand_icon.Blend(new /icon('human.dmi', "[part.icon_name]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "[part.icon_name]_l"), ICON_OVERLAY)
stand_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "groin_[g]_l"), ICON_OVERLAY)
if (husk)
stand_icon.Blend(new /icon('human.dmi', "husk_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "husk_l"), ICON_OVERLAY)
/*else if(obese)
stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/
else
var/icon/husk_s = new /icon('human.dmi', "husk_s")
var/icon/husk_l = new /icon('human.dmi', "husk_l")
for(var/name in organs)
var/datum/organ/external/part = organs[name]
if(!istype(part, /datum/organ/external/groin) \
&& !istype(part, /datum/organ/external/chest) \
&& !istype(part, /datum/organ/external/head) \
&& part.destroyed)
stand_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]"), ICON_OVERLAY)
lying_icon.Blend(new /icon('dam_mask.dmi', "[part.icon_name]2"), ICON_OVERLAY)
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)
stand_icon.Blend(husk_s, ICON_OVERLAY)
lying_icon.Blend(husk_l, ICON_OVERLAY)
/*else if(obese)
stand_icon.Blend(new /icon('human.dmi', "fatbody_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "fatbody_l"), ICON_OVERLAY)*/
// Skin tone
if (s_tone >= 0)

View File

@@ -39,7 +39,7 @@
return null
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/slash = 0)
/mob/living/carbon/human/apply_damage(var/damage = 0,var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0)
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
@@ -58,9 +58,9 @@
switch(damagetype)
if(BRUTE)
organ.take_damage(damage, 0, slash)
organ.take_damage(damage, 0, sharp)
if(BURN)
organ.take_damage(0, damage, slash)
organ.take_damage(0, damage, sharp)
UpdateDamageIcon()
updatehealth()
return 1

View File

@@ -96,7 +96,7 @@ emp_act
var/armor = run_armor_check(affecting, "melee", "Your armor has protected you from a hit to the [hit_area].", "Your armor has softened hit to your [hit_area].")
if(armor >= 2) return 0
if(!I.force) return 0
apply_damage(I.force, I.damtype, affecting, armor, I.slash)
apply_damage(I.force, I.damtype, affecting, armor, is_cut(I))
var/bloody = 0
if((I.damtype == BRUTE) && prob(25 + (I.force * 2)))

View File

@@ -669,10 +669,11 @@
return //TODO: DEFERRED
handle_regular_status_updates()
var/leg_tally = 2
for(var/name in organs)
var/datum/organ/external/E = organs[name]
E.process()
if(E.broken)
if(E.broken || E.destroyed)
if(E.name == "l_hand" || E.name == "l_arm")
if(hand && equipped())
drop_item()
@@ -681,12 +682,21 @@
if(!hand && equipped())
drop_item()
emote("scream")
else if(E.name == "l_leg" || E.name == "l_foot" \
|| E.name == "r_leg" || E.name == "r_foot" && !lying)
leg_tally-- // let it fail even if just foot&leg
if(E.open && (!resting) && (!sleeping))
emote("scream")
E.take_damage(20,0)
emote("collapse")
paralysis = 10
// can't stand
if(leg_tally == 0)
emote("scream")
emote("collapse")
paralysis = 10
updatehealth()
// health = 100 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())

View File

@@ -41,10 +41,8 @@
damage_msg = "\red You feel a intense pain"
var/open = 0
var/clean = 1
var/stage = 0
var/wound = 0
var/split = 0
New(mob/living/carbon/human/H)
..(H)
@@ -54,14 +52,14 @@
owner = H
H.organs[name] = src
proc/take_damage(brute, burn, slash)
proc/take_damage(brute, burn, sharp)
if((brute <= 0) && (burn <= 0))
return 0
if(destroyed)
return 0
if(owner) owner.pain(display_name, (brute+burn)*3, 1)
if(slash)
if(sharp)
var/chance = rand(1,5)
var/nux = brute * chance
if(brute_dam >= max_damage)
@@ -190,19 +188,25 @@
switch(body_part)
if(UPPER_TORSO)
owner.gib()
if(LOWER_TORSO)
owner << "\red You are now sterile."
if(HEAD)
var/obj/item/weapon/organ/head/H = new(owner.loc)
var/obj/item/weapon/organ/head/H = new(owner.loc, owner)
if(owner.gender == FEMALE)
H.icon_state = "head_f_l"
H.overlays += owner.face_lying
var/lol = pick(cardinal)
step(H,lol)
owner:update_face()
owner:update_body()
return
owner.update_face()
owner.update_body()
owner.death()
if(ARM_RIGHT)
var/obj/item/weapon/organ/r_arm/H = new(owner.loc)
if(owner:organs["r_hand"])
var/datum/organ/external/S = owner:organs["r_hand"]
if(!S.destroyed)
var/obj/item/weapon/organ/r_hand/X = new(owner.loc)
var/obj/item/weapon/organ/r_hand/X = new(owner.loc, owner)
for(var/mob/M in viewers(owner))
M.show_message("\red [owner.name]'s [X.name] flies off.")
var/lol2 = pick(cardinal)
@@ -210,13 +214,12 @@
var/lol = pick(cardinal)
step(H,lol)
destroyed = 1
return
if(ARM_LEFT)
var/obj/item/weapon/organ/l_arm/H = new(owner.loc)
if(owner:organs["l_hand"])
var/datum/organ/external/S = owner:organs["l_hand"]
if(!S.destroyed)
var/obj/item/weapon/organ/l_hand/X = new(owner.loc)
var/obj/item/weapon/organ/l_hand/X = new(owner.loc, owner)
for(var/mob/M in viewers(owner))
M.show_message("\red [owner.name]'s [X.name] flies off in arc.")
var/lol2 = pick(cardinal)
@@ -224,13 +227,12 @@
var/lol = pick(cardinal)
step(H,lol)
destroyed = 1
return
if(LEG_RIGHT)
var/obj/item/weapon/organ/r_leg/H = new(owner.loc)
if(owner:organs["r_foot"])
var/datum/organ/external/S = owner:organs["r_foot"]
if(!S.destroyed)
var/obj/item/weapon/organ/l_foot/X = new(owner.loc)
var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner)
for(var/mob/M in viewers(owner))
M.show_message("\red [owner.name]'s [X.name] flies off flies off in arc.")
var/lol2 = pick(cardinal)
@@ -238,13 +240,12 @@
var/lol = pick(cardinal)
step(H,lol)
destroyed = 1
return
if(LEG_LEFT)
var/obj/item/weapon/organ/l_leg/H = new(owner.loc)
if(owner:organs["l_foot"])
var/datum/organ/external/S = owner:organs["l_foot"]
if(!S.destroyed)
var/obj/item/weapon/organ/l_foot/X = new(owner.loc)
var/obj/item/weapon/organ/l_foot/X = new(owner.loc, owner)
for(var/mob/M in viewers(owner))
M.show_message("\red [owner.name]'s [X.name] flies off.")
var/lol2 = pick(cardinal)
@@ -252,7 +253,6 @@
var/lol = pick(cardinal)
step(H,lol)
destroyed = 1
return
proc/createwound(var/size = 1)
if(ishuman(src.owner))

View File

@@ -15,8 +15,8 @@
/datum/organ/external/head
name = "head"
icon_name = "head"
max_damage = 125
min_broken_damage = 70
max_damage = 75
min_broken_damage = 40
body_part = HEAD
var/disfigured = 0
@@ -84,32 +84,41 @@
min_broken_damage = 15
body_part = HAND_LEFT
obj/item/weapon/organ/
obj/item/weapon/organ
icon = 'human.dmi'
obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
..(loc)
if(!istype(H))
return
if(H.dna)
blood_DNA = H.dna.unique_enzymes
blood_type = H.b_type
obj/item/weapon/organ/head
name = "head"
icon_state = "head_l"
icon_state = "head_m_l"
obj/item/weapon/organ/l_arm
name = "left arm"
icon_state = "arm_left_l"
icon_state = "l_arm_l"
obj/item/weapon/organ/l_foot
name = "left foot"
icon_state = "foot_left_l"
icon_state = "l_foot_l"
obj/item/weapon/organ/l_hand
name = "left hand"
icon_state = "hand_left_l"
icon_state = "l_hand_l"
obj/item/weapon/organ/l_leg
name = "left leg"
icon_state = "leg_left_l"
icon_state = "l_leg_l"
obj/item/weapon/organ/r_arm
name = "right arm"
icon_state = "arm_right_l"
icon_state = "r_arm_l"
obj/item/weapon/organ/r_foot
name = "right foot"
icon_state = "foot_right_l"
icon_state = "r_foot_l"
obj/item/weapon/organ/r_hand
name = "right hand"
icon_state = "hand_right_l"
icon_state = "r_hand_l"
obj/item/weapon/organ/r_leg
name = "right leg"
icon_state = "leg_right_l"
icon_state = "r_leg_l"