First update for update_icons stuffs:

Fixed husking and fatties
Fixed floor tiles still appearing in hand when laying them
Fixed a possible runtime with FAT people

Fixes for pre-existing bugs:
Fixed being unable to put belts & backpacks on other people
Tweaked the damage procs a bit. Mainly adding in sanity checks to prevent negative damage and such. A few optimisations here and there.
Fixed ratios for brute-burn damage being applied to organs simultaneously
nodamage==1 now prevents all organ damage. It does not stop healing however.
In-line with the sanity stuff mentioned above, clamp-values for brute/burn were removed as requested by Rockdtben


git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3825 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
elly1989@rocketmail.com
2012-06-15 04:11:14 +00:00
parent c36e6d57d4
commit 5b76469b98
15 changed files with 358 additions and 348 deletions

View File

@@ -1545,9 +1545,9 @@ var/list/the_station_areas = list (
sound_delay = rand(0, 50)
for(var/mob/living/carbon/human/H in src)
if(H.s_tone > -55)
H.s_tone--
H.update_body()
// if(H.s_tone > -55) //ugh...nice/novel idea but please no.
// H.s_tone--
// H.update_body()
if(H.client)
mysound.status = SOUND_UPDATE
H << mysound

View File

@@ -362,7 +362,7 @@
H.h_style = hair.icon_state
H.hair_style = hair
H.update_body()
H.update_body(0)
H.update_hair()
return 1

View File

@@ -833,7 +833,7 @@
else if( istype(W,/obj/item/apc_frame) )
var/obj/item/apc_frame/AH = W
AH.try_build(src)
else if(istype(W,/obj/item/light_fixture_frame))
var/obj/item/light_fixture_frame/AH = W
AH.try_build(src)
@@ -1385,7 +1385,7 @@ turf/simulated/floor/return_siding_icon_state()
if(is_light_floor())
var/obj/item/stack/tile/light/T = floor_tile
if(T.state)
user.u_equip(C)
user.drop_item(C)
del(C)
T.state = C //fixing it by bashing it with a light bulb, fun eh?
update_icon()

View File

@@ -368,16 +368,17 @@
if(reagents) reagents.metabolize(src)
if(src.nutrition > 500 && !(FAT in src.mutations))
if(prob(5 + round((src.nutrition - 200) / 2)))
src << "\red You suddenly feel blubbery!"
src.mutations.Add(FAT)
// update_body()
if (src.nutrition < 100 && (FAT in src.mutations))
if(prob(round((50 - src.nutrition) / 100)))
src << "\blue You feel fit again!"
src.mutations.Remove(FAT)
// update_body()
if(FAT in mutations)
if(nutrition < 100)
if(prob(round((50 - src.nutrition) / 100)))
src << "\blue You feel fit again!"
src.mutations.Remove(FAT)
else
if(nutrition > 500)
if(prob(5 + round((src.nutrition - 200) / 2)))
src << "\red You suddenly feel blubbery!"
src.mutations.Add(FAT)
if (src.nutrition > 0)
src.nutrition -= HUNGER_FACTOR

View File

@@ -284,19 +284,19 @@
handle_chemicals_in_body()
if(reagents) reagents.metabolize(src)
if(nutrition > 500 && !(FAT in src.mutations))
if(prob(5 + round((nutrition - 200) / 2)))
src << "\red You suddenly feel blubbery!"
mutations.Add(FAT)
// update_body()
if (nutrition < 100 && (FAT in src.mutations))
if(prob(round((50 - nutrition) / 100)))
src << "\blue You feel fit again!"
mutations.Add(FAT)
// update_body()
if(FAT in mutations)
if(nutrition < 100)
if(prob(round((50 - nutrition) / 100)))
src << "\blue You feel fit again!"
mutations.Add(FAT)
else
if(nutrition > 500)
if(prob(5 + round((nutrition - 200) / 2)))
src << "\red You suddenly feel blubbery!"
mutations.Add(FAT)
if (nutrition > 0)
nutrition-= HUNGER_FACTOR

View File

@@ -102,7 +102,8 @@
return
mutations.Add(HUSK)
real_name = "Unknown"
update_body()
update_body(0)
update_mutantrace()
return
/mob/living/carbon/human/proc/Drain()

View File

@@ -1118,7 +1118,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
if ((istype(item, /obj) && item.flags & 128 && target.w_uniform))
if ((istype(item, /obj) && (item.slot_flags & SLOT_BELT) && target.w_uniform))
source.drop_item()
loc = target
item.layer = 20
@@ -1363,7 +1363,7 @@ It can still be worn/put on as normal.
W.layer = initial(W.layer)
W.add_fingerprint(source)
else
if ((istype(item, /obj/item) && item.flags & 1))
if ((istype(item, /obj/item) && (item.slot_flags & SLOT_BACK) ))
source.drop_item()
loc = target
item.layer = 20
@@ -1605,80 +1605,6 @@ It can still be worn/put on as normal.
return ..(shock_damage,source,siemens_coeff)
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
var/list/datum/organ/external/parts = list()
for(var/datum/organ/external/organ in organs)
if((brute && organ.brute_dam) || (burn && organ.burn_dam))
parts += organ
return parts
/mob/living/carbon/human/proc/get_damageable_organs()
var/list/datum/organ/external/parts = list()
for(var/datum/organ/external/organ in organs)
if(organ.brute_dam + organ.burn_dam < organ.max_damage)
parts += organ
return parts
// heal ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
if(!parts.len)
return
var/datum/organ/external/picked = pick(parts)
if(picked.heal_damage(brute,burn))
UpdateDamageIcon()
updatehealth()
// damage ONE external organ, organ gets randomly selected from damaged ones.
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn)
var/list/datum/organ/external/parts = get_damageable_organs()
if(!parts.len)
return
var/datum/organ/external/picked = pick(parts)
if(picked.take_damage(brute,burn))
UpdateDamageIcon()
updatehealth()
// heal MANY external organs, in random order
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/organ/external/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.heal_damage(brute,burn)
brute -= (brute_was-picked.brute_dam)
burn -= (burn_was-picked.burn_dam)
parts -= picked
updatehealth()
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn)
var/list/datum/organ/external/parts = get_damageable_organs()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/organ/external/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn)
brute -= (picked.brute_dam-brute_was)
burn -= (picked.burn_dam-burn_was)
parts -= picked
updatehealth()
if(update) UpdateDamageIcon()
/mob/living/carbon/human/Topic(href, href_list)
if (href_list["refresh"])
if((machine)&&(in_range(src, usr)))
@@ -1759,17 +1685,6 @@ It can still be worn/put on as normal.
return 1//Humans can use guns and such
/mob/living/carbon/human/updatehealth()
if(src.nodamage)
src.health = 100
src.stat = 0
return
src.health = 100 - src.getOxyLoss() - src.getToxLoss() - src.getFireLoss() - src.getBruteLoss() - src.getCloneLoss()
if(getFireLoss() > (100 - config.health_threshold_dead) && stat == DEAD) //100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
ChangeToHusk()
return
/mob/living/carbon/human/abiotic(var/full_body = 0)
if(full_body && ((src.l_hand && !( src.l_hand.abstract )) || (src.r_hand && !( src.r_hand.abstract )) || (src.back || src.wear_mask || src.head || src.shoes || src.w_uniform || src.wear_suit || src.glasses || src.ears || src.gloves)))
return 1
@@ -1779,44 +1694,6 @@ It can still be worn/put on as normal.
return 0
/mob/living/carbon/human/getBruteLoss()
var/amount = 0.0
for(var/datum/organ/external/O in organs)
amount+= O.brute_dam
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
if(amount > 0)
take_overall_damage(amount, 0)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/getFireLoss()
var/amount = 0.0
for(var/datum/organ/external/O in organs)
amount+= O.burn_dam
return amount
/mob/living/carbon/human/adjustFireLoss(var/amount)
if(amount > 0)
take_overall_damage(0, amount)
else
heal_overall_damage(0, -amount)
/mob/living/carbon/human/Stun(amount)
if(HULK in mutations)
return
..()
/mob/living/carbon/human/Weaken(amount)
if(HULK in mutations)
return
..()
/mob/living/carbon/human/Paralyse(amount)
if(HULK in mutations)
return
..()
/mob/living/carbon/human/proc/check_dna()
dna.check_integrity(src)

