From 0fa96f21aec9d0cbb5d0a69513f38714ef9a6c4e Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 15 Jan 2016 07:59:14 -0500 Subject: [PATCH] Revert "conflict fixes" This reverts commit ba87398eeac1bed6f7ed9fb4bcdd51210ce5f443. --- .../mob/living/carbon/human/update_icons.dm | 1080 ++++++++++++++++- icons/mob/human_face.dmi | Bin 79068 -> 78637 bytes 2 files changed, 1045 insertions(+), 35 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index e22ad5e66dc..b768039ac29 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,35 +1,1045 @@ -//LOOK G-MA, I'VE JOINED CARBON PROCS THAT ARE IDENTICAL IN ALL CASES INTO ONE PROC, I'M BETTER THAN LIFE() -//I thought about mob/living but silicons and simple_animals don't want this just yet. -//Right now just handles lying down, but could handle other cases later. -//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/carbon/update_transform() - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - if(lying != lying_prev) - changed++ - ntransform.TurnTo(lying_prev,lying) - if(lying == 0) //Lying to standing - final_pixel_y = get_standard_pixel_y_offset() - else //if(lying != 0) - if(lying_prev == 0) //Standing to lying - pixel_y = get_standard_pixel_y_offset() - final_pixel_y = get_standard_pixel_y_offset(lying) - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - lying_prev = lying //so we don't try to animate until there's been another change. - - if(resize != RESIZE_DEFAULT_SIZE) - changed++ - ntransform.Scale(resize) - resize = RESIZE_DEFAULT_SIZE - - if(changed) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - handle_transform_change() - floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). - -/mob/living/carbon/proc/handle_transform_change() - return \ No newline at end of file +/* + Global associative list for caching humanoid icons. + Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0. + TODO: Proper documentation + icon_key is [species.race_key][g][husk][fat][hulk][skeleton][s_tone] +*/ +var/global/list/human_icon_cache = list() + + /////////////////////// + //UPDATE_ICONS SYSTEM// + /////////////////////// +/* +Calling this a system is perhaps a bit trumped up. It is essentially update_clothing dismantled into its +core parts. The key difference is that when we generate overlays we do not generate either lying or standing +versions. Instead, we generate both and store them in two fixed-length lists, both using the same list-index +(The indexes are in update_icons.dm): Each list for humans is (at the time of writing) of length 19. +This will hopefully be reduced as the system is refined. + + var/overlays_lying[19] //For the lying down stance + var/overlays_standing[19] //For the standing stance + +When we call update_icons, the 'lying' variable is checked and then the appropriate list is assigned to our overlays! +That in itself uses a tiny bit more memory (no more than all the ridiculous lists the game has already mind you). + +On the other-hand, it should be very CPU cheap in comparison to the old system. +In the old system, we updated all our overlays every life() call, even if we were standing still inside a crate! +or dead!. 25ish overlays, all generated from scratch every second for every xeno/human/monkey and then applied. +More often than not update_clothing was being called a few times in addition to that! CPU was not the only issue, +all those icons had to be sent to every client. So really the cost was extremely cumulative. To the point where +update_clothing would frequently appear in the top 10 most CPU intensive procs during profiling. + +Another feature of this new system is that our lists are indexed. This means we can update specific overlays! +So we only regenerate icons when we need them to be updated! This is the main saving for this system. + +In practice this means that: + everytime you fall over, we just switch between precompiled lists. Which is fast and cheap. + Everytime you do something minor like take a pen out of your pocket, we only update the in-hand overlay + etc... + + +There are several things that need to be remembered: + +> Whenever we do something that should cause an overlay to update (which doesn't use standard procs + ( i.e. you do something like l_hand = /obj/item/something new(src) ) + You will need to call the relevant update_inv_* proc: + update_inv_head() + update_inv_wear_suit() + update_inv_gloves() + update_inv_shoes() + update_inv_w_uniform() + update_inv_glasse() + update_inv_l_hand() + update_inv_r_hand() + update_inv_belt() + update_inv_wear_id() + update_inv_ears() + update_inv_s_store() + update_inv_pockets() + update_inv_back() + update_inv_handcuffed() + update_inv_wear_mask() + + All of these are named after the variable they update from. They are defined at the mob/ level like + update_clothing was, so you won't cause undefined proc runtimes with usr.update_inv_wear_id() if the usr is a + slime etc. Instead, it'll just return without doing any work. So no harm in calling it for slimes and such. + + +> There are also these special cases: + update_mutations() //handles updating your appearance for certain mutations. e.g TK head-glows + update_mutantrace() //handles updating your appearance after setting the mutantrace var + UpdateDamageIcon() //handles damage overlays for brute/burn damage //(will rename this when I geta round to it) + update_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc + update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and + ...eyes were merged into update_body) + update_targeted() // Updates the target overlay when someone points a gun at you + +> All of these procs update our overlays_lying and overlays_standing, and then call update_icons() by default. + If you wish to update several overlays at once, you can set the argument to 0 to disable the update and call + it manually: + e.g. + update_inv_head(0) + update_inv_l_hand(0) + update_inv_r_hand() //<---calls update_icons() + + or equivillantly: + update_inv_head(0) + update_inv_l_hand(0) + update_inv_r_hand(0) + update_icons() + +> If you need to update all overlays you can use regenerate_icons(). it works exactly like update_clothing used to. + +> I reimplimented an old unused variable which was in the code called (coincidentally) var/update_icon + It can be used as another method of triggering regenerate_icons(). It's basically a flag that when set to non-zero + will call regenerate_icons() at the next life() call and then reset itself to 0. + The idea behind it is icons are regenerated only once, even if multiple events requested it. + +This system is confusing and is still a WIP. It's primary goal is speeding up the controls of the game whilst +reducing processing costs. So please bear with me while I iron out the kinks. It will be worth it, I promise. +If I can eventually free var/lying stuff from the life() process altogether, stuns/death/status stuff +will become less affected by lag-spikes and will be instantaneous! :3 + +If you have any questions/constructive-comments/bugs-to-report/or have a massivly devestated butt... +Please contact me on #coderbus IRC. ~Carn x +*/ + +//Human Overlays Indexes///////// +#define MUTANTRACE_LAYER 1 +#define MUTATIONS_LAYER 2 +#define DAMAGE_LAYER 3 +#define UNIFORM_LAYER 4 +#define ID_LAYER 5 +#define SHOES_LAYER 6 +#define GLOVES_LAYER 7 +#define EARS_LAYER 8 +#define SUIT_LAYER 9 +#define GLASSES_LAYER 10 +#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt? +#define TAIL_LAYER 12 //bs12 specific. this hack is probably gonna come back to haunt me +#define SUIT_STORE_LAYER 13 +#define BACK_LAYER 14 +#define HAIR_LAYER 15 //TODO: make part of head layer? +#define FACEMASK_LAYER 16 +#define HEAD_LAYER 17 +#define COLLAR_LAYER 18 +#define HANDCUFF_LAYER 19 +#define LEGCUFF_LAYER 20 +#define L_HAND_LAYER 21 +#define R_HAND_LAYER 22 +#define TARGETED_LAYER 23 //BS12: Layer for the target overlay from weapon targeting system +#define FIRE_LAYER 24 //If you're on fire +#define TOTAL_LAYERS 24 + + + +/mob/living/carbon/human + var/list/overlays_standing[TOTAL_LAYERS] + var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed + var/icon/skeleton + + +/mob/living/carbon/human/proc/apply_overlay(cache_index) + var/image/I = overlays_standing[cache_index] + if(I) + overlays += I + +/mob/living/carbon/human/proc/remove_overlay(cache_index) + if(overlays_standing[cache_index]) + overlays -= overlays_standing[cache_index] + overlays_standing[cache_index] = null + +//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING +//this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers +//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date. +/mob/living/carbon/human/update_icons() + + update_hud() //TODO: remove the need for this + + var/stealth = 0 + for(var/obj/item/weapon/cloaking_device/S in list(l_hand,r_hand,belt,l_store,r_store)) + if(S.active) + stealth = 1 + break + + if(stealth) + icon = 'icons/mob/human.dmi' + icon_state = "body_cloaked" + var/image/I = overlays_standing[L_HAND_LAYER] + if(istype(I)) overlays += I + I = overlays_standing[R_HAND_LAYER] + if(istype(I)) overlays += I + else + icon = stand_icon + if(overlays.len != overlays_standing.len) + overlays.Cut() + + for(var/thing in overlays_standing) + if(thing) overlays += thing + + update_transform() + +var/global/list/damage_icon_parts = list() + +//DAMAGE OVERLAYS +//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists +/mob/living/carbon/human/UpdateDamageIcon(var/update_icons=1) + // first check whether something actually changed about damage appearance + var/damage_appearance = "" + + for(var/obj/item/organ/external/O in organs) + if(O.is_stump()) + continue + if(O.status & ORGAN_DESTROYED) damage_appearance += "d" + else + damage_appearance += O.damage_state + + if(damage_appearance == previous_damage_appearance) + // nothing to do here + return + + previous_damage_appearance = damage_appearance + + var/icon/standing = new /icon(species.damage_overlays, "00") + + var/image/standing_image = new /image("icon" = standing) + + // blend the individual damage states with our icons + for(var/obj/item/organ/external/O in organs) + if(O.is_stump()) + continue + if(!(O.status & ORGAN_DESTROYED)) + O.update_icon() + if(O.damage_state == "00") continue + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]" + + if(damage_icon_parts[cache_index] == null) + DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human + DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(species.blood_color, ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] + standing_image.overlays += DI + + overlays_standing[DAMAGE_LAYER] = standing_image + + if(update_icons) update_icons() + +//BASE MOB SPRITE +/mob/living/carbon/human/proc/update_body(var/update_icons=1) + + var/husk_color_mod = rgb(96,88,80) + var/hulk_color_mod = rgb(48,224,40) + + var/husk = (HUSK in src.mutations) + var/fat = (FAT in src.mutations) + var/hulk = (HULK in src.mutations) + var/skeleton = (SKELETON in src.mutations) + + //CACHING: Generate an index key from visible bodyparts. + //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. + //Create a new, blank icon for our mob to use. + if(stand_icon) + qdel(stand_icon) + stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") + var/icon_key = "" + var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) + + if(eyes) + icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" + else + icon_key += "#000000" + + for(var/organ_tag in species.has_limbs) + var/obj/item/organ/external/part = organs_by_name[organ_tag] + if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED)) + icon_key += "0" + else if(part.status & ORGAN_ROBOT) + icon_key += "2[part.model ? "-[part.model]": ""]" + else if(part.status & ORGAN_DEAD) + icon_key += "3" + else + icon_key += "1" + + if(part) + icon_key += "[part.species.race_key]" + icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" + icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]" + if(part.s_col) + icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]" + + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" + + var/icon/base_icon + if(human_icon_cache[icon_key]) + base_icon = human_icon_cache[icon_key] + else + //BEGIN CACHED ICON GENERATION. + var/obj/item/organ/external/chest = get_organ("chest") + base_icon = chest.get_icon() + + for(var/obj/item/organ/external/part in organs) + var/icon/temp = part.get_icon(skeleton) + //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST + //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) + if(part.icon_position&(LEFT|RIGHT)) + var/icon/temp2 = new('icons/mob/human.dmi',"blank") + temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) + temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) + if(!(part.icon_position & LEFT)) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(!(part.icon_position & RIGHT)) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + base_icon.Blend(temp2, ICON_OVERLAY) + if(part.icon_position & LEFT) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(part.icon_position & RIGHT) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + base_icon.Blend(temp2, ICON_UNDERLAY) + else + base_icon.Blend(temp, ICON_OVERLAY) + + if(!skeleton) + if(husk) + base_icon.ColorTone(husk_color_mod) + else if(hulk) + var/list/tone = ReadRGB(hulk_color_mod) + base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) + + //Handle husk overlay. + if(husk && ("overlay_husk" in icon_states(species.icobase))) + var/icon/mask = new(base_icon) + var/icon/husk_over = new(species.icobase,"overlay_husk") + mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) + husk_over.Blend(mask, ICON_ADD) + base_icon.Blend(husk_over, ICON_OVERLAY) + + human_icon_cache[icon_key] = base_icon + + //END CACHED ICON GENERATION. + stand_icon.Blend(base_icon,ICON_OVERLAY) + + //Underwear + if(underwear && species.clothing_flags & HAS_UNDERWEAR) + var/datum/sprite_accessory/underwear/U = underwear_list[underwear] + if(U) + stand_icon.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY) + + if(undershirt && species.clothing_flags & HAS_UNDERSHIRT) + var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt] + if(U2) + stand_icon.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY) + + + if(socks && species.clothing_flags & HAS_SOCKS) + var/datum/sprite_accessory/socks/U3 = socks_list[socks] + if(U3) + stand_icon.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY) + + + if(update_icons) + update_icons() + + if(lip_style && species && species.flags & HAS_LIPS) + var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s") + lips.Blend(lip_color, ICON_ADD) + + stand_icon.Blend(lips, ICON_OVERLAY) + + //tail + update_tail_layer(0) + + +//HAIR OVERLAY +/mob/living/carbon/human/proc/update_hair(var/update_icons=1) + //Reset our hair + overlays_standing[HAIR_LAYER] = null + + var/obj/item/organ/external/head/head_organ = get_organ("head") + if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) ) + if(update_icons) update_icons() + return + + //masks and helmets can obscure our hair, unless we're a synthetic + if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if(update_icons) update_icons() + return + + //base icons + var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") + + if(f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style && facial_hair_style.species_allowed) + if(src.species.name in facial_hair_style.species_allowed) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + face_standing.Blend(facial_s, ICON_OVERLAY) + else + //warning("Invalid f_style for [species.name]: [f_style]") + + if(!get_int_organ(/obj/item/organ/internal/brain)) + face_standing += icon("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained_s") + + if(h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic()))) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style && hair_style.species_allowed) + if(src.species.name in hair_style.species_allowed) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + + face_standing.Blend(hair_s, ICON_OVERLAY) + else + //warning("Invalid h_style for [species.name]: [h_style]") + + overlays_standing[HAIR_LAYER] = image(face_standing) + + if(update_icons) update_icons() + +/mob/living/carbon/human/update_mutations(var/update_icons=1) + var/fat + if(FAT in mutations) + fat = "fat" + + var/image/standing = image("icon" = 'icons/effects/genetics.dmi') + var/add_image = 0 + var/g = "m" + if(gender == FEMALE) g = "f" + // DNA2 - Drawing underlays. + for(var/datum/dna/gene/gene in dna_genes) + if(!gene.block) + continue + if(gene.is_active(src)) + var/underlay=gene.OnDrawUnderlays(src,g,fat) + if(underlay) + standing.underlays += underlay + add_image = 1 + for(var/mut in mutations) + switch(mut) + /* + if(HULK) + if(fat) + standing.underlays += "hulk_[fat]_s" + else + standing.underlays += "hulk_[g]_s" + add_image = 1 + if(RESIST_COLD) + standing.underlays += "fire[fat]_s" + add_image = 1 + if(RESIST_HEAT) + standing.underlays += "cold[fat]_s" + add_image = 1 + if(TK) + standing.underlays += "telekinesishead[fat]_s" + add_image = 1 + */ + if(LASER) + standing.overlays += "lasereyes_s" + add_image = 1 + if((RESIST_COLD in mutations) && (RESIST_HEAT in mutations)) + standing.underlays -= "cold[fat]_s" + standing.underlays -= "fire[fat]_s" + standing.underlays += "coldfire[fat]_s" + if(add_image) + overlays_standing[MUTATIONS_LAYER] = standing + else + overlays_standing[MUTATIONS_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1) +//BS12 EDIT + var/skel = (SKELETON in src.mutations) + if(skel) + skeleton = 'icons/mob/human_races/r_skeleton.dmi' + else + skeleton = null + + update_hair(0) + if(update_icons) update_icons() + +//Call when target overlay should be added/removed +/mob/living/carbon/human/update_targeted(var/update_icons=1) + if (targeted_by && target_locked) + overlays_standing[TARGETED_LAYER] = target_locked + else if (!targeted_by && target_locked) + qdel(target_locked) + if (!targeted_by) + overlays_standing[TARGETED_LAYER] = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_fire() + remove_overlay(FIRE_LAYER) + if(on_fire) + overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite, "layer"=-FIRE_LAYER) + else + overlays_standing[FIRE_LAYER] = null + apply_overlay(FIRE_LAYER) + +/* --------------------------------------- */ +//For legacy support. +/mob/living/carbon/human/regenerate_icons() + ..() + if(notransform) return + update_mutations(0) + update_body(0) + update_hair(0) + update_mutantrace(0) + update_inv_w_uniform(0,0) + update_inv_wear_id(0) + update_inv_gloves(0,0) + update_inv_glasses(0) + update_inv_ears(0) + update_inv_shoes(0,0) + update_inv_s_store(0) + update_inv_wear_mask(0) + update_inv_head(0,0) + update_inv_belt(0) + update_inv_back(0) + update_inv_wear_suit(0) + update_inv_r_hand(0) + update_inv_l_hand(0) + update_inv_handcuffed(0) + update_inv_legcuffed(0) + update_inv_pockets(0) + update_inv_wear_pda(0) + UpdateDamageIcon() + update_icons() + //Hud Stuff + update_hud() + update_fire() +/* --------------------------------------- */ +//vvvvvv UPDATE_INV PROCS vvvvvv + +/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1) + if(w_uniform && istype(w_uniform, /obj/item/clothing/under) ) + w_uniform.screen_loc = ui_iclothing + var/t_color = w_uniform.item_color + if(!t_color) t_color = icon_state + var/image/standing = image("icon_state" = "[t_color]_s") + + if(FAT in mutations) + if(w_uniform.flags&ONESIZEFITSALL) + standing.icon = 'icons/mob/uniform_fat.dmi' + else + src << "\red You burst out of \the [w_uniform]!" + unEquip(w_uniform) + return + else + standing.icon = 'icons/mob/uniform.dmi' + + if(w_uniform.icon_override) + standing.icon = w_uniform.icon_override + else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[species.name]) + standing.icon = w_uniform.sprite_sheets[species.name] + + if(w_uniform.blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood") + bloodsies.color = w_uniform.blood_color + standing.overlays += bloodsies + + if(w_uniform:accessories.len) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE. + for(var/obj/item/clothing/accessory/A in w_uniform:accessories) + var/tie_color = A.item_color + if(!tie_color) tie_color = A.icon_state + standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]") + + overlays_standing[UNIFORM_LAYER] = standing + else + overlays_standing[UNIFORM_LAYER] = null + // Automatically drop anything in store / id / belt if you're not wearing a uniform. //CHECK IF NECESARRY + for( var/obj/item/thing in list(r_store, l_store, wear_id, wear_pda, belt) ) // + if(thing) // + unEquip(thing) // + if (client) // + client.screen -= thing // + // + if (thing) // + thing.loc = loc // + thing.dropped(src) // + thing.layer = initial(thing.layer) + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_wear_id(var/update_icons=1) + if(wear_id) + wear_id.screen_loc = ui_id //TODO + if(w_uniform && w_uniform:displays_id) + overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id") + else + overlays_standing[ID_LAYER] = null + else + overlays_standing[ID_LAYER] = null + + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_gloves(var/update_icons=1) + if(gloves) + var/t_state = gloves.item_state + if(!t_state) t_state = gloves.icon_state + + var/image/standing + if(gloves.icon_override) + standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]") + else if(gloves.sprite_sheets && gloves.sprite_sheets[species.name]) + standing = image("icon" = gloves.sprite_sheets[species.name], "icon_state" = "[t_state]") + else + standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]") + + if(gloves.blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") + bloodsies.color = gloves.blood_color + standing.overlays += bloodsies + gloves.screen_loc = ui_gloves + overlays_standing[GLOVES_LAYER] = standing + else + if(blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands") + bloodsies.color = hand_blood_color + overlays_standing[GLOVES_LAYER] = bloodsies + else + overlays_standing[GLOVES_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_inv_glasses(var/update_icons=1) + if(glasses) + + if(glasses.icon_override) + overlays_standing[GLASSES_LAYER] = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]") + else if(glasses.sprite_sheets && glasses.sprite_sheets[species.name]) + overlays_standing[GLASSES_LAYER]= image("icon" = glasses.sprite_sheets[species.name], "icon_state" = "[glasses.icon_state]") + else + overlays_standing[GLASSES_LAYER]= image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]") + + else + overlays_standing[GLASSES_LAYER] = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_ears(var/update_icons=1) + if(l_ear || r_ear) + if(l_ear) + + var/t_type = l_ear.icon_state + if(l_ear.icon_override) + t_type = "[t_type]_l" + overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon_override, "icon_state" = "[t_type]") + else if(l_ear.sprite_sheets && l_ear.sprite_sheets[species.name]) + t_type = "[t_type]_l" + overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[species.name], "icon_state" = "[t_type]") + else + overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") + + if(r_ear) + + var/t_type = r_ear.icon_state + if(r_ear.icon_override) + t_type = "[t_type]_r" + overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon_override, "icon_state" = "[t_type]") + else if(r_ear.sprite_sheets && r_ear.sprite_sheets[species.name]) + t_type = "[t_type]_r" + overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[species.name], "icon_state" = "[t_type]") + else + overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]") + + else + overlays_standing[EARS_LAYER] = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_shoes(var/update_icons=1) + if(shoes) + + var/image/standing + if(shoes.icon_override) + standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]") + else if(shoes.sprite_sheets && shoes.sprite_sheets[species.name]) + standing = image("icon" = shoes.sprite_sheets[species.name], "icon_state" = "[shoes.icon_state]") + else + standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]") + + + if(shoes.blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") + bloodsies.color = shoes.blood_color + standing.overlays += bloodsies + overlays_standing[SHOES_LAYER] = standing + else + if(feet_blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood") + bloodsies.color = feet_blood_color + overlays_standing[SHOES_LAYER] = bloodsies + else + overlays_standing[SHOES_LAYER] = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_s_store(var/update_icons=1) + if(s_store) + var/t_state = s_store.item_state + if(!t_state) + t_state = s_store.icon_state + var/dmi='icons/mob/belt_mirror.dmi' + overlays_standing[SUIT_STORE_LAYER] = image("icon" = dmi, "icon_state" = "[t_state]") + s_store.screen_loc = ui_sstore1 //TODO + else + overlays_standing[SUIT_STORE_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_inv_head(var/update_icons=1) + if(head) + head.screen_loc = ui_head //TODO + var/image/standing + if(head.icon_override) + standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]") + else if(head.sprite_sheets && head.sprite_sheets[species.name]) + standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]") + else + standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]") + + if(head.blood_DNA) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood") + bloodsies.color = head.blood_color + standing.overlays += bloodsies + overlays_standing[HEAD_LAYER] = standing + + + else + overlays_standing[HEAD_LAYER] = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_belt(var/update_icons=1) + if(belt) + belt.screen_loc = ui_belt //TODO + var/t_state = belt.item_state + if(!t_state) t_state = belt.icon_state + + if(belt.icon_override) + t_state = "[t_state]_be" + overlays_standing[BELT_LAYER] = image("icon" = belt.icon_override, "icon_state" = "[t_state]") + else if(belt.sprite_sheets && belt.sprite_sheets[species.name]) + overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[species.name], "icon_state" = "[t_state]") + else + overlays_standing[BELT_LAYER] = image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[t_state]") + else + overlays_standing[BELT_LAYER] = null + 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/standing + if(wear_suit.icon_override) + standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]") + else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name]) + standing = image("icon" = wear_suit.sprite_sheets[species.name], "icon_state" = "[wear_suit.icon_state]") + else if(FAT in mutations) + if(wear_suit.flags&ONESIZEFITSALL) + standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]") + else + src << "\red You burst out of \the [wear_suit]!" + unEquip(wear_suit) + return + else + standing = image("icon" = 'icons/mob/suit.dmi', "icon_state" = "[wear_suit.icon_state]") + + + if( istype(wear_suit, /obj/item/clothing/suit/straight_jacket) ) + unEquip(handcuffed) + drop_l_hand() + drop_r_hand() + + + if(wear_suit.blood_DNA) + var/obj/item/clothing/suit/S = wear_suit + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood") + bloodsies.color = wear_suit.blood_color + standing.overlays += bloodsies + + + overlays_standing[SUIT_LAYER] = standing + + update_tail_layer(0) + + else + overlays_standing[SUIT_LAYER] = null + + update_tail_layer(0) + + update_collar(0) + + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_pockets(var/update_icons=1) + if(l_store) l_store.screen_loc = ui_storage1 //TODO + if(r_store) r_store.screen_loc = ui_storage2 //TODO + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_wear_pda(var/update_icons=1) + if(wear_pda) wear_pda.screen_loc = ui_pda + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_wear_mask(var/update_icons=1) + if( wear_mask && ( istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory) ) ) + wear_mask.screen_loc = ui_mask //TODO + + var/image/standing + if(wear_mask.icon_override) + standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]") + else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name]) + standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]") + else + standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]") + + if( !istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA ) + var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood") + bloodsies.color = wear_mask.blood_color + standing.overlays += bloodsies + overlays_standing[FACEMASK_LAYER] = standing + else + overlays_standing[FACEMASK_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_inv_back(var/update_icons=1) + if(back) + back.screen_loc = ui_back //TODO + + //determine the icon to use + var/icon/overlay_icon + if(back.icon_override) + overlay_icon = back.icon_override + else if(istype(back, /obj/item/weapon/rig)) + //If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc. + var/obj/item/weapon/rig/rig = back + overlay_icon = rig.mob_icon + else if(back.sprite_sheets && back.sprite_sheets[species.name]) + overlay_icon = back.sprite_sheets[species.name] + else + overlay_icon = icon('icons/mob/back.dmi', "[back.icon_state]") + + //determine state to use + var/overlay_state + if(back.item_state) + overlay_state = back.item_state + else + overlay_state = back.icon_state + + //create the image + overlays_standing[BACK_LAYER] = image(icon = overlay_icon, icon_state = overlay_state) + else + overlays_standing[BACK_LAYER] = null + + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_hud() //TODO: do away with this if possible + if(client) + client.screen |= contents + if(hud_used) + hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar + + +/mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1) + if(handcuffed) + drop_r_hand() + drop_l_hand() + stop_pulling() //TODO: should be handled elsewhere + if(hud_used) //hud handcuff icons + var/obj/screen/inventory/R = hud_used.adding[7] + var/obj/screen/inventory/L = hud_used.adding[8] + R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus") + L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle") + if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/pinkcuffs)) + overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1") + else + overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1") + else + overlays_standing[HANDCUFF_LAYER] = null + if(hud_used) + var/obj/screen/inventory/R = hud_used.adding[7] + var/obj/screen/inventory/L = hud_used.adding[8] + R.overlays = null + L.overlays = null + if(update_icons) update_icons() + +/mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1) + if(legcuffed) + overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1") + if(src.m_intent != "walk") + src.m_intent = "walk" + if(src.hud_used && src.hud_used.move_intent) + src.hud_used.move_intent.icon_state = "walking" + + else + overlays_standing[LEGCUFF_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_inv_r_hand(var/update_icons=1) + if(r_hand) + r_hand.screen_loc = ui_rhand //TODO + var/t_state = r_hand.item_state + if(!t_state) t_state = r_hand.icon_state + + var/image/I = image("icon" = r_hand.righthand_file, "icon_state"="[t_state]") + I = center_image(I, r_hand.inhand_x_dimension, r_hand.inhand_y_dimension) + overlays_standing[R_HAND_LAYER] = I + + if (handcuffed) drop_r_hand() + else + overlays_standing[R_HAND_LAYER] = null + if(update_icons) update_icons() + + +/mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) + if(l_hand) + l_hand.screen_loc = ui_lhand //TODO + var/t_state = l_hand.item_state + if(!t_state) t_state = l_hand.icon_state + + var/image/I = image("icon" = l_hand.lefthand_file, "icon_state"="[t_state]") + I = center_image(I, l_hand.inhand_x_dimension, l_hand.inhand_y_dimension) + overlays_standing[L_HAND_LAYER] = I + + if (handcuffed) drop_l_hand() + else + overlays_standing[L_HAND_LAYER] = null + if(update_icons) update_icons() + + + +/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1) + overlays_standing[TAIL_LAYER] = null + + if(body_accessory) + if(body_accessory.try_restrictions(src)) + var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state) + accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + + + else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran + if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) + var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") + tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + overlays_standing[TAIL_LAYER] = image(tail_s) + + if(update_icons) + update_icons() + + +/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1) + overlays_standing[TAIL_LAYER] = null + + if(body_accessory) + var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state()) + accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode) + + overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset) + + else if(species.tail && species.bodyflags & HAS_TAIL) + var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s") + tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + overlays_standing[TAIL_LAYER] = image(tailw_s) + + if(update_icons) + update_icons() + +/mob/living/carbon/human/proc/stop_tail_wagging(var/update_icons=1) + overlays_standing[TAIL_LAYER] = null + + update_tail_layer(update_icons) //just trigger a full update for normal stationary sprites + +/mob/living/carbon/human/handle_transform_change() + ..() + update_tail_layer() + +//Adds a collar overlay above the helmet layer if the suit has one +// Suit needs an identically named sprite in icons/mob/collar.dmi +/mob/living/carbon/human/proc/update_collar(var/update_icons=1) + var/icon/C = new('icons/mob/collar.dmi') + var/image/standing = null + + if(wear_suit) + if(wear_suit.icon_state in C.IconStates()) + standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]") + + overlays_standing[COLLAR_LAYER] = standing + + if(update_icons) update_icons() + + +// Used mostly for creating head items +/mob/living/carbon/human/proc/generate_head_icon() +//gender no longer matters for the mouth, although there should probably be seperate base head icons. +// var/g = "m" +// if (gender == FEMALE) g = "f" + + //base icons + var/icon/face_lying = new /icon('icons/mob/human_face.dmi',"bald_l") + + if(f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style) + var/icon/facial_l = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_l") + facial_l.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + face_lying.Blend(facial_l, ICON_OVERLAY) + + if(h_style) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style) + var/icon/hair_l = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_l") + hair_l.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + face_lying.Blend(hair_l, ICON_OVERLAY) + + //Eyes + // Note: These used to be in update_face(), and the fact they're here will make it difficult to create a disembodied head + var/icon/eyes_l = new/icon('icons/mob/human_face.dmi', "eyes_l") + eyes_l.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + face_lying.Blend(eyes_l, ICON_OVERLAY) + + if(lip_style) + face_lying.Blend(new/icon('icons/mob/human_face.dmi', "lips_[lip_style]_l"), ICON_OVERLAY) + + var/image/face_lying_image = new /image(icon = face_lying) + return face_lying_image + +/mob/living/carbon/human/proc/force_update_limbs() + for(var/obj/item/organ/external/O in organs) + O.sync_colour_to_human(src) + update_body(0) + +//Human Overlays Indexes///////// +#undef MUTANTRACE_LAYER +#undef MUTATIONS_LAYER +#undef DAMAGE_LAYER +#undef UNIFORM_LAYER +#undef TAIL_LAYER +#undef ID_LAYER +#undef SHOES_LAYER +#undef GLOVES_LAYER +#undef EARS_LAYER +#undef SUIT_LAYER +#undef GLASSES_LAYER +#undef FACEMASK_LAYER +#undef BELT_LAYER +#undef SUIT_STORE_LAYER +#undef BACK_LAYER +#undef HAIR_LAYER +#undef HEAD_LAYER +#undef COLLAR_LAYER +#undef HANDCUFF_LAYER +#undef LEGCUFF_LAYER +#undef L_HAND_LAYER +#undef R_HAND_LAYER +#undef TARGETED_LAYER +#undef FIRE_LAYER +#undef TOTAL_LAYERS diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index ffecceda82e351b6fc7e920597c14640c1e9d9b3..1fa0f5c3a222aaeb0fe4488105a2cd164a8597e1 100644 GIT binary patch delta 14967 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 delta 15315 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