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