From ae6faabd8acb6e21839c6c2a5fcc387080f39fae Mon Sep 17 00:00:00 2001 From: Ricotez Date: Wed, 23 Mar 2016 20:41:36 +0100 Subject: [PATCH] Brighter ghost hair and new preferences. +Ghost hair is now brighter than before. +Added a new preference ghost_accs that stores what you want your own ghost to display. +Added a new preference ghost_others that stores what you want other people's ghosts to display. --- code/__DEFINES/misc.dm | 25 ++++ code/_globalvars/lists/flavor_misc.dm | 4 + code/modules/client/preferences.dm | 43 +++++++ code/modules/client/preferences_savefile.dm | 8 +- code/modules/client/preferences_toggles.dm | 56 +++++++-- code/modules/mob/dead/observer/login.dm | 7 +- code/modules/mob/dead/observer/observer.dm | 130 +++++++++++++++++--- code/modules/mob/new_player/new_player.dm | 4 +- icons/mob/mob.dmi | Bin 247097 -> 247323 bytes 9 files changed, 249 insertions(+), 28 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 6029de927b8..c36b27d9856 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -330,6 +330,31 @@ var/list/bloody_footprints_cache = list() #define GHOST_ORBIT_SQUARE "square" #define GHOST_ORBIT_PENTAGON "pentagon" +//Ghost showing preferences: +#define GHOST_ACCS_NONE 1 +#define GHOST_ACCS_DIR 50 +#define GHOST_ACCS_FULL 100 + +#define GHOST_ACCS_NONE_NAME "default sprites" +#define GHOST_ACCS_DIR_NAME "only directional sprites" +#define GHOST_ACCS_FULL_NAME "full accessories" + +#define GHOST_ACCS_DEFAULT_OPTION GHOST_ACCS_FULL + +var/global/list/ghost_accs_options = list(GHOST_ACCS_NONE, GHOST_ACCS_DIR, GHOST_ACCS_FULL) //So save files can be sanitized properly. + +#define GHOST_OTHERS_SIMPLE 1 +#define GHOST_OTHERS_DEFAULT_SPRITE 50 +#define GHOST_OTHERS_THEIR_SETTING 100 + +#define GHOST_OTHERS_SIMPLE_NAME "white ghost" +#define GHOST_OTHERS_DEFAULT_SPRITE_NAME "default sprites" +#define GHOST_OTHERS_THEIR_SETTING_NAME "their setting" + +#define GHOST_OTHERS_DEFAULT_OPTION GHOST_OTHERS_THEIR_SETTING + +var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DEFAULT_SPRITE, GHOST_OTHERS_THEIR_SETTING) //Same as ghost_accs_options. + //Bloodcrawling #define BLOODCRAWL 1 #define BLOODCRAWL_EAT 2 diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 6c968640473..5116c62e83e 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -28,6 +28,10 @@ var/global/list/ears_list = list() var/global/list/frills_list = list() var/global/list/spines_list = list() var/global/list/animated_spines_list = list() + +var/global/list/ghost_forms_with_directions_list = list("ghost") //stores the ghost forms that support directional sprites +var/global/list/ghost_forms_with_accessories_list = list("ghost") //stores the ghost forms that support hair and other such things + //Backpacks #define GBACKPACK "Grey Backpack" #define GSATCHEL "Grey Satchel" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index efcaa9bbbb6..52fece2c3e8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -34,6 +34,8 @@ var/list/preferences_datums = list() var/chat_toggles = TOGGLES_DEFAULT_CHAT var/ghost_form = "ghost" var/ghost_orbit = GHOST_ORBIT_CIRCLE + var/ghost_accs = GHOST_ACCS_DEFAULT_OPTION + var/ghost_others = GHOST_OTHERS_DEFAULT_OPTION var/ghost_hud = 1 var/inquisitive_ghost = 1 var/allow_midround_antag = 1 @@ -357,6 +359,27 @@ var/list/preferences_datums = list() dat += "Ghost Form: [ghost_form]
" dat += "Ghost Orbit: [ghost_orbit]
" + var/button_name = "If you see this something went wrong." + switch(ghost_accs) + if(GHOST_ACCS_FULL) + button_name = GHOST_ACCS_FULL_NAME + if(GHOST_ACCS_DIR) + button_name = GHOST_ACCS_DIR_NAME + if(GHOST_ACCS_NONE) + button_name = GHOST_ACCS_NONE_NAME + + dat += "Ghost Accessories: [button_name]
" + + switch(ghost_others) + if(GHOST_OTHERS_THEIR_SETTING) + button_name = GHOST_OTHERS_THEIR_SETTING_NAME + if(GHOST_OTHERS_DEFAULT_SPRITE) + button_name = GHOST_OTHERS_DEFAULT_SPRITE_NAME + if(GHOST_OTHERS_SIMPLE) + button_name = GHOST_OTHERS_SIMPLE_NAME + + dat += "Ghosts of Others: [button_name]
" + if (SERVERTOOLS && config.maprotation) var/p_map = preferred_map if (!p_map) @@ -752,6 +775,26 @@ var/list/preferences_datums = list() if(new_orbit) ghost_orbit = new_orbit + if("ghostaccs") + var/new_ghost_accs = alert("Do you want your ghost to show full accessories where possible, hide accessories but still use the directional sprites where possible, or also ignore the directions and stick to the default sprites?",,GHOST_ACCS_FULL_NAME, GHOST_ACCS_DIR_NAME, GHOST_ACCS_NONE_NAME) + switch(new_ghost_accs) + if(GHOST_ACCS_FULL_NAME) + ghost_accs = GHOST_ACCS_FULL + if(GHOST_ACCS_DIR_NAME) + ghost_accs = GHOST_ACCS_DIR + if(GHOST_ACCS_NONE_NAME) + ghost_accs = GHOST_ACCS_NONE + + if("ghostothers") + var/new_ghost_others = alert("Do you want the ghosts of others to show up as their own setting, as their default sprites or always as the default white ghost?",,GHOST_OTHERS_THEIR_SETTING_NAME, GHOST_OTHERS_DEFAULT_SPRITE_NAME, GHOST_OTHERS_SIMPLE_NAME) + switch(new_ghost_others) + if(GHOST_OTHERS_THEIR_SETTING_NAME) + ghost_others = GHOST_OTHERS_THEIR_SETTING + if(GHOST_OTHERS_DEFAULT_SPRITE_NAME) + ghost_others = GHOST_OTHERS_DEFAULT_SPRITE + if(GHOST_OTHERS_SIMPLE_NAME) + ghost_others = GHOST_OTHERS_SIMPLE + if("name") var/new_name = reject_bad_name( input(user, "Choose your character's name:", "Character Preference") as text|null ) if(new_name) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 5b14f2a5e04..5b9bfcaa3bf 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -2,7 +2,7 @@ #define SAVEFILE_VERSION_MIN 8 //This is the current version, anything below this will attempt to update (if it's not obsolete) -#define SAVEFILE_VERSION_MAX 13 +#define SAVEFILE_VERSION_MAX 14 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -217,6 +217,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["toggles"] >> toggles S["ghost_form"] >> ghost_form S["ghost_orbit"] >> ghost_orbit + S["ghost_accs"] >> ghost_accs + S["ghost_others"] >> ghost_others S["preferred_map"] >> preferred_map S["ignoring"] >> ignoring S["ghost_hud"] >> ghost_hud @@ -238,6 +240,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car toggles = sanitize_integer(toggles, 0, 65535, initial(toggles)) ghost_form = sanitize_inlist(ghost_form, ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, ghost_orbits, initial(ghost_orbit)) + ghost_accs = sanitize_inlist(ghost_accs, ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) + ghost_others = sanitize_inlist(ghost_others, ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) return 1 @@ -264,6 +268,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["chat_toggles"] << chat_toggles S["ghost_form"] << ghost_form S["ghost_orbit"] << ghost_orbit + S["ghost_accs"] << ghost_accs + S["ghost_others"] << ghost_others S["preferred_map"] << preferred_map S["ignoring"] << ignoring S["ghost_hud"] << ghost_hud diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 62d10113e2c..0892ba85a1a 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -212,11 +212,9 @@ var/global/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost", "ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \ "ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\ "ghost_mellow","ghost_rainbow","ghost_camo","ghost_fire") -/client/verb/pick_form() - set name = "Choose Ghost Form" - set category = "Preferences" - set desc = "Choose your preferred ghostly appearance." +/client/proc/pick_form() if(!is_content_unlocked()) + alert("This setting is for accounts with BYOND premium only.") return var/new_form = input(src, "Thanks for supporting BYOND - Choose your ghostly form:","Thanks for supporting BYOND",null) as null|anything in ghost_forms if(new_form) @@ -228,11 +226,9 @@ var/global/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost", var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOST_ORBIT_SQUARE,GHOST_ORBIT_HEXAGON,GHOST_ORBIT_PENTAGON) -/client/verb/pick_ghost_orbit() - set name = "Choose Ghost Orbit" - set category = "Preferences" - set desc = "Choose your preferred ghostly orbit." +/client/proc/pick_ghost_orbit() if(!is_content_unlocked()) + alert("This setting is for accounts with BYOND premium only.") return var/new_orbit = input(src, "Thanks for supporting BYOND - Choose your ghostly orbit:","Thanks for supporting BYOND",null) as null|anything in ghost_orbits if(new_orbit) @@ -242,6 +238,50 @@ var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS var/mob/dead/observer/O = mob O.ghost_orbit = new_orbit +/client/proc/pick_ghost_accs() + var/new_ghost_accs = alert("Do you want your ghost to show full accessories where possible, hide accessories but still use the directional sprites where possible, or also ignore the directions and stick to the default sprites?",,"full accessories", "only directional sprites", "default sprites") + switch(new_ghost_accs) + if("full accessories") + prefs.ghost_accs = GHOST_ACCS_FULL + if("only directional sprites") + prefs.ghost_accs = GHOST_ACCS_DIR + if("default sprites") + prefs.ghost_accs = GHOST_ACCS_NONE + if(istype(mob, /mob/dead/observer)) + var/mob/dead/observer/O = mob + O.update_icon() + +/client/verb/pick_ghost_customization() + set name = "Ghost Customization" + set category = "Preferences" + set desc = "Customize your ghastly appearance." + if(is_content_unlocked()) + switch(alert("Which setting do you want to change?",,"Ghost Form","Ghost Orbit","Ghost Accessories")) + if("Ghost Form") + pick_form() + if("Ghost Orbit") + pick_ghost_orbit() + if("Ghost Accessories") + pick_ghost_accs() + else + pick_ghost_accs() + +/client/verb/pick_ghost_others() + set name = "Ghost Display Settings" + set category = "Preferences" + set desc = "Change display settings for the ghosts of other players." + var/new_ghost_others = alert("Do you want the ghosts of others to show up as their own setting, as their default sprites or always as the default white ghost?",,"Their Setting", "Default Sprites", "White Ghost") + switch(new_ghost_others) + if("Their Setting") + prefs.ghost_others = GHOST_OTHERS_THEIR_SETTING + if("Default Sprites") + prefs.ghost_others = GHOST_OTHERS_DEFAULT_SPRITE + if("White Ghost") + prefs.ghost_others = GHOST_OTHERS_SIMPLE + if(istype(mob, /mob/dead/observer)) + var/mob/dead/observer/O = mob + O.updateghostsight() + /client/verb/toggle_intent_style() set name = "Toggle Intent Selection Style" set category = "Preferences" diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index 0b77ededdcb..bd9bd81d748 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -1,11 +1,16 @@ /mob/dead/observer/Login() ..() + ghost_accs = client.prefs.ghost_accs + ghost_others = client.prefs.ghost_others + var/preferred_form = null + if(check_rights(R_ADMIN, 0)) has_unlimited_silicon_privilege = 1 if(client.prefs.unlock_content) - update_icon(client.prefs.ghost_form) + preferred_form = client.prefs.ghost_form ghost_orbit = client.prefs.ghost_orbit + update_icon(preferred_form) updateghostimages() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 60be69b3801..7f89e56f794 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,7 @@ -var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness +var/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness, BUT NOT THE GHOSTS THEMSELVES! +var/list/image/ghost_images_full = list() //this is a list of full images of the ghosts themselves +var/list/image/ghost_images_default = list() //this is a list of the default (non-accessorized, non-dir) images of the ghosts themselves +var/list/image/ghost_images_simple = list() //this is a list of all ghost images as the simple white ghost /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -23,6 +26,8 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi var/atom/movable/following = null var/fun_verbs = 0 var/image/ghostimage = null //this mobs ghost image, for deleting and stuff + var/image/ghostimage_default = null //this mobs ghost image without accessories and dirs + var/image/ghostimage_simple = null //this mob with the simple white ghost sprite var/ghostvision = 1 //is the ghost able to see things humans can't? var/seedarkness = 1 var/ghost_hud_enabled = 1 //did this ghost disable the on-screen HUD? @@ -37,11 +42,26 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi var/facial_hair_color var/image/facial_hair_image + var/updatedir = 1 //Do we have to update our dir as the ghost moves around? + var/lastsetting = null //Stores the last setting that ghost_others was set to, for a little more efficiency when we update ghost images. Null means no update is necessary + + //We store copies of the ghost display preferences locally so they can be referred to even if no client is connected. + //If there's a bug with changing your ghost settings, it's probably related to this. + var/ghost_accs = GHOST_ACCS_DEFAULT_OPTION + var/ghost_others = GHOST_OTHERS_DEFAULT_OPTION + /mob/dead/observer/New(mob/body) verbs += /mob/dead/observer/proc/dead_tele ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage + if(icon_state in ghost_forms_with_directions_list) + ghostimage_default = image(src.icon,src,src.icon_state + "_nodir") + else + ghostimage_default = image(src.icon,src,src.icon_state) + ghostimage_simple = image(src.icon,src,"ghost_nodir") + ghost_images_full |= ghostimage + ghost_images_default |= ghostimage_default + ghost_images_simple |= ghostimage_simple updateallghostimages() var/turf/T @@ -63,10 +83,10 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi var/mob/living/carbon/human/body_human = body if(HAIR in body_human.dna.species.specflags) hair_style = body_human.hair_style - hair_color = body_human.hair_color + hair_color = brighten_color(body_human.hair_color) if(FACEHAIR in body_human.dna.species.specflags) facial_hair_style = body_human.facial_hair_style - facial_hair_color = body_human.facial_hair_color + facial_hair_color = brighten_color(body_human.facial_hair_color) update_icon() @@ -105,20 +125,35 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi * |- Ricotez */ /mob/dead/observer/proc/update_icon(new_form) + if(client) //We update our preferences in case they changed right before update_icon was called. + ghost_accs = client.prefs.ghost_accs + ghost_others = client.prefs.ghost_others + if(hair_image) overlays -= hair_image ghostimage.overlays -= hair_image hair_image = null + if(facial_hair_image) overlays -= facial_hair_image ghostimage.overlays -= facial_hair_image facial_hair_image = null + if(new_form) icon_state = new_form - ghostimage.icon_state = new_form + if(icon_state in ghost_forms_with_directions_list) + ghostimage_default.icon_state = new_form + "_nodir" //if this icon has dirs, the default ghostimage must use its nodir version or clients with the preference set to default sprites only will see the dirs + else + ghostimage_default.icon_state = new_form - if(icon_state == "ghost") //For now we just check for the default ghost sprite. If other sprites get updated in the future to support hair, change this to a list. + if(ghost_accs >= GHOST_ACCS_DIR && icon_state in ghost_forms_with_directions_list) //if this icon has dirs AND the client wants to show them, we make sure we update the dir on movement + updatedir = 1 + else + updatedir = 0 //stop updating the dir in case we want to show accessories with dirs on a ghost sprite without dirs + dir = 2 //reset the dir to its default so the sprites all properly align up + + if(ghost_accs == GHOST_ACCS_FULL && icon_state in ghost_forms_with_accessories_list) //check if this form supports accessories and if the client wants to show them var/datum/sprite_accessory/S if(facial_hair_style) S = facial_hair_styles_list[facial_hair_style] @@ -139,6 +174,39 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi overlays += hair_image ghostimage.overlays += hair_image +/* + * Increase the brightness of a color by calculating the average distance between the R, G and B values, + * and maximum brightness, then adding 30% of that average to R, G and B. + * + * I'll make this proc global and move it to its own file in a future update. |- Ricotez + */ +/mob/proc/brighten_color(input_color) + var/r_val + var/b_val + var/g_val + var/color_format = lentext(input_color) + if(color_format == 3) + r_val = hex2num(copytext(input_color, 1, 2))*16 + g_val = hex2num(copytext(input_color, 2, 3))*16 + b_val = hex2num(copytext(input_color, 3, 0))*16 + else if(color_format == 6) + r_val = hex2num(copytext(input_color, 1, 3)) + g_val = hex2num(copytext(input_color, 3, 5)) + b_val = hex2num(copytext(input_color, 5, 0)) + else + return 0 //If the color format is not 3 or 6, you're using an unexpected way to represent a color. + + r_val += (255 - r_val) * 0.4 + if(r_val > 255) + r_val = 255 + g_val += (255 - g_val) * 0.4 + if(g_val > 255) + g_val = 255 + b_val += (255 - b_val) * 0.4 + if(b_val > 255) + b_val = 255 + + return num2hex(r_val, 2) + num2hex(g_val, 2) + num2hex(b_val, 2) /* Transfer_mind is there to check if mob is being deleted/not going to have a body. @@ -175,7 +243,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/Move(NewLoc, direct) - dir = direct + if(updatedir) + dir = direct //only update dir if we actually need it, so overlays won't spin on base sprites that don't have directions of their own if(NewLoc) loc = NewLoc for(var/obj/effect/step_trigger/S in NewLoc) @@ -303,6 +372,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp orbit(target,orbitsize, FALSE, 20, rot_seg) /mob/dead/observer/orbit() + dir = 2 //reset dir so the right directional sprites show up ..() //restart our floating animation after orbit is done. sleep 2 //orbit sets up a 2ds animation when it finishes, so we wait for that to end @@ -374,12 +444,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp updateghostsight() /mob/dead/observer/proc/updateghostsight() - if (!seedarkness) - see_invisible = SEE_INVISIBLE_NOLIGHTING - else + if(client) + ghost_others = client.prefs.ghost_others //A quick update just in case this setting was changed right before calling the proc + + if (seedarkness) see_invisible = SEE_INVISIBLE_OBSERVER - if (!ghostvision) + if (!ghostvision || ghost_others <= GHOST_OTHERS_DEFAULT_SPRITE) see_invisible = SEE_INVISIBLE_LIVING + else + see_invisible = SEE_INVISIBLE_NOLIGHTING + updateghostimages() /proc/updateallghostimages() @@ -389,13 +463,37 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/updateghostimages() if (!client) return - if (seedarkness || !ghostvision) + + if(lastsetting) + switch(lastsetting) //checks the setting we last came from, for a little efficiency so we don't try to delete images from the client that it doesn't have anyway + if(GHOST_OTHERS_THEIR_SETTING) + client.images -= ghost_images_full + if(GHOST_OTHERS_DEFAULT_SPRITE) + client.images -= ghost_images_default + if(GHOST_OTHERS_SIMPLE) + client.images -= ghost_images_simple + + if ((seedarkness || !ghostvision) && client.prefs.ghost_others == GHOST_OTHERS_THEIR_SETTING) client.images -= ghost_darkness_images - else + lastsetting = null + else if(ghostvision && (!seedarkness || client.prefs.ghost_others <= GHOST_OTHERS_DEFAULT_SPRITE)) //add images for the 60inv things ghosts can normally see when darkness is enabled so they can see them now - client.images |= ghost_darkness_images - if (ghostimage) - client.images -= ghostimage //remove ourself + if(!lastsetting) + client.images |= ghost_darkness_images + switch(client.prefs.ghost_others) + if(GHOST_OTHERS_THEIR_SETTING) + client.images |= ghost_images_full + if (ghostimage) + client.images -= ghostimage //remove ourself + if(GHOST_OTHERS_DEFAULT_SPRITE) + client.images |= ghost_images_default + if(ghostimage_default) + client.images -= ghostimage_default + if(GHOST_OTHERS_SIMPLE) + client.images |= ghost_images_simple + if(ghostimage_simple) + client.images -= ghostimage_simple + lastsetting = client.prefs.ghost_others /mob/dead/observer/verb/possess() set category = "Ghost" diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 74db315a9c5..9a14b41a6df 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -133,10 +133,10 @@ client.prefs.random_character(gender) if(HAIR in client.prefs.pref_species.specflags) observer.hair_style = client.prefs.hair_style - observer.hair_color = client.prefs.hair_color + observer.hair_color = observer.brighten_color(client.prefs.hair_color) if(FACEHAIR in client.prefs.pref_species.specflags) observer.facial_hair_style = client.prefs.facial_hair_style - observer.facial_hair_color = client.prefs.facial_hair_color + observer.facial_hair_color = observer.brighten_color(client.prefs.facial_hair_color) observer.real_name = client.prefs.real_name observer.name = observer.real_name observer.key = key diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 167d9caf265bacec7925e50bee5c6b1205f102d6..3a74a701ed063e1c8a21e57e566ee83f622ded52 100644 GIT binary patch delta 14184 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 NMoLk#^sT<{{{Sc9vzh<^