View File

@@ -1,3 +1,143 @@
//Updates the mob's health from organs and mob damage variables
/mob/living/carbon/human/updatehealth()
if(nodamage)
health = 100
stat = CONSCIOUS
return
var/total_burn = 0
var/total_brute = 0
for(var/datum/organ/external/O in organs) //hardcoded to streamline things a bit
total_brute += O.brute_dam
total_burn += O.burn_dam
health = 100 - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
//TODO: fix this husking crap
if( ((100 - total_burn) < config.health_threshold_dead) && stat == DEAD) //100 only being used as the magic human max health number, feel free to change it if you add a var for it -- Urist
ChangeToHusk()
return
//These procs fetch a cumulative total damage from all organs
/mob/living/carbon/human/getBruteLoss()
var/amount = 0
for(var/datum/organ/external/O in organs)
amount += O.brute_dam
return amount
/mob/living/carbon/human/getFireLoss()
var/amount = 0
for(var/datum/organ/external/O in organs)
amount += O.burn_dam
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
if(amount > 0)
take_overall_damage(amount, 0)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/adjustFireLoss(var/amount)
if(amount > 0)
take_overall_damage(0, amount)
else
heal_overall_damage(0, -amount)
/mob/living/carbon/human/Stun(amount)
if(HULK in mutations) return
..()
/mob/living/carbon/human/Weaken(amount)
if(HULK in mutations) return
..()
/mob/living/carbon/human/Paralyse(amount)
if(HULK in mutations) return
..()
////////////////////////////////////////////
//Returns a list of damaged organs
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn)
var/list/datum/organ/external/parts = list()
for(var/datum/organ/external/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/organ/external/parts = list()
for(var/datum/organ/external/O in organs)
if(O.brute_dam + O.burn_dam < O.max_damage)
parts += O
return parts
//Heals ONE external organ, organ gets randomly selected from damaged ones.
//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/organ/external/parts = get_damaged_organs(brute,burn)
if(!parts.len) return
var/datum/organ/external/picked = pick(parts)
if(picked.heal_damage(brute,burn))
UpdateDamageIcon()
updatehealth()
//Damages ONE external organ, organ gets randomly selected from damagable ones.
//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/organ/external/parts = get_damageable_organs()
if(!parts.len) return
var/datum/organ/external/picked = pick(parts)
if(picked.take_damage(brute,burn))
UpdateDamageIcon()
updatehealth()
//Heal MANY external organs, in random order
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn)
var/list/datum/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/organ/external/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.heal_damage(brute,burn)
brute -= (brute_was-picked.brute_dam)
burn -= (burn_was-picked.burn_dam)
parts -= picked
updatehealth()
if(update) UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn)
if(nodamage) return //godmode
var/list/datum/organ/external/parts = get_damageable_organs()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/datum/organ/external/picked = pick(parts)
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
parts -= picked
updatehealth()
if(update) UpdateDamageIcon()
////////////////////////////////////////////
/mob/living/carbon/human/proc/HealDamage(zone, brute, burn)
var/datum/organ/external/E = get_organ(zone)
if(istype(E, /datum/organ/external))

