diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 890efe66fc0..b7621500e3a 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -32,7 +32,7 @@
to_chat(user, "You are not capable of wearing underwear.")
return
- var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Undershirt","Socks")
+ var/choice = input(user, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in list("Underwear","Underwear Color","Undershirt","Socks")
if(!Adjacent(user))
return
@@ -41,7 +41,10 @@
var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in GLOB.underwear_list
if(new_undies)
H.underwear = new_undies
-
+ if("Underwear Color")
+ var/new_underwear_color = input(H, "Choose your underwear color", "Underwear Color","#"+H.underwear_color) as color|null
+ if(new_underwear_color)
+ H.underwear_color = sanitize_hexcolor(new_underwear_color)
if("Undershirt")
var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in GLOB.undershirt_list
if(new_undershirt)
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 90749af01e1..61eefeb7721 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -15,6 +15,7 @@
H.real_name = random_unique_name(H.gender)
H.name = H.real_name
H.underwear = random_underwear(H.gender)
+ H.underwear_color = random_short_color()
H.skin_tone = random_skin_tone()
H.hair_style = random_hair_style(H.gender)
H.facial_hair_style = random_facial_hair_style(H.gender)
@@ -36,4 +37,4 @@
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 85193b8fefc..aa589bced19 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -55,6 +55,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character
var/underwear = "Nude" //underwear type
+ var/underwear_color = "000" //underwear color
var/undershirt = "Nude" //undershirt type
var/socks = "Nude" //socks type
var/backbag = DBACKPACK //backpack type
@@ -229,6 +230,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Always Random Species: [be_random_species ? "Yes" : "No"]
"
dat += "Underwear:
[underwear]
"
+ dat += "Underwear Color:
Change
"
dat += "Undershirt:
[undershirt]
"
dat += "Socks:
[socks]
"
dat += "Backpack:
[backbag]
"
@@ -1023,6 +1025,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
facial_hair_style = random_facial_hair_style(gender)
if("underwear")
underwear = random_underwear(gender)
+ if("underwear_color")
+ underwear_color = random_short_color()
if("undershirt")
undershirt = random_undershirt(gender)
if("socks")
@@ -1165,6 +1169,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_underwear)
underwear = new_underwear
+ if("underwear_color")
+ var/new_underwear_color = input(user, "Choose your character's underwear color:", "Character Preference","#"+underwear_color) as color|null
+ if(new_underwear_color)
+ underwear_color = sanitize_hexcolor(new_underwear_color)
+
if("undershirt")
var/new_undershirt
if(gender == MALE)
@@ -1560,6 +1569,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
character.hair_style = hair_style
character.facial_hair_style = facial_hair_style
character.underwear = underwear
+ character.underwear_color = underwear_color
character.undershirt = undershirt
character.socks = socks
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index ffb4ac14320..6d4306f4403 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 23
+#define SAVEFILE_VERSION_MAX 24
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -109,6 +109,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks -= "Physically Obstructive"
all_quirks -= "Neat"
all_quirks -= "NEET"
+ if(current_version < 24)
+ if (!(underwear in GLOB.underwear_list))
+ underwear = "Nude"
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
@@ -293,6 +296,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["hair_style_name"] >> hair_style
S["facial_style_name"] >> facial_hair_style
S["underwear"] >> underwear
+ S["underwear_color"] >> underwear_color
S["undershirt"] >> undershirt
S["socks"] >> socks
S["backbag"] >> backbag
@@ -380,6 +384,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, 3, 0)
facial_hair_color = sanitize_hexcolor(facial_hair_color, 3, 0)
+ underwear_color = sanitize_hexcolor(underwear_color, 3, 0)
eye_color = sanitize_hexcolor(eye_color, 3, 0)
skin_tone = sanitize_inlist(skin_tone, GLOB.skin_tones)
backbag = sanitize_inlist(backbag, GLOB.backbaglist, initial(backbag))
@@ -433,6 +438,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["hair_style_name"] , hair_style)
WRITE_FILE(S["facial_style_name"] , facial_hair_style)
WRITE_FILE(S["underwear"] , underwear)
+ WRITE_FILE(S["underwear_color"] , underwear_color)
WRITE_FILE(S["undershirt"] , undershirt)
WRITE_FILE(S["socks"] , socks)
WRITE_FILE(S["backbag"] , backbag)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index 8eee4d75418..abea88c4213 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -6,6 +6,7 @@
else
gender = pick(MALE,FEMALE)
underwear = random_underwear(gender)
+ underwear_color = random_short_color()
undershirt = random_undershirt(gender)
socks = random_socks()
skin_tone = random_skin_tone()
diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm
index 0b8a9d92850..782923ace04 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -52,6 +52,7 @@
var/name //the preview name of the accessory
var/gender = NEUTER //Determines if the accessory will be skipped or included in random hair generations
var/gender_specific //Something that can be worn by either gender, but looks different on each
+ var/use_static //determines if the accessory will be skipped by color preferences
var/color_src = MUTCOLORS //Currently only used by mutantparts so don't worry about hair and stuff. This is the source that this accessory will get its color from. Default is MUTCOLOR, but can also be HAIR, FACEHAIR, EYECOLOR and 0 if none.
var/hasinner //Decides if this sprite has an "inner" part, such as the fleshy parts on ears.
var/locked = FALSE //Is this part locked from roundstart selection? Used for parts that apply effects
@@ -944,62 +945,26 @@
///////////////////////////
// Underwear Definitions //
///////////////////////////
+
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
+ use_static = FALSE
+
+//MALE UNDERWEAR
/datum/sprite_accessory/underwear/nude
name = "Nude"
icon_state = null
gender = NEUTER
-/datum/sprite_accessory/underwear/male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
+/datum/sprite_accessory/underwear/male_briefs
+ name = "Men's Briefs"
+ icon_state = "male_briefs"
gender = MALE
-/datum/sprite_accessory/underwear/male_black
- name = "Men's Black"
- icon_state = "male_black"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_blackalt
- name = "Men's Black Boxer"
- icon_state = "male_blackalt"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_blue
- name = "Men's Blue"
- icon_state = "male_blue"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_green
- name = "Men's Green"
- icon_state = "male_green"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_grey
- name = "Men's Grey"
- icon_state = "male_grey"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_greyalt
- name = "Men's Grey Boxer"
- icon_state = "male_greyalt"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_hearts
- name = "Men's Hearts Boxer"
- icon_state = "male_hearts"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_kinky
- name = "Men's Kinky"
- icon_state = "male_kinky"
- gender = MALE
-
-/datum/sprite_accessory/underwear/male_red
- name = "Men's Red"
- icon_state = "male_red"
+/datum/sprite_accessory/underwear/male_boxers
+ name = "Men's Boxer"
+ icon_state = "male_boxers"
gender = MALE
/datum/sprite_accessory/underwear/male_stripe
@@ -1007,109 +972,60 @@
icon_state = "male_stripe"
gender = MALE
+/datum/sprite_accessory/underwear/male_kinky
+ name = "Men's Kinky"
+ icon_state = "male_kinky"
+ gender = MALE
+
+/datum/sprite_accessory/underwear/male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
+ gender = MALE
+
+/datum/sprite_accessory/underwear/male_hearts
+ name = "Men's Hearts Boxer"
+ icon_state = "male_hearts"
+ gender = MALE
+ use_static = TRUE
+
/datum/sprite_accessory/underwear/male_commie
name = "Men's Striped Commie Boxer"
icon_state = "male_commie"
gender = MALE
+ use_static = TRUE
/datum/sprite_accessory/underwear/male_usastripe
name = "Men's Striped Freedom Boxer"
icon_state = "male_assblastusa"
gender = MALE
+ use_static = TRUE
/datum/sprite_accessory/underwear/male_uk
name = "Men's Striped UK Boxer"
icon_state = "male_uk"
gender = MALE
+ use_static = TRUE
-/datum/sprite_accessory/underwear/male_white
- name = "Men's White"
- icon_state = "male_white"
- gender = MALE
-/datum/sprite_accessory/underwear/female_babydoll
- name = "Babydoll"
- icon_state = "female_babydoll"
+//FEMALE UNDERWEAR
+/datum/sprite_accessory/underwear/female_bikini
+ name = "Ladies' Bikini"
+ icon_state = "female_bikini"
gender = FEMALE
-/datum/sprite_accessory/underwear/female_babyblue
- name = "Ladies' Baby-Blue"
- icon_state = "female_babyblue"
+/datum/sprite_accessory/underwear/female_lace
+ name = "Ladies' Lace"
+ icon_state = "female_lace"
gender = FEMALE
-/datum/sprite_accessory/underwear/female_black
- name = "Ladies' Black"
- icon_state = "female_black"
+/datum/sprite_accessory/underwear/female_bralette
+ name = "Ladies' Bralette"
+ icon_state = "female_bralette"
gender = FEMALE
-/datum/sprite_accessory/underwear/female_black_neko
- name = "Ladies' Black Neko"
- icon_state = "female_neko_black"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_blackalt
- name = "Ladies' Black Sport"
- icon_state = "female_blackalt"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_blue
- name = "Ladies' Blue"
- icon_state = "female_blue"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_commie
- name = "Ladies' Commie"
- icon_state = "female_commie"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_usastripe
- name = "Ladies' Freedom"
- icon_state = "female_assblastusa"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_green
- name = "Ladies' Green"
- icon_state = "female_green"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_kinky
- name = "Ladies' Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_pink
- name = "Ladies' Pink"
- icon_state = "female_pink"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/female_red
- name = "Ladies' Red"
- icon_state = "female_red"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit
- name = "Ladies' Swimsuit (Black)"
- icon_state = "swim_black"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_blue
- name = "Ladies' Swimsuit (Blue)"
- icon_state = "swim_blue"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_green
- name = "Ladies' Swimsuit (Green)"
- icon_state = "swim_green"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_purple
- name = "Ladies' Swimsuit (Purple)"
- icon_state = "swim_purple"
- gender = FEMALE
-
-/datum/sprite_accessory/underwear/swimsuit_red
- name = "Ladies' Swimsuit (Red)"
- icon_state = "swim_red"
+/datum/sprite_accessory/underwear/female_sport
+ name = "Ladies' Sport"
+ icon_state = "female_sport"
gender = FEMALE
/datum/sprite_accessory/underwear/female_thong
@@ -1117,30 +1033,76 @@
icon_state = "female_thong"
gender = FEMALE
-/datum/sprite_accessory/underwear/female_uk
- name = "Ladies' UK"
- icon_state = "female_uk"
+/datum/sprite_accessory/underwear/female_strapless
+ name = "Ladies' Strapless"
+ icon_state = "female_strapless"
gender = FEMALE
-/datum/sprite_accessory/underwear/female_white
- name = "Ladies' White"
- icon_state = "female_white"
+/datum/sprite_accessory/underwear/female_babydoll
+ name = "Babydoll"
+ icon_state = "female_babydoll"
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/swimsuit_onepiece
+ name = "Ladies' One Piece Swimsuit"
+ icon_state = "swim_onepiece"
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/swimsuit_strapless_onepiece
+ name = "Ladies' Strapless One Piece Swimsuit"
+ icon_state = "swim_strapless_onepiece"
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/swimsuit_twopiece
+ name = "Ladies' Two Piece Swimsuit"
+ icon_state = "swim_twopiece"
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/swimsuit_strapless_twopiece
+ name = "Ladies' Strapless Two Piece Swimsuit"
+ icon_state = "swim_strapless_twopiece"
+ gender = FEMALE
+
+/datum/sprite_accessory/underwear/swimsuit_stripe
+ name = "Ladies' Stripe Swimsuit"
+ icon_state = "swim_stripe"
gender = FEMALE
/datum/sprite_accessory/underwear/female_white_neko
name = "Ladies' White Neko"
icon_state = "female_neko_white"
gender = FEMALE
+ use_static = TRUE
-/datum/sprite_accessory/underwear/female_whitealt
- name = "Ladies' White Sport"
- icon_state = "female_whitealt"
+/datum/sprite_accessory/underwear/female_black_neko
+ name = "Ladies' Black Neko"
+ icon_state = "female_neko_black"
gender = FEMALE
+ use_static = TRUE
-/datum/sprite_accessory/underwear/female_yellow
- name = "Ladies' Yellow"
- icon_state = "female_yellow"
+/datum/sprite_accessory/underwear/female_commie
+ name = "Ladies' Commie"
+ icon_state = "female_commie"
gender = FEMALE
+ use_static = TRUE
+
+/datum/sprite_accessory/underwear/female_usastripe
+ name = "Ladies' Freedom"
+ icon_state = "female_assblastusa"
+ gender = FEMALE
+ use_static = TRUE
+
+/datum/sprite_accessory/underwear/female_uk
+ name = "Ladies' UK"
+ icon_state = "female_uk"
+ gender = FEMALE
+ use_static = TRUE
+
+/datum/sprite_accessory/underwear/female_kinky
+ name = "Ladies' Kinky"
+ icon_state = "female_kinky"
+ gender = FEMALE
+ use_static = TRUE
////////////////////////////
// Undershirt Definitions //
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 2351c629510..48b435baca0 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -25,6 +25,7 @@
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
+ var/underwear_color = "000"
var/undershirt = "Nude" //Which undershirt the player wants
var/socks = "Nude" //Which socks the player wants
var/backbag = DBACKPACK //Which backpack type the player has chosen.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index f56b53d4bec..91c0486f70a 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -502,8 +502,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!(NO_UNDERWEAR in species_traits))
if(H.underwear)
var/datum/sprite_accessory/underwear/underwear = GLOB.underwear_list[H.underwear]
+ var/mutable_appearance/underwear_overlay
if(underwear)
- standing += mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
+ underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER)
+ if(!underwear.use_static)
+ underwear_overlay.color = "#" + H.underwear_color
+ standing += underwear_overlay
if(H.undershirt)
var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[H.undershirt]
diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi
index c08805567f2..8d891e9e583 100644
Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