diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 58125b5497..7c4e8207bd 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -105,3 +105,9 @@
//belly sound pref things
#define NORMIE_HEARCHECK 4
+
+//icon states for the default eyes and for a state for no eye
+#define DEFAULT_EYES_TYPE "normal"
+#define DEFAULT_LEFT_EYE_STATE "normal_left_eye"
+#define DEFAULT_RIGHT_EYE_STATE "normal_right_eye"
+#define DEFAULT_NO_EYE_STATE "no_eye"
\ No newline at end of file
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index a6c7bf10ea..31046d8a12 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -284,3 +284,6 @@ GLOBAL_LIST_INIT(greyscale_limb_types, list("human","moth","lizard","pod","plant
//body ids that have prosthetic sprites
GLOBAL_LIST_INIT(prosthetic_limb_types, list("xion","bishop","cybersolutions","grayson","hephaestus","nanotrasen","talon"))
+
+//list of eye types, corresponding to a respective left and right icon state for the set of eyes
+GLOBAL_LIST_INIT(eye_types, list("normal", "insect"))
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7a2c8156d4..d7f5133651 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -98,6 +98,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/use_custom_skin_tone = FALSE
var/left_eye_color = "000000" //Eye color
var/right_eye_color = "000000"
+ var/eye_type = DEFAULT_EYES_TYPE //Eye type
var/split_eye_colors = FALSE
var/datum/species/pref_species = new /datum/species/human() //Mutant race
var/list/features = list("mcolor" = "FFFFFF",
@@ -474,25 +475,28 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (CONFIG_GET(number/body_size_min) != CONFIG_GET(number/body_size_max))
dat += "Sprite Size: [features["body_size"]*100]%
"
- if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits))
- if(!use_skintones && !mutant_colors)
- dat += APPEARANCE_CATEGORY_COLUMN
- if(left_eye_color != right_eye_color)
- split_eye_colors = TRUE
- dat += "
Heterochromia
"
- dat += "[split_eye_colors ? "Enabled" : "Disabled"]"
- if(!split_eye_colors)
- dat += "Eye Color
"
- dat += " Change"
+ if(!(NOEYES in pref_species.species_traits))
+ dat += "Eye Type
"
+ dat += "[eye_type]
"
+ if((EYECOLOR in pref_species.species_traits))
+ if(!use_skintones && !mutant_colors)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ if(left_eye_color != right_eye_color)
+ split_eye_colors = TRUE
+ dat += "Heterochromia
"
+ dat += "[split_eye_colors ? "Enabled" : "Disabled"]"
+ if(!split_eye_colors)
+ dat += "Eye Color
"
+ dat += " Change"
+ dat += ""
+ else
+ dat += "Left Eye Color
"
+ dat += " Change"
+ dat += "Right Eye Color
"
+ dat += " Change
"
+ dat += ""
+ else if(use_skintones || mutant_colors)
dat += ""
- else
- dat += "Left Eye Color
"
- dat += " Change"
- dat += "Right Eye Color
"
- dat += " Change
"
- dat += ""
- else if(use_skintones || mutant_colors)
- dat += ""
dat += APPEARANCE_CATEGORY_COLUMN
dat += "Speech preferences
"
@@ -1584,6 +1588,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_eyes)
right_eye_color = sanitize_hexcolor(new_eyes, 6)
+ if("eye_type")
+ var/new_eye_type = input(user, "Choose your character's eye type.", "Character Preference") as null|anything in GLOB.eye_types
+ if(new_eye_type)
+ eye_type = new_eye_type
+
if("toggle_split_eyes")
split_eye_colors = !split_eye_colors
right_eye_color = left_eye_color
@@ -1617,6 +1626,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(features["mcolor3"] == "#000000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor3"] = pref_species.default_color
+ //switch to the type of eyes the species uses
+ eye_type = pref_species.eye_type
+
if("custom_species")
var/new_species = reject_bad_name(input(user, "Choose your species subtype, if unique. This will show up on examinations and health scans. Do not abuse this:", "Character Preference", custom_species) as null|text)
if(new_species)
@@ -2601,6 +2613,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.dna.features = features.Copy()
character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE)
+ character.dna.species.eye_type = eye_type
if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids))
character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id
character.dna.real_name = character.real_name
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index fb1178fd8e..fc9b76f519 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -509,6 +509,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["age"] >> age
S["hair_color"] >> hair_color
S["facial_hair_color"] >> facial_hair_color
+ S["eye_type"] >> eye_type
S["left_eye_color"] >> left_eye_color
S["right_eye_color"] >> right_eye_color
S["use_custom_skin_tone"] >> use_custom_skin_tone
@@ -692,6 +693,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
hair_color = sanitize_hexcolor(hair_color, 6, FALSE)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 6, FALSE)
+ eye_type = sanitize_inlist(eye_type, GLOB.eye_types, DEFAULT_EYES_TYPE)
left_eye_color = sanitize_hexcolor(left_eye_color, 6, FALSE)
right_eye_color = sanitize_hexcolor(right_eye_color, 6, FALSE)
@@ -822,6 +824,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["age"] , age)
WRITE_FILE(S["hair_color"] , hair_color)
WRITE_FILE(S["facial_hair_color"] , facial_hair_color)
+ WRITE_FILE(S["eye_type"] , eye_type)
WRITE_FILE(S["left_eye_color"] , left_eye_color)
WRITE_FILE(S["right_eye_color"] , right_eye_color)
WRITE_FILE(S["use_custom_skin_tone"] , use_custom_skin_tone)
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 3774ce575f..e19a0538fc 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -190,7 +190,7 @@
/obj/item/clothing/head/wig
name = "wig"
desc = "A bunch of hair without a head attached."
- icon = 'icons/mob/human_face.dmi' // default icon for all hairs
+ icon = 'icons/mob/hair.dmi' // default icon for all hairs
icon_state = "hair_vlong"
flags_inv = HIDEHAIR
color = "#000"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
index a07fdaa5d3..23b1f87bd2 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_face.dm
@@ -2,7 +2,7 @@
// Facial Hair Definitions //
/////////////////////////////
/datum/sprite_accessory/facial_hair
- icon = 'icons/mob/human_face.dmi'
+ icon = 'icons/mob/hair.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix w/ beards :P)
// please make sure they're sorted alphabetically and categorized
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index 8e4e6ad617..55ab18c20c 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -2,7 +2,7 @@
// Hair Definitions //
//////////////////////
/datum/sprite_accessory/hair
- icon = 'icons/mob/human_face.dmi' // default icon for all hairs
+ icon = 'icons/mob/hair.dmi' // default icon for all hairs
// please make sure they're sorted alphabetically and, where needed, categorized
// try to capitalize the names please~
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 554013c7bc..20260a04f4 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -117,6 +117,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
//the ids you can use for your species, if empty, it means default only and not changeable
var/list/allowed_limb_ids
+ //the type of eyes this species has
+ var/eye_type = "normal"
+
///////////
// PROCS //
///////////
@@ -512,7 +515,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER)
if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
if(!(NOBLOOD in species_traits))
- hair_overlay.icon = 'icons/mob/human_face.dmi'
+ hair_overlay.icon = 'icons/mob/hair.dmi'
hair_overlay.icon_state = "debrained"
else if(H.hair_style && (HAIR in species_traits))
@@ -571,7 +574,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(HD && !(HAS_TRAIT(H, TRAIT_HUSK)))
// lipstick
if(H.lip_style && (LIPS in species_traits))
- var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER)
+ var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/lips.dmi', "lips_[H.lip_style]", -BODY_LAYER)
lip_overlay.color = H.lip_color
if(OFFSET_LIPS in H.dna.species.offset_features)
@@ -584,10 +587,15 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(!(NOEYES in species_traits))
var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(!has_eyes)
- standing += mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
+ standing += mutable_appearance('icons/mob/eyes.dmi', "eyes_missing", -BODY_LAYER)
else
- var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER)
- var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER)
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(GLOB.eye_types[eye_type])
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
+ var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
if((EYECOLOR in species_traits) && has_eyes)
left_eye.color = "#" + H.left_eye_color
right_eye.color = "#" + H.right_eye_color
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index cfb35fbb00..b83a6f9039 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -748,7 +748,7 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
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)
+ var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/lips.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]
@@ -759,10 +759,17 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
if(!(NOEYES in dna.species.species_traits))
var/has_eyes = getorganslot(ORGAN_SLOT_EYES)
if(!has_eyes)
- add_overlay(mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER))
+ add_overlay(mutable_appearance('icons/mob/eyes.dmi', "eyes_missing", -BODY_LAYER))
else
- var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER)
- var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER)
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(dna.species)
+ var/eye_type = dna.species.eye_type
+ if(GLOB.eye_types[eye_type])
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ var/mutable_appearance/left_eye = mutable_appearance('icons/mob/eyes.dmi', left_state, -BODY_LAYER)
+ var/mutable_appearance/right_eye = mutable_appearance('icons/mob/eyes.dmi', right_state, -BODY_LAYER)
if((EYECOLOR in dna.species.species_traits) && has_eyes)
left_eye.color = "#" + left_eye_color
right_eye.color = "#" + right_eye_color
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 1e00815f24..bfe04c8622 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -34,7 +34,7 @@
hair_hidden = 1
if(!hair_hidden)
if(!getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
- overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_face.dmi', "debrained", -HAIR_LAYER)
+ overlays_standing[HAIR_LAYER] = mutable_appearance('icons/mob/human_parts.dmi', "debrained", -HAIR_LAYER)
apply_overlay(HAIR_LAYER)
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
index 2c94739180..f6ab2a1a9e 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm
@@ -59,12 +59,12 @@
/mob/living/simple_animal/hostile/retaliate/ghost/proc/give_hair()
if(ghost_hair_style != null)
- ghost_hair = mutable_appearance('icons/mob/human_face.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER)
+ ghost_hair = mutable_appearance('icons/mob/hair.dmi', "hair_[ghost_hair_style]", -HAIR_LAYER)
ghost_hair.alpha = 200
ghost_hair.color = ghost_hair_color
add_overlay(ghost_hair)
if(ghost_facial_hair_style != null)
- ghost_facial_hair = mutable_appearance('icons/mob/human_face.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER)
+ ghost_facial_hair = mutable_appearance('icons/mob/hair.dmi', "facial_[ghost_facial_hair_style]", -HAIR_LAYER)
ghost_facial_hair.alpha = 200
ghost_facial_hair.color = ghost_facial_hair_color
add_overlay(ghost_facial_hair)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index b6a0a387e2..8b1473fed2 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -161,7 +161,7 @@
debrain_overlay.icon = 'icons/mob/animal_parts.dmi'
debrain_overlay.icon_state = "debrained_larva"
else if(!(NOBLOOD in species_flags_list))
- debrain_overlay.icon = 'icons/mob/human_face.dmi'
+ debrain_overlay.icon = 'icons/mob/human_parts.dmi'
debrain_overlay.icon_state = "debrained"
. += debrain_overlay
else
@@ -175,21 +175,31 @@
// lipstick
if(lip_style)
- var/image/lips_overlay = image('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH)
+ var/image/lips_overlay = image('icons/mob/lips.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH)
lips_overlay.color = lip_color
. += lips_overlay
// eyes
if(eyes)
- var/image/left_eye = image('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER, SOUTH)
- var/image/right_eye = image('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER, SOUTH)
- if(eyes.left_eye_color && eyes.right_eye_color)
- left_eye.color = "#" + eyes.left_eye_color
- right_eye.color = "#" + eyes.right_eye_color
- . += left_eye
- . += right_eye
+ var/left_state = DEFAULT_LEFT_EYE_STATE
+ var/right_state = DEFAULT_RIGHT_EYE_STATE
+ if(owner && owner.dna.species)
+ var/eye_type = owner.dna.species.eye_type
+ if(GLOB.eye_types[eye_type])
+ left_state = eye_type + "_left_eye"
+ right_state = eye_type + "_right_eye"
+ if(left_state != DEFAULT_NO_EYE_STATE)
+ var/image/left_eye = image('icons/mob/hair.dmi', left_state, -BODY_LAYER, SOUTH)
+ if(eyes.left_eye_color)
+ left_eye.color = "#" + eyes.left_eye_color
+ . += left_eye
+ if(right_state != DEFAULT_NO_EYE_STATE)
+ var/image/right_eye = image('icons/mob/hair.dmi', right_state, -BODY_LAYER, SOUTH)
+ if(eyes.right_eye_color)
+ right_eye.color = "#" + eyes.right_eye_color
+ . += right_eye
else
- var/eyes_overlay = image('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER, SOUTH)
+ var/eyes_overlay = image('icons/mob/hair.dmi', "eyes_missing", -BODY_LAYER, SOUTH)
. += eyes_overlay
/obj/item/bodypart/head/monkey
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index efceefc131..b4c58b31ed 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -248,7 +248,7 @@
/obj/item/organ/eyes/robotic/glow/Initialize()
. = ..()
- mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs")
+ mob_overlay = image('icons/mob/eyes.dmi', "eyes_glow_gs")
/obj/item/organ/eyes/robotic/glow/Destroy()
terminate_effects()
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
new file mode 100644
index 0000000000..008bfbba8c
Binary files /dev/null and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi
new file mode 100644
index 0000000000..6dfa78fcff
Binary files /dev/null and b/icons/mob/hair.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 1e67d7baba..563dd6665c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 60978d55a2..f7f51b65e4 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/lips.dmi b/icons/mob/lips.dmi
new file mode 100644
index 0000000000..4c00ac324a
Binary files /dev/null and b/icons/mob/lips.dmi differ