Merge pull request #1561 from RobRichards1997/11/10/2013-Limbs-are-Objects

Changes Limbs into Objects [Merge/Give Feedback]
This commit is contained in:
Aranclanos
2013-10-22 00:41:09 -07:00
35 changed files with 331 additions and 214 deletions
+1 -1
View File
@@ -487,7 +487,7 @@
name = "Disarming Syndrome"
stage = 4
activate(var/mob/living/carbon/mob,var/multiplier)
var/datum/limb/org = mob.organs["r_arm"]
var/obj/item/organ/limb/org = mob.organs["r_arm"]
org.take_damage(3,0,0,0)
mob << "\red You feel a sting in your right arm."*/
+1 -1
View File
@@ -72,7 +72,7 @@
return
var/mob/living/carbon/ML = A
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/limb/affecting = null
var/obj/item/organ/limb/affecting = null
if(ishuman(ML)) // why the hell is this not more general
affecting = ML:get_organ(ran_zone(dam_zone))
var/armor = ML.run_armor_check(affecting, "melee")
+1 -1
View File
@@ -18,7 +18,7 @@
user.Paralyse(5)
user << "\red An unexplicable force powerfully repels the sword from [target]!"
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/datum/limb/affecting = user.get_organ(organ)
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
user.update_damage_overlays(0)
return
+1 -1
View File
@@ -267,7 +267,7 @@ var/list/sacrificed = list()
usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
return fizzle()
for(var/datum/limb/affecting in corpse_to_raise.organs)
for(var/obj/item/organ/limb/affecting in corpse_to_raise.organs)
affecting.heal_damage(1000, 1000)
corpse_to_raise.setToxLoss(0)
corpse_to_raise.setOxyLoss(0)
+1 -1
View File
@@ -610,7 +610,7 @@ About the new airlock wires panel:
playsound(src.loc, 'sound/effects/bang.ogg', 25, 1)
if(!istype(H.head, /obj/item/clothing/head/helmet))
visible_message("\red [user] headbutts the airlock.")
var/datum/limb/affecting = H.get_organ("head")
var/obj/item/organ/limb/affecting = H.get_organ("head")
H.Stun(8)
H.Weaken(5)
if(affecting.take_damage(10, 0))
+1 -1
View File
@@ -41,7 +41,7 @@
var/mob/living/carbon/human/H = target
// if (M.health <= 0) return
var/datum/limb/temp = H.get_organ(pick("chest", "chest", "chest", "head"))
var/obj/item/organ/limb/temp = H.get_organ(pick("chest", "chest", "chest", "head"))
if(temp)
var/update = 0
switch(damtype)
+4 -2
View File
@@ -501,9 +501,11 @@
"\red You stab yourself in the eyes with [src]!" \
)
if(istype(M, /mob/living/carbon/human))
var/datum/limb/affecting = M:get_organ("head")
var/mob/living/carbon/human/U = M
var/obj/item/organ/limb/affecting = U.get_organ("head")
if(affecting.take_damage(7))
M:update_damage_overlays(0)
U.update_damage_overlays(0)
else
M.take_organ_damage(7)
M.eye_blurry += rand(3,4)
+1 -1
View File
@@ -125,7 +125,7 @@ MASS SPECTROMETER
var/list/damaged = H.get_damaged_organs(1,1)
user.show_message("<span class='notice'>Localized Damage, <font color='#FF8000'>Burn</font>/<font color='red'>Brute</font>:</span>",1)
if(length(damaged)>0)
for(var/datum/limb/org in damaged)
for(var/obj/item/organ/limb/org in damaged)
user.show_message(text("<span class='notice'>\t []: []-[]", capitalize(org.getDisplayName()), (org.burn_dam > 0) ? "<font color='#FF8000'>[org.burn_dam]</font>" : 0, (org.brute_dam > 0) ? "<font color='red'>[org.brute_dam]</font></span>" : 0), 1)
else
user.show_message("<span class='notice'>\t Limbs are OK.</span>",1)
+2 -2
View File
@@ -50,13 +50,13 @@
if (istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
var/datum/limb/affecting = H.get_organ("chest")
var/obj/item/organ/limb/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/limb) || affecting:burn_dam <= 0)
if(!istype(affecting, /obj/item/organ/limb) || affecting:burn_dam <= 0)
affecting = H.get_organ("head")
if (affecting.heal_damage(src.heal_brute, src.heal_burn))
@@ -280,7 +280,7 @@
if(!H.gloves)
H << "<span class='warning'>[src] cuts into your hand!</span>"
var/organ = (H.hand ? "l_" : "r_") + "arm"
var/datum/limb/affecting = H.get_organ(organ)
var/obj/item/organ/limb/affecting = H.get_organ(organ)
if(affecting.take_damage(force / 2))
H.update_damage_overlays(0)
else if(isliving(user))
@@ -26,7 +26,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/heal_amt = 10
for(var/datum/limb/affecting in H.organs)
for(var/obj/item/organ/limb/affecting in H.organs)
if(affecting.heal_damage(heal_amt, heal_amt))
H.update_damage_overlays(0)
return
+1 -1
View File
@@ -39,7 +39,7 @@
proc/triggered(mob/target as mob, var/type = "feet")
if(!armed)
return
var/datum/limb/affecting = null
var/obj/item/organ/limb/affecting = null
if(ishuman(target))
var/mob/living/carbon/human/H = target
switch(type)
+2 -2
View File
@@ -33,7 +33,7 @@
user << "\red The nettle burns your bare hand!"
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/datum/limb/affecting = user.get_organ(organ)
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0,force))
user.update_damage_overlays(0)
else
@@ -57,7 +57,7 @@
if(!user.gloves)
if(istype(user, /mob/living/carbon/human))
var/organ = ((user.hand ? "l_":"r_") + "arm")
var/datum/limb/affecting = user.get_organ(organ)
var/obj/item/organ/limb/affecting = user.get_organ(organ)
if(affecting.take_damage(0,force))
user.update_damage_overlays(0)
else
+3 -3
View File
@@ -20,8 +20,8 @@
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
var/organ = H.get_organ("chest")
if (istype(organ, /datum/limb))
var/datum/limb/temp = organ
if (istype(organ, /obj/item/organ/limb))
var/obj/item/organ/limb/temp = organ
if(temp.take_damage(d, 0))
H.update_damage_overlays(0)
H.updatehealth()
@@ -146,7 +146,7 @@
"<span class='notice'>[src] examines \himself.", \
"<span class='notice'>You check yourself for injuries.</span>")
for(var/datum/limb/org in H.organs)
for(var/obj/item/organ/limb/org in H.organs)
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
@@ -18,9 +18,9 @@
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
//initialise organs
organs = newlist(/datum/limb/chest, /datum/limb/head, /datum/limb/l_arm,
/datum/limb/r_arm, /datum/limb/r_leg, /datum/limb/l_leg)
for(var/datum/limb/O in organs)
organs = newlist(/obj/item/organ/limb/chest, /obj/item/organ/limb/head, /obj/item/organ/limb/l_arm,
/obj/item/organ/limb/r_arm, /obj/item/organ/limb/r_leg, /obj/item/organ/limb/l_leg)
for(var/obj/item/organ/limb/O in organs)
O.owner = src
internal_organs += new /obj/item/organ/appendix
internal_organs += new /obj/item/organ/heart
@@ -186,7 +186,7 @@
Paralyse(10)
var/update = 0
for(var/datum/limb/temp in organs)
for(var/obj/item/organ/limb/temp in organs)
switch(temp.name)
if("head")
update |= temp.take_damage(b_loss * 0.2, f_loss * 0.2)
@@ -207,7 +207,7 @@
if(stat == 2) return
show_message("\red The blob attacks you!")
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/limb/affecting = get_organ(ran_zone(dam_zone))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
apply_damage(rand(20,30), BRUTE, affecting, run_armor_check(affecting, "melee"))
return
@@ -216,7 +216,7 @@
if ((M.client && !( M.blinded )))
M.show_message("\red [src] has been hit by [O]", 1)
if (health > 0)
var/datum/limb/affecting = get_organ(pick("chest", "chest", "chest", "head"))
var/obj/item/organ/limb/affecting = get_organ(pick("chest", "chest", "chest", "head"))
if(!affecting) return
if (istype(O, /obj/effect/immovablerod))
if(affecting.take_damage(101, 0))
@@ -240,7 +240,7 @@
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [M.name] ([M.ckey])</font>")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/limb/affecting = get_organ(ran_zone(dam_zone))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
var/armor = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor)
if(armor >= 2) return
@@ -265,7 +265,7 @@
var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
var/datum/limb/affecting = get_organ(ran_zone(dam_zone))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
var/armor_block = run_armor_check(affecting, "melee")
apply_damage(damage, BRUTE, affecting, armor_block)
@@ -30,7 +30,7 @@
playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1)
visible_message("\red <B>[M] has lunged at [src]!</B>")
return 0
var/datum/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
@@ -80,7 +80,7 @@
return 0
var/datum/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/armor_block = run_armor_check(affecting, "melee")
if(HULK in M.mutations)
@@ -111,7 +111,7 @@
if(w_uniform)
w_uniform.add_fingerprint(M)
var/datum/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(M.zone_sel.selecting))
var/randn = rand(1, 100)
if(randn <= 25)
apply_effect(2, WEAKEN, run_armor_check(affecting, "melee"))
@@ -11,7 +11,7 @@
var/damage = rand(1, 3)
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/limb/affecting = get_organ(ran_zone(dam_zone))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee"))
for(var/datum/disease/D in M.viruses)
@@ -6,7 +6,7 @@
return
var/total_burn = 0
var/total_brute = 0
for(var/datum/limb/O in organs) //hardcoded to streamline things a bit
for(var/obj/item/organ/limb/O in organs) //hardcoded to streamline things a bit
total_brute += O.brute_dam
total_burn += O.burn_dam
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
@@ -19,13 +19,13 @@
//These procs fetch a cumulative total damage from all organs
/mob/living/carbon/human/getBruteLoss()
var/amount = 0
for(var/datum/limb/O in organs)
for(var/obj/item/organ/limb/O in organs)
amount += O.brute_dam
return amount
/mob/living/carbon/human/getFireLoss()
var/amount = 0
for(var/datum/limb/O in organs)
for(var/obj/item/organ/limb/O in organs)
amount += O.burn_dam
return amount
@@ -58,16 +58,16 @@
//Returns a list of damaged organs
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
var/list/datum/limb/parts = list()
for(var/datum/limb/O in organs)
var/list/obj/item/organ/limb/parts = list()
for(var/obj/item/organ/limb/O in organs)
if((brute && O.brute_dam) || (burn && O.burn_dam))
parts += O
return parts
//Returns a list of damageable organs
/mob/living/carbon/human/proc/get_damageable_organs()
var/list/datum/limb/parts = list()
for(var/datum/limb/O in organs)
var/list/obj/item/organ/limb/parts = list()
for(var/obj/item/organ/limb/O in organs)
if(O.brute_dam + O.burn_dam < O.max_damage)
parts += O
return parts
@@ -76,9 +76,9 @@
//It automatically updates damage overlays if necesary
//It automatically updates health status
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
var/list/datum/limb/parts = get_damaged_organs(brute,burn)
var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn)
if(!parts.len) return
var/datum/limb/picked = pick(parts)
var/obj/item/organ/limb/picked = pick(parts)
if(picked.heal_damage(brute,burn))
update_damage_overlays(0)
updatehealth()
@@ -87,9 +87,9 @@
//It automatically updates damage overlays if necesary
//It automatically updates health status
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn)
var/list/datum/limb/parts = get_damageable_organs()
var/list/obj/item/organ/limb/parts = get_damageable_organs()
if(!parts.len) return
var/datum/limb/picked = pick(parts)
var/obj/item/organ/limb/picked = pick(parts)
if(picked.take_damage(brute,burn))
update_damage_overlays(0)
updatehealth()
@@ -97,11 +97,11 @@
//Heal MANY external organs, in random order
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
var/list/datum/limb/parts = get_damaged_organs(brute,burn)
var/list/obj/item/organ/limb/parts = get_damaged_organs(brute,burn)
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/limb/picked = pick(parts)
var/obj/item/organ/limb/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
@@ -118,10 +118,10 @@
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn)
if(status_flags & GODMODE) return //godmode
var/list/datum/limb/parts = get_damageable_organs()
var/list/obj/item/organ/limb/parts = get_damageable_organs()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/limb/picked = pick(parts)
var/obj/item/organ/limb/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
@@ -140,8 +140,8 @@
////////////////////////////////////////////
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
var/datum/limb/E = get_organ(zone)
if(istype(E, /datum/limb))
var/obj/item/organ/limb/E = get_organ(zone)
if(istype(E, /obj/item/organ/limb))
if (E.heal_damage(brute, burn))
update_damage_overlays(0)
else
@@ -151,7 +151,7 @@
/mob/living/carbon/human/proc/get_organ(var/zone)
if(!zone) zone = "chest"
for(var/datum/limb/O in organs)
for(var/obj/item/organ/limb/O in organs)
if(O.name == zone)
return O
return null
@@ -164,7 +164,7 @@
if(blocked >= 2) return 0
var/datum/limb/organ = null
var/obj/item/organ/limb/organ = null
if(isorgan(def_zone))
organ = def_zone
else
@@ -15,18 +15,18 @@ emp_act
if(def_zone)
if(isorgan(def_zone))
return checkarmor(def_zone, type)
var/datum/limb/affecting = get_organ(ran_zone(def_zone))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(def_zone))
return checkarmor(affecting, type)
//If a specific bodypart is targetted, check how that bodypart is protected and return the value.
//If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values
for(var/datum/limb/organ in organs)
for(var/obj/item/organ/limb/organ in organs)
armorval += checkarmor(organ, type)
organnum++
return (armorval/max(organnum, 1))
/mob/living/carbon/human/proc/checkarmor(var/datum/limb/def_zone, var/type)
/mob/living/carbon/human/proc/checkarmor(var/obj/item/organ/limb/def_zone, var/type)
if(!type) return 0
var/protection = 0
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform)
@@ -120,7 +120,7 @@ emp_act
/mob/living/carbon/human/proc/attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone)
if(!I || !user) return 0
var/datum/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
var/obj/item/organ/limb/affecting = get_organ(ran_zone(user.zone_sel.selecting))
var/hit_area = parse_zone(affecting.name)
@@ -50,7 +50,7 @@
return if_no_face
if( head && (head.flags_inv&HIDEFACE) )
return if_no_face //Likewise for hats
var/datum/limb/O = get_organ("head")
var/obj/item/organ/limb/O = get_organ("head")
if( (status_flags&DISFIGURED) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
return if_no_face
return real_name
@@ -161,13 +161,13 @@ Please contact me on #coderbus IRC. ~Carnie x
overlays_standing[DAMAGE_LAYER] = standing
overlays_lying[DAMAGE_LAYER] = lying
for(var/datum/limb/O in organs)
for(var/obj/item/organ/limb/O in organs)
if(O.brutestate)
standing.overlays += "[O.icon_name]_[O.brutestate]0" //we're adding icon_states of the base image as overlays
lying.overlays += "[O.icon_name]2_[O.brutestate]0"
standing.overlays += "[O.icon_state]_[O.brutestate]0" //we're adding icon_states of the base image as overlays //made icon_name redundant - RR
lying.overlays += "[O.icon_state]2_[O.brutestate]0"
if(O.burnstate)
standing.overlays += "[O.icon_name]_0[O.burnstate]"
lying.overlays += "[O.icon_name]2_0[O.burnstate]"
standing.overlays += "[O.icon_state]_0[O.burnstate]"
lying.overlays += "[O.icon_state]2_0[O.burnstate]"
apply_overlay(DAMAGE_LAYER)
+2 -2
View File
@@ -38,7 +38,7 @@
var/mob/living/carbon/human/H = src //make this damage method divide the damage to be done among all the body parts, then burn each body part for that much damage. will have better effect then just randomly picking a body part
var/divided_damage = (burn_amount)/(H.organs.len)
var/extradam = 0 //added to when organ is at max dam
for(var/datum/limb/affecting in H.organs)
for(var/obj/item/organ/limb/affecting in H.organs)
if(!affecting) continue
if(affecting.take_damage(0, divided_damage+extradam)) //TODO: fix the extradam stuff. Or, ebtter yet...rewrite this entire proc ~Carn
H.update_damage_overlays(0)
@@ -216,7 +216,7 @@
var/t = shooter:zone_sel.selecting
if ((t in list( "eyes", "mouth" )))
t = "head"
var/datum/limb/def_zone = ran_zone(t)
var/obj/item/organ/limb/def_zone = ran_zone(t)
return def_zone
@@ -135,7 +135,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg")
var/datum/limb/affecting = H.get_organ(ran_zone(dam_zone))
var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(dam_zone))
H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"))
return H
else if(isliving(target))
+1 -1
View File
@@ -121,7 +121,7 @@ proc/isovermind(A)
return 0
proc/isorgan(A)
if(istype(A, /datum/limb))
if(istype(A, /obj/item/organ/limb))
return 1
return 0
+1 -1
View File
@@ -496,7 +496,7 @@
else
user << "You try to remove the light [fitting], but you burn your hand on it!"
var/datum/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
if(affecting.take_damage( 0, 5 )) // 5 burn damage
H.update_damage_overlays(0)
@@ -161,7 +161,7 @@
if(isliving(target) && isliving(user))
if(target == user)
var/datum/limb/affecting = user.zone_sel.selecting
var/obj/item/organ/limb/affecting = user.zone_sel.selecting
if(affecting == "head")
var/obj/item/ammo_casing/AC = loaded[1]
+1 -1
View File
@@ -1628,7 +1628,7 @@ datum
if(!M.unacidable)
if(istype(M, /mob/living/carbon/human) && volume >= 3)
var/mob/living/carbon/human/H = M
var/datum/limb/affecting = H.get_organ("head")
var/obj/item/organ/limb/affecting = H.get_organ("head")
if(affecting)
if(affecting.take_damage(4*toxpwr, 2*toxpwr))
H.update_damage_overlays(0)
@@ -43,7 +43,7 @@
force = 15 //Smashing bottles over someoen's head hurts.
var/datum/limb/affecting = user.zone_sel.selecting //Find what the player is aiming at
var/obj/item/organ/limb/affecting = user.zone_sel.selecting //Find what the player is aiming at
var/armor_block = 0 //Get the target's armour values for normal attack damage.
var/armor_duration = 0 //The more force the bottle has, the longer the duration.
+117 -1
View File
@@ -28,4 +28,120 @@
//Looking for brains?
//Try code/modules/mob/living/carbon/brain/brain_item.dm
//Try code/modules/mob/living/carbon/brain/brain_item.dm
/obj/item/organ/limb
name = "limb"
var/mob/owner = null
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
var/max_damage = 0
/obj/item/organ/limb/chest
name = "chest"
icon_state = "chest"
max_damage = 200
body_part = CHEST
/obj/item/organ/limb/head
name = "head"
icon_state = "head"
max_damage = 200
body_part = HEAD
/obj/item/organ/limb/l_arm
name = "l_arm"
icon_state = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/obj/item/organ/limb/l_leg
name = "l_leg"
icon_state = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/obj/item/organ/limb/r_arm
name = "r_arm"
icon_state = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/obj/item/organ/limb/r_leg
name = "r_leg"
icon_state = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
/obj/item/organ/limb/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE)) return 0 //godmode
brute = max(brute,0)
burn = max(burn,0)
var/can_inflict = max_damage - (brute_dam + burn_dam)
if(!can_inflict) return 0
if((brute + burn) < can_inflict)
brute_dam += brute
burn_dam += burn
else
if(brute > 0)
if(burn > 0)
brute = round( (brute/(brute+burn)) * can_inflict, 1 )
burn = can_inflict - brute //gets whatever damage is left over
brute_dam += brute
burn_dam += burn
else
brute_dam += can_inflict
else
if(burn > 0)
burn_dam += can_inflict
else
return 0
return update_organ_icon()
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
/obj/item/organ/limb/proc/heal_damage(brute, burn)
brute = max(brute, 0)
burn = max(burn, 0)
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
return update_organ_icon()
//Returns total damage...kinda pointless really
/obj/item/organ/limb/proc/get_damage()
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by update_damage_overlays()
//Returns 1 if we need to update overlays. 0 otherwise.
/obj/item/organ/limb/proc/update_organ_icon()
var/tbrute = round( (brute_dam/max_damage)*3, 1 )
var/tburn = round( (burn_dam/max_damage)*3, 1 )
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
//Returns a display name for the organ
/obj/item/organ/limb/proc/getDisplayName()
switch(name)
if("l_leg") return "left leg"
if("r_leg") return "right leg"
if("l_arm") return "left arm"
if("r_arm") return "right arm"
else return name
+1 -1
View File
@@ -480,7 +480,7 @@ Doing this because FindTurfs() isn't even used
if(stat > 1) stat=0
disabilities = initial(disabilities)
sdisabilities = initial(sdisabilities)
for(var/datum/limb/e in src)
for(var/obj/item/organ/limb/e in src)
e.brute_dam = 0.0
e.burn_dam = 0.0
e.bandaged = 0.0
+140 -140
View File
@@ -1,140 +1,140 @@
/datum/limb
var/name = "limb"
var/mob/owner = null
var/icon_name = null
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
var/max_damage = 0
/datum/limb/chest
name = "chest"
icon_name = "chest"
max_damage = 200
body_part = CHEST
/datum/limb/head
name = "head"
icon_name = "head"
max_damage = 200
body_part = HEAD
/datum/limb/l_arm
name = "l_arm"
icon_name = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/datum/limb/l_leg
name = "l_leg"
icon_name = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/datum/limb/r_arm
name = "r_arm"
icon_name = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/datum/limb/r_leg
name = "r_leg"
icon_name = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
/*Leaving these here in case we want to use them later
/datum/limb/l_foot
name = "l foot"
icon_name = "l_foot"
body_part = FOOT_LEFT
/datum/limb/r_foot
name = "r foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
/datum/limb/r_hand
name = "r hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
/datum/limb/l_hand
name = "l hand"
icon_name = "l_hand"
body_part = HAND_LEFT
/datum/limb/groin
name = "groin"
icon_name = "groin"
body_part = GROIN
*/
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
/datum/limb/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE)) return 0 //godmode
brute = max(brute,0)
burn = max(burn,0)
var/can_inflict = max_damage - (brute_dam + burn_dam)
if(!can_inflict) return 0
if((brute + burn) < can_inflict)
brute_dam += brute
burn_dam += burn
else
if(brute > 0)
if(burn > 0)
brute = round( (brute/(brute+burn)) * can_inflict, 1 )
burn = can_inflict - brute //gets whatever damage is left over
brute_dam += brute
burn_dam += burn
else
brute_dam += can_inflict
else
if(burn > 0)
burn_dam += can_inflict
else
return 0
return update_icon()
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
/datum/limb/proc/heal_damage(brute, burn)
brute = max(brute, 0)
burn = max(burn, 0)
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
return update_icon()
//Returns total damage...kinda pointless really
/datum/limb/proc/get_damage()
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by update_damage_overlays()
//Returns 1 if we need to update overlays. 0 otherwise.
/datum/limb/proc/update_icon()
var/tbrute = round( (brute_dam/max_damage)*3, 1 )
var/tburn = round( (burn_dam/max_damage)*3, 1 )
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
//Returns a display name for the organ
/datum/limb/proc/getDisplayName()
switch(name)
if("l_leg") return "left leg"
if("r_leg") return "right leg"
if("l_arm") return "left arm"
if("r_arm") return "right arm"
else return name
/datum/limb
var/name = "limb"
var/mob/owner = null
var/icon_name = null
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
var/max_damage = 0
/datum/limb/chest
name = "chest"
icon_name = "chest"
max_damage = 200
body_part = CHEST
/datum/limb/head
name = "head"
icon_name = "head"
max_damage = 200
body_part = HEAD
/datum/limb/l_arm
name = "l_arm"
icon_name = "l_arm"
max_damage = 75
body_part = ARM_LEFT
/datum/limb/l_leg
name = "l_leg"
icon_name = "l_leg"
max_damage = 75
body_part = LEG_LEFT
/datum/limb/r_arm
name = "r_arm"
icon_name = "r_arm"
max_damage = 75
body_part = ARM_RIGHT
/datum/limb/r_leg
name = "r_leg"
icon_name = "r_leg"
max_damage = 75
body_part = LEG_RIGHT
/*Leaving these here in case we want to use them later
/datum/limb/l_foot
name = "l foot"
icon_name = "l_foot"
body_part = FOOT_LEFT
/datum/limb/r_foot
name = "r foot"
icon_name = "r_foot"
body_part = FOOT_RIGHT
/datum/limb/r_hand
name = "r hand"
icon_name = "r_hand"
body_part = HAND_RIGHT
/datum/limb/l_hand
name = "l hand"
icon_name = "l_hand"
body_part = HAND_LEFT
/datum/limb/groin
name = "groin"
icon_name = "groin"
body_part = GROIN
*/
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
//Damage will not exceed max_damage using this proc
//Cannot apply negative damage
/datum/limb/proc/take_damage(brute, burn)
if(owner && (owner.status_flags & GODMODE)) return 0 //godmode
brute = max(brute,0)
burn = max(burn,0)
var/can_inflict = max_damage - (brute_dam + burn_dam)
if(!can_inflict) return 0
if((brute + burn) < can_inflict)
brute_dam += brute
burn_dam += burn
else
if(brute > 0)
if(burn > 0)
brute = round( (brute/(brute+burn)) * can_inflict, 1 )
burn = can_inflict - brute //gets whatever damage is left over
brute_dam += brute
burn_dam += burn
else
brute_dam += can_inflict
else
if(burn > 0)
burn_dam += can_inflict
else
return 0
return update_icon()
//Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all.
//Damage cannot go below zero.
//Cannot remove negative damage (i.e. apply damage)
/datum/limb/proc/heal_damage(brute, burn)
brute = max(brute, 0)
burn = max(burn, 0)
brute_dam = max(brute_dam - brute, 0)
burn_dam = max(burn_dam - burn, 0)
return update_icon()
//Returns total damage...kinda pointless really
/datum/limb/proc/get_damage()
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by update_damage_overlays()
//Returns 1 if we need to update overlays. 0 otherwise.
/datum/limb/proc/update_icon()
var/tbrute = round( (brute_dam/max_damage)*3, 1 )
var/tburn = round( (burn_dam/max_damage)*3, 1 )
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
//Returns a display name for the organ
/datum/limb/proc/getDisplayName()
switch(name)
if("l_leg") return "left leg"
if("r_leg") return "right leg"
if("l_arm") return "left arm"
if("r_arm") return "right arm"
else return name
+2 -2
View File
@@ -43,9 +43,9 @@ mob/living/carbon/human/proc/handle_pain()
if(reagents.has_reagent("oxycodone"))
return
var/maxdam = 0
var/datum/limb/damaged_organ = null
var/obj/item/organ/limb/damaged_organ = null
for(var/name in organs)
var/datum/limb/E = organs[name]
var/obj/item/organ/limb/E = organs[name]
var/dam = E.get_damage()
// make the choice of the organ depend on damage,
// but also sometimes use one of the less damaged ones
+1 -1
View File
@@ -193,7 +193,7 @@
var/dmg = rand(rock_min_dmg,rock_max_dmg)
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
var/datum/limb/affecting = H.organs["head"]
var/obj/item/organ/limb/affecting = H.organs["head"]
affecting.take_damage(dmg)
H.updatehealth()
else
-1
View File
@@ -93,7 +93,6 @@
#include "code\datums\datacore.dm"
#include "code\datums\datumvars.dm"
#include "code\datums\disease.dm"
#include "code\datums\limbs.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
#include "code\datums\modules.dm"