diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm index cd85d928e9..6b116dffd7 100644 --- a/code/defines/area/Space Station 13 areas.dm +++ b/code/defines/area/Space Station 13 areas.dm @@ -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 diff --git a/code/game/dna.dm b/code/game/dna.dm index 483d6b7254..774f8bf11b 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -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 diff --git a/code/game/turf.dm b/code/game/turf.dm index 2723b46e98..d8a569dfda 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -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() diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 9d142e7d7f..962d57edf6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -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 diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 64906879e9..098c28ebc2 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index c58932f512..06b9cbde98 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -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() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 2c969f5c9c..16b414c703 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 3a4297581c..3f58535769 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -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)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 10faa3a8bd..c184668c21 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f4929d862c..eeca0b1a16 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -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 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5958360f48..2605656f93 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -187,7 +187,7 @@ u_equip(item) //if (client) // client.screen -= item - //regenerate_icons() + update_icons() return /mob/proc/get_active_hand() diff --git a/code/modules/mob/organ/organ.dm b/code/modules/mob/organ/organ.dm index 5aebf7cc87..7fe61e128d 100644 --- a/code/modules/mob/organ/organ.dm +++ b/code/modules/mob/organ/organ.dm @@ -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" -*/ diff --git a/code/modules/mob/organ/organ_external.dm b/code/modules/mob/organ/organ_external.dm index fa228505e5..85df6bf56f 100644 --- a/code/modules/mob/organ/organ_external.dm +++ b/code/modules/mob/organ/organ_external.dm @@ -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 diff --git a/code/modules/mob/organ/organ_internal.dm b/code/modules/mob/organ/organ_internal.dm index a74411463c..66496141bb 100644 --- a/code/modules/mob/organ/organ_internal.dm +++ b/code/modules/mob/organ/organ_internal.dm @@ -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 + diff --git a/html/changelog.html b/html/changelog.html index 5f08e63c20..5f175014d7 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -47,6 +47,16 @@ should be listed in the changelog upon commit tho. Thanks. --> +