diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 6d52c9d6acee..9da8bb0c32a3 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -36,6 +36,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/teeth, GLOB.teeth_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/dome, GLOB.dome_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/dorsal_tubes, GLOB.dorsal_tubes_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_mark, GLOB.ethereal_mark_list)
//Species
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index e96025c328a2..314e870a4443 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -78,6 +78,8 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/dome, GLOB.dome_list)
if(!GLOB.dorsal_tubes_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/dorsal_tubes, GLOB.dorsal_tubes_list)
+ if(!GLOB.ethereal_mark_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/ethereal_mark, GLOB.ethereal_mark_list)
//For now we will always return none for tail_human and ears. this shit was unreadable if you do somethign like this make it at least readable
return(list(
@@ -100,7 +102,8 @@
"tail_polysmorph" = "Polys",
"teeth" = pick(GLOB.teeth_list),
"dome" = pick(GLOB.dome_list),
- "dorsal_tubes" = pick(GLOB.dorsal_tubes_list)
+ "dorsal_tubes" = pick(GLOB.dorsal_tubes_list),
+ "ethereal_mark" = pick(GLOB.ethereal_mark_list)
))
/proc/random_hair_style(gender)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 43d7102196b2..f1f8abee32cb 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -43,6 +43,7 @@ GLOBAL_LIST_EMPTY(moth_wings_list)
GLOBAL_LIST_EMPTY(moth_wingsopen_list)
GLOBAL_LIST_EMPTY(caps_list)
+GLOBAL_LIST_EMPTY(ethereal_mark_list) //ethereal face marks
GLOBAL_LIST_INIT(color_list_ethereal, list("F Class(Green)" = "97ee63", "F2 Class (Light Green)" = "00fa9a", "F3 Class (Dark Green)" = "37835b", "M Class (Red)" = "9c3030", "M1 Class (Purple)" = "ee82ee", "G Class (Yellow)" = "fbdf56", "O Class (Blue)" = "3399ff", "A Class (Cyan)" = "00ffff"))
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 3355bc5d945e..196507acc50b 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -37,7 +37,8 @@
H.dna.features["teeth"] = pick(GLOB.teeth_list)
H.dna.features["dome"] = pick(GLOB.dome_list)
H.dna.features["dorsal_tubes"] = pick(GLOB.dorsal_tubes_list)
+ H.dna.features["ethereal_mark"] = pick(GLOB.ethereal_mark_list)
H.update_body()
H.update_hair()
- H.update_body_parts()
\ No newline at end of file
+ H.update_body_parts()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 85607d423cff..847c733f76c4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -71,7 +71,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF", "gradientstyle" = "None", "gradientcolor" = "000", "ethcolor" = "9c3030", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain", "tail_polysmorph" = "Polys", "teeth" = "None", "dome" = "None", "dorsal_tubes" = "No")
+ var/list/features = list("mcolor" = "FFF", "gradientstyle" = "None", "gradientcolor" = "000", "ethcolor" = "9c3030", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain", "tail_polysmorph" = "Polys", "teeth" = "None", "dome" = "None", "dorsal_tubes" = "No", "ethereal_mark" = "None")
var/list/genders = list(MALE, FEMALE, PLURAL)
var/list/friendlyGenders = list("Male" = "male", "Female" = "female", "Other" = "plural")
@@ -368,16 +368,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " Change"
dat += "[random_locks["facial"] ? "Unlock" : "Lock"]
"
- if(pref_species.id != "ethereal")
- dat += "
Hair Gradient
"
+ dat += "Hair Gradient
"
- dat += "[features["gradientstyle"]]"
- dat += "[random_locks["gradientstyle"] ? "Unlock" : "Lock"]
"
+ dat += "[features["gradientstyle"]]"
+ dat += "[random_locks["gradientstyle"] ? "Unlock" : "Lock"]
"
- dat += "< >
"
+ dat += "< >
"
- dat += " Change"
- dat += "[random_locks["gradientcolor"] ? "Unlock" : "Lock"]
"
+ dat += " Change"
+ dat += "[random_locks["gradientcolor"] ? "Unlock" : "Lock"]
"
dat += ""
@@ -551,6 +550,20 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
+
+ if("ethereal_mark" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Ethereal Mark
"
+
+ dat += "[features["ethereal_mark"]]"
+ dat += "[random_locks["ethereal_mark"] ? "Unlock" : "Lock"]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
if("tail_human" in pref_species.default_features)
if(!mutant_category)
@@ -1384,6 +1397,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"teeth" = 1,
"dome" = 1,
"dorsal_tubes" = 1,
+ "ethereal_mark" = 1,
)
if("gender")
random_locks["random_locks"] = gender
@@ -1674,6 +1688,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_dorsal_tubes)
features["dorsal_tubes"] = new_dorsal_tubes
+ if("ethereal_mark")
+ var/new_ethereal_mark
+ new_ethereal_mark = input(user, "Choose if your character has a facial mark", "Character Preference") as null|anything in GLOB.ethereal_mark_list
+ if(new_ethereal_mark)
+ features["ethereal_mark"] = new_ethereal_mark
+
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones
if(new_s_tone)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 4a579537bceb..857687128f1b 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -437,6 +437,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
READ_FILE(S["feature_polysmorph_teeth"], features["teeth"])
READ_FILE(S["feature_polysmorph_dome"], features["dome"])
READ_FILE(S["feature_polysmorph_dorsal_tubes"], features["dorsal_tubes"])
+ READ_FILE(S["feature_ethereal_mark"], features["ethereal_mark"])
+
READ_FILE(S["persistent_scars"], persistent_scars)
if(!CONFIG_GET(flag/join_with_mutant_humans))
features["tail_human"] = "none"
@@ -536,6 +538,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["teeth"] = sanitize_inlist(features["teeth"], GLOB.teeth_list)
features["dome"] = sanitize_inlist(features["dome"], GLOB.dome_list)
features["dorsal_tubes"] = sanitize_inlist(features["dorsal_tubes"], GLOB.dorsal_tubes_list)
+ features["ethereal_mark"] = sanitize_inlist(features["ethereal_mark"], GLOB.ethereal_mark_list)
persistent_scars = sanitize_integer(persistent_scars)
@@ -596,6 +599,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_polysmorph_teeth"] , features["teeth"])
WRITE_FILE(S["feature_polysmorph_dome"] , features["dome"])
WRITE_FILE(S["feature_polysmorph_dorsal_tubes"] , features["dorsal_tubes"])
+ WRITE_FILE(S["feature_ethereal_mark"] , features["ethereal_mark"])
WRITE_FILE(S["persistent_scars"] , persistent_scars)
//Custom names
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index fdbc072f0879..ced9a94d9e67 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -2169,4 +2169,37 @@
/datum/sprite_accessory/dorsal_tubes/dtdown
name = "Down"
- icon_state = "dtdown"
\ No newline at end of file
+ icon_state = "dtdown"
+
+//ETHEREAL FACE MARKINGS
+/datum/sprite_accessory/ethereal_mark
+ icon = 'icons/mob/mutant_bodyparts.dmi'
+ //color_src = MUTCOLORS
+
+/datum/sprite_accessory/ethereal_mark/eyes
+ name = "Eyes"
+ icon_state = "eyes"
+
+/datum/sprite_accessory/ethereal_mark/diamond
+ name = "Diamond"
+ icon_state = "diamond"
+
+/datum/sprite_accessory/ethereal_mark/heart
+ name = "Heart"
+ icon_state = "heart"
+
+/datum/sprite_accessory/ethereal_mark/omega
+ name = "Omega"
+ icon_state = "omega"
+
+/datum/sprite_accessory/ethereal_mark/plus
+ name = "Plus"
+ icon_state = "plus"
+
+/datum/sprite_accessory/ethereal_mark/triangle
+ name = "Triangle"
+ icon_state = "triangle"
+
+/datum/sprite_accessory/ethereal_mark/x
+ name = "X"
+ icon_state = "x"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e63580e6f754..801eabf75825 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -752,6 +752,10 @@ GLOBAL_LIST_EMPTY(mentor_races)
if("dome" in mutant_bodyparts)
if(!H.dna.features["dome"] || H.dna.features["dome"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
bodyparts_to_add -= "dome"
+
+ if("ethereal_mark" in mutant_bodyparts)
+ if((H.wear_mask && (H.wear_mask.flags_inv & HIDEEYES)) || (H.head && (H.head.flags_inv & HIDEEYES)) || !HD || HD.status == BODYPART_ROBOTIC)
+ bodyparts_to_add -= "ethereal_mark"
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
var/update_needed = FALSE
@@ -845,6 +849,8 @@ GLOBAL_LIST_EMPTY(mentor_races)
S = GLOB.dome_list[H.dna.features["dome"]]
if("dorsal_tubes")
S = GLOB.dorsal_tubes_list[H.dna.features["dorsal_tubes"]]
+ if("ethereal_mark")
+ S = GLOB.ethereal_mark_list[H.dna.features["ethereal_mark"]]
if(!S || S.icon_state == "none")
continue
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 9944405b6f8e..090aba2eb7a7 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -14,9 +14,11 @@
payday_modifier = 0.7 //Neutrally useful to NT
attack_type = BURN //burn bish
damage_overlay_type = "" //We are too cool for regular damage overlays
- species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, FACEHAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
+ species_traits = list(NOEYESPRITES,DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, FACEHAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
inherent_traits = list(TRAIT_NOHUNGER)
+ mutant_bodyparts = list("ethereal_mark")
+ default_features = list("ethereal_mark" = "Eyes")
species_language_holder = /datum/language_holder/ethereal
sexes = FALSE //no fetish content allowed
toxic_food = NONE
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index ae50e0732b77..98d03830afca 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