diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index dac3613318e..3f5b16ef917 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -30,6 +30,7 @@
#define HAS_HAIR_COLOR 0x20 // Hair colour selectable in chargen. (RGB)
#define HAS_SOCKS 0x40 // If this species can wear socks
#define HAS_FBP 0x80 // If for whatever ungodly reason we decide to ever have non-Shell FBPs.
+#define HAS_SKIN_PRESET 0x100 // Skin color presets selectable in character generation.
// Tau-Ceti basic, language common to all crew.
#define LANGUAGE_TCB "Ceti Basic"
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 8c54e26643c..d9e87a13c64 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -56,6 +56,7 @@ var/global/list/facial_hair_styles_female_list = list()
var/global/list/skin_styles_female_list = list() //unused
var/global/list/body_marking_styles_list = list()
var/global/list/chargen_disabilities_list = list()
+
//Underwear
var/global/list/underwear_m = list("White" = "m1", "Grey" = "m2", "Green" = "m3", "Blue" = "m4", "Black" = "m5", "Mankini" = "m6", "Boxers" = "boxers", "Green and blue boxers" = "boxers_green_and_blue","Loveheart boxers" = "boxers_loveheart","None") //Curse whoever made male/female underwear diffrent colours
var/global/list/underwear_f = list("Red" = "f1", "White" = "f2", "Yellow" = "f3", "Blue" = "f4", "Black" = "f5", "Thong" = "f6", "Black Sports" = "f7","White Sports" = "f8","None")
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index b94f3fd61d6..e96248e7034 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -936,10 +936,10 @@ var/list/admin_verbs_cciaa = list(
M.g_skin = hex2num(copytext(new_skin, 4, 6))
M.b_skin = hex2num(copytext(new_skin, 6, 8))
- var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as text
+ var/new_tone = input("Please select skin tone level: 30-220. Higher is darker.", "Character Generation") as text
if (new_tone)
- M.s_tone = max(min(round(text2num(new_tone)), 220), 1)
+ M.s_tone = max(min(round(text2num(new_tone)), 220), 30)
M.s_tone = -M.s_tone + 35
// hair
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index 1a0d8f8eef3..b45f8d6c663 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -143,6 +143,7 @@
var/datum/category_item/player_setup_item/general/equipment/equipment_item = category.items[4]
equipment_item.sanitize_character() // sanitize equipment
+ pref.update_preview_icon()
return TOPIC_REFRESH
else if(href_list["age"])
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index d4b57eb8d94..8fcfcf368c3 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -160,7 +160,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_facial = sanitize_integer(pref.r_facial, 0, 255, initial(pref.r_facial))
pref.g_facial = sanitize_integer(pref.g_facial, 0, 255, initial(pref.g_facial))
pref.b_facial = sanitize_integer(pref.b_facial, 0, 255, initial(pref.b_facial))
- pref.s_tone = sanitize_integer(pref.s_tone, -185, 34, initial(pref.s_tone))
+ pref.s_tone = sanitize_integer(pref.s_tone, -185, 5, initial(pref.s_tone))
pref.r_skin = sanitize_integer(pref.r_skin, 0, 255, initial(pref.r_skin))
pref.g_skin = sanitize_integer(pref.g_skin, 0, 255, initial(pref.g_skin))
pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin))
@@ -294,9 +294,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
out += "
Eyes
"
out += "Change Color [HTML_RECT(rgb(pref.r_eyes, pref.g_eyes, pref.b_eyes))]
"
- if(has_flag(mob_species, HAS_SKIN_COLOR))
- out += "
Body Color
"
- out += "Change Color [HTML_RECT(rgb(pref.r_skin, pref.g_skin, pref.b_skin))]
"
+ if(has_flag(mob_species, HAS_SKIN_COLOR) || has_flag(mob_species, HAS_SKIN_PRESET))
+ if(has_flag(mob_species, HAS_SKIN_PRESET))
+ out += "
Body Color Presets
"
+ out += "Choose Preset
"
+ else
+ out += "
Body Color
"
+ out += "Change Color [HTML_RECT(rgb(pref.r_skin, pref.g_skin, pref.b_skin))]
"
+
+
out += "
Body Markings +
"
for(var/M in pref.body_markings)
@@ -444,19 +450,28 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["skin_tone"])
if(!has_flag(mob_species, HAS_SKIN_TONE))
return TOPIC_NOACTION
- var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null
+ var/new_s_tone = input(user, "Choose your character's skin-tone:\n(Light 30 - 220 Dark)", "Character Preference", (-pref.s_tone) + 35) as num|null
if(new_s_tone && has_flag(mob_species, HAS_SKIN_TONE) && CanUseTopic(user))
- pref.s_tone = 35 - max(min( round(new_s_tone), 220),1)
+ pref.s_tone = 35 - max(min( round(new_s_tone), 220),30)
return TOPIC_REFRESH
else if(href_list["skin_color"])
- if(!has_flag(mob_species, HAS_SKIN_COLOR))
+ if(!has_flag(mob_species, HAS_SKIN_COLOR) && !has_flag(mob_species, HAS_SKIN_PRESET))
return TOPIC_NOACTION
- var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as color|null
- if(new_skin && has_flag(mob_species, HAS_SKIN_COLOR) && CanUseTopic(user))
- pref.r_skin = GetRedPart(new_skin)
- pref.g_skin = GetGreenPart(new_skin)
- pref.b_skin = GetBluePart(new_skin)
+ if(has_flag(mob_species, HAS_SKIN_COLOR) && !has_flag(mob_species, HAS_SKIN_PRESET))
+ var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as color|null
+ if(new_skin && has_flag(mob_species, HAS_SKIN_COLOR) && CanUseTopic(user))
+ pref.r_skin = GetRedPart(new_skin)
+ pref.g_skin = GetGreenPart(new_skin)
+ pref.b_skin = GetBluePart(new_skin)
+ return TOPIC_REFRESH
+
+ else if(has_flag(mob_species, HAS_SKIN_PRESET))
+ var/new_preset = input(user, "Choose your character's body color preset:", "Character Preference", rgb(pref.r_skin, pref.g_skin, pref.b_skin)) as null|anything in mob_species.character_color_presets
+ new_preset = mob_species.character_color_presets[new_preset]
+ pref.r_skin = GetRedPart(new_preset)
+ pref.g_skin = GetGreenPart(new_preset)
+ pref.b_skin = GetBluePart(new_preset)
return TOPIC_REFRESH
else if(href_list["facial_style"])
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7e3f4408d8d..fc58328af30 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -55,9 +55,9 @@ datum/preferences
var/b_facial = 0 //Face hair color
var/s_tone = 0 //Skin tone
var/skin_colour = "#000000" //Skin colour hex value, for SQL loading
- var/r_skin = 0 //Skin color
- var/g_skin = 0 //Skin color
- var/b_skin = 0 //Skin color
+ var/r_skin = 37 //Skin color
+ var/g_skin = 3 //Skin color
+ var/b_skin = 2 //Skin color
var/eyes_colour = "#000000" //Eye colour hex value, for SQL loading
var/r_eyes = 0 //Eye color
var/g_eyes = 0 //Eye color
diff --git a/code/modules/mob/abstract/new_player/preferences_setup.dm b/code/modules/mob/abstract/new_player/preferences_setup.dm
index 18f0e7a327e..a9281d46e80 100644
--- a/code/modules/mob/abstract/new_player/preferences_setup.dm
+++ b/code/modules/mob/abstract/new_player/preferences_setup.dm
@@ -1,197 +1,204 @@
-datum/preferences
+/datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
- proc/randomize_appearance_for(var/mob/living/carbon/human/H,var/random_gender=TRUE)
- if(random_gender)
- gender = pick(MALE, FEMALE)
- else
- gender = H.gender
- var/datum/species/current_species = all_species[species]
+/datum/preferences/proc/randomize_appearance_for(var/mob/living/carbon/human/H,var/random_gender=TRUE)
+ if(random_gender)
+ gender = pick(MALE, FEMALE)
+ else
+ gender = H.gender
+ var/datum/species/current_species = all_species[species]
- if(current_species)
- if(current_species.appearance_flags & HAS_SKIN_TONE)
- s_tone = random_skin_tone()
- if(current_species.appearance_flags & HAS_EYE_COLOR)
- randomize_eyes_color()
- if(current_species.appearance_flags & HAS_SKIN_COLOR)
- randomize_skin_color()
- if(current_species.appearance_flags & HAS_UNDERWEAR)
- if(gender == FEMALE)
- underwear = underwear_f[pick(underwear_f)]
- else
- underwear = underwear_m[pick(underwear_m)]
- undershirt = undershirt_t[pick(undershirt_t)]
- if(current_species.appearance_flags & HAS_SOCKS)
- if(gender == FEMALE)
- socks = socks_f[pick(socks_f)]
- else
- socks = socks_m[pick(socks_m)]
+ if(current_species)
+ if(current_species.appearance_flags & HAS_SKIN_TONE)
+ s_tone = random_skin_tone()
+ if(current_species.appearance_flags & HAS_EYE_COLOR)
+ randomize_eyes_color()
+ if(current_species.appearance_flags & HAS_SKIN_COLOR)
+ randomize_skin_color(current_species)
+ if(current_species.appearance_flags & HAS_UNDERWEAR)
+ if(gender == FEMALE)
+ underwear = underwear_f[pick(underwear_f)]
+ else
+ underwear = underwear_m[pick(underwear_m)]
+ undershirt = undershirt_t[pick(undershirt_t)]
+ if(current_species.appearance_flags & HAS_SOCKS)
+ if(gender == FEMALE)
+ socks = socks_f[pick(socks_f)]
+ else
+ socks = socks_m[pick(socks_m)]
- h_style = random_hair_style(gender, species)
- f_style = random_facial_hair_style(gender, species)
- randomize_hair_color("hair")
- randomize_hair_color("facial")
+ h_style = random_hair_style(gender, species)
+ f_style = random_facial_hair_style(gender, species)
+ randomize_hair_color("hair")
+ randomize_hair_color("facial")
- backbag = 2
- age = rand(getMinAge(),getMaxAge())
- if(H)
- copy_to(H,1)
+ backbag = 2
+ age = rand(getMinAge(),getMaxAge())
+ if(H)
+ copy_to(H,1)
- proc/randomize_hair_color(var/target = "hair")
- if(prob (75) && target == "facial") // Chance to inherit hair color
- r_facial = r_hair
- g_facial = g_hair
- b_facial = b_hair
- return
+/datum/preferences/proc/randomize_hair_color(var/target = "hair")
+ if(prob (75) && target == "facial") // Chance to inherit hair color
+ r_facial = r_hair
+ g_facial = g_hair
+ b_facial = b_hair
+ return
- var/red
- var/green
- var/blue
+ var/red
+ var/green
+ var/blue
- var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
- switch(col)
- if("blonde")
- red = 255
- green = 255
- blue = 0
- if("black")
- red = 0
- green = 0
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 51
- if("copper")
- red = 255
- green = 153
- blue = 0
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("wheat")
- red = 255
- green = 255
- blue = 153
- if("old")
- red = rand (100, 255)
- green = red
- blue = red
- if("punk")
- red = rand (0, 255)
- green = rand (0, 255)
- blue = rand (0, 255)
+ var/col = pick ("blonde", "black", "chestnut", "copper", "brown", "wheat", "old", "punk")
+ switch(col)
+ if("blonde")
+ red = 255
+ green = 255
+ blue = 0
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 51
+ if("copper")
+ red = 255
+ green = 153
+ blue = 0
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("wheat")
+ red = 255
+ green = 255
+ blue = 153
+ if("old")
+ red = rand (100, 255)
+ green = red
+ blue = red
+ if("punk")
+ red = rand (0, 255)
+ green = rand (0, 255)
+ blue = rand (0, 255)
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
+ red = max(min(red + rand (-25, 25), 255), 0)
+ green = max(min(green + rand (-25, 25), 255), 0)
+ blue = max(min(blue + rand (-25, 25), 255), 0)
- switch(target)
- if("hair")
- r_hair = red
- g_hair = green
- b_hair = blue
- if("facial")
- r_facial = red
- g_facial = green
- b_facial = blue
+ switch(target)
+ if("hair")
+ r_hair = red
+ g_hair = green
+ b_hair = blue
+ if("facial")
+ r_facial = red
+ g_facial = green
+ b_facial = blue
- proc/randomize_eyes_color()
- var/red
- var/green
- var/blue
+/datum/preferences/proc/randomize_eyes_color()
+ var/red
+ var/green
+ var/blue
- var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
- switch(col)
- if("black")
- red = 0
- green = 0
- blue = 0
- if("grey")
- red = rand (100, 200)
- green = red
- blue = red
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 0
- if("blue")
- red = 51
- green = 102
- blue = 204
- if("lightblue")
- red = 102
- green = 204
- blue = 255
- if("green")
- red = 0
- green = 102
- blue = 0
- if("albino")
- red = rand (200, 255)
- green = rand (0, 150)
- blue = rand (0, 150)
+ var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
+ switch(col)
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("grey")
+ red = rand (100, 200)
+ green = red
+ blue = red
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 0
+ if("blue")
+ red = 51
+ green = 102
+ blue = 204
+ if("lightblue")
+ red = 102
+ green = 204
+ blue = 255
+ if("green")
+ red = 0
+ green = 102
+ blue = 0
+ if("albino")
+ red = rand (200, 255)
+ green = rand (0, 150)
+ blue = rand (0, 150)
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
+ red = max(min(red + rand (-25, 25), 255), 0)
+ green = max(min(green + rand (-25, 25), 255), 0)
+ blue = max(min(blue + rand (-25, 25), 255), 0)
- r_eyes = red
- g_eyes = green
- b_eyes = blue
+ r_eyes = red
+ g_eyes = green
+ b_eyes = blue
- proc/randomize_skin_color()
- var/red
- var/green
- var/blue
+/datum/preferences/proc/randomize_skin_color(var/datum/species/current_species)
+ var/red
+ var/green
+ var/blue
- var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
- switch(col)
- if("black")
- red = 0
- green = 0
- blue = 0
- if("grey")
- red = rand (100, 200)
- green = red
- blue = red
- if("brown")
- red = 102
- green = 51
- blue = 0
- if("chestnut")
- red = 153
- green = 102
- blue = 0
- if("blue")
- red = 51
- green = 102
- blue = 204
- if("lightblue")
- red = 102
- green = 204
- blue = 255
- if("green")
- red = 0
- green = 102
- blue = 0
- if("albino")
- red = rand (200, 255)
- green = rand (0, 150)
- blue = rand (0, 150)
+ if(current_species && current_species.appearance_flags & HAS_SKIN_PRESET)
+ var/hex = pick(current_species.character_color_presets)
+ r_skin = GetRedPart(hex)
+ g_skin = GetGreenPart(hex)
+ b_skin = GetBluePart(hex)
+ return
- red = max(min(red + rand (-25, 25), 255), 0)
- green = max(min(green + rand (-25, 25), 255), 0)
- blue = max(min(blue + rand (-25, 25), 255), 0)
+ var/col = pick ("black", "grey", "brown", "chestnut", "blue", "lightblue", "green", "albino")
+ switch(col)
+ if("black")
+ red = 0
+ green = 0
+ blue = 0
+ if("grey")
+ red = rand (100, 200)
+ green = red
+ blue = red
+ if("brown")
+ red = 102
+ green = 51
+ blue = 0
+ if("chestnut")
+ red = 153
+ green = 102
+ blue = 0
+ if("blue")
+ red = 51
+ green = 102
+ blue = 204
+ if("lightblue")
+ red = 102
+ green = 204
+ blue = 255
+ if("green")
+ red = 0
+ green = 102
+ blue = 0
+ if("albino")
+ red = rand (200, 255)
+ green = rand (0, 150)
+ blue = rand (0, 150)
- r_skin = red
- g_skin = green
- b_skin = blue
+ red = max(min(red + rand (-25, 25), 255), 0)
+ green = max(min(green + rand (-25, 25), 255), 0)
+ blue = max(min(blue + rand (-25, 25), 255), 0)
+
+ r_skin = red
+ g_skin = green
+ b_skin = blue
/datum/preferences/proc/dress_preview_mob(var/mob/living/carbon/human/mannequin)
@@ -238,6 +245,9 @@ datum/preferences
/datum/preferences/proc/update_preview_icon()
var/mob/living/carbon/human/dummy/mannequin/mannequin = SSmob.get_mannequin(client.ckey)
mannequin.delete_inventory(TRUE)
+ mannequin.species.create_organs(mannequin)
+ if(gender)
+ mannequin.change_gender(gender)
dress_preview_mob(mannequin)
preview_icon = icon('icons/effects/effects.dmi', "nothing")
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index ab5b2b5f06d..d13211bc9c1 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -22,9 +22,10 @@
return
src.gender = gender
+ dna.SetUIState(DNA_UI_GENDER, src.gender != MALE, 1)
reset_hair()
update_body()
- update_dna()
+ species.create_organs(src)
return 1
/mob/living/carbon/human/proc/change_hair(var/hair_style)
@@ -112,7 +113,7 @@
return 1
/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue)
- if(red == r_skin && green == g_skin && blue == b_skin || !(species.appearance_flags & HAS_SKIN_COLOR))
+ if((red == r_skin && green == g_skin && blue == b_skin) || !((species.appearance_flags & HAS_SKIN_COLOR) && (species.appearance_flags & HAS_SKIN_PRESET)))
return
r_skin = red
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 59ff3b11fe3..8b6aa777d49 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -212,6 +212,7 @@
var/list/allowed_religions = list(RELIGION_NONE, RELIGION_OTHER, RELIGION_CHRISTIANITY, RELIGION_ISLAM, RELIGION_JUDAISM, RELIGION_HINDU, RELIGION_BUDDHISM, RELIGION_MOROZ, RELIGION_TRINARY)
var/zombie_type //What zombie species they become
+ var/list/character_color_presets
/datum/species/proc/get_eyes(var/mob/living/carbon/human/H)
return
diff --git a/code/modules/mob/living/carbon/human/species/station/human/human.dm b/code/modules/mob/living/carbon/human/species/station/human/human.dm
index 31700054c0e..c186cfec836 100644
--- a/code/modules/mob/living/carbon/human/species/station/human/human.dm
+++ b/code/modules/mob/living/carbon/human/species/station/human/human.dm
@@ -25,7 +25,7 @@
name_language = null // Use the first-name last-name generator rather than a language scrambler
mob_size = 9
spawn_flags = CAN_JOIN
- appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR | HAS_SOCKS
+ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR | HAS_SOCKS | HAS_SKIN_PRESET
remains_type = /obj/effect/decal/remains/human
stamina = 130 // Humans can sprint for longer than any other species
@@ -38,4 +38,6 @@
inherent_verbs = list(
/mob/living/carbon/human/proc/tie_hair)
- zombie_type = "Zombie"
\ No newline at end of file
+ zombie_type = "Zombie"
+ base_color = "#25032"
+ character_color_presets = list("Dark" = "#000000", "Warm" = "#250302", "Cold" = "#1e1e29")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
index d2ed0714780..b2d3143fcc3 100644
--- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
+++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm
@@ -43,7 +43,7 @@
"Your synthetic flesh crawls in the heat, swelling into a disgusting morass of plastic."
)
- appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_FBP | HAS_UNDERWEAR | HAS_SOCKS
+ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_FBP | HAS_UNDERWEAR | HAS_SOCKS | HAS_SKIN_PRESET
has_limbs = list(
"chest" = list("path" = /obj/item/organ/external/chest/shell),
@@ -59,6 +59,9 @@
"r_foot" = list("path" = /obj/item/organ/external/foot/right/shell)
)
+ base_color = "#25032"
+ character_color_presets = list("Dark" = "#000000", "Warm" = "#250302", "Cold" = "#1e1e29")
+
sprint_temperature_factor = 1.3
sprint_charge_factor = 0.85
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 50e66a0a12b..bf3a34982ed 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -34,9 +34,9 @@
return 1
if(href_list["skin_tone"])
if(can_change_skin_tone())
- var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -owner.s_tone + 35) as num|null
+ var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 30 - 220 Dark)", "Skin Tone", -owner.s_tone + 35) as num|null
if(isnum(new_s_tone) && can_still_topic(state))
- new_s_tone = 35 - max(min( round(new_s_tone), 220),1)
+ new_s_tone = 35 - max(min( round(new_s_tone), 220),30)
return owner.change_skin_tone(new_s_tone)
if(href_list["skin_color"])
if(can_change_skin_color())
@@ -48,6 +48,16 @@
if(owner.change_skin_color(r_skin, g_skin, b_skin))
update_dna()
return 1
+ if(href_list["skin_preset"])
+ if(can_change_skin_preset())
+ var/new_preset = input(usr, "Choose your character's body color preset:", "Character Preference", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as null|anything in owner.species.character_color_presets
+ if(new_preset && can_still_topic(state))
+ var/r_skin = GetRedPart(new_preset)
+ var/g_skin = GetGreenPart(new_preset)
+ var/b_skin = GetBluePart(new_preset)
+ if(owner.change_skin_color(r_skin, g_skin, b_skin))
+ update_dna()
+ return 1
if(href_list["hair"])
if(can_change(APPEARANCE_HAIR) && (href_list["hair"] in valid_hairstyles))
if(owner.change_hair(href_list["hair"]))
@@ -110,6 +120,7 @@
data["change_gender"] = can_change(APPEARANCE_GENDER)
data["change_skin_tone"] = can_change_skin_tone()
data["change_skin_color"] = can_change_skin_color()
+ data["change_skin_preset"] = can_change_skin_preset()
data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR)
data["change_hair"] = can_change(APPEARANCE_HAIR)
if(data["change_hair"])
@@ -149,6 +160,9 @@
/datum/nano_module/appearance_changer/proc/can_change_skin_color()
return owner && (flags & APPEARANCE_SKIN) && owner.species.appearance_flags & HAS_SKIN_COLOR
+/datum/nano_module/appearance_changer/proc/can_change_skin_preset()
+ return owner && (flags & APPEARANCE_SKIN) && owner.species.appearance_flags & HAS_SKIN_PRESET
+
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
valid_facial_hairstyles.Cut()
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 20138e11e76..46f028e602c 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -21,7 +21,7 @@
return
if(!isnull(human.s_tone) && (human.species.appearance_flags & HAS_SKIN_TONE))
s_tone = human.s_tone
- if(human.species.appearance_flags & HAS_SKIN_COLOR)
+ if((human.species.appearance_flags & HAS_SKIN_COLOR) || (human.species.appearance_flags & HAS_SKIN_PRESET))
skin_color = rgb(human.r_skin, human.g_skin, human.b_skin)
hair_color = rgb(human.r_hair, human.g_hair, human.b_hair)
@@ -33,7 +33,7 @@
return
if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.appearance_flags & HAS_SKIN_TONE))
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
- if(species.appearance_flags & HAS_SKIN_COLOR)
+ if((species.appearance_flags & HAS_SKIN_COLOR) || (species.appearance_flags & HAS_SKIN_PRESET))
skin_color = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
hair_color = rgb(dna.GetUIValue(DNA_UI_HAIR_R),dna.GetUIValue(DNA_UI_HAIR_G),dna.GetUIValue(DNA_UI_HAIR_B))
@@ -150,13 +150,15 @@
mob_icon.ColorTone(rgb(10,50,0))
mob_icon.SetIntensity(0.7)
+ if(skin_color)
+ mob_icon.Blend(skin_color, ICON_ADD)
+
if(!isnull(s_tone))
if(s_tone >= 0)
mob_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD)
else
mob_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- else if(skin_color)
- mob_icon.Blend(skin_color, ICON_ADD)
+
apply_markings()
diff --git a/html/changelogs/mattatlaspoze-newhumansprites.yml b/html/changelogs/mattatlaspoze-newhumansprites.yml
new file mode 100644
index 00000000000..a3a0b1c3e53
--- /dev/null
+++ b/html/changelogs/mattatlaspoze-newhumansprites.yml
@@ -0,0 +1,41 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: PoZe, MattAtlas
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "New human sprites! Your characters will be grey until you select a preset. Please send all feedback regarding human colors to MattAtlas#6970. This is brought to you mainly by PoZe, who did most of the work."
diff --git a/icons/mob/human_races/human/human_preview.dmi b/icons/mob/human_races/human/human_preview.dmi
index 961c062c2b2..1d5051bcfa7 100644
Binary files a/icons/mob/human_races/human/human_preview.dmi and b/icons/mob/human_races/human/human_preview.dmi differ
diff --git a/icons/mob/human_races/human/r_def_human.dmi b/icons/mob/human_races/human/r_def_human.dmi
index e622ef14b5a..3daedac6633 100644
Binary files a/icons/mob/human_races/human/r_def_human.dmi and b/icons/mob/human_races/human/r_def_human.dmi differ
diff --git a/icons/mob/human_races/human/r_human.dmi b/icons/mob/human_races/human/r_human.dmi
index 5724355bf1c..d870164d383 100644
Binary files a/icons/mob/human_races/human/r_human.dmi and b/icons/mob/human_races/human/r_human.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index bb283f245ba..bdb31c67be5 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -35,7 +35,10 @@
{{if data.change_skin_tone}}
{{:helper.link('Change skin tone', null, { 'skin_tone' : 1})}}
{{/if}}
- {{if data.change_skin_color}}
+ {{if data.change_skin_preset}}
+ {{:helper.link('Change skin preset', null, { 'skin_preset' : 1})}}
+ {{/if}}
+ {{if data.change_skin_color && !data.change_skin_preset}}
{{:helper.link('Change skin color', null, { 'skin_color' : 1})}}
{{/if}}
{{if data.change_hair_color}}