diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 7d46553be1..bc85cc3ddf 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -105,7 +105,7 @@
"mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"mcolor2" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"mcolor3" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
- "tail_lizard" = pick(GLOB.tails_list_lizard),
+ "tail_lizard" = "None",
"tail_human" = "None",
"wings" = "None",
"snout" = pick(GLOB.snouts_list),
@@ -118,9 +118,9 @@
"caps" = pick(GLOB.caps_list),
"moth_wings" = pick(GLOB.moth_wings_list),
"taur" = "None",
- "mam_body_markings" = "wolf",
- "mam_ears" = "wolf",
- "mam_tail" = "wolf",
+ "mam_body_markings" = "None",
+ "mam_ears" = "None",
+ "mam_tail" = "None",
"mam_tail_animated" = "None",
"xenodorsal" = "standard",
"xenohead" = "standard",
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 4e78cb8814..9199bd7051 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -9,8 +9,6 @@
GLOBAL_LIST_EMPTY(preferences_datums)
-
-
/datum/preferences
var/client/parent
//doohickeys for savefiles
@@ -167,9 +165,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/dat = list("
")
dat += "Character Settings"
- dat += "Game Preferences"
dat += "Character Appearance"
dat += "Loadout"
+ dat += "Game Preferences"
+
if(!path)
dat += "Please create an account to save your preferences
"
@@ -236,24 +235,28 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
-// CITADEL EDIT - ALL OF THESE ARE HANDLED IN THE MODULAR VERSION, TAB 2
- /* dat += "Body
"
- dat += "Random Body "
- dat += "Always Random Body: [be_random_body ? "Yes" : "No"]
"
-
- dat += ""
-
- dat += "Species: [pref_species.name] "
-
- dat += "Underwear: [underwear] "
- dat += "Undershirt: [undershirt] "
- dat += "Socks: [socks] "
- dat += "Backpack: [backbag] "
- dat += "Uplink Spawn Location: [uplink_spawn_loc]
| "
+ //Character Appearance
+ if(2)
+ update_preview_icon(nude=TRUE)
+ user << browse_rsc(preview_icon, "previewicon.png")
+ dat += ""
+ dat += ""
+ dat += "Set Flavor Text "
+ if(lentext(features["flavor_text"]) <= 40)
+ if(!lentext(features["flavor_text"]))
+ dat += "\[...\]"
+ else
+ dat += "[features["flavor_text"]]"
+ else
+ dat += "[TextPreview(features["flavor_text"])]... "
+ dat += "Body"
+ dat += "Gender: [gender == MALE ? "Male" : "Female"] "
+ dat += "Species:[pref_species.id] "
+ dat += "Random Body "
+ dat += "Always Random Body: [be_random_body ? "Yes" : "No"] "
var/use_skintones = pref_species.use_skintones
if(use_skintones)
-
dat += APPEARANCE_CATEGORY_COLUMN
dat += "Skin Tone"
@@ -262,14 +265,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/mutant_colors
if((MUTCOLORS in pref_species.species_traits) || (MUTCOLORS_PARTSONLY in pref_species.species_traits))
-
if(!use_skintones)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Mutant Color"
-
- dat += " Change "
-
+ dat += "Body Colors "
+ dat += "Primary Color: Change "
+ dat += "Secondary Color: Change "
+ dat += "Tertiary Color: Change "
mutant_colors = TRUE
if((EYECOLOR in pref_species.species_traits) && !(NOEYES in pref_species.species_traits))
@@ -302,7 +304,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += " Change "
dat += " | "
-
//Mutant stuff
var/mutant_category = 0
@@ -319,6 +320,30 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
+ if("mam_tail" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Tail
"
+
+ dat += "[features["mam_tail"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("tail_human" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Tail
"
+
+ dat += "[features["tail_human"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
if("snout" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -331,7 +356,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
-
if("horns" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -343,8 +367,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
- mutant_category = 0
-
if("frills" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -383,46 +405,30 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
-
- if("legs" in pref_species.default_features)
+ if("mam_body_markings" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
- dat += "Legs
"
+ dat += "Species Markings
"
- dat += "[features["legs"]]
"
+ dat += "[features["mam_body_markings"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+
+ if("mam_ears" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Ears
"
+
+ dat += "[features["mam_ears"]]
"
mutant_category++
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
-
- if("moth_wings" in pref_species.default_features)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Moth wings
"
-
- dat += "[features["moth_wings"]]
"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
- if("tail_human" in pref_species.default_features)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
-
- dat += "Tail
"
-
- dat += "[features["tail_human"]]
"
-
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
-
if("ears" in pref_species.default_features)
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -435,27 +441,166 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(mutant_category >= MAX_MUTANT_ROWS)
dat += ""
mutant_category = 0
+ if("legs" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
- if(CONFIG_GET(flag/join_with_mutant_humans))
+ dat += "Legs
"
- if("wings" in pref_species.default_features && GLOB.r_wings_list.len >1)
- if(!mutant_category)
- dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "[features["legs"]]
"
- dat += "Wings
"
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("moth_wings" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
- dat += "[features["wings"]]
"
+ dat += "Moth wings
"
- mutant_category++
- if(mutant_category >= MAX_MUTANT_ROWS)
- dat += ""
- mutant_category = 0
+ dat += "[features["moth_wings"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("taur" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Tauric Body
"
+
+ dat += "[features["taur"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("wings" in pref_species.mutant_bodyparts && GLOB.r_wings_list.len >1)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Wings
"
+
+ dat += "[features["wings"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("xenohead" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Caste Head
"
+
+ dat += "[features["xenohead"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("xenotail" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Tail
"
+
+ dat += "[features["xenotail"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("xenodorsal" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Dorsal Spines
"
+
+ dat += "[features["xenodorsal"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("ipc_screen" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Screen
"
+
+ dat += "[features["ipc_screen"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
+ if("ipc_antenna" in pref_species.default_features)
+ if(!mutant_category)
+ dat += APPEARANCE_CATEGORY_COLUMN
+
+ dat += "Antenna
"
+
+ dat += "[features["ipc_antenna"]]
"
+
+ mutant_category++
+ if(mutant_category >= MAX_MUTANT_ROWS)
+ dat += ""
+ mutant_category = 0
if(mutant_category)
dat += ""
mutant_category = 0
- dat += "
"*/
+ dat += "
"
+
+ dat += ""
+
+ dat += "Clothing & Equipment"
+
+ dat += "Underwear:[underwear] "
+ dat += "Undershirt:[undershirt] "
+ dat += "Socks:[socks] "
+ dat += "Backpack:[backbag] "
+ dat += "Uplink Location:[uplink_spawn_loc] "
+
+ dat += "Genitals"
+ if(NOGENITALS in pref_species.species_traits)
+ dat += "Your species ([pref_species.name]) does not support genitals! "
+ else
+ dat += "Has Penis:[features["has_cock"] == TRUE ? "Yes" : "No"] "
+ if(features["has_cock"] == TRUE)
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Penis Color: (Skin tone overriding) "
+ else
+ dat += "Penis Color: Change "
+ dat += "Penis Shape: [features["cock_shape"]] "
+ dat += "Penis Length: [features["cock_length"]] inch(es) "
+ dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"] "
+ if(features["has_balls"] == TRUE)
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Testicles Color: (Skin tone overriding) "
+ else
+ dat += "Testicles Color: Change "
+ dat += "Has Vagina:[features["has_vag"] == TRUE ? "Yes" : "No"] "
+ if(features["has_vag"])
+ dat += "Vagina Type: [features["vag_shape"]] "
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Vagina Color: (Skin tone overriding) "
+ else
+ dat += "Vagina Color: Change "
+ dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"] "
+ dat += "Has Breasts:[features["has_breasts"] == TRUE ? "Yes" : "No"] "
+ if(features["has_breasts"])
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Color: (Skin tone overriding) "
+ else
+ dat += "Color: Change "
+ dat += "Cup Size:[features["breasts_size"]] "
+ dat += "Breast Shape:[features["breasts_shape"]] "
+ dat += " | "
if (1) // Game Preferences
dat += ""
if(unlock_content)
dat += "Ghost Form: [ghost_form]
"
dat += "Ghost Orbit: [ghost_orbit]
"
-
var/button_name = "If you see this something went wrong."
switch(ghost_accs)
if(GHOST_ACCS_FULL)
@@ -490,7 +654,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
button_name = GHOST_ACCS_NONE_NAME
dat += "Ghost Accessories: [button_name]
"
-
switch(ghost_others)
if(GHOST_OTHERS_THEIR_SETTING)
button_name = GHOST_OTHERS_THEIR_SETTING_NAME
@@ -501,9 +664,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Ghosts of Others: [button_name]
"
dat += "
"
-
dat += "FPS: [clientfps]
"
-
dat += "Parallax (Fancy Space): "
switch (parallax)
if (PARALLAX_LOW)
@@ -517,7 +678,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
dat += "High"
dat += "
"
-
dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
"
dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
"
@@ -562,6 +722,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Be [capitalize(i)]: \[IN [days_remaining] DAYS]
"
else
dat += "Be [capitalize(i)]: [(i in be_special) ? "Enabled" : "Disabled"]
"
+ dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Enabled" : "Disabled"]
"
+
dat += "
"
dat += "Citadel Preferences
" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe.
dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]
"
@@ -575,39 +737,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (user && user.client && !user.client.prefs.screenshake==0)
dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
"
dat += "
"
- dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Enabled" : "Disabled"]
"
-
- dat += ""
-
- dat += ""
if(3)
if(!gear_tab)
@@ -660,9 +789,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[gear.description] | "
dat += ""
- else
- dat = citadel_dat_replace(current_tab)
-
dat += "
"
if(!IsGuestKey(user.key))
@@ -1190,7 +1316,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
-/* if("hair")
+ if("flavor_text")
+ var/msg = stripped_multiline_input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE) as null|message
+ if(!isnull(msg))
+ msg = copytext(msg, 1, MAX_MESSAGE_LEN*2)
+ features["flavor_text"] = msg
+
+ if("hair")
var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
if(new_hair)
hair_color = sanitize_hexcolor(new_hair)
@@ -1220,27 +1352,25 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null
if(new_facial)
facial_hair_color = sanitize_hexcolor(new_facial)
-
- if("facial_hair_style")
- var/new_facial_hair_style
- if(gender == MALE)
- new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_male_list
- else
- new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_female_list
- if(new_facial_hair_style)
- facial_hair_style = new_facial_hair_style
+ if("facial_hair_style")
+ var/new_facial_hair_style
+ if(gender == MALE)
+ new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_male_list
+ else
+ new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_female_list
+ if(new_facial_hair_style)
+ facial_hair_style = new_facial_hair_style
if("next_facehair_style")
if (gender == MALE)
facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
else
facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
-
- if("previous_facehair_style")
- if (gender == MALE)
- facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
- else
- facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
+ if("previous_facehair_style")
+ if (gender == MALE)
+ facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
+ else
+ facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
if("underwear")
var/new_underwear
@@ -1266,22 +1396,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_socks)
socks = new_socks
- if(BODY_ZONE_PRECISE_EYES)
+ if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
if(new_eyes)
eye_color = sanitize_hexcolor(new_eyes)
if("species")
-
var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
-
if(result)
var/newtype = GLOB.species_list[result]
pref_species = new newtype()
//Now that we changed our species, we must verify that the mutant colour is still allowed.
var/temp_hsv = RGBtoHSV(features["mcolor"])
- if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]))
+ if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
features["mcolor"] = pref_species.default_color
+ if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
+ features["mcolor2"] = pref_species.default_color
+ if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
+ features["mcolor3"] = pref_species.default_color
if("mutant_color")
var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference","#"+features["mcolor"]) as color|null
@@ -1289,22 +1421,88 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
if(new_mutantcolor == "#000000")
features["mcolor"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright, but only if they affect the skin
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
else
to_chat(user, "Invalid color. Your color is not bright enough.")
+ if("mutant_color2")
+ var/new_mutantcolor = input(user, "Choose your character's secondary alien/mutant color:", "Character Preference") as color|null
+ if(new_mutantcolor)
+ var/temp_hsv = RGBtoHSV(new_mutantcolor)
+ if(new_mutantcolor == "#000000")
+ features["mcolor2"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
+ features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
+ else
+ to_chat(user, "Invalid color. Your color is not bright enough.")
+
+ if("mutant_color3")
+ var/new_mutantcolor = input(user, "Choose your character's tertiary alien/mutant color:", "Character Preference") as color|null
+ if(new_mutantcolor)
+ var/temp_hsv = RGBtoHSV(new_mutantcolor)
+ if(new_mutantcolor == "#000000")
+ features["mcolor3"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
+ features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
+ else
+ to_chat(user, "Invalid color. Your color is not bright enough.")
+
+ if("ipc_screen")
+ var/new_ipc_screen
+ new_ipc_screen = input(user, "Choose your character's screen:", "Character Preference") as null|anything in GLOB.ipc_screens_list
+ if(new_ipc_screen)
+ features["ipc_screen"] = new_ipc_screen
+
+ if("ipc_antenna")
+ var/new_ipc_antenna
+ new_ipc_antenna = input(user, "Choose your character's antenna:", "Character Preference") as null|anything in GLOB.ipc_antennas_list
+ if(new_ipc_antenna)
+ features["ipc_antenna"] = new_ipc_antenna
+
if("tail_lizard")
var/new_tail
new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.tails_list_lizard
if(new_tail)
features["tail_lizard"] = new_tail
+ if(new_tail != "None")
+ features["taur"] = "None"
+ features["tail_human"] = "None"
+ features["mam_tail"] = "None"
if("tail_human")
+ var/list/snowflake_tails_list = list("Normal" = null)
+ for(var/path in GLOB.tails_list_human)
+ var/datum/sprite_accessory/tails/human/instance = GLOB.tails_list_human[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_tails_list[S.name] = path
var/new_tail
- new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.tails_list_human
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in snowflake_tails_list
if(new_tail)
features["tail_human"] = new_tail
+ if(new_tail != "None")
+ features["taur"] = "None"
+ features["tail_lizard"] = "None"
+ features["mam_tail"] = "None"
+
+ if("mam_tail")
+ var/list/snowflake_tails_list = list("Normal" = null)
+ for(var/path in GLOB.mam_tails_list)
+ var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_tails_list[S.name] = path
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in snowflake_tails_list
+ if(new_tail)
+ features["mam_tail"] = new_tail
+ if(new_tail != "None")
+ features["taur"] = "None"
+ features["tail_human"] = "None"
+ features["tail_lizard"] = "None"
if("snout")
var/new_snout
@@ -1363,7 +1561,177 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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)
- skin_tone = new_s_tone*/
+ skin_tone = new_s_tone
+
+ if("taur")
+ var/list/snowflake_taur_list = list("Normal" = null)
+ for(var/path in GLOB.taur_list)
+ var/datum/sprite_accessory/taur/instance = GLOB.taur_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_taur_list[S.name] = path
+ var/new_taur
+ new_taur = input(user, "Choose your character's tauric body:", "Character Preference") as null|anything in snowflake_taur_list
+ if(new_taur)
+ features["taur"] = new_taur
+ if(new_taur != "None")
+ features["mam_tail"] = "None"
+ features["xenotail"] = "None"
+ features["tail_human"] = "None"
+ features["tail_lizard"] = "None"
+
+ if("ears")
+ var/list/snowflake_ears_list = list("Normal" = null)
+ for(var/path in GLOB.ears_list)
+ var/datum/sprite_accessory/ears/instance = GLOB.ears_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_ears_list[S.name] = path
+ var/new_ears
+ new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in snowflake_ears_list
+ if(new_ears)
+ features["ears"] = new_ears
+
+ if("mam_ears")
+ var/list/snowflake_ears_list = list("Normal" = null)
+ for(var/path in GLOB.mam_ears_list)
+ var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_ears_list[S.name] = path
+ var/new_ears
+ new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in snowflake_ears_list
+ if(new_ears)
+ features["mam_ears"] = new_ears
+
+ if("mam_body_markings")
+ var/list/snowflake_markings_list = list("Normal" = null)
+ for(var/path in GLOB.mam_body_markings_list)
+ var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
+ if(istype(instance, /datum/sprite_accessory))
+ var/datum/sprite_accessory/S = instance
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_markings_list[S.name] = path
+ var/new_mam_body_markings
+ new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list
+ if(new_mam_body_markings)
+ features["mam_body_markings"] = new_mam_body_markings
+
+ //Xeno Bodyparts
+ if("xenohead")//Head or caste type
+ var/new_head
+ new_head = input(user, "Choose your character's caste:", "Character Preference") as null|anything in GLOB.xeno_head_list
+ if(new_head)
+ features["xenohead"] = new_head
+
+ if("xenotail")//Currently one one type, more maybe later if someone sprites them. Might include animated variants in the future.
+ var/new_tail
+ new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.xeno_tail_list
+ if(new_tail)
+ features["xenotail"] = new_tail
+ if(new_tail != "None")
+ features["mam_tail"] = "None"
+ features["taur"] = "None"
+ features["tail_human"] = "None"
+ features["tail_lizard"] = "None"
+
+ if("xenodorsal")
+ var/new_dors
+ new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list
+ if(new_dors)
+ features["xenodorsal"] = new_dors
+ //Genital code
+ if("cock_color")
+ var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null
+ if(new_cockcolor)
+ var/temp_hsv = RGBtoHSV(new_cockcolor)
+ if(new_cockcolor == "#000000")
+ features["cock_color"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["cock_color"] = sanitize_hexcolor(new_cockcolor)
+ else
+ user << "Invalid color. Your color is not bright enough."
+
+ if("cock_length")
+ var/new_length = input(user, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Character Preference") as num|null
+ if(new_length)
+ features["cock_length"] = max(min( round(text2num(new_length)), COCK_SIZE_MAX),COCK_SIZE_MIN)
+
+ if("cock_shape")
+ var/new_shape
+ new_shape = input(user, "Penis shape:", "Character Preference") as null|anything in GLOB.cock_shapes_list
+ if(new_shape)
+ features["cock_shape"] = new_shape
+
+ if("balls_color")
+ var/new_ballscolor = input(user, "Testicle Color:", "Character Preference") as color|null
+ if(new_ballscolor)
+ var/temp_hsv = RGBtoHSV(new_ballscolor)
+ if(new_ballscolor == "#000000")
+ features["balls_color"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["balls_color"] = sanitize_hexcolor(new_ballscolor)
+ else
+ user << "Invalid color. Your color is not bright enough."
+
+ if("egg_size")
+ var/new_size
+ var/list/egg_sizes = list(1,2,3)
+ new_size = input(user, "Egg Diameter(inches):", "Egg Size") as null|anything in egg_sizes
+ if(new_size)
+ features["eggsack_egg_size"] = new_size
+
+ if("egg_color")
+ var/new_egg_color = input(user, "Egg Color:", "Character Preference") as color|null
+ if(new_egg_color)
+ var/temp_hsv = RGBtoHSV(new_egg_color)
+ if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
+ else
+ user << "Invalid color. Your color is not bright enough."
+
+ if("breasts_size")
+ var/new_size
+ new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breasts_size_list
+ if(new_size)
+ features["breasts_size"] = new_size
+
+ if("breasts_shape")
+ var/new_shape
+ new_shape = input(user, "Breast Shape", "Character Preference") as null|anything in GLOB.breasts_shapes_list
+ if(new_shape)
+ features["breasts_shape"] = new_shape
+
+ if("breasts_color")
+ var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null
+ if(new_breasts_color)
+ var/temp_hsv = RGBtoHSV(new_breasts_color)
+ if(new_breasts_color == "#000000")
+ features["breasts_color"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
+ else
+ user << "Invalid color. Your color is not bright enough."
+
+ if("vag_shape")
+ var/new_shape
+ new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list
+ if(new_shape)
+ features["vag_shape"] = new_shape
+
+ if("vag_color")
+ var/new_vagcolor = input(user, "Vagina color:", "Character Preference") as color|null
+ if(new_vagcolor)
+ var/temp_hsv = RGBtoHSV(new_vagcolor)
+ if(new_vagcolor == "#000000")
+ features["vag_color"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["vag_color"] = sanitize_hexcolor(new_vagcolor)
+ else
+ user << "Invalid color. Your color is not bright enough."
if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null
@@ -1628,8 +1996,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
LAZYADD(chosen_gear, G.type)
gear_points -= initial(G.cost)
- process_citadel_link(user, href_list)
-
ShowChoices(user)
return 1
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index bc163b1781..1d54b9f4a0 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -50,7 +50,7 @@
to_chat(src, "You have OOC muted.")
return
- mob.log_talk(raw_msg, LOG_OOC)
+ mob.log_talk(raw_msg, LOG_OOC, tag="(OOC)")
var/keyname = key
if(prefs.unlock_content)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 7929a00357..ad2c45b291 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -271,20 +271,18 @@
"You shake [src] trying to get [p_them()] up!")
else if(check_zone(M.zone_selected) == "head")
- M.visible_message("[M] gives [src] a pat on the head to make [p_them()] feel better!", \
- "You give [src] a pat on the head to make [p_them()] feel better!")
- if(dna && dna.species && ("tail_lizard" in dna.species.mutant_bodyparts) && (dna.features["tail_lizard"])!= "None")
- emote("wag") //lewd
- else if(dna && dna.species && ("tail_human" in dna.species.mutant_bodyparts) && (dna.features["tail_human"])!= "None")
- emote("wag")
- else if(dna && dna.species && ("mam_tail" in dna.species.mutant_bodyparts) && (dna.features["mam_tail"])!= "None")
- emote("wag")
+ var/mob/living/carbon/human/H = src
+ M.visible_message("[M] gives [H] a pat on the head to make [p_them()] feel better!", \
+ "You give [H] a pat on the head to make [p_them()] feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
+ if(H.dna.species.can_wag_tail(H) && (H.dna.features["tail_human"]!= "None" || H.dna.features["tail_lizard"]!= "None" || H.dna.features["mam_tail"])!= "None")
+ H.emote("wag")
else
M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \
"You hug [src] to make [p_them()] feel better!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
+
AdjustStun(-60)
AdjustKnockdown(-60)
AdjustUnconscious(-60)
diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm
index a7c20b981a..d0eacf8622 100644
--- a/code/modules/mob/living/carbon/human/species_types/humans.dm
+++ b/code/modules/mob/living/carbon/human/species_types/humans.dm
@@ -29,7 +29,7 @@
return ("mam_waggingtail" in mutant_bodyparts)
/datum/species/human/start_wagging_tail(mob/living/carbon/human/H)
- if("tail_human" in mutant_bodyparts)
+ if("mam_tail" in mutant_bodyparts)
mutant_bodyparts -= "mam_tail"
mutant_bodyparts |= "mam_waggingtail"
H.update_body()
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index f083e7c658..416f02b40c 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -11,7 +11,7 @@
mutanttail = /obj/item/organ/tail/lizard
coldmod = 1.5
heatmod = 0.67
- default_features = list("mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "taur" = "None")
+ default_features = list("mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "taur" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/config/config.txt b/config/config.txt
index 411e8f979f..3a74166fe7 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -117,6 +117,9 @@ LOG_ATTACK
## log pda messages
LOG_PDA
+## log telecomms messages
+LOG_TELECOMMS
+
## log prayers
LOG_PRAYER
@@ -126,6 +129,9 @@ LOG_LAW
## log crew manifest to seperate file
LOG_MANIFEST
+## log job divide debugging information
+#LOG_JOB_DEBUG
+
## log all world.Topic() calls
# LOG_WORLD_TOPIC
@@ -134,7 +140,7 @@ LOG_MANIFEST
# LOG_TWITTER
## Enable logging pictures
-LOG_PICTURES
+# LOG_PICTURES
##Log camera pictures - Must have picture logging enabled
PICTURE_LOGGING_CAMERA
@@ -154,9 +160,6 @@ ALLOW_ADMIN_OOCCOLOR
## Job slot open/close by identification consoles delay in seconds
ID_CONSOLE_JOBSLOT_DELAY 30
-## If metadata is supported
-ALLOW_METADATA
-
## allow players to initiate a restart vote
#ALLOW_VOTE_RESTART
@@ -234,6 +237,17 @@ CHECK_RANDOMIZER
## Github address
# GITHUBURL https://www.github.com/tgstation/tgstation
+## Round specific stats address
+## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot()
+## This will take priority over the game logs address during reboot.
+## Example: https://atlantaned.space/statbus/round.php?round=
+# ROUNDSTATSURL
+
+## Game Logs address
+## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs.
+## Example: https://tgstation13.org/parsed-logs/basil/data/logs/
+# GAMELOGURL
+
## Github repo id
##This can be found by going to https://api.github.com/users//repos
##Or https://api.github.com/orgs//repos if the repo owner is an organization
@@ -257,7 +271,7 @@ CHECK_RANDOMIZER
## Uncomment this to forbid admins from possessing the singularity.
#FORBID_SINGULO_POSSESSION
-## Uncomment to show a popup 'reply to' window to every non-admin that recieves an adminPM.
+## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM.
## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off)
#POPUP_ADMIN_PM
@@ -367,10 +381,6 @@ AUTOADMIN_RANK Game Master
## Uncomment to automatically give that admin rank to all players
#AUTOADMIN
-## GENERATE_MINIMAPS
-## Generating minimaps(For crew monitor) is slow and bogs down testing, so its disabled by default and must be enabled by uncommenting this config if you are running a production server.
-#GENERATE_MINIMAPS
-
## CLIENT VERSION CONTROL
## This allows you to configure the minimum required client version, as well as a warning version, and message for both.
## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower.
diff --git a/config/game_options.txt b/config/game_options.txt
index 953de2f923..f4d76c670c 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -14,8 +14,6 @@ REVIVAL_CLONING
## amount of time (in hundredths of seconds) for which a brain retains the "spark of life" after the person's death (set to -1 for infinite)
REVIVAL_BRAIN_LIFE -1
-## RENAMING ###
-
## OOC DURING ROUND ###
## Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
OOC_DURING_ROUND
@@ -37,13 +35,16 @@ EMOJIS
RUN_DELAY 1
WALK_DELAY 4
-## The variables below affect the movement of specific mob types.
-HUMAN_DELAY 0
-ROBOT_DELAY 0
-MONKEY_DELAY 0
-ALIEN_DELAY 0
-SLIME_DELAY 0
-ANIMAL_DELAY 1
+## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE!
+## Entries completely override all subtypes. Later entries have precedence over earlier entries.
+## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and
+## /mob/living/carbon/human on the last entry, the last entry will override the first.
+##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 0
+##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0
+##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0
+##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0
+##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0
+MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1
## NAMES ###
@@ -134,10 +135,10 @@ MIDROUND_ANTAG CHANGELING
MIDROUND_ANTAG WIZARD
#MIDROUND_ANTAG MONKEY
-## Uncomment these for overrides of the minimum / maximum number of players in a round type.
+## Uncomment these for overrides of the minimum / maximum number of players in a round type.
## If you set any of these occasionally check to see if you still need them as the modes
## will still be actively rebalanced around the SUGGESTED populations, not your overrides.
-## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to
+## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to
## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that.
#MIN_POP TRAITOR 0
@@ -257,6 +258,9 @@ EVENTS_MIN_PLAYERS_MUL 1
## Allow the AI job to be picked.
ALLOW_AI
+## Allow the AI Multicamera feature to be used by AI players
+ALLOW_AI_MULTICAM
+
## Secborg ###
## Uncomment to prevent the security cyborg module from being chosen
#DISABLE_SECBORG
@@ -423,11 +427,21 @@ ROUNDSTART_RACES plasmaman
## Races that are straight upgrades. If these are on expect powergamers to always pick them
#ROUNDSTART_RACES skeleton
#ROUNDSTART_RACES zombie
-ROUNDSTART_RACES slimeperson
+#ROUNDSTART_RACES slime
#ROUNDSTART_RACES pod
#ROUNDSTART_RACES military_synth
#ROUNDSTART_RACES agent
+## CITADEL Races
+ROUNDSTART_RACES mammal
+ROUNDSTART_RACES avian
+ROUNDSTART_RACES aquatic
+ROUNDSTART_RACES insect
+ROUNDSTART_RACES xeno
+ROUNDSTART_RACES datashark
+ROUNDSTART_RACES guilmon
+ROUNDSTART_RACES ipc
+
##-------------------------------------------------------------------------------------------
## Uncomment to give players the choice of joining as a human with mutant bodyparts before they join the game
@@ -509,27 +523,6 @@ MICE_ROUNDSTART 10
## Determines if players are allowed to print integrated circuits, uncomment to allow.
#IC_PRINTING
-## CITADEL Races
-ROUNDSTART_RACES mammal
-ROUNDSTART_RACES avian
-ROUNDSTART_RACES aquatic
-ROUNDSTART_RACES insect
-ROUNDSTART_RACES xeno
-ROUNDSTART_RACES datashark
-ROUNDSTART_RACES guilmon
-ROUNDSTART_RACES ipc
-
-## CREW OBJECTIVES ##
-## Comment to disable objectives for innocent crew members.
-ALLOW_CREW_OBJECTIVES
-
-## MISCREANTS ##
-## Comment to allow miscreants to spawn. Miscreants are a mini-antag with objectives that are not tracked.
-ALLOW_MISCREANTS
-
-## Uncomment to let miscreants spawn during Extended. I hold no responsibility for fun that may occur while this is enabled.
-#ALLOW_EXTENDED_MISCREANTS
-
## Uncomment to allow roundstart quirk selection in the character setup menu.
## This used to be named traits, hence the config name, but it handles quirks, not the other kind of trait!
ROUNDSTART_TRAITS
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 7d73fa618b..6611b1da1a 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -99,563 +99,6 @@
..()
LAZYINITLIST(chosen_gear)
-/datum/preferences/proc/citadel_dat_replace(current_tab)
- var/mob/user
- //This proc is for menus other than game pref and char pref
- . = ""
- . += "Character Settings"
- . += "Character Appearance"
- . += "Loadout"
- . += "Game Preferences"
-
- if(!path)
- . += "Please create an account to save your preferences
"
-
- . += ""
-
- . += "
"
-
- //Character Appearance
- if(current_tab == 2)
- update_preview_icon(nude=TRUE)
- user << browse_rsc(preview_icon, "previewicon.png")
- . += ""
-
-/datum/preferences/proc/process_citadel_link(mob/user, list/href_list)
- if("input")
- switch(href_list["preference"])
- if("flavor_text")
- var/msg = stripped_multiline_input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(features["flavor_text"]), MAX_MESSAGE_LEN*2, TRUE) as null|message
- if(!isnull(msg))
- msg = copytext(msg, 1, MAX_MESSAGE_LEN*2)
- features["flavor_text"] = msg
-
- if("hair")
- var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null
- if(new_hair)
- hair_color = sanitize_hexcolor(new_hair)
-
- if("hair_style")
- var/new_hair_style
- if(gender == MALE)
- new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_male_list
- else
- new_hair_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in GLOB.hair_styles_female_list
- if(new_hair_style)
- hair_style = new_hair_style
-
- if("next_hair_style")
- if (gender == MALE)
- hair_style = next_list_item(hair_style, GLOB.hair_styles_male_list)
- else
- hair_style = next_list_item(hair_style, GLOB.hair_styles_female_list)
-
- if("previous_hair_style")
- if (gender == MALE)
- hair_style = previous_list_item(hair_style, GLOB.hair_styles_male_list)
- else
- hair_style = previous_list_item(hair_style, GLOB.hair_styles_female_list)
-
- if("facial")
- var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference","#"+facial_hair_color) as color|null
- if(new_facial)
- facial_hair_color = sanitize_hexcolor(new_facial)
- if("facial_hair_style")
- var/new_facial_hair_style
- if(gender == MALE)
- new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_male_list
- else
- new_facial_hair_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in GLOB.facial_hair_styles_female_list
- if(new_facial_hair_style)
- facial_hair_style = new_facial_hair_style
-
- if("next_facehair_style")
- if (gender == MALE)
- facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
- else
- facial_hair_style = next_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
- if("previous_facehair_style")
- if (gender == MALE)
- facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_male_list)
- else
- facial_hair_style = previous_list_item(facial_hair_style, GLOB.facial_hair_styles_female_list)
-
- if("underwear")
- var/new_underwear
- if(gender == MALE)
- new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_m
- else
- new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_f
- if(new_underwear)
- underwear = new_underwear
-
- if("undershirt")
- var/new_undershirt
- if(gender == MALE)
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_m
- else
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in GLOB.undershirt_f
- if(new_undershirt)
- undershirt = new_undershirt
-
- if("socks")
- var/new_socks
- new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in GLOB.socks_list
- if(new_socks)
- socks = new_socks
-
- if("eyes")
- var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null
- if(new_eyes)
- eye_color = sanitize_hexcolor(new_eyes)
-
- if("species")
- var/result = input(user, "Select a species", "Species Selection") as null|anything in GLOB.roundstart_races
- if(result)
- var/newtype = GLOB.species_list[result]
- pref_species = new newtype()
- //Now that we changed our species, we must verify that the mutant colour is still allowed.
- var/temp_hsv = RGBtoHSV(features["mcolor"])
- if(features["mcolor"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
- features["mcolor"] = pref_species.default_color
- if(features["mcolor2"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
- features["mcolor2"] = pref_species.default_color
- if(features["mcolor3"] == "#000" || (!(MUTCOLORS_PARTSONLY in pref_species.species_traits) && ReadHSV(temp_hsv)[3] < ReadHSV("#202020")[3]))
- features["mcolor3"] = pref_species.default_color
-
- if("mutant_color")
- var/new_mutantcolor = input(user, "Choose your character's alien/mutant color:", "Character Preference","#"+features["mcolor"]) as color|null
- if(new_mutantcolor)
- var/temp_hsv = RGBtoHSV(new_mutantcolor)
- if(new_mutantcolor == "#000000")
- features["mcolor"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor"] = sanitize_hexcolor(new_mutantcolor)
- else
- to_chat(user, "Invalid color. Your color is not bright enough.")
-
- if("mutant_color2")
- var/new_mutantcolor = input(user, "Choose your character's secondary alien/mutant color:", "Character Preference") as color|null
- if(new_mutantcolor)
- var/temp_hsv = RGBtoHSV(new_mutantcolor)
- if(new_mutantcolor == "#000000")
- features["mcolor2"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor2"] = sanitize_hexcolor(new_mutantcolor)
- else
- to_chat(user, "Invalid color. Your color is not bright enough.")
-
- if("mutant_color3")
- var/new_mutantcolor = input(user, "Choose your character's tertiary alien/mutant color:", "Character Preference") as color|null
- if(new_mutantcolor)
- var/temp_hsv = RGBtoHSV(new_mutantcolor)
- if(new_mutantcolor == "#000000")
- features["mcolor3"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) // mutantcolors must be bright, but only if they affect the skin
- features["mcolor3"] = sanitize_hexcolor(new_mutantcolor)
- else
- to_chat(user, "Invalid color. Your color is not bright enough.")
-
- if("ipc_screen")
- var/new_ipc_screen
- new_ipc_screen = input(user, "Choose your character's screen:", "Character Preference") as null|anything in GLOB.ipc_screens_list
- if(new_ipc_screen)
- features["ipc_screen"] = new_ipc_screen
-
- if("ipc_antenna")
- var/new_ipc_antenna
- new_ipc_antenna = input(user, "Choose your character's antenna:", "Character Preference") as null|anything in GLOB.ipc_antennas_list
- if(new_ipc_antenna)
- features["ipc_antenna"] = new_ipc_antenna
-
- if("tail_lizard")
- var/new_tail
- new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.tails_list_lizard
- if(new_tail)
- features["tail_lizard"] = new_tail
- if(new_tail != "None")
- features["taur"] = "None"
-
- if("tail_human")
- var/list/snowflake_tails_list = list("Normal" = null)
- for(var/path in GLOB.tails_list_human)
- var/datum/sprite_accessory/tails/human/instance = GLOB.tails_list_human[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_tails_list[S.name] = path
- var/new_tail
- new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in snowflake_tails_list
- if(new_tail)
- features["tail_human"] = new_tail
- if(new_tail != "None")
- features["taur"] = "None"
-
- if("mam_tail")
- var/list/snowflake_tails_list = list("Normal" = null)
- for(var/path in GLOB.mam_tails_list)
- var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_tails_list[S.name] = path
- var/new_tail
- new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in snowflake_tails_list
- if(new_tail)
- features["mam_tail"] = new_tail
- if(new_tail != "None")
- features["taur"] = "None"
-
- if("snout")
- var/new_snout
- new_snout = input(user, "Choose your character's snout:", "Character Preference") as null|anything in GLOB.snouts_list
- if(new_snout)
- features["snout"] = new_snout
-
- if("horns")
- var/new_horns
- new_horns = input(user, "Choose your character's horns:", "Character Preference") as null|anything in GLOB.horns_list
- if(new_horns)
- features["horns"] = new_horns
-
- if("ears")
- var/new_ears
- new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in GLOB.ears_list
- if(new_ears)
- features["ears"] = new_ears
-
- if("wings")
- var/new_wings
- new_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.r_wings_list
- if(new_wings)
- features["wings"] = new_wings
-
- if("frills")
- var/new_frills
- new_frills = input(user, "Choose your character's frills:", "Character Preference") as null|anything in GLOB.frills_list
- if(new_frills)
- features["frills"] = new_frills
-
- if("spines")
- var/new_spines
- new_spines = input(user, "Choose your character's spines:", "Character Preference") as null|anything in GLOB.spines_list
- if(new_spines)
- features["spines"] = new_spines
-
- if("body_markings")
- var/new_body_markings
- new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list
- if(new_body_markings)
- features["body_markings"] = new_body_markings
-
- if("legs")
- var/new_legs
- new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list
- if(new_legs)
- features["legs"] = new_legs
-
- if("moth_wings")
- var/new_moth_wings
- new_moth_wings = input(user, "Choose your character's wings:", "Character Preference") as null|anything in GLOB.moth_wings_list
- if(new_moth_wings)
- features["moth_wings"] = new_moth_wings
-
- 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)
- skin_tone = new_s_tone
-
- if("taur")
- var/list/snowflake_taur_list = list("Normal" = null)
- for(var/path in GLOB.taur_list)
- var/datum/sprite_accessory/taur/instance = GLOB.taur_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_taur_list[S.name] = path
- var/new_taur
- new_taur = input(user, "Choose your character's tauric body:", "Character Preference") as null|anything in snowflake_taur_list
- if(new_taur)
- features["taur"] = new_taur
- if(new_taur != "None")
- features["mam_tail"] = "None"
- features["xenotail"] = "None"
-
- if("ears")
- var/list/snowflake_ears_list = list("Normal" = null)
- for(var/path in GLOB.ears_list)
- var/datum/sprite_accessory/ears/instance = GLOB.ears_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_ears_list[S.name] = path
- var/new_ears
- new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in snowflake_ears_list
- if(new_ears)
- features["ears"] = new_ears
-
- if("mam_ears")
- var/list/snowflake_ears_list = list("Normal" = null)
- for(var/path in GLOB.mam_ears_list)
- var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_ears_list[S.name] = path
- var/new_ears
- new_ears = input(user, "Choose your character's ears:", "Character Preference") as null|anything in snowflake_ears_list
- if(new_ears)
- features["mam_ears"] = new_ears
-
- if("mam_body_markings")
- var/list/snowflake_markings_list = list("Normal" = null)
- for(var/path in GLOB.mam_body_markings_list)
- var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_markings_list[S.name] = path
- var/new_mam_body_markings
- new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list
- if(new_mam_body_markings)
- features["mam_body_markings"] = new_mam_body_markings
-
- //Xeno Bodyparts
- if("xenohead")//Head or caste type
- var/new_head
- new_head = input(user, "Choose your character's caste:", "Character Preference") as null|anything in GLOB.xeno_head_list
- if(new_head)
- features["xenohead"] = new_head
-
- if("xenotail")//Currently one one type, more maybe later if someone sprites them. Might include animated variants in the future.
- var/new_tail
- new_tail = input(user, "Choose your character's tail:", "Character Preference") as null|anything in GLOB.xeno_tail_list
- if(new_tail)
- features["xenotail"] = new_tail
-
- if("xenodorsal")
- var/new_dors
- new_dors = input(user, "Choose your character's dorsal tube type:", "Character Preference") as null|anything in GLOB.xeno_dorsal_list
- if(new_dors)
- features["xenodorsal"] = new_dors
- //Genital code
- if("cock_color")
- var/new_cockcolor = input(user, "Penis color:", "Character Preference") as color|null
- if(new_cockcolor)
- var/temp_hsv = RGBtoHSV(new_cockcolor)
- if(new_cockcolor == "#000000")
- features["cock_color"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["cock_color"] = sanitize_hexcolor(new_cockcolor)
- else
- user << "Invalid color. Your color is not bright enough."
-
- if("cock_length")
- var/new_length = input(user, "Penis length in inches:\n([COCK_SIZE_MIN]-[COCK_SIZE_MAX])", "Character Preference") as num|null
- if(new_length)
- features["cock_length"] = max(min( round(text2num(new_length)), COCK_SIZE_MAX),COCK_SIZE_MIN)
-
- if("cock_shape")
- var/new_shape
- new_shape = input(user, "Penis shape:", "Character Preference") as null|anything in GLOB.cock_shapes_list
- if(new_shape)
- features["cock_shape"] = new_shape
-
- if("balls_color")
- var/new_ballscolor = input(user, "Testicle Color:", "Character Preference") as color|null
- if(new_ballscolor)
- var/temp_hsv = RGBtoHSV(new_ballscolor)
- if(new_ballscolor == "#000000")
- features["balls_color"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["balls_color"] = sanitize_hexcolor(new_ballscolor)
- else
- user << "Invalid color. Your color is not bright enough."
-
- if("egg_size")
- var/new_size
- var/list/egg_sizes = list(1,2,3)
- new_size = input(user, "Egg Diameter(inches):", "Egg Size") as null|anything in egg_sizes
- if(new_size)
- features["eggsack_egg_size"] = new_size
-
- if("egg_color")
- var/new_egg_color = input(user, "Egg Color:", "Character Preference") as color|null
- if(new_egg_color)
- var/temp_hsv = RGBtoHSV(new_egg_color)
- if(ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["eggsack_egg_color"] = sanitize_hexcolor(new_egg_color)
- else
- user << "Invalid color. Your color is not bright enough."
-
- if("breasts_size")
- var/new_size
- new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breasts_size_list
- if(new_size)
- features["breasts_size"] = new_size
-
- if("breasts_shape")
- var/new_shape
- new_shape = input(user, "Breast Shape", "Character Preference") as null|anything in GLOB.breasts_shapes_list
- if(new_shape)
- features["breasts_shape"] = new_shape
-
- if("breasts_color")
- var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null
- if(new_breasts_color)
- var/temp_hsv = RGBtoHSV(new_breasts_color)
- if(new_breasts_color == "#000000")
- features["breasts_color"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
- else
- user << "Invalid color. Your color is not bright enough."
-
- if("vag_shape")
- var/new_shape
- new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list
- if(new_shape)
- features["vag_shape"] = new_shape
-
- if("vag_color")
- var/new_vagcolor = input(user, "Vagina color:", "Character Preference") as color|null
- if(new_vagcolor)
- var/temp_hsv = RGBtoHSV(new_vagcolor)
- if(new_vagcolor == "#000000")
- features["vag_color"] = pref_species.default_color
- else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
- features["vag_color"] = sanitize_hexcolor(new_vagcolor)
- else
- user << "Invalid color. Your color is not bright enough."
-
/datum/preferences/proc/is_loadout_slot_available(slot)
var/list/L
LAZYINITLIST(L)
diff --git a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
index 4eba44598c..ef3c9487ba 100644
--- a/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
+++ b/modular_citadel/code/modules/mob/living/carbon/human/species_types/furrypeople.dm
@@ -5,7 +5,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_ears", "mam_body_markings", "snout", "taur")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "body_markings" = "husky", "mam_tail" = "husky", "mam_ears" = "husky", "mam_body_markings" = "husky", "taur" = "None")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -61,7 +61,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("snout", "wings", "taur", "mam_tail", "mam_body_markings", "taur")
- default_features = list("snout" = "Sharp", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "snout" = "Beak", "wings" = "None", "taur" = "None", "mam_body_markings" = "Hawk", "mam_tail" = "Hawk")
attack_verb = "peck"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -114,7 +114,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
mutant_bodyparts = list("mam_tail", "mam_body_markings", "mam_ears", "taur")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF","mam_tail" = "shark", "mam_body_markings" = "None", "mam_ears" = "None")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF","mam_tail" = "shark", "mam_body_markings" = "Shark", "mam_ears" = "None")
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -168,7 +168,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID, MOB_BUG)
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur", "moth_wings")
- default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "None")
+ default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "Plain")
attack_verb = "flutter" //wat?
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -222,8 +222,8 @@
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS)
inherent_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
- mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "legs", "taur","mam_body_markings")
- default_features = list("xenotail"="xeno","xenohead"="standard","xenodorsal"="standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "xeno")
+ mutant_bodyparts = list("xenotail", "xenohead", "xenodorsal", "legs", "taur", "mam_body_markings")
+ default_features = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None","mam_body_markings" = "Xeno", "legs" = "Digitigrade Legs")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'