View File

@@ -111,8 +111,8 @@
sleeping = max( min(sleeping, 20), 0 ) // positive and under 20
oxyloss = max(oxyloss,0) // positive
toxloss = max(toxloss,0) // positive
bruteloss = max(bruteloss,0) // positive
fireloss = max(fireloss,0) // positive
// bruteloss = max(bruteloss,0) // positive
// fireloss = max(fireloss,0) // positive
update_mind()
if(!mind && client)
@@ -579,13 +579,6 @@
if(pressure > HAZARD_HIGH_PRESSURE)
adjustBruteLoss(min((10+(round(pressure/(HIGH_STEP_PRESSURE)-2)*5)),MAX_PRESSURE_DAMAGE))
return //TODO: DEFERRED
adjust_body_temperature(current, loc_temp, boost)
@@ -704,16 +697,23 @@
adjustToxLoss(-1)
adjustOxyLoss(-1)
//The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
if(FAT in mutations)
if(overeatduration < 100)
src << "\blue You feel fit again!"
mutations.Remove(FAT)
update_body()
update_mutantrace(0)
update_mutations(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
else
if(overeatduration > 500)
src << "\red You suddenly feel blubbery!"
mutations.Add(FAT)
update_body()
update_mutantrace(0)
update_mutations(0)
update_inv_w_uniform(0)
update_inv_wear_suit()
// nutrition decrease
if (nutrition > 0 && stat != 2)

View File

@@ -106,11 +106,11 @@ Please contact me on #coderbus IRC. ~Carn x
#define EARS_LAYER 8
#define SUIT_LAYER 9
#define GLASSES_LAYER 10
#define FACEMASK_LAYER 11
#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 13
#define BACK_LAYER 14
#define HAIR_LAYER 15 //TODO: make part of head layer?
#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 12
#define BACK_LAYER 13
#define HAIR_LAYER 14 //TODO: make part of head layer?
#define FACEMASK_LAYER 15
#define HEAD_LAYER 16
#define HANDCUFF_LAYER 17
#define L_HAND_LAYER 18
@@ -177,7 +177,7 @@ Please contact me on #coderbus IRC. ~Carn x
if(update_icons) update_icons()
//BASE MOB SPRITE
/mob/living/carbon/human/proc/update_body()
/mob/living/carbon/human/proc/update_body(var/update_icons=1)
if(stand_icon) del(stand_icon)
if(lying_icon) del(lying_icon)
if(mutantrace) return
@@ -221,6 +221,7 @@ Please contact me on #coderbus IRC. ~Carn x
if(!fat)
stand_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY)
lying_icon.Blend(new /icon('human.dmi', "underwear[underwear]_[g]_l"), ICON_OVERLAY)
if(update_icons) update_icons()
//HAIR OVERLAY
@@ -263,26 +264,6 @@ Please contact me on #coderbus IRC. ~Carn x
var/fat
if( FAT in mutations )
fat = "fat"
if( w_uniform && !(w_uniform&ONESIZEFITSALL) )
src << "\red You burst out of \the [w_uniform]!"
var/obj/item/clothing/c = w_uniform
u_equip(c) //Check
if(client) //
client.screen -= c //
if(c) //
c:loc = loc //
c:dropped(src) //
c:layer = initial(c:layer) //
if( wear_suit && !(wear_suit&ONESIZEFITSALL) )
src << "\red You burst out of \the [wear_suit]!"
var/obj/item/clothing/c = wear_suit
u_equip(c)
if(client)
client.screen -= c
if(c)
c:loc = loc
c:dropped(src)
c:layer = initial(c:layer)
var/image/lying = image("icon" = 'genetics.dmi')
var/image/standing = image("icon" = 'genetics.dmi')
@@ -332,7 +313,7 @@ Please contact me on #coderbus IRC. ~Carn x
else
overlays_lying[MUTANTRACE_LAYER] = null
overlays_standing[MUTANTRACE_LAYER] = null
update_body()
update_body(0)
update_hair(0)
if(update_icons) update_icons()
@@ -367,25 +348,36 @@ Please contact me on #coderbus IRC. ~Carn x
//vvvvvv UPDATE_INV PROCS vvvvvv
/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1)
if(w_uniform)
w_uniform.screen_loc = ui_iclothing //what is this?
if( istype(w_uniform, /obj/item/clothing/under) )
var/t_color = w_uniform.color
if(!t_color) t_color = icon_state
var/image/lying = image("icon_state" = "[t_color]_l")
var/image/standing = image("icon_state" = "[t_color]_s")
if( (FAT in mutations) )
if(w_uniform && istype(w_uniform, /obj/item/clothing/under) )
w_uniform.screen_loc = ui_iclothing
var/t_color = w_uniform.color
if(!t_color) t_color = icon_state
var/image/lying = image("icon_state" = "[t_color]_l")
var/image/standing = image("icon_state" = "[t_color]_s")
if( (FAT in mutations) )
if(w_uniform.flags&ONESIZEFITSALL)
lying.icon = 'uniform_fat.dmi'
standing.icon = 'uniform_fat.dmi'
else
lying.icon = 'uniform.dmi'
standing.icon = 'uniform.dmi'
src << "\red You burst out of \the [w_uniform]!"
var/obj/item/clothing/c = w_uniform
w_uniform = null
if(client)
client.screen -= c
c.loc = loc
c.dropped(src)
c.layer = initial(c.layer)
lying = null
standing = null
else
lying.icon = 'uniform.dmi'
standing.icon = 'uniform.dmi'
if(w_uniform.blood_DNA)
lying.overlays += image("icon" = 'blood.dmi', "icon_state" = "uniformblood2")
standing.overlays += image("icon" = 'blood.dmi', "icon_state" = "uniformblood")
overlays_lying[UNIFORM_LAYER] = lying
overlays_standing[UNIFORM_LAYER] = standing
if(w_uniform.blood_DNA)
lying.overlays += image("icon" = 'blood.dmi', "icon_state" = "uniformblood2")
standing.overlays += image("icon" = 'blood.dmi', "icon_state" = "uniformblood")
overlays_lying[UNIFORM_LAYER] = lying
overlays_standing[UNIFORM_LAYER] = standing
else
overlays_lying[UNIFORM_LAYER] = null
overlays_standing[UNIFORM_LAYER] = null
@@ -513,36 +505,49 @@ Please contact me on #coderbus IRC. ~Carn x
if(update_icons) update_icons()
/mob/living/carbon/human/update_inv_wear_suit(var/update_icons=1)
if( wear_suit && istype(wear_suit, /obj/item/clothing/suit) ) //TODO check this
wear_suit.screen_loc = ui_oclothing //TODO
var/image/lying = image("icon" = 'suit.dmi', "icon_state" = "[wear_suit.icon_state]2")
var/image/standing = image("icon" = 'suit.dmi', "icon_state" = "[wear_suit.icon_state]")
if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) ) //TODO
if (handcuffed) //
handcuffed.loc = loc //
handcuffed.layer = initial(handcuffed.layer) //
handcuffed = null //
if (l_hand || r_hand) //
var/h = hand //
hand = 1 //
drop_item() //
hand = 0 //
drop_item() //
hand = h //
if(FAT in mutations)
if(!wear_suit.flags&ONESIZEFITSALL)
src << "\red You burst out of \the [wear_suit]!"
var/obj/item/clothing/c = wear_suit
wear_suit = null
if(client)
client.screen -= c
c.loc = loc
c.dropped(src)
c.layer = initial(c.layer)
lying = null
standing = null
if(wear_suit.blood_DNA)
var/t_state
if( istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat) )
t_state = "armor"
else if( istype(wear_suit, /obj/item/clothing/suit/det_suit || /obj/item/clothing/suit/labcoat) )
t_state = "coat"
else
t_state = "suit"
lying.overlays += image("icon" = 'blood.dmi', "icon_state" = "[t_state]blood2")
standing.overlays += image("icon" = 'blood.dmi', "icon_state" = "[t_state]blood")
else
if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) ) //TODO
if (handcuffed) //
handcuffed.loc = loc //
handcuffed.layer = initial(handcuffed.layer) //
handcuffed = null //
if (l_hand || r_hand) //
var/h = hand //
hand = 1 //
drop_item() //
hand = 0 //
drop_item() //
hand = h //
if(wear_suit.blood_DNA)
var/t_state
if( istype(wear_suit, /obj/item/clothing/suit/armor/vest || /obj/item/clothing/suit/wcoat) )
t_state = "armor"
else if( istype(wear_suit, /obj/item/clothing/suit/det_suit || /obj/item/clothing/suit/labcoat) )
t_state = "coat"
else
t_state = "suit"
lying.overlays += image("icon" = 'blood.dmi', "icon_state" = "[t_state]blood2")
standing.overlays += image("icon" = 'blood.dmi', "icon_state" = "[t_state]blood")
overlays_lying[SUIT_LAYER] = lying
overlays_standing[SUIT_LAYER] = standing

View File

@@ -187,7 +187,7 @@
u_equip(item)
//if (client)
// client.screen -= item
//regenerate_icons()
update_icons()
return
/mob/proc/get_active_hand()

View File

@@ -2,121 +2,13 @@
/datum/organ
var/name = "organ"
var/owner = null
var/mob/owner = null
/datum/organ/proc/process()
return 0
proc/process()
return 0
proc/receive_chem(chemical as obj)
return 0
/datum/organ/proc/receive_chem(chemical as obj)
return 0
/****************************************************
EXTERNAL ORGANS
****************************************************/
/datum/organ/external
name = "external"
var/icon_name = null
var/body_part = null
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
var/burn_dam = 0
// var/bandaged = 0
var/max_damage = 0
// var/wound_size = 0
// var/max_size = 0
proc/take_damage(brute, burn)
if((brute <= 0) && (burn <= 0)) return 0
if((src.brute_dam + src.burn_dam + brute + burn) < src.max_damage)
src.brute_dam += brute
src.burn_dam += burn
else
var/can_inflict = src.max_damage - (src.brute_dam + src.burn_dam)
if(can_inflict)
if (brute > 0 && burn > 0)
brute = can_inflict/2
burn = can_inflict/2
var/ratio = brute / (brute + burn)
src.brute_dam += ratio * can_inflict
src.burn_dam += (1 - ratio) * can_inflict
else
if (brute > 0)
brute = can_inflict
src.brute_dam += brute
else
burn = can_inflict
src.burn_dam += burn
else
return 0
return update_icon()
proc/heal_damage(brute, burn)
src.brute_dam = max(0, src.brute_dam - brute)
src.burn_dam = max(0, src.burn_dam - burn)
return update_icon()
proc/get_damage() //returns total damage
return src.brute_dam + src.burn_dam //could use src.health?
// new damage icon system
// returns just the brute/burn damage code
proc/update_icon()
var/tburn
var/tbrute
if(burn_dam ==0)
tburn = 0
else if (src.burn_dam < (src.max_damage * 0.33))
tburn = 1
else if (src.burn_dam < (src.max_damage * 0.66))
tburn = 2
else
tburn = 3
if (src.brute_dam == 0)
tbrute = 0
else if (src.brute_dam < (src.max_damage * 0.33))
tbrute = 1
else if (src.brute_dam < (src.max_damage * 0.66))
tbrute = 2
else
tbrute = 3
if((tbrute != brutestate) || (tburn != burnstate))
brutestate = tbrute
burnstate = tburn
return 1
return 0
proc/getDisplayName()
switch(src.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 src.name
/*
/****************************************************
INTERNAL ORGANS
****************************************************/
/datum/organ/internal
name = "internal"
*/

View File

@@ -1,14 +1,22 @@
/datum/organ/external
name = "external"
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
// var/bandaged = 0
// var/wound_size = 0
// var/max_size = 0
/datum/organ/external/chest
name = "chest"
icon_name = "chest"
max_damage = 150
body_part = UPPER_TORSO
/*/datum/organ/external/groin
name = "groin"
icon_name = "groin"
body_part = LOWER_TORSO
*/
/datum/organ/external/head
name = "head"
icon_name = "head"
@@ -59,4 +67,76 @@
name = "l hand"
icon_name = "l_hand"
body_part = HAND_LEFT
/datum/organ/external/groin
name = "groin"
icon_name = "groin"
body_part = LOWER_TORSO
*/
//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/organ/external/proc/take_damage(brute, burn)
if(owner && owner.nodamage) 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/organ/external/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/organ/external/proc/get_damage() //returns total damage
return brute_dam + burn_dam
//Updates an organ's brute/burn states for use by updateDamageIcon()
//Returns 1 if we need to update overlays. 0 otherwise.
/datum/organ/external/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/organ/external/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

View File

@@ -1,3 +1,6 @@
/datum/organ/internal
name = "internal"
/datum/organ/internal/blood_vessels
name = "blood vessels"
var/heart = null
@@ -45,3 +48,4 @@
name = "throat"
var/lungs = null
var/stomach = null

View File

@@ -47,6 +47,16 @@ should be listed in the changelog upon commit tho. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">15 June 2012</h2>
<h3 class="author">Carnwennan updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">First update for update_icons stuffs:<br>Fixed husking and fatties<br>Fixed floor tiles still appearing in hand when laying them<br>Fixed runtimes with fatties.</li>
<li class="bugfix">Fixes for pre-existing bugs:<br>Fixed being unable to put belts & backpacks on other people<br>nodamage (godmode) now prevents all organ damage. It does not stop healing however.<br>Nerd stuff...</li>
<li class="wip"><font color='purple'>Dear god people. Use the fucking issue tracker you lazy shits. If you don't fill it out properly you have absolutely no right to complain about TGstation ever.</font></li>
</ul>
</div>
<div class="commit sansserif">
<h2 class="date">14 June 2012</h2>
<h3 class="author">Carn updated:</h3>