From ba87398eeac1bed6f7ed9fb4bcdd51210ce5f443 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Fri, 15 Jan 2016 07:11:28 -0500 Subject: [PATCH] conflict fixes --- .../mob/living/carbon/human/update_icons.dm | 1080 +---------------- icons/mob/human_face.dmi | Bin 78637 -> 79068 bytes 2 files changed, 35 insertions(+), 1045 deletions(-) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index b768039ac29..e22ad5e66dc 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,1045 +1,35 @@ -/* - 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 +//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 diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 1fa0f5c3a222aaeb0fe4488105a2cd164a8597e1..ffecceda82e351b6fc7e920597c14640c1e9d9b3 100644 GIT binary patch delta 15315 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 delta 14967 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