730 lines
26 KiB
Plaintext
730 lines
26 KiB
Plaintext
///////////////////////
|
|
//UPDATE_ICONS SYSTEM//
|
|
///////////////////////
|
|
/* Keep these comments up-to-date if you -insist- on hurting my code-baby ;_;
|
|
This system allows you to update individual mob-overlays, without regenerating them all each time.
|
|
When we generate overlays we generate the standing version and then rotate the mob as necessary..
|
|
|
|
As of the time of writing there are 20 layers within this list. Please try to keep this from increasing. //22 and counting, good job guys
|
|
var/overlays_standing[20] //For the standing stance
|
|
|
|
Most of the time we only wish to update one overlay:
|
|
e.g. - we dropped the fireaxe out of our left hand and need to remove its icon from our mob
|
|
e.g.2 - our hair colour has changed, so we need to update our hair icons on our mob
|
|
In these cases, instead of updating every overlay using the old behaviour (regenerate_icons), we instead call
|
|
the appropriate update_X proc.
|
|
e.g. - update_l_hand()
|
|
e.g.2 - update_hair()
|
|
|
|
Note: Recent changes by aranclanos+carn:
|
|
update_icons() no longer needs to be called.
|
|
the system is easier to use. update_icons() should not be called unless you absolutely -know- you need it.
|
|
IN ALL OTHER CASES it's better to just call the specific update_X procs.
|
|
|
|
Note: The defines for layer numbers is now kept exclusvely in __DEFINES/misc.dm instead of being defined there,
|
|
then redefined and undefiend everywhere else. If you need to change the layering of sprites (or add a new layer)
|
|
that's where you should start.
|
|
|
|
All of this means that this code is more maintainable, faster and still fairly easy to use.
|
|
|
|
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), rather than using the helper procs)
|
|
You will need to call the relevant update_inv_* proc
|
|
|
|
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_damage_overlays() //handles damage overlays for brute/burn damage
|
|
update_body() //Handles updating your mob's body layer and mutant bodyparts
|
|
as well as sprite-accessories that didn't really fit elsewhere (underwear, undershirts, socks, lips, eyes)
|
|
//NOTE: update_mutantrace() is now merged into this!
|
|
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
|
|
eyes were merged into update_body())
|
|
|
|
|
|
*/
|
|
|
|
//HAIR OVERLAY
|
|
/mob/living/carbon/human/update_hair()
|
|
dna.species.handle_hair(src)
|
|
|
|
//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body.
|
|
/mob/living/carbon/human/proc/update_mutant_bodyparts()
|
|
dna.species.handle_mutant_bodyparts(src)
|
|
|
|
|
|
/mob/living/carbon/human/update_body()
|
|
remove_overlay(BODY_LAYER)
|
|
dna.species.handle_body(src)
|
|
..()
|
|
|
|
/mob/living/carbon/human/update_fire()
|
|
..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning")
|
|
|
|
|
|
/* --------------------------------------- */
|
|
//For legacy support.
|
|
/mob/living/carbon/human/regenerate_icons()
|
|
|
|
if(!..())
|
|
icon_render_key = null //invalidate bodyparts cache
|
|
update_body()
|
|
update_hair()
|
|
update_inv_w_uniform()
|
|
update_inv_wear_id()
|
|
update_inv_gloves()
|
|
update_inv_glasses()
|
|
update_inv_ears()
|
|
update_inv_shoes()
|
|
update_inv_s_store()
|
|
update_inv_wear_mask()
|
|
update_inv_head()
|
|
update_inv_belt()
|
|
update_inv_back()
|
|
update_inv_wear_suit()
|
|
update_inv_pockets()
|
|
update_inv_neck()
|
|
update_transform()
|
|
//mutations
|
|
update_mutations_overlay()
|
|
//damage overlays
|
|
update_damage_overlays()
|
|
|
|
/* --------------------------------------- */
|
|
//vvvvvv UPDATE_INV PROCS vvvvvv
|
|
|
|
/mob/living/carbon/human/update_inv_w_uniform()
|
|
remove_overlay(UNIFORM_LAYER)
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM]
|
|
inv.update_icon()
|
|
|
|
if(istype(w_uniform, /obj/item/clothing/under))
|
|
var/obj/item/clothing/under/U = w_uniform
|
|
U.screen_loc = ui_iclothing
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += w_uniform
|
|
update_observer_view(w_uniform,1)
|
|
|
|
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT))
|
|
return
|
|
|
|
|
|
var/t_color = U.item_color
|
|
if(!t_color)
|
|
t_color = U.icon_state
|
|
if(U.suit_style == NORMAL_SUIT_STYLE)
|
|
if(U.adjusted == ALT_STYLE)
|
|
t_color = "[t_color]_d"
|
|
|
|
var/alt_worn = U.alternate_worn_icon
|
|
|
|
if(!U.force_alternate_icon && U.mutantrace_variation && U.suit_style == DIGITIGRADE_SUIT_STYLE)
|
|
alt_worn = 'modular_citadel/icons/mob/uniform_digi.dmi'
|
|
|
|
var/mutable_appearance/uniform_overlay
|
|
|
|
if(dna && dna.species.sexes)
|
|
var/G = (gender == FEMALE) ? "f" : "m"
|
|
if(G == "f" && U.fitted != NO_FEMALE_UNIFORM)
|
|
uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE, femaleuniform = U.fitted)
|
|
|
|
if(!uniform_overlay)
|
|
uniform_overlay = U.build_worn_icon(state = "[t_color]", default_layer = UNIFORM_LAYER, default_icon_file = (alt_worn ? alt_worn : 'icons/mob/uniform.dmi'), isinhands = FALSE)
|
|
|
|
|
|
if(OFFSET_UNIFORM in dna.species.offset_features)
|
|
uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1]
|
|
uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2]
|
|
overlays_standing[UNIFORM_LAYER] = uniform_overlay
|
|
|
|
apply_overlay(UNIFORM_LAYER)
|
|
update_mutant_bodyparts()
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_wear_id()
|
|
remove_overlay(ID_LAYER)
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID]
|
|
inv.update_icon()
|
|
|
|
var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER]
|
|
|
|
if(wear_id)
|
|
wear_id.screen_loc = ui_id
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
client.screen += wear_id
|
|
update_observer_view(wear_id)
|
|
|
|
//TODO: add an icon file for ID slot stuff, so it's less snowflakey
|
|
id_overlay = wear_id.build_worn_icon(state = wear_id.item_state, default_layer = ID_LAYER, default_icon_file = ((wear_id.alternate_worn_icon) ? wear_id.alternate_worn_icon : 'icons/mob/mob.dmi'))
|
|
if(OFFSET_ID in dna.species.offset_features)
|
|
id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1]
|
|
id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2]
|
|
overlays_standing[ID_LAYER] = id_overlay
|
|
apply_overlay(ID_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_gloves()
|
|
remove_overlay(GLOVES_LAYER)
|
|
|
|
if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES])
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES]
|
|
inv.update_icon()
|
|
|
|
if(!gloves && bloody_hands)
|
|
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
|
|
if(get_num_arms() < 2)
|
|
if(has_left_hand())
|
|
bloody_overlay.icon_state = "bloodyhands_left"
|
|
else if(has_right_hand())
|
|
bloody_overlay.icon_state = "bloodyhands_right"
|
|
|
|
overlays_standing[GLOVES_LAYER] = bloody_overlay
|
|
|
|
var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER]
|
|
if(gloves)
|
|
gloves.screen_loc = ui_gloves
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += gloves
|
|
update_observer_view(gloves,1)
|
|
var/t_state = gloves.item_state
|
|
if(!t_state)
|
|
t_state = gloves.icon_state
|
|
overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(state = t_state, default_layer = GLOVES_LAYER, default_icon_file = ((gloves.alternate_worn_icon) ? gloves.alternate_worn_icon : 'icons/mob/hands.dmi'))
|
|
gloves_overlay = overlays_standing[GLOVES_LAYER]
|
|
if(OFFSET_GLOVES in dna.species.offset_features)
|
|
gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1]
|
|
gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2]
|
|
overlays_standing[GLOVES_LAYER] = gloves_overlay
|
|
apply_overlay(GLOVES_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_glasses()
|
|
remove_overlay(GLASSES_LAYER)
|
|
|
|
if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
|
|
return
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES]
|
|
inv.update_icon()
|
|
|
|
if(glasses)
|
|
glasses.screen_loc = ui_glasses //...draw the item in the inventory screen
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown) //if the inventory is open ...
|
|
client.screen += glasses //Either way, add the item to the HUD
|
|
update_observer_view(glasses,1)
|
|
if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES)))
|
|
overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(state = glasses.icon_state, default_layer = GLASSES_LAYER, default_icon_file = ((glasses.alternate_worn_icon) ? glasses.alternate_worn_icon : 'icons/mob/eyes.dmi'))
|
|
var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER]
|
|
if(glasses_overlay)
|
|
if(OFFSET_GLASSES in dna.species.offset_features)
|
|
glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1]
|
|
glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2]
|
|
overlays_standing[GLASSES_LAYER] = glasses_overlay
|
|
apply_overlay(GLASSES_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_ears()
|
|
remove_overlay(EARS_LAYER)
|
|
|
|
if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated
|
|
return
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS]
|
|
inv.update_icon()
|
|
|
|
if(ears)
|
|
ears.screen_loc = ui_ears //move the item to the appropriate screen loc
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown) //if the inventory is open
|
|
client.screen += ears //add it to the client's screen
|
|
update_observer_view(ears,1)
|
|
|
|
overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = ((ears.alternate_worn_icon) ? ears.alternate_worn_icon : 'icons/mob/ears.dmi'))
|
|
var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
|
|
if(OFFSET_EARS in dna.species.offset_features)
|
|
ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1]
|
|
ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2]
|
|
overlays_standing[EARS_LAYER] = ears_overlay
|
|
apply_overlay(EARS_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_shoes()
|
|
remove_overlay(SHOES_LAYER)
|
|
|
|
if(get_num_legs() <2)
|
|
return
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES]
|
|
inv.update_icon()
|
|
|
|
if(shoes)
|
|
var/obj/item/clothing/shoes/S = shoes
|
|
shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown) //if the inventory is open
|
|
client.screen += shoes //add it to client's screen
|
|
update_observer_view(shoes,1)
|
|
if(S.mutantrace_variation)
|
|
if(S.adjusted == ALT_STYLE)
|
|
S.alternate_worn_icon = 'modular_citadel/icons/mob/digishoes.dmi'
|
|
else
|
|
S.alternate_worn_icon = null
|
|
var/t_state = shoes.item_state
|
|
if (!t_state)
|
|
t_state = shoes.icon_state
|
|
overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(state = t_state, default_layer = SHOES_LAYER, default_icon_file = ((shoes.alternate_worn_icon) ? shoes.alternate_worn_icon : 'icons/mob/feet.dmi'))
|
|
var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER]
|
|
if(OFFSET_SHOES in dna.species.offset_features)
|
|
shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1]
|
|
shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2]
|
|
overlays_standing[SHOES_LAYER] = shoes_overlay
|
|
apply_overlay(SHOES_LAYER)
|
|
|
|
/mob/living/carbon/human/update_inv_s_store()
|
|
remove_overlay(SUIT_STORE_LAYER)
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE]
|
|
inv.update_icon()
|
|
|
|
if(s_store)
|
|
s_store.screen_loc = ui_sstore1
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
client.screen += s_store
|
|
update_observer_view(s_store)
|
|
var/t_state = s_store.item_state
|
|
if(!t_state)
|
|
t_state = s_store.icon_state
|
|
overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.alternate_worn_icon) ? s_store.alternate_worn_icon : 'icons/mob/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER)
|
|
var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_LAYER]
|
|
if(OFFSET_S_STORE in dna.species.offset_features)
|
|
s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1]
|
|
s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2]
|
|
overlays_standing[SUIT_STORE_LAYER] = s_store_overlay
|
|
apply_overlay(SUIT_STORE_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_head()
|
|
..()
|
|
update_mutant_bodyparts()
|
|
if(head)
|
|
remove_overlay(HEAD_LAYER)
|
|
var/obj/item/clothing/head/H = head
|
|
if(H.mutantrace_variation)
|
|
if(H.muzzle_var == ALT_STYLE)
|
|
H.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_helmet.dmi'
|
|
else
|
|
H.alternate_worn_icon = null
|
|
|
|
overlays_standing[HEAD_LAYER] = H.build_worn_icon(state = H.icon_state, default_layer = HEAD_LAYER, default_icon_file = ((head.alternate_worn_icon) ? H.alternate_worn_icon : 'icons/mob/head.dmi'))
|
|
var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER]
|
|
|
|
if(OFFSET_HEAD in dna.species.offset_features)
|
|
head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1]
|
|
head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2]
|
|
overlays_standing[HEAD_LAYER] = head_overlay
|
|
apply_overlay(HEAD_LAYER)
|
|
|
|
/mob/living/carbon/human/update_inv_belt()
|
|
remove_overlay(BELT_LAYER)
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT]
|
|
inv.update_icon()
|
|
|
|
if(belt)
|
|
belt.screen_loc = ui_belt
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
client.screen += belt
|
|
update_observer_view(belt)
|
|
|
|
var/t_state = belt.item_state
|
|
if(!t_state)
|
|
t_state = belt.icon_state
|
|
|
|
overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = ((belt.alternate_worn_icon) ? belt.alternate_worn_icon : 'icons/mob/belt.dmi'))
|
|
var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
|
|
if(OFFSET_BELT in dna.species.offset_features)
|
|
belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1]
|
|
belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2]
|
|
overlays_standing[BELT_LAYER] = belt_overlay
|
|
apply_overlay(BELT_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_wear_suit()
|
|
remove_overlay(SUIT_LAYER)
|
|
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT]
|
|
inv.update_icon()
|
|
|
|
if(wear_suit)
|
|
var/obj/item/clothing/suit/S = wear_suit
|
|
var/no_taur_thanks = FALSE
|
|
if(!istype(S))
|
|
no_taur_thanks = TRUE
|
|
wear_suit.screen_loc = ui_oclothing
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += wear_suit
|
|
update_observer_view(wear_suit,1)
|
|
|
|
if(!S.force_alternate_icon)
|
|
if(!no_taur_thanks && S.mutantrace_variation) //Just make sure we've got this checked too
|
|
if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE) //are we not a taur, but we have Digitigrade legs? Run this check first, then.
|
|
S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi'
|
|
else
|
|
S.alternate_worn_icon = null
|
|
|
|
if(S.tauric == TRUE) //Are we a suit with tauric mode possible?
|
|
if(S.taurmode == SNEK_TAURIC)
|
|
S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_naga.dmi'
|
|
if(S.taurmode == PAW_TAURIC)
|
|
S.alternate_worn_icon = 'modular_citadel/icons/mob/taur_canine.dmi'
|
|
if(S.taurmode == NOT_TAURIC && S.adjusted == ALT_STYLE)
|
|
S.alternate_worn_icon = 'modular_citadel/icons/mob/suit_digi.dmi'
|
|
else if(S.taurmode == NOT_TAURIC && S.adjusted == NORMAL_STYLE)
|
|
S.alternate_worn_icon = null
|
|
|
|
overlays_standing[SUIT_LAYER] = S.build_worn_icon(state = wear_suit.icon_state, default_layer = SUIT_LAYER, default_icon_file = ((wear_suit.alternate_worn_icon) ? S.alternate_worn_icon : 'icons/mob/suit.dmi'))
|
|
var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER]
|
|
if(OFFSET_SUIT in dna.species.offset_features)
|
|
suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1]
|
|
suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2]
|
|
if(!no_taur_thanks && S.center)
|
|
suit_overlay = center_image(suit_overlay, S.dimension_x, S.dimension_y)
|
|
overlays_standing[SUIT_LAYER] = suit_overlay
|
|
update_hair()
|
|
update_mutant_bodyparts()
|
|
|
|
apply_overlay(SUIT_LAYER)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_pockets()
|
|
if(client && hud_used)
|
|
var/obj/screen/inventory/inv
|
|
|
|
inv = hud_used.inv_slots[SLOT_L_STORE]
|
|
inv.update_icon()
|
|
|
|
inv = hud_used.inv_slots[SLOT_R_STORE]
|
|
inv.update_icon()
|
|
|
|
if(l_store)
|
|
l_store.screen_loc = ui_storage1
|
|
if(hud_used.hud_shown)
|
|
client.screen += l_store
|
|
update_observer_view(l_store)
|
|
|
|
if(r_store)
|
|
r_store.screen_loc = ui_storage2
|
|
if(hud_used.hud_shown)
|
|
client.screen += r_store
|
|
update_observer_view(r_store)
|
|
|
|
|
|
/mob/living/carbon/human/update_inv_wear_mask()
|
|
..()
|
|
if(wear_mask)
|
|
var/obj/item/clothing/mask/M = wear_mask
|
|
remove_overlay(FACEMASK_LAYER)
|
|
if(M.mutantrace_variation)
|
|
if(M.muzzle_var == ALT_STYLE)
|
|
M.alternate_worn_icon = 'modular_citadel/icons/mob/muzzled_mask.dmi'
|
|
else
|
|
M.alternate_worn_icon = null
|
|
|
|
overlays_standing[FACEMASK_LAYER] = M.build_worn_icon(state = wear_mask.icon_state, default_layer = FACEMASK_LAYER, default_icon_file = ((wear_mask.alternate_worn_icon) ? M.alternate_worn_icon : 'icons/mob/mask.dmi'))
|
|
var/mutable_appearance/mask_overlay = overlays_standing[FACEMASK_LAYER]
|
|
|
|
if(OFFSET_FACEMASK in dna.species.offset_features)
|
|
mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1]
|
|
mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2]
|
|
overlays_standing[FACEMASK_LAYER] = mask_overlay
|
|
apply_overlay(FACEMASK_LAYER)
|
|
update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout
|
|
|
|
/mob/living/carbon/human/update_inv_back()
|
|
..()
|
|
var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
|
|
if(back_overlay)
|
|
remove_overlay(BACK_LAYER)
|
|
if(OFFSET_BACK in dna.species.offset_features)
|
|
back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1]
|
|
back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2]
|
|
overlays_standing[BACK_LAYER] = back_overlay
|
|
apply_overlay(BACK_LAYER)
|
|
|
|
/proc/wear_female_version(t_color, icon, layer, type)
|
|
var/index = t_color
|
|
var/icon/female_clothing_icon = GLOB.female_clothing_icons[index]
|
|
if(!female_clothing_icon) //Create standing/laying icons if they don't exist
|
|
generate_female_clothing(index,t_color,icon,type)
|
|
return mutable_appearance(GLOB.female_clothing_icons[t_color], layer = -layer)
|
|
|
|
/mob/living/carbon/human/proc/get_overlays_copy(list/unwantedLayers)
|
|
var/list/out = new
|
|
for(var/i in 1 to TOTAL_LAYERS)
|
|
if(overlays_standing[i])
|
|
if(i in unwantedLayers)
|
|
continue
|
|
out += overlays_standing[i]
|
|
return out
|
|
|
|
//human HUD updates for items in our inventory
|
|
|
|
//update whether our head item appears on our hud.
|
|
/mob/living/carbon/human/update_hud_head(obj/item/I)
|
|
I.screen_loc = ui_head
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += I
|
|
update_observer_view(I,1)
|
|
|
|
//update whether our mask item appears on our hud.
|
|
/mob/living/carbon/human/update_hud_wear_mask(obj/item/I)
|
|
I.screen_loc = ui_mask
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += I
|
|
update_observer_view(I,1)
|
|
|
|
//update whether our neck item appears on our hud.
|
|
/mob/living/carbon/human/update_hud_neck(obj/item/I)
|
|
I.screen_loc = ui_neck
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
if(hud_used.inventory_shown)
|
|
client.screen += I
|
|
update_observer_view(I,1)
|
|
|
|
//update whether our back item appears on our hud.
|
|
/mob/living/carbon/human/update_hud_back(obj/item/I)
|
|
I.screen_loc = ui_back
|
|
if(client && hud_used && hud_used.hud_shown)
|
|
client.screen += I
|
|
update_observer_view(I)
|
|
|
|
|
|
|
|
|
|
/*
|
|
Does everything in relation to building the /mutable_appearance used in the mob's overlays list
|
|
covers:
|
|
inhands and any other form of worn item
|
|
centering large appearances
|
|
layering appearances on custom layers
|
|
building appearances from custom icon files
|
|
|
|
By Remie Richards (yes I'm taking credit because this just removed 90% of the copypaste in update_icons())
|
|
|
|
state: A string to use as the state, this is FAR too complex to solve in this proc thanks to shitty old code
|
|
so it's specified as an argument instead.
|
|
|
|
default_layer: The layer to draw this on if no other layer is specified
|
|
|
|
default_icon_file: The icon file to draw states from if no other icon file is specified
|
|
|
|
isinhands: If true then alternate_worn_icon is skipped so that default_icon_file is used,
|
|
in this situation default_icon_file is expected to match either the lefthand_ or righthand_ file var
|
|
|
|
femalueuniform: A value matching a uniform item's fitted var, if this is anything but NO_FEMALE_UNIFORM, we
|
|
generate/load female uniform sprites matching all previously decided variables
|
|
|
|
|
|
*/
|
|
/obj/item/proc/build_worn_icon(var/state = "", var/default_layer = 0, var/default_icon_file = null, var/isinhands = FALSE, var/femaleuniform = NO_FEMALE_UNIFORM)
|
|
|
|
//Find a valid icon file from variables+arguments
|
|
var/file2use
|
|
if(!isinhands && alternate_worn_icon)
|
|
file2use = alternate_worn_icon
|
|
if(!file2use)
|
|
file2use = default_icon_file
|
|
|
|
//Find a valid layer from variables+arguments
|
|
var/layer2use
|
|
if(alternate_worn_layer)
|
|
layer2use = alternate_worn_layer
|
|
if(!layer2use)
|
|
layer2use = default_layer
|
|
|
|
var/mutable_appearance/standing
|
|
if(femaleuniform)
|
|
standing = wear_female_version(state,file2use,layer2use,femaleuniform)
|
|
if(!standing)
|
|
standing = mutable_appearance(file2use, state, -layer2use)
|
|
|
|
//Get the overlays for this item when it's being worn
|
|
//eg: ammo counters, primed grenade flashes, etc.
|
|
var/list/worn_overlays = worn_overlays(isinhands, file2use)
|
|
if(worn_overlays && worn_overlays.len)
|
|
standing.overlays.Add(worn_overlays)
|
|
|
|
standing = center_image(standing, isinhands ? inhand_x_dimension : worn_x_dimension, isinhands ? inhand_y_dimension : worn_y_dimension)
|
|
|
|
//Handle held offsets
|
|
var/mob/M = loc
|
|
if(istype(M))
|
|
var/list/L = get_held_offsets()
|
|
if(L)
|
|
standing.pixel_x += L["x"] //+= because of center()ing
|
|
standing.pixel_y += L["y"]
|
|
|
|
standing.alpha = alpha
|
|
standing.color = color
|
|
|
|
return standing
|
|
|
|
|
|
/obj/item/proc/get_held_offsets()
|
|
var/list/L
|
|
if(ismob(loc))
|
|
var/mob/M = loc
|
|
L = M.get_item_offsets_for_index(M.get_held_index_of_item(src))
|
|
return L
|
|
|
|
|
|
//Can't think of a better way to do this, sadly
|
|
/mob/proc/get_item_offsets_for_index(i)
|
|
switch(i)
|
|
if(3) //odd = left hands
|
|
return list("x" = 0, "y" = 16)
|
|
if(4) //even = right hands
|
|
return list("x" = 0, "y" = 16)
|
|
else //No offsets or Unwritten number of hands
|
|
return list("x" = 0, "y" = 0)
|
|
|
|
|
|
|
|
//produces a key based on the human's limbs
|
|
/mob/living/carbon/human/generate_icon_render_key()
|
|
. = "[dna.species.limbs_id]"
|
|
|
|
if(dna.check_mutation(HULK))
|
|
. += "-coloured-hulk"
|
|
else if(dna.species.use_skintones)
|
|
. += "-coloured-[skin_tone]"
|
|
else if(dna.species.fixed_mut_color)
|
|
. += "-coloured-[dna.species.fixed_mut_color]"
|
|
else if(dna.features["mcolor"])
|
|
. += "-coloured-[dna.features["mcolor"]]-[dna.features["mcolor2"]]-[dna.features["mcolor3"]]"
|
|
else
|
|
. += "-not_coloured"
|
|
|
|
. += "-[gender]"
|
|
|
|
|
|
var/is_taur = FALSE
|
|
var/mob/living/carbon/human/H = src
|
|
if(("taur" in H.dna.species.mutant_bodyparts) && (H.dna.features["taur"] != "None"))
|
|
is_taur = TRUE
|
|
|
|
|
|
for(var/X in bodyparts)
|
|
var/obj/item/bodypart/BP = X
|
|
|
|
if(istype(BP, /obj/item/bodypart/r_leg) || istype(BP, /obj/item/bodypart/l_leg))
|
|
if(is_taur)
|
|
continue
|
|
|
|
|
|
. += "-[BP.body_zone]"
|
|
if(BP.status == BODYPART_ORGANIC)
|
|
. += "-organic"
|
|
else
|
|
. += "-robotic"
|
|
if(BP.use_digitigrade)
|
|
. += "-digitigrade[BP.use_digitigrade]"
|
|
if(BP.dmg_overlay_type)
|
|
. += "-[BP.dmg_overlay_type]"
|
|
if(BP.body_markings)
|
|
. += "-[BP.body_markings]"
|
|
else
|
|
. += "-no_marking"
|
|
|
|
if(HAS_TRAIT(src, TRAIT_HUSK))
|
|
. += "-husk"
|
|
|
|
/mob/living/carbon/human/load_limb_from_cache()
|
|
..()
|
|
update_hair()
|
|
|
|
|
|
|
|
/mob/living/carbon/human/proc/update_observer_view(obj/item/I, inventory)
|
|
if(observers && observers.len)
|
|
for(var/M in observers)
|
|
var/mob/dead/observe = M
|
|
if(observe.client && observe.client.eye == src)
|
|
if(observe.hud_used)
|
|
if(inventory && !observe.hud_used.inventory_shown)
|
|
continue
|
|
observe.client.screen += I
|
|
else
|
|
observers -= observe
|
|
if(!observers.len)
|
|
observers = null
|
|
break
|
|
|
|
// Only renders the head of the human
|
|
/mob/living/carbon/human/proc/update_body_parts_head_only()
|
|
if (!dna)
|
|
return
|
|
|
|
if (!dna.species)
|
|
return
|
|
|
|
var/obj/item/bodypart/HD = get_bodypart("head")
|
|
|
|
if (!istype(HD))
|
|
return
|
|
|
|
HD.update_limb()
|
|
|
|
add_overlay(HD.get_limb_icon())
|
|
update_damage_overlays()
|
|
|
|
if(HD && !(HAS_TRAIT(src, TRAIT_HUSK)))
|
|
// lipstick
|
|
if(lip_style && (LIPS in dna.species.species_traits))
|
|
var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER)
|
|
lip_overlay.color = lip_color
|
|
if(OFFSET_LIPS in dna.species.offset_features)
|
|
lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1]
|
|
lip_overlay.pixel_y += dna.species.offset_features[OFFSET_LIPS][2]
|
|
add_overlay(lip_overlay)
|
|
|
|
// eyes
|
|
if(!(NOEYES in dna.species.species_traits))
|
|
var/has_eyes = getorganslot(ORGAN_SLOT_EYES)
|
|
var/mutable_appearance/eye_overlay
|
|
if(!has_eyes)
|
|
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
|
|
else
|
|
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
|
|
if((EYECOLOR in dna.species.species_traits) && has_eyes)
|
|
eye_overlay.color = "#" + eye_color
|
|
if(OFFSET_EYES in dna.species.offset_features)
|
|
eye_overlay.pixel_x += dna.species.offset_features[OFFSET_EYES][1]
|
|
eye_overlay.pixel_y += dna.species.offset_features[OFFSET_EYES][2]
|
|
add_overlay(eye_overlay)
|
|
|
|
dna.species.handle_hair(src)
|
|
|
|
update_inv_head()
|
|
update_inv_wear_mask()
|