diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql
index ec34b6632f3..1069dd6b2d6 100644
--- a/SQL/paradise_schema.sql
+++ b/SQL/paradise_schema.sql
@@ -33,23 +33,28 @@ CREATE TABLE `characters` (
`hair_red` smallint(4) NOT NULL,
`hair_green` smallint(4) NOT NULL,
`hair_blue` smallint(4) NOT NULL,
+ `secondary_hair_red` smallint(4) NOT NULL,
+ `secondary_hair_green` smallint(4) NOT NULL,
+ `secondary_hair_blue` smallint(4) NOT NULL,
`facial_red` smallint(4) NOT NULL,
`facial_green` smallint(4) NOT NULL,
`facial_blue` smallint(4) NOT NULL,
+ `secondary_facial_red` smallint(4) NOT NULL,
+ `secondary_facial_green` smallint(4) NOT NULL,
+ `secondary_facial_blue` smallint(4) NOT NULL,
`skin_tone` smallint(4) NOT NULL,
`skin_red` smallint(4) NOT NULL,
`skin_green` smallint(4) NOT NULL,
`skin_blue` smallint(4) NOT NULL,
- `markings_red` smallint(4) NOT NULL,
- `markings_green` smallint(4) NOT NULL,
- `markings_blue` smallint(4) NOT NULL,
+ `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000',
`head_accessory_red` smallint(4) NOT NULL,
`head_accessory_green` smallint(4) NOT NULL,
`head_accessory_blue` smallint(4) NOT NULL,
`hair_style_name` varchar(45) NOT NULL,
`facial_style_name` varchar(45) NOT NULL,
- `marking_style_name` varchar(45) NOT NULL,
+ `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None',
`head_accessory_style_name` varchar(45) NOT NULL,
+ `alt_head_name` varchar(45) NOT NULL,
`eyes_red` smallint(4) NOT NULL,
`eyes_green` smallint(4) NOT NULL,
`eyes_blue` smallint(4) NOT NULL,
diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql
index b5115a93caf..55e71aa2aab 100644
--- a/SQL/paradise_schema_prefixed.sql
+++ b/SQL/paradise_schema_prefixed.sql
@@ -33,23 +33,28 @@ CREATE TABLE `SS13_characters` (
`hair_red` smallint(4) NOT NULL,
`hair_green` smallint(4) NOT NULL,
`hair_blue` smallint(4) NOT NULL,
+ `secondary_hair_red` smallint(4) NOT NULL,
+ `secondary_hair_green` smallint(4) NOT NULL,
+ `secondary_hair_blue` smallint(4) NOT NULL,
`facial_red` smallint(4) NOT NULL,
`facial_green` smallint(4) NOT NULL,
`facial_blue` smallint(4) NOT NULL,
+ `secondary_facial_red` smallint(4) NOT NULL,
+ `secondary_facial_green` smallint(4) NOT NULL,
+ `secondary_facial_blue` smallint(4) NOT NULL,
`skin_tone` smallint(4) NOT NULL,
`skin_red` smallint(4) NOT NULL,
`skin_green` smallint(4) NOT NULL,
`skin_blue` smallint(4) NOT NULL,
- `markings_red` smallint(4) NOT NULL,
- `markings_green` smallint(4) NOT NULL,
- `markings_blue` smallint(4) NOT NULL,
+ `marking_colours` varchar(255) NOT NULL DEFAULT 'head=%23000000&body=%23000000&tail=%23000000',
`head_accessory_red` smallint(4) NOT NULL,
`head_accessory_green` smallint(4) NOT NULL,
`head_accessory_blue` smallint(4) NOT NULL,
`hair_style_name` varchar(45) NOT NULL,
`facial_style_name` varchar(45) NOT NULL,
- `marking_style_name` varchar(45) NOT NULL,
+ `marking_styles` varchar(255) NOT NULL DEFAULT 'head=None&body=None&tail=None',
`head_accessory_style_name` varchar(45) NOT NULL,
+ `alt_head_name` varchar(45) NOT NULL,
`eyes_red` smallint(4) NOT NULL,
`eyes_green` smallint(4) NOT NULL,
`eyes_blue` smallint(4) NOT NULL,
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 2b2adbdbaf2..61bc32d378e 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -59,10 +59,14 @@
#define HAS_SKIN_TONE 64
#define HAS_ICON_SKIN_TONE 128
#define HAS_SKIN_COLOR 256
-#define HAS_MARKINGS 512
-#define TAIL_WAGGING 1024
-#define NO_EYES 2048
-#define HAS_FUR 4096
+#define HAS_HEAD_MARKINGS 512
+#define HAS_BODY_MARKINGS 1024
+#define HAS_TAIL_MARKINGS 2048
+#define HAS_MARKINGS HAS_HEAD_MARKINGS|HAS_BODY_MARKINGS|HAS_TAIL_MARKINGS
+#define TAIL_WAGGING 4096
+#define NO_EYES 8192
+#define HAS_FUR 16384
+#define HAS_ALT_HEADS 32768
//Species Diet Flags
#define DIET_CARN 1
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 92f498ec907..55889cb689e 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -210,14 +210,14 @@
#define GLOVES_LAYER 11
#define EARS_LAYER 12
#define SUIT_LAYER 13
-#define GLASSES_LAYER 14
-#define BELT_LAYER 15 //Possible make this an overlay of somethign required to wear a belt?
-#define SUIT_STORE_LAYER 16
-#define BACK_LAYER 17
-#define TAIL_LAYER 18 //bs12 specific. this hack is probably gonna come back to haunt me
-#define HAIR_LAYER 19 //TODO: make part of head layer?
-#define HEAD_ACCESSORY_LAYER 20
-#define FHAIR_LAYER 21
+#define BELT_LAYER 14 //Possible make this an overlay of somethign required to wear a belt?
+#define SUIT_STORE_LAYER 15
+#define BACK_LAYER 16
+#define HAIR_LAYER 17 //TODO: make part of head layer?
+#define HEAD_ACCESSORY_LAYER 18
+#define FHAIR_LAYER 19
+#define TAIL_LAYER 20 //bs12 specific. this hack is probably gonna come back to haunt me
+#define GLASSES_LAYER 21
#define FACEMASK_LAYER 22
#define HEAD_LAYER 23
#define COLLAR_LAYER 24
diff --git a/code/__DEFINES/mob.dm b/code/__DEFINES/mob.dm
index 736ca0d291f..bf9c479d3e8 100644
--- a/code/__DEFINES/mob.dm
+++ b/code/__DEFINES/mob.dm
@@ -50,6 +50,10 @@
#define SHOES_SLOWDOWN -1.0 // How much shoes slow you down by default. Negative values speed you up
+//Mob attribute defaults.
+#define DEFAULT_MARKING_STYLES list("head" = "None", "body" = "None", "tail" = "None") //Marking styles. Use instead of initial() for m_styles.
+#define DEFAULT_MARKING_COLOURS list("head" = "#000000", "body" = "#000000", "tail" = "#000000") //Marking colours. Use instead of initial() for m_colours.
+
////////REAGENT STUFF////////
// How many units of reagent are consumed per tick, by default.
#define REAGENTS_METABOLISM 0.4
@@ -72,15 +76,18 @@
#define APPEARANCE_SKIN 8
#define APPEARANCE_HAIR 16
#define APPEARANCE_HAIR_COLOR 32
-#define APPEARANCE_FACIAL_HAIR 64
-#define APPEARANCE_FACIAL_HAIR_COLOR 128
-#define APPEARANCE_EYE_COLOR 256
-#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR
-#define APPEARANCE_HEAD_ACCESSORY 512
-#define APPEARANCE_MARKINGS 1024
-#define APPEARANCE_BODY_ACCESSORY 2048
-#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY
-#define APPEARANCE_ALL 4095
+#define APPEARANCE_SECONDARY_HAIR_COLOR 64
+#define APPEARANCE_FACIAL_HAIR 128
+#define APPEARANCE_FACIAL_HAIR_COLOR 256
+#define APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR 512
+#define APPEARANCE_EYE_COLOR 1024
+#define APPEARANCE_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_SECONDARY_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR
+#define APPEARANCE_HEAD_ACCESSORY 2048
+#define APPEARANCE_MARKINGS 4096
+#define APPEARANCE_BODY_ACCESSORY 8192
+#define APPEARANCE_ALT_HEAD 16384
+#define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD
+#define APPEARANCE_ALL 32767
// Intents
#define I_HELP "help"
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 8e0b22ffc2b..155f7dfae58 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -401,23 +401,6 @@
mobs_found += M
return mobs_found
-/proc/GetRedPart(const/hexa)
- return hex2num(copytext(hexa,2,4))
-
-/proc/GetGreenPart(const/hexa)
- return hex2num(copytext(hexa,4,6))
-
-/proc/GetBluePart(const/hexa)
- return hex2num(copytext(hexa,6,8))
-
-/proc/GetHexColors(const/hexa)
- return list(
- GetRedPart(hexa),
- GetGreenPart(hexa),
- GetBluePart(hexa)
- )
-
-
/proc/alone_in_area(var/area/the_area, var/mob/must_be_alone, var/check_type = /mob/living/carbon)
var/area/our_area = get_area_master(the_area)
for(var/C in living_mob_list)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 7398518bb03..ed0b7887e5a 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -18,6 +18,8 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/undershirt, undershirt_list, undershirt_m, undershirt_f)
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, socks_list, socks_m, socks_f)
+ //alt heads
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/alt_heads, alt_heads_list)
init_subtypes(/datum/surgery_step, surgery_steps)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index edde3f13142..a2e8542b825 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -1,3 +1,15 @@
+proc/GetOppositeDir(var/dir)
+ switch(dir)
+ if(NORTH) return SOUTH
+ if(SOUTH) return NORTH
+ if(EAST) return WEST
+ if(WEST) return EAST
+ if(SOUTHWEST) return NORTHEAST
+ if(NORTHWEST) return SOUTHEAST
+ if(NORTHEAST) return SOUTHWEST
+ if(SOUTHEAST) return NORTHWEST
+ return 0
+
proc/random_underwear(gender, species = "Human")
var/list/pick_list = list()
switch(gender)
@@ -34,57 +46,133 @@ proc/pick_species_allowed_underwear(list/all_picks, species)
return pick(valid_picks)
-proc/random_hair_style(var/gender, species = "Human")
+proc/random_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead)
var/h_style = "Bald"
-
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if( !(species in S.species_allowed))
- continue
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
+ continue
+ if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE))
+ continue
+ if(species == "Machine") //If the user is a species who can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
if(valid_hairstyles.len)
h_style = pick(valid_hairstyles)
- return h_style
+ return h_style
-proc/GetOppositeDir(var/dir)
- switch(dir)
- if(NORTH) return SOUTH
- if(SOUTH) return NORTH
- if(EAST) return WEST
- if(WEST) return EAST
- if(SOUTHWEST) return NORTHEAST
- if(NORTHWEST) return SOUTHEAST
- if(NORTHEAST) return SOUTHWEST
- if(SOUTHEAST) return NORTHWEST
- return 0
-
-proc/random_facial_hair_style(var/gender, species = "Human")
+proc/random_facial_hair_style(var/gender, species = "Human", var/datum/robolimb/robohead)
var/f_style = "Shaved"
-
- var/list/valid_facialhairstyles = list()
+ var/list/valid_facial_hairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if( !(species in S.species_allowed))
- continue
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
+ continue
+ if((gender == MALE && S.gender == FEMALE) || (gender == FEMALE && S.gender == MALE))
+ continue
+ if(species == "Machine") //If the user is a species who can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
+ if(valid_facial_hairstyles.len)
+ f_style = pick(valid_facial_hairstyles)
- return f_style
+ return f_style
+
+proc/random_head_accessory(species = "Human")
+ var/ha_style = "None"
+ var/list/valid_head_accessories = list()
+ for(var/head_accessory in head_accessory_styles_list)
+ var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
+
+ if(!(species in S.species_allowed))
+ continue
+ valid_head_accessories += head_accessory
+
+ if(valid_head_accessories.len)
+ ha_style = pick(valid_head_accessories)
+
+ return ha_style
+
+proc/random_marking_style(var/location = "body", species = "Human", var/datum/robolimb/robohead, var/body_accessory, var/alt_head)
+ var/m_style = "None"
+ var/list/valid_markings = list()
+ for(var/marking in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking]
+ if(S.name == "None")
+ valid_markings += marking
+ continue
+ if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
+ continue
+ if(!(species in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ continue
+ if(location == "tail")
+ if(!body_accessory)
+ if(S.tails_allowed)
+ continue
+ else
+ if(!S.tails_allowed || !(body_accessory in S.tails_allowed))
+ continue
+ if(location == "head")
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
+ if(species == "Machine")//If the user is a species that can have a robotic head...
+ if(!robohead)
+ robohead = all_robolimbs["Morpheus Cyberkinetics"]
+ if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
+ continue
+ else if(alt_head && alt_head != "None") //If the user's got an alt head, validate markings for that head.
+ if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
+ valid_markings += marking
+
+ if(valid_markings.len)
+ m_style = pick(valid_markings)
+
+ return m_style
+
+proc/random_body_accessory(species = "Vulpkanin")
+ var/body_accessory = null
+ var/list/valid_body_accessories = list()
+ for(var/B in body_accessory_by_name)
+ var/datum/body_accessory/A = body_accessory_by_name[B]
+ if(!istype(A))
+ valid_body_accessories += "None" //The only null entry should be the "None" option.
+ continue
+ if(species in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ valid_body_accessories += B
+
+ if(valid_body_accessories.len)
+ body_accessory = pick(valid_body_accessories)
+
+ return body_accessory
proc/random_name(gender, species = "Human")
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 7e4fca82c32..1265846d199 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -10,7 +10,7 @@
//Returns an integer given a hex input
/proc/hex2num(hex)
- if(!( istext(hex) ))
+ if(!(istext(hex)))
return
var/num = 0
@@ -59,6 +59,27 @@
hex = "0[hex]"
return hex || "0"
+//Returns an integer value for R of R/G/B given a hex color input.
+/proc/color2R(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 2, 4)) //Returning R
+
+//Returns an integer value for G of R/G/B given a hex color input.
+/proc/color2G(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 4, 6)) //Returning G
+
+//Returns an integer value for B of R/G/B given a hex color input.
+/proc/color2B(hex)
+ if(!(istext(hex)))
+ return
+
+ return hex2num(copytext(hex, 6, 8)) //Returning B
+
/proc/text2numlist(text, delimiter="\n")
var/list/num_list = list()
for(var/x in splittext(text, delimiter))
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index d409d6e54c9..713289c737c 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -23,6 +23,8 @@ var/global/list/undershirt_f = list() //stores only undershirt name
var/global/list/socks_list = list() //stores /datum/sprite_accessory/socks indexed by name
var/global/list/socks_m = list() //stores only socks name
var/global/list/socks_f = list() //stores only socks name
+ //Alt Heads
+var/global/list/alt_heads_list = list() //stores /datum/sprite_accessory/alt_heads indexed by name
//Backpacks
var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt")
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 26738b137fe..c7edd88803a 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -141,7 +141,12 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
var/icon/temp
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
- temp = new /icon(icobase, "head_[g]")
+ var/head = "head"
+ if(head_organ.alt_head && head_organ.species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[head_organ.alt_head]
+ if(alternate_head.icon_state)
+ head = alternate_head.icon_state
+ temp = new /icon(icobase, "[head]_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
//Tail
@@ -188,6 +193,13 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
hair_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -205,15 +217,31 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
facial_s.Blend(rgb(H.r_skin, H.g_skin, H.b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
//Markings
- if(H.species.bodyflags & HAS_MARKINGS)
- var/datum/sprite_accessory/marking_style = marking_styles_list[H.m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(H.r_markings, H.g_markings, H.b_markings), ICON_ADD)
- face_s.Blend(markings_s, ICON_OVERLAY)
+ if((H.species.bodyflags & HAS_HEAD_MARKINGS) || (H.species.bodyflags & HAS_BODY_MARKINGS))
+ if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = H.m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(H.m_colours["body"], ICON_ADD)
+ face_s.Blend(b_marking_s, ICON_OVERLAY)
+ if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = H.m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(H.m_colours["head"], ICON_ADD)
+ face_s.Blend(h_marking_s, ICON_OVERLAY)
preview_icon.Blend(face_s, ICON_OVERLAY)
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index c147bd9235c..62774ad61a7 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -60,7 +60,7 @@
Sound(message_sound)
Log(message, message_title)
-datum/announcement/proc/Message(message as text, message_title as text)
+/datum/announcement/proc/Message(message as text, message_title as text)
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, "
[title]
")
@@ -72,14 +72,14 @@ datum/announcement/proc/Message(message as text, message_title as text)
to_chat(world, "[message_title]")
to_chat(world, "[message]")
-datum/announcement/priority/Message(message as text, message_title as text)
+/datum/announcement/priority/Message(message as text, message_title as text)
to_chat(world, "[message_title]
")
to_chat(world, "[message]")
if(announcer)
to_chat(world, " -[html_encode(announcer)]")
to_chat(world, "
")
-datum/announcement/priority/command/Message(message as text, message_title as text)
+/datum/announcement/priority/command/Message(message as text, message_title as text)
var/command
command += "[command_name()] Update
"
if(message_title)
@@ -91,7 +91,7 @@ datum/announcement/priority/command/Message(message as text, message_title as te
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, command)
-datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text)
+/datum/announcement/priority/enemy/Message(message as text, message_title as text, from as text)
var/command
command += "[from]
"
if(message_title)
@@ -103,11 +103,11 @@ datum/announcement/priority/enemy/Message(message as text, message_title as text
if(!istype(M,/mob/new_player) && !isdeaf(M))
to_chat(M, command)
-datum/announcement/priority/security/Message(message as text, message_title as text)
+/datum/announcement/priority/security/Message(message as text, message_title as text)
to_chat(world, "[message_title]")
to_chat(world, "[message]")
-datum/announcement/proc/NewsCast(message as text, message_title as text)
+/datum/announcement/proc/NewsCast(message as text, message_title as text)
if(disable_newscasts)
return
if(!newscast)
@@ -121,28 +121,28 @@ datum/announcement/proc/NewsCast(message as text, message_title as text)
news.can_be_redacted = 0
announce_newscaster_news(news)
-datum/announcement/proc/PlaySound(var/message_sound)
+/datum/announcement/proc/PlaySound(var/message_sound)
if(!message_sound)
return
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player) && !isdeaf(M))
M << message_sound
-datum/announcement/proc/Sound(var/message_sound)
+/datum/announcement/proc/Sound(var/message_sound)
PlaySound(message_sound)
-datum/announcement/priority/Sound(var/message_sound)
+/datum/announcement/priority/Sound(var/message_sound)
if(sound)
world << sound
-datum/announcement/priority/command/Sound(var/message_sound)
+/datum/announcement/priority/command/Sound(var/message_sound)
PlaySound(message_sound)
-datum/announcement/proc/Log(message as text, message_title as text)
+/datum/announcement/proc/Log(message as text, message_title as text)
if(log)
log_say("[key_name(usr)] has made \a [announcement_type]: [message_title] - [message] - [announcer]")
message_admins("[key_name_admin(usr)] has made \a [announcement_type].", 1)
-
+
/proc/GetNameAndAssignmentFromId(var/obj/item/weapon/card/id/I)
// Format currently matches that of newscaster feeds: Registered Name (Assigned Rank)
- return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
+ return I.assignment ? "[I.registered_name] ([I.assignment])" : I.registered_name
\ No newline at end of file
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 78b889071f5..82f7ffb2e93 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -30,19 +30,27 @@
#define DNA_UI_HACC_R 11
#define DNA_UI_HACC_G 12
#define DNA_UI_HACC_B 13
-#define DNA_UI_MARK_R 14
-#define DNA_UI_MARK_G 15
-#define DNA_UI_MARK_B 16
-#define DNA_UI_EYES_R 17
-#define DNA_UI_EYES_G 18
-#define DNA_UI_EYES_B 19
-#define DNA_UI_GENDER 20
-#define DNA_UI_BEARD_STYLE 21
-#define DNA_UI_HAIR_STYLE 22
+#define DNA_UI_HEAD_MARK_R 14
+#define DNA_UI_HEAD_MARK_G 15
+#define DNA_UI_HEAD_MARK_B 16
+#define DNA_UI_BODY_MARK_R 17
+#define DNA_UI_BODY_MARK_G 18
+#define DNA_UI_BODY_MARK_B 19
+#define DNA_UI_TAIL_MARK_R 20
+#define DNA_UI_TAIL_MARK_G 21
+#define DNA_UI_TAIL_MARK_B 22
+#define DNA_UI_EYES_R 23
+#define DNA_UI_EYES_G 24
+#define DNA_UI_EYES_B 25
+#define DNA_UI_GENDER 26
+#define DNA_UI_BEARD_STYLE 27
+#define DNA_UI_HAIR_STYLE 28
/*#define DNA_UI_BACC_STYLE 23*/
-#define DNA_UI_HACC_STYLE 23
-#define DNA_UI_MARK_STYLE 24
-#define DNA_UI_LENGTH 24 // Update this when you add something, or you WILL break shit.
+#define DNA_UI_HACC_STYLE 29
+#define DNA_UI_HEAD_MARK_STYLE 30
+#define DNA_UI_BODY_MARK_STYLE 31
+#define DNA_UI_TAIL_MARK_STYLE 32
+#define DNA_UI_LENGTH 32 // Update this when you add something, or you WILL break shit.
#define DNA_SE_LENGTH 55 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
@@ -128,16 +136,18 @@ var/global/list/bad_blocks[0]
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
-
/*// Body Accessory
if(!character.body_accessory)
character.body_accessory = null
var/bodyacc = character.body_accessory*/
// Markings
- if(!character.m_style)
- character.m_style = "None"
- var/marks = marking_styles_list.Find(character.m_style)
+ if(!character.m_styles)
+ character.m_styles = DEFAULT_MARKING_STYLES
+
+ var/head_marks = marking_styles_list.Find(character.m_styles["head"])
+ var/body_marks = marking_styles_list.Find(character.m_styles["body"])
+ var/tail_marks = marking_styles_list.Find(character.m_styles["tail"])
head_traits_to_dna(H)
eye_color_to_dna(eyes_organ)
@@ -146,15 +156,25 @@ var/global/list/bad_blocks[0]
SetUIValueRange(DNA_UI_SKIN_G, character.g_skin, 255, 1)
SetUIValueRange(DNA_UI_SKIN_B, character.b_skin, 255, 1)
- SetUIValueRange(DNA_UI_MARK_R, character.r_markings, 255, 1)
- SetUIValueRange(DNA_UI_MARK_G, character.g_markings, 255, 1)
- SetUIValueRange(DNA_UI_MARK_B, character.b_markings, 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_R, color2R(character.m_colours["head"]), 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_G, color2G(character.m_colours["head"]), 255, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_B, color2B(character.m_colours["head"]), 255, 1)
- SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
+ SetUIValueRange(DNA_UI_BODY_MARK_R, color2R(character.m_colours["body"]), 255, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_G, color2G(character.m_colours["body"]), 255, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_B, color2B(character.m_colours["body"]), 255, 1)
- SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_R, color2R(character.m_colours["tail"]), 255, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_G, color2G(character.m_colours["tail"]), 255, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_B, color2B(character.m_colours["tail"]), 255, 1)
+
+ SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
+
+ SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
/*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/
- SetUIValueRange(DNA_UI_MARK_STYLE, marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, marking_styles_list.len, 1)
+ SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, marking_styles_list.len, 1)
UpdateUI()
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 137617ffd1e..2c5fdbbb5b1 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -138,9 +138,9 @@
H.g_skin = dna.GetUIValueRange(DNA_UI_SKIN_G, 255)
H.b_skin = dna.GetUIValueRange(DNA_UI_SKIN_B, 255)
- H.r_markings = dna.GetUIValueRange(DNA_UI_MARK_R, 255)
- H.g_markings = dna.GetUIValueRange(DNA_UI_MARK_G, 255)
- H.b_markings = dna.GetUIValueRange(DNA_UI_MARK_B, 255)
+ H.m_colours["head"] = rgb(dna.GetUIValueRange(DNA_UI_HEAD_MARK_R, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_G, 255), dna.GetUIValueRange(DNA_UI_HEAD_MARK_B, 255))
+ H.m_colours["body"] = rgb(dna.GetUIValueRange(DNA_UI_BODY_MARK_R, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_G, 255), dna.GetUIValueRange(DNA_UI_BODY_MARK_B, 255))
+ H.m_colours["tail"] = rgb(dna.GetUIValueRange(DNA_UI_TAIL_MARK_R, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_G, 255), dna.GetUIValueRange(DNA_UI_TAIL_MARK_B, 255))
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
@@ -149,16 +149,37 @@
else
H.change_gender(MALE, 0)
- //Markings
- var/marks = dna.GetUIValueRange(DNA_UI_MARK_STYLE,marking_styles_list.len)
- if((0 < marks) && (marks <= marking_styles_list.len))
- H.m_style = marking_styles_list[marks]
+ var/number_head_marks = 0
+ var/number_body_marks = 0
+ var/number_tail_marks = 0
+ for(var/m in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/marking = marking_styles_list[m]
+ if(marking.marking_location == "head")
+ number_head_marks++
+ else if(marking.marking_location == "body")
+ number_body_marks++
+ else if(marking.marking_location == "tail")
+ number_tail_marks++
+
+ //Head Markings
+ var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, marking_styles_list.len)
+ if((head_marks > 0) && (head_marks <= number_head_marks))
+ H.m_styles["head"] = marking_styles_list[head_marks]
+ //Body Markings
+ var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE, marking_styles_list.len)
+ if((body_marks > 0) && (body_marks <= number_body_marks))
+ H.m_styles["body"] = marking_styles_list[body_marks]
+ //Tail Markings
+ var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, marking_styles_list.len)
+ if((tail_marks > 0) && (tail_marks <= number_tail_marks))
+ H.m_styles["tail"] = marking_styles_list[tail_marks]
H.force_update_limbs()
H.update_eyes()
H.update_hair()
H.update_fhair()
H.update_markings()
+ H.update_tail_layer()
H.update_head_accessory()
return 1
@@ -178,7 +199,7 @@
//Hair
var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
- if((0 < hair) && (hair <= hair_styles_list.len))
+ if((hair > 0) && (hair <= hair_styles_list.len))
head_organ.h_style = hair_styles_list[hair]
head_organ.r_hair = GetUIValueRange(DNA_UI_HAIR_R, 255)
@@ -187,7 +208,7 @@
//Facial Hair
var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
- if((0 < beard) && (beard <= facial_hair_styles_list.len))
+ if((beard > 0) && (beard <= facial_hair_styles_list.len))
head_organ.f_style = facial_hair_styles_list[beard]
head_organ.r_facial = GetUIValueRange(DNA_UI_BEARD_R, 255)
@@ -196,7 +217,7 @@
//Head Accessories
var/headacc = GetUIValueRange(DNA_UI_HACC_STYLE,head_accessory_styles_list.len)
- if((0 < headacc) && (headacc <= head_accessory_styles_list.len))
+ if((headacc > 0) && (headacc <= head_accessory_styles_list.len))
head_organ.ha_style = head_accessory_styles_list[headacc]
head_organ.r_headacc = GetUIValueRange(DNA_UI_HACC_R, 255)
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 992e4326317..a194ddfeed1 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -54,10 +54,14 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Character Generation", rgb(eyes_red,eyes_green,eyes_blue)) as null|color
if(new_eyes)
- eyes_red = hex2num(copytext(new_eyes, 2, 4))
- eyes_green = hex2num(copytext(new_eyes, 4, 6))
- eyes_blue = hex2num(copytext(new_eyes, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ M.change_eye_color(color2R(new_eyes), color2G(new_eyes), color2B(new_eyes))
+
+ //Alt heads.
+ if(head_organ.species.bodyflags & HAS_ALT_HEADS)
+ var/list/valid_alt_heads = M.generate_valid_alt_heads()
+ var/new_alt_head = input("Please select alternate head", "Character Generation", head_organ.alt_head) as null|anything in valid_alt_heads
+ if(new_alt_head)
+ M.change_alt_head(new_alt_head)
// hair
var/list/valid_hairstyles = M.generate_valid_hairstyles()
@@ -65,52 +69,45 @@
// if new style selected (not cancel)
if(new_style)
- head_organ.h_style = new_style
+ M.change_hair(new_style)
var/new_hair = input("Please select hair color.", "Character Generation", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as null|color
if(new_hair)
- head_organ.r_hair = hex2num(copytext(new_hair, 2, 4))
- head_organ.g_hair = hex2num(copytext(new_hair, 4, 6))
- head_organ.b_hair = hex2num(copytext(new_hair, 6, 8))
+ M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair))
+
+ var/datum/sprite_accessory/hair_style = hair_styles_list[head_organ.h_style]
+ if(hair_style.secondary_theme && !hair_style.no_sec_colour)
+ new_hair = input("Please select secondary hair color.", "Character Generation", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as null|color
+ if(new_hair)
+ M.change_hair_color(color2R(new_hair), color2G(new_hair), color2B(new_hair), 1)
// facial hair
var/list/valid_facial_hairstyles = M.generate_valid_facial_hairstyles()
new_style = input("Please select facial style", "Character Generation", head_organ.f_style) as null|anything in valid_facial_hairstyles
if(new_style)
- head_organ.f_style = new_style
+ M.change_facial_hair(new_style)
var/new_facial = input("Please select facial hair color.", "Character Generation", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as null|color
if(new_facial)
- head_organ.r_facial = hex2num(copytext(new_facial, 2, 4))
- head_organ.g_facial = hex2num(copytext(new_facial, 4, 6))
- head_organ.b_facial = hex2num(copytext(new_facial, 6, 8))
+ M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial))
+
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
+ if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
+ new_facial = input("Please select secondary facial hair color.", "Character Generation", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as null|color
+ if(new_facial)
+ M.change_facial_hair_color(color2R(new_facial), color2G(new_facial), color2B(new_facial), 1)
//Head accessory.
if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()
var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories
if(new_head_accessory)
- head_organ.ha_style = new_head_accessory
+ M.change_head_accessory(new_head_accessory)
var/new_head_accessory_colour = input("Please select head accessory colour.", "Character Generation", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as null|color
if(new_head_accessory_colour)
- head_organ.r_headacc = hex2num(copytext(new_head_accessory_colour, 2, 4))
- head_organ.g_headacc = hex2num(copytext(new_head_accessory_colour, 4, 6))
- head_organ.b_headacc = hex2num(copytext(new_head_accessory_colour, 6, 8))
-
- //Body markings.
- if(M.species.bodyflags & HAS_MARKINGS)
- var/list/valid_markings = M.generate_valid_markings()
- var/new_marking = input("Please select marking style", "Character Generation", M.m_style) as null|anything in valid_markings
- if(new_marking)
- M.m_style = new_marking
-
- var/new_marking_colour = input("Please select marking colour.", "Character Generation", rgb(M.r_markings, M.g_markings, M.b_markings)) as null|color
- if(new_marking_colour)
- M.r_markings = hex2num(copytext(new_marking_colour, 2, 4))
- M.g_markings = hex2num(copytext(new_marking_colour, 4, 6))
- M.b_markings = hex2num(copytext(new_marking_colour, 6, 8))
+ M.change_head_accessory_color(color2R(new_head_accessory_colour), color2G(new_head_accessory_colour), color2B(new_head_accessory_colour))
//Body accessory.
if(M.species.tail && M.species.bodyflags & HAS_TAIL)
@@ -118,18 +115,51 @@
if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items.
var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories
if(new_body_accessory)
- M.body_accessory = body_accessory_by_name[new_body_accessory]
+ M.change_body_accessory(new_body_accessory)
+
+ //Head markings.
+ if(M.species.bodyflags & HAS_HEAD_MARKINGS)
+ var/list/valid_head_markings = M.generate_valid_markings("head")
+ var/new_marking = input("Please select head marking style", "Character Generation", M.m_styles["head"]) as null|anything in valid_head_markings
+ if(new_marking)
+ M.change_markings(new_marking, "head")
+
+ var/new_marking_colour = input("Please select head marking colour.", "Character Generation", M.m_colours["head"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "head")
+ //Body markings.
+ if(M.species.bodyflags & HAS_BODY_MARKINGS)
+ var/list/valid_body_markings = M.generate_valid_markings("body")
+ var/new_marking = input("Please select body marking style", "Character Generation", M.m_styles["body"]) as null|anything in valid_body_markings
+ if(new_marking)
+ M.change_markings(new_marking, "body")
+
+ var/new_marking_colour = input("Please select body marking colour.", "Character Generation", M.m_colours["body"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "body")
+ //Tail markings.
+ if(M.species.bodyflags & HAS_TAIL_MARKINGS)
+ var/list/valid_tail_markings = M.generate_valid_markings("tail")
+ var/new_marking = input("Please select tail marking style", "Character Generation", M.m_styles["tail"]) as null|anything in valid_tail_markings
+ if(new_marking)
+ M.change_markings(new_marking, "tail")
+
+ var/new_marking_colour = input("Please select tail marking colour.", "Character Generation", M.m_colours["tail"]) as null|color
+ if(new_marking_colour)
+ M.change_marking_color(new_marking_colour, "tail")
//Skin tone.
if(M.species.bodyflags & HAS_SKIN_TONE)
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 35
- M.s_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
+ else
+ new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
+ M.change_skin_tone(new_tone)
if(M.species.bodyflags & HAS_ICON_SKIN_TONE)
var/prompt = "Please select skin tone: 1-[M.species.icon_skin_tones.len] ("
- for(var/i = 1; i <= M.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to M.species.icon_skin_tones.len)
prompt += "[i] = [M.species.icon_skin_tones[i]]"
if(i != M.species.icon_skin_tones.len)
prompt += ", "
@@ -138,18 +168,16 @@
var/new_tone = input(prompt, "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 0
- M.s_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ else
+ new_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ M.change_skin_tone(new_tone)
//Skin colour.
if(M.species.bodyflags & HAS_SKIN_COLOR)
var/new_body_colour = input("Please select body colour.", "Character Generation", rgb(M.r_skin, M.g_skin, M.b_skin)) as null|color
if(new_body_colour)
- M.r_skin = hex2num(copytext(new_body_colour, 2, 4))
- M.g_skin = hex2num(copytext(new_body_colour, 4, 6))
- M.b_skin = hex2num(copytext(new_body_colour, 6, 8))
+ M.change_skin_color(color2R(new_body_colour), color2G(new_body_colour), color2B(new_body_colour))
- M.force_update_limbs()
- M.regenerate_icons()
M.update_dna()
M.visible_message("[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index f060183f25d..df30a2e6169 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -160,16 +160,13 @@ proc/issyndicate(mob/living/M as mob)
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
- head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
- head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
- var/eyes_red = hex2num(copytext(eye_c, 2, 4))
- var/eyes_green = hex2num(copytext(eye_c, 4, 6))
- var/eyes_blue = hex2num(copytext(eye_c, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ head_organ.r_facial = color2R(hair_c)
+ head_organ.g_facial = color2G(hair_c)
+ head_organ.b_facial = color2B(hair_c)
+ head_organ.r_hair = color2R(hair_c)
+ head_organ.g_hair = color2G(hair_c)
+ head_organ.b_hair = color2B(hair_c)
+ M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 8c139dabdbd..58d041b9442 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -129,7 +129,6 @@ var/const/access_trade_sol = 160
return 0
-
/obj/item/proc/GetAccess()
return list()
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 7c77ca6099f..01608efedcb 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -1,9 +1,12 @@
-
#define COMM_SCREEN_MAIN 1
#define COMM_SCREEN_STAT 2
#define COMM_SCREEN_MESSAGES 3
#define COMM_SCREEN_SECLEVEL 4
+#define COMM_AUTHENTICATION_NONE 0
+#define COMM_AUTHENTICATION_MIN 1
+#define COMM_AUTHENTICATION_MAX 2
+
// The communications computer
/obj/machinery/computer/communications
name = "communications console"
@@ -13,7 +16,7 @@
req_access = list(access_heads)
circuit = /obj/item/weapon/circuitboard/communications
var/prints_intercept = 1
- var/authenticated = 0
+ var/authenticated = COMM_AUTHENTICATION_NONE
var/list/messagetitle = list()
var/list/messagetext = list()
var/currmsg = 0
@@ -39,16 +42,16 @@
crew_announcement.newscast = 1
/obj/machinery/computer/communications/proc/is_authenticated(var/mob/user, var/message = 1)
- if(authenticated == 2)
- return 2
+ if(authenticated == COMM_AUTHENTICATION_MAX)
+ return COMM_AUTHENTICATION_MAX
else if(user.can_admin_interact())
- return 2
+ return COMM_AUTHENTICATION_MAX
else if(authenticated)
- return 1
+ return COMM_AUTHENTICATION_MIN
else
if(message)
to_chat(user, "Access denied.")
- return 0
+ return COMM_AUTHENTICATION_NONE
/obj/machinery/computer/communications/Topic(href, href_list)
if(..(href, href_list))
@@ -62,23 +65,23 @@
if(!ishuman(usr))
to_chat(usr, "Access denied.")
return
- var/mob/living/carbon/human/M = usr
- var/obj/item/card = M.get_active_hand()
- var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(I && istype(I))
- if(src.check_access(I))
- authenticated = 1
- if(access_captain in I.access)
- authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
+
+ var/list/access = usr.get_access()
+ if(allowed(usr))
+ authenticated = COMM_AUTHENTICATION_MIN
+
+ if(access_captain in access)
+ authenticated = COMM_AUTHENTICATION_MAX
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
nanomanager.update_uis(src)
return
if(href_list["logout"])
- authenticated = 0
+ authenticated = COMM_AUTHENTICATION_NONE
crew_announcement.announcer = ""
setMenuState(usr,COMM_SCREEN_MAIN)
nanomanager.update_uis(src)
@@ -131,13 +134,13 @@
to_chat(usr, "You need to swipe your ID.")
if("announce")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(message_cooldown)
to_chat(usr, "Please allow at least one minute to pass between announcements.")
nanomanager.update_uis(src)
return
var/input = input(usr, "Please write a message to announce to the station crew.", "Priority Announcement")
- if(!input || message_cooldown || ..() || !(is_authenticated(usr) == 2))
+ if(!input || message_cooldown || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
crew_announcement.Announce(input)
@@ -213,13 +216,13 @@
setMenuState(usr,COMM_SCREEN_STAT)
if("nukerequest")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please enter the reason for requesting the nuclear self-destruct codes. Misuse of the nuclear request system will not be tolerated under any circumstances. Transmission does not guarantee a response.", "Self Destruct Code Request.","") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Nuke_request(input, usr)
@@ -232,13 +235,13 @@
setMenuState(usr,COMM_SCREEN_MAIN)
if("MessageCentcomm")
- if(is_authenticated(usr) == 2)
+ if(is_authenticated(usr) == COMM_AUTHENTICATION_MAX)
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please choose a message to transmit to Centcomm via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Centcomm_announce(input, usr)
@@ -251,13 +254,13 @@
// OMG SYNDICATE ...LETTERHEAD
if("MessageSyndicate")
- if((is_authenticated(usr) == 2) && (src.emagged))
+ if((is_authenticated(usr) == COMM_AUTHENTICATION_MAX) && (src.emagged))
if(centcomm_message_cooldown)
to_chat(usr, "Arrays recycling. Please stand by.")
nanomanager.update_uis(src)
return
var/input = stripped_input(usr, "Please choose a message to transmit to \[ABNORMAL ROUTING CORDINATES\] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "") as text|null
- if(!input || ..() || !(is_authenticated(usr) == 2))
+ if(!input || ..() || !(is_authenticated(usr) == COMM_AUTHENTICATION_MAX))
nanomanager.update_uis(src)
return
Syndicate_announce(input, usr)
@@ -518,7 +521,7 @@
return ..()
shuttle_master.emergency.request(null, 0.3, null, "All communication consoles, boards, and AI's have been destroyed.")
- log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
- message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
+ log_game("All the AI's, communication consoles and boards are destroyed. Shuttle called.")
+ message_admins("All the AI's, communication consoles and boards are destroyed. Shuttle called.", 1)
return ..()
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 30e5cac609f..acad5a5a563 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -4,7 +4,7 @@
name = "airlock electronics"
icon = 'icons/obj/doors/door_assembly.dmi'
icon_state = "door_electronics"
- w_class = 2 //It should be tiny! -Agouri
+ w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
req_access = list(access_engine)
@@ -12,101 +12,96 @@
var/list/conf_access = null
var/one_access = 0 //if set to 1, door would receive req_one_access instead of req_access
var/last_configurator = null
- var/locked = 1
+ var/locked = TRUE
+ var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
- attack_self(mob/user as mob)
- if(!ishuman(user) && !istype(user,/mob/living/silicon/robot))
- return ..(user)
+/obj/item/weapon/airlock_electronics/attack_self(mob/user)
+ if(!ishuman(user) && !isrobot(user))
+ return ..()
+ if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.getBrainLoss() >= 60)
+ if(H.getBrainLoss() >= max_brain_damage)
+ to_chat(user, "You forget how to use \the [src].")
return
- var/t1 = text("Access control
\n")
+ var/t1 = text("Access control
\n")
+ if(last_configurator)
+ t1 += "Operator: [last_configurator]
"
- if(last_configurator)
- t1 += "Operator: [last_configurator]
"
+ if(locked)
+ t1 += "Swipe ID
"
+ else
+ t1 += "Block
"
- if(locked)
- t1 += "Swipe ID
"
+ t1 += "Access requirement is set to "
+ t1 += one_access ? "ONE
" : "ALL
"
+
+ t1 += conf_access == null ? "All
" : "All
"
+
+ t1 += "
"
+
+ var/list/accesses = get_all_accesses()
+ for(var/acc in accesses)
+ var/aname = get_access_desc(acc)
+
+ if(!conf_access || !conf_access.len || !(acc in conf_access))
+ t1 += "[aname]
"
+ else if(one_access)
+ t1 += "[aname]
"
+ else
+ t1 += "[aname]
"
+
+ t1 += "Close
\n"
+
+ var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
+ popup.set_content(t1)
+ popup.open(0)
+ onclose(user, "airlock")
+
+/obj/item/weapon/airlock_electronics/Topic(href, href_list)
+ ..()
+
+ if(usr.incapacitated() || (!ishuman(usr) && !isrobot(usr)))
+ return 1
+
+ if(href_list["close"])
+ usr << browse(null, "window=airlock")
+ return
+
+ if(href_list["login"])
+ if(allowed(usr))
+ locked = FALSE
+ last_configurator = usr.name
+
+ if(locked)
+ return
+
+ if(href_list["logout"])
+ locked = TRUE
+
+ if(href_list["one_access"])
+ one_access = !one_access
+
+ if(href_list["access"])
+ toggle_access(href_list["access"])
+
+ attack_self(usr)
+
+/obj/item/weapon/airlock_electronics/proc/toggle_access(var/access)
+ if(access == "all")
+ conf_access = null
+ else
+ var/req = text2num(access)
+
+ if(conf_access == null)
+ conf_access = list()
+
+ if(!(req in conf_access))
+ conf_access += req
else
- t1 += "Block
"
-
- t1 += "Access requirement is set to "
- t1 += one_access ? "ONE
" : "ALL
"
-
- t1 += conf_access == null ? "All
" : "All
"
-
- t1 += "
"
-
- var/list/accesses = get_all_accesses()
- for(var/acc in accesses)
- var/aname = get_access_desc(acc)
-
- if(!conf_access || !conf_access.len || !(acc in conf_access))
- t1 += "[aname]
"
- else if(one_access)
- t1 += "[aname]
"
- else
- t1 += "[aname]
"
-
- t1 += "Close
\n"
-
- var/datum/browser/popup = new(user, "airlock_electronics", name, 400, 400)
- popup.set_content(t1)
- popup.open(0)
- onclose(user, "airlock")
-
- Topic(href, href_list)
- ..()
- if(usr.stat || usr.restrained() || (!ishuman(usr) && !istype(usr,/mob/living/silicon)))
- return
- if(href_list["close"])
- usr << browse(null, "window=airlock")
- return
-
- if(href_list["login"])
- if(istype(usr,/mob/living/silicon))
- src.locked = 0
- src.last_configurator = usr.name
- else
- var/obj/item/I = usr.get_active_hand()
- if(istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if(I && src.check_access(I))
- src.locked = 0
- src.last_configurator = I:registered_name
-
- if(locked)
- return
-
- if(href_list["logout"])
- locked = 1
-
- if(href_list["one_access"])
- one_access = !one_access
-
- if(href_list["access"])
- toggle_access(href_list["access"])
-
- attack_self(usr)
-
- proc
- toggle_access(var/acc)
- if(acc == "all")
+ conf_access -= req
+ if(!conf_access.len)
conf_access = null
- else
- var/req = text2num(acc)
-
- if(conf_access == null)
- conf_access = list()
-
- if(!(req in conf_access))
- conf_access += req
- else
- conf_access -= req
- if(!conf_access.len)
- conf_access = null
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index 151478ddee6..73e590361a7 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -111,21 +111,21 @@
if(do_after(user, 50, target = H))
switch(what_to_dye)
if("hair")
- var/r_hair = hex2num(copytext(dye_color, 2, 4))
- var/g_hair = hex2num(copytext(dye_color, 4, 6))
- var/b_hair = hex2num(copytext(dye_color, 6, 8))
+ var/r_hair = color2R(dye_color)
+ var/g_hair = color2G(dye_color)
+ var/b_hair = color2B(dye_color)
if(H.change_hair_color(r_hair, g_hair, b_hair))
H.update_dna()
if("facial hair")
- var/r_facial = hex2num(copytext(dye_color, 2, 4))
- var/g_facial = hex2num(copytext(dye_color, 4, 6))
- var/b_facial = hex2num(copytext(dye_color, 6, 8))
+ var/r_facial = color2R(dye_color)
+ var/g_facial = color2G(dye_color)
+ var/b_facial = color2B(dye_color)
if(H.change_facial_hair_color(r_facial, g_facial, b_facial))
H.update_dna()
if("body")
- var/r_skin = hex2num(copytext(dye_color, 2, 4))
- var/g_skin = hex2num(copytext(dye_color, 4, 6))
- var/b_skin = hex2num(copytext(dye_color, 6, 8))
+ var/r_skin = color2R(dye_color)
+ var/g_skin = color2G(dye_color)
+ var/b_skin = color2B(dye_color)
if(H.change_skin_color(r_skin, g_skin, b_skin))
H.update_dna()
user.visible_message("[user] finishes dying [M]'s [what_to_dye]!", "You finish dying [M]'s [what_to_dye]!")
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index 7cc71918905..448395df3e4 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -16,41 +16,41 @@
var/icon_closed = "lockbox"
var/icon_broken = "lockbox+b"
-
- attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/card/id))
- if(src.broken)
- to_chat(user, "It appears to be broken.")
- return
- if(src.allowed(user))
- src.locked = !( src.locked )
- if(src.locked)
- src.icon_state = src.icon_locked
- to_chat(user, "You lock the [src.name]!")
- return
- else
- src.icon_state = src.icon_closed
- to_chat(user, "You unlock the [src.name]!")
- origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
- return
- else
- to_chat(user, "Access Denied")
- else if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)) && !broken)
- emag_act(user)
+/obj/item/weapon/storage/lockbox/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(broken)
+ to_chat(user, "It appears to be broken.")
return
- if(!locked)
- ..()
+ if(check_access(W))
+ locked = !locked
+ if(locked)
+ icon_state = icon_locked
+ to_chat(user, "You lock \the [src]!")
+ return
+ else
+ icon_state = icon_closed
+ to_chat(user, "You unlock \the [src]!")
+ origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
+ return
else
- to_chat(user, "It's locked!")
+ to_chat(user, "Access denied.")
+ return
+ else if((istype(W, /obj/item/weapon/card/emag) || (istype(W, /obj/item/weapon/melee/energy/blade)) && !broken))
+ emag_act(user)
return
+ if(!locked)
+ ..()
+ else
+ to_chat(user, "It's locked!")
+ return
- show_to(mob/user as mob)
- if(locked)
- to_chat(user, "It's locked!")
- else
- ..()
- return
+/obj/item/weapon/storage/lockbox/show_to(mob/user as mob)
+ if(locked)
+ to_chat(user, "It's locked!")
+ else
+ ..()
+ return
/obj/item/weapon/storage/lockbox/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!locked)
@@ -64,7 +64,7 @@
broken = 1
locked = 0
desc = "It appears to be broken."
- icon_state = src.icon_broken
+ icon_state = icon_broken
to_chat(user, "You unlock \the [src].")
origin_tech = null //wipe out any origin tech if it's unlocked in any way so you can't double-dip tech levels at R&D.
return
@@ -84,23 +84,21 @@
name = "Lockbox (Mindshield Implants)"
req_access = list(access_security)
- New()
- ..()
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implantcase/loyalty(src)
- new /obj/item/weapon/implanter/loyalty(src)
-
+/obj/item/weapon/storage/lockbox/loyalty/New()
+ ..()
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implantcase/loyalty(src)
+ new /obj/item/weapon/implanter/loyalty(src)
/obj/item/weapon/storage/lockbox/clusterbang
name = "lockbox (clusterbang)"
desc = "You have a bad feeling about opening this."
req_access = list(access_security)
- New()
- ..()
- new /obj/item/weapon/grenade/clusterbuster(src)
-
+/obj/item/weapon/storage/lockbox/clusterbang/New()
+ ..()
+ new /obj/item/weapon/grenade/clusterbuster(src)
/obj/item/weapon/storage/lockbox/medal
name = "medal box"
@@ -116,14 +114,14 @@
icon_closed = "medalbox"
icon_broken = "medalbox+b"
- New()
- ..()
- new /obj/item/clothing/accessory/medal/gold/heroism(src)
- new /obj/item/clothing/accessory/medal/silver/security(src)
- new /obj/item/clothing/accessory/medal/silver/valor(src)
- new /obj/item/clothing/accessory/medal/nobel_science(src)
- new /obj/item/clothing/accessory/medal/bronze_heart(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/conduct(src)
- new /obj/item/clothing/accessory/medal/gold/captain(src)
+/obj/item/weapon/storage/lockbox/medal/New()
+ ..()
+ new /obj/item/clothing/accessory/medal/gold/heroism(src)
+ new /obj/item/clothing/accessory/medal/silver/security(src)
+ new /obj/item/clothing/accessory/medal/silver/valor(src)
+ new /obj/item/clothing/accessory/medal/nobel_science(src)
+ new /obj/item/clothing/accessory/medal/bronze_heart(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/conduct(src)
+ new /obj/item/clothing/accessory/medal/gold/captain(src)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index f1eca747755..cc09bfb1f8a 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -18,20 +18,37 @@
return
switch(choice)
if("Underwear")
- var/new_undies = input(user, "Select your underwear", "Changing") as null|anything in underwear_list
- if(new_undies)
- H.underwear = new_undies
+ var/list/valid_underwear = list()
+ for(var/underwear in underwear_list)
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_underwear[underwear] = underwear_list[underwear]
+ var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
+ if(new_underwear)
+ H.underwear = new_underwear
if("Undershirt")
- var/new_undershirt = input(user, "Select your undershirt", "Changing") as null|anything in undershirt_list
+ var/list/valid_undershirts = list()
+ for(var/undershirt in undershirt_list)
+ var/datum/sprite_accessory/S = undershirt_list[undershirt]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_undershirts[undershirt] = undershirt_list[undershirt]
+ var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
if(new_undershirt)
H.undershirt = new_undershirt
if("Socks")
- var/new_socks = input(user, "Select your socks", "Changing") as null|anything in socks_list
+ var/list/valid_sockstyles = list()
+ for(var/sockstyle in socks_list)
+ var/datum/sprite_accessory/S = socks_list[sockstyle]
+ if(!(H.species.name in S.species_allowed))
+ continue
+ valid_sockstyles[sockstyle] = socks_list[sockstyle]
+ var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
if(new_socks)
- H.socks= new_socks
-
+ H.socks = new_socks
add_fingerprint(H)
H.update_body()
\ No newline at end of file
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index 81e800a2b00..121228b4d3f 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -167,16 +167,13 @@ var/ert_request_answered = 0
if(prob(5))
facial_hair_style = pick(facial_hair_styles_list)
- head_organ.r_facial = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_facial = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_facial = hex2num(copytext(hair_c, 6, 8))
- head_organ.r_hair = hex2num(copytext(hair_c, 2, 4))
- head_organ.g_hair = hex2num(copytext(hair_c, 4, 6))
- head_organ.b_hair = hex2num(copytext(hair_c, 6, 8))
- var/eyes_red = hex2num(copytext(eye_c, 2, 4))
- var/eyes_green = hex2num(copytext(eye_c, 4, 6))
- var/eyes_blue = hex2num(copytext(eye_c, 6, 8))
- M.change_eye_color(eyes_red, eyes_green, eyes_blue)
+ head_organ.r_facial = color2R(hair_c)
+ head_organ.g_facial = color2G(hair_c)
+ head_organ.b_facial = color2B(hair_c)
+ head_organ.r_hair = color2R(hair_c)
+ head_organ.g_hair = color2G(hair_c)
+ head_organ.b_hair = color2B(hair_c)
+ M.change_eye_color(color2R(eye_c), color2G(eye_c), color2B(eye_c))
M.s_tone = skin_tone
head_organ.h_style = hair_style
head_organ.f_style = facial_hair_style
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 82f76a04824..72ec8f101d2 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -108,18 +108,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/r_headacc = 0 //Head accessory colour
var/g_headacc = 0 //Head accessory colour
var/b_headacc = 0 //Head accessory colour
- var/m_style = "None" //Marking style
- var/r_markings = 0 //Marking colour
- var/g_markings = 0 //Marking colour
- var/b_markings = 0 //Marking colour
+ var/list/m_styles = list(
+ "head" = "None",
+ "body" = "None",
+ "tail" = "None"
+ ) //Marking styles.
+ var/list/m_colours = list(
+ "head" = "#000000",
+ "body" = "#000000",
+ "tail" = "#000000"
+ ) //Marking colours.
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
var/b_hair = 0 //Hair color
- var/f_style = "Shaved" //Face hair type
- var/r_facial = 0 //Face hair color
- var/g_facial = 0 //Face hair color
- var/b_facial = 0 //Face hair color
+ var/r_hair_sec = 0 //Secondary hair color
+ var/g_hair_sec = 0 //Secondary hair color
+ var/b_hair_sec = 0 //Secondary hair color
+ var/f_style = "Shaved" //Facial hair type
+ var/r_facial = 0 //Facial hair color
+ var/g_facial = 0 //Facial hair color
+ var/b_facial = 0 //Facial hair color
+ var/r_facial_sec = 0 //Secondary facial hair color
+ var/g_facial_sec = 0 //Secondary facial hair color
+ var/b_facial_sec = 0 //Secondary facial hair color
var/s_tone = 0 //Skin tone
var/r_skin = 0 //Skin color
var/g_skin = 0 //Skin color
@@ -127,6 +139,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/r_eyes = 0 //Eye color
var/g_eyes = 0 //Eye color
var/b_eyes = 0 //Eye color
+ var/alt_head = "None" //Alt head style.
var/species = "Human"
var/language = "None" //Secondary language
@@ -284,18 +297,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "[ha_style] "
dat += "Color [color_square(r_headacc, g_headacc, b_headacc)]
"
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have body markings.
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ dat += "Head Markings: "
+ dat += "[m_styles["head"]]"
+ dat += "Color [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]
"
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
dat += "Body Markings: "
- dat += "[m_style]"
- dat += "Color [color_square(r_markings, g_markings, b_markings)]
"
+ dat += "[m_styles["body"]]"
+ dat += "Color [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]
"
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ dat += "Tail Markings: "
+ dat += "[m_styles["tail"]]"
+ dat += "Color [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]
"
dat += "Hair: "
dat += "[h_style]"
- dat += "Color [color_square(r_hair, g_hair, b_hair)]
"
+ dat += "Color [color_square(r_hair, g_hair, b_hair)]"
+ var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style]
+ if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]"
+ dat += "
"
dat += "Facial Hair: "
dat += "[f_style ? "[f_style]" : "Shaved"]"
- dat += "Color [color_square(r_facial, g_facial, b_facial)]
"
+ dat += "Color [color_square(r_facial, g_facial, b_facial)]"
+ var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style]
+ if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour)
+ dat += " Color #2 [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]"
+ dat += "
"
+
if(species != "Machine")
dat += "Eyes: "
@@ -318,6 +348,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "Character Records
"
dat += "Limbs
"
+ if(species in list("Unathi")) //Species with alt heads.
+ dat += "Alternate Head: "
+ dat += "[alt_head]
"
dat += "Limbs and Parts: Adjust
"
if(species != "Slime People" && species != "Machine")
dat += "Internal Organs: Adjust
"
@@ -1097,6 +1130,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(href_list["task"])
if("random")
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
switch(href_list["preference"])
if("name")
real_name = random_name(gender,species)
@@ -1107,23 +1144,59 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
r_hair = rand(0,255)
g_hair = rand(0,255)
b_hair = rand(0,255)
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_hair_sec = rand(0,255)
+ g_hair_sec = rand(0,255)
+ b_hair_sec = rand(0,255)
if("h_style")
- h_style = random_hair_style(gender, species)
+ h_style = random_hair_style(gender, species, robohead)
if("facial")
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
r_facial = rand(0,255)
g_facial = rand(0,255)
b_facial = rand(0,255)
+ if("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
+ r_facial_sec = rand(0,255)
+ g_facial_sec = rand(0,255)
+ b_facial_sec = rand(0,255)
if("f_style")
- f_style = random_facial_hair_style(gender, species)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if("headaccessory")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ r_headacc = rand(0,255)
+ g_headacc = rand(0,255)
+ b_headacc = rand(0,255)
+ if("ha_style")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_styles["body"] = random_marking_style("body", species)
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings.
+ m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255))
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255))
if("underwear")
- underwear = random_underwear(gender)
+ underwear = random_underwear(gender, species)
ShowChoices(user)
if("undershirt")
- undershirt = random_undershirt(gender)
+ undershirt = random_undershirt(gender, species)
ShowChoices(user)
if("socks")
- socks = random_socks(gender)
+ socks = random_socks(gender, species)
ShowChoices(user)
if("eyes")
r_eyes = rand(0,255)
@@ -1159,7 +1232,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(new_age)
age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN)
if("species")
-
var/list/new_species = list("Human", "Tajaran", "Skrell", "Unathi", "Diona", "Vulpkanin")
var/prev_species = species
// var/whitelisted = 0
@@ -1177,43 +1249,41 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
species = input("Please select a species", "Character Generation", null) in new_species
if(prev_species != species)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
//grab one of the valid hair styles for the newly chosen species
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
-
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
-
- if(valid_hairstyles.len)
- h_style = pick(valid_hairstyles)
- else
- //this shouldn't happen
- h_style = hair_styles_list["Bald"]
+ h_style = random_hair_style(gender, species, robohead)
//grab one of the valid facial hair styles for the newly chosen species
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
- continue
- if(!(species in S.species_allowed))
- continue
+ f_style = random_facial_hair_style(gender, species, robohead)
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species that have head accessories.
+ ha_style = random_head_accessory(species)
else
- //this shouldn't happen
- f_style = facial_hair_styles_list["Shaved"]
+ ha_style = "None" // No Vulp ears on Unathi
+ r_headacc = 0
+ g_headacc = 0
+ b_headacc = 0
+
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ else
+ m_styles["head"] = "None"
+ m_colours["head"] = "#000000"
+
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ m_styles["body"] = random_marking_style("body", species)
+ else
+ m_styles["body"] = "None"
+ m_colours["body"] = "#000000"
+
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ else
+ m_styles["tail"] = "None"
+ m_colours["tail"] = "#000000"
// Don't wear another species' underwear!
var/datum/sprite_accessory/S = underwear_list[underwear]
@@ -1228,20 +1298,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!S || !(species in S.species_allowed))
socks = random_socks(gender, species)
- //reset hair colour and skin colour
- r_hair = 0//hex2num(copytext(new_hair, 2, 4))
- g_hair = 0//hex2num(copytext(new_hair, 4, 6))
- b_hair = 0//hex2num(copytext(new_hair, 6, 8))
-
- s_tone = 0
+ //reset skin tone and colour
+ if(species in list("Human", "Drask", "Vox"))
+ random_skin_tone(species)
+ else
+ s_tone = 0
if(!(species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")))
r_skin = 0
g_skin = 0
b_skin = 0
- ha_style = "None" // No Vulp ears on Unathi
- m_style = "None" // No Unathi markings on Tajara
+ alt_head = "None" //No alt heads on species that don't have them.
body_accessory = null //no vulptail on humans damnit
@@ -1288,39 +1356,44 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/input = "Choose your character's hair colour:"
var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
if(new_hair)
- r_hair = hex2num(copytext(new_hair, 2, 4))
- g_hair = hex2num(copytext(new_hair, 4, 6))
- b_hair = hex2num(copytext(new_hair, 6, 8))
+ r_hair = color2R(new_hair)
+ g_hair = color2G(new_hair)
+ b_hair = color2B(new_hair)
+
+ if("secondary_hair")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
+ if(hair_style.secondary_theme && !hair_style.no_sec_colour)
+ var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null
+ if(new_hair)
+ r_hair_sec = color2R(new_hair)
+ g_hair_sec = color2G(new_hair)
+ b_hair_sec = color2B(new_hair)
if("h_style")
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
- if(S.name == "Bald")
- valid_hairstyles[hairstyle] = S
- if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
- else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
- //and said head is in the hair style's allowed models list...
- valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
- continue
- else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_hairstyles[hairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
- valid_hairstyles[hairstyle] = S
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
+ continue
+ if(species == "Machine") //Species that can use prosthetic heads.
+ var/head_model
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ head_model = "Morpheus Cyberkinetics"
+ else
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
+ else
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
if(new_h_style)
@@ -1331,9 +1404,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/input = "Choose the colour of your your character's head accessory:"
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
if(new_head_accessory)
- r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ r_headacc = color2R(new_head_accessory)
+ g_headacc = color2G(new_head_accessory)
+ b_headacc = color2B(new_head_accessory)
if("ha_style")
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
@@ -1343,47 +1416,130 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(!(species in H.species_allowed))
continue
- valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
+ valid_head_accessory_styles += head_accessory_style
var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
if(new_head_accessory_style)
ha_style = new_head_accessory_style
- if("markings")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/input = "Choose the colour of your your character's markings:"
- var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
- if(new_markings)
- r_markings = hex2num(copytext(new_markings, 2, 4))
- g_markings = hex2num(copytext(new_markings, 4, 6))
- b_markings = hex2num(copytext(new_markings, 6, 8))
-
- if("m_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
- var/list/valid_markings = list()
- for(var/markingstyle in marking_styles_list)
- var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
- if(!(species in M.species_allowed))
+ if("alt_head")
+ if(organ_data["head"] == "cyborg")
+ return
+ if(species in list("Unathi")) //Species with alt heads.
+ var/list/valid_alt_heads = list()
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(species in head.species_allowed))
continue
+ valid_alt_heads += alternate_head
+
+ var/new_alt_head = input(user, "Choose your character's alternate head style:", "Character Preference") as null|anything in valid_alt_heads
+ if(new_alt_head)
+ alt_head = new_alt_head
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+
+ if("m_style_head")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "head")
+ continue
+ if(alt_head && alt_head != "None")
+ if(!("All" in M.heads_allowed) && !(alt_head in M.heads_allowed))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
+
if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_model = "Morpheus Cyberkinetics"
else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
continue
else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
if(!(robohead.company in M.models_allowed))
continue
- valid_markings[markingstyle] = marking_styles_list[markingstyle]
+ valid_markings += markingstyle
- var/new_marking_style = input(user, "Choose the style of your character's markings:", "Character Preference", m_style) as null|anything in valid_markings
+ var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", m_styles["head"]) as null|anything in valid_markings
if(new_marking_style)
- m_style = new_marking_style
+ m_styles["head"] = new_marking_style
+
+ if("m_head_colour")
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin")) //Species with head markings.
+ var/input = "Choose the colour of your your character's head markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["head"]) as color|null
+ if(new_markings)
+ m_colours["head"] = new_markings
+
+ if("m_style_body")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
+ if(!(species in M.species_allowed))
+ continue
+ if(M.marking_location != "body")
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", m_styles["body"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["body"] = new_marking_style
+
+ if("m_body_colour")
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask")) //Species with body markings/tattoos.
+ var/input = "Choose the colour of your your character's body markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["body"]) as color|null
+ if(new_markings)
+ m_colours["body"] = new_markings
+
+ if("m_style_tail")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/list/valid_markings = list()
+ valid_markings["None"] = marking_styles_list["None"]
+ for(var/markingstyle in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/tail/M = marking_styles_list[markingstyle]
+ if(M.marking_location != "tail")
+ continue
+ if(!(species in M.species_allowed))
+ continue
+ if(!body_accessory)
+ if(M.tails_allowed)
+ continue
+ else
+ if(!M.tails_allowed || !(body_accessory in M.tails_allowed))
+ continue
+
+ valid_markings += markingstyle
+
+ var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", m_styles["tail"]) as null|anything in valid_markings
+ if(new_marking_style)
+ m_styles["tail"] = new_marking_style
+
+ if("m_tail_colour")
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ var/input = "Choose the colour of your your character's tail markings:"
+ var/new_markings = input(user, input, "Character Preference", m_colours["tail"]) as color|null
+ if(new_markings)
+ m_colours["tail"] = new_markings
if("body_accessory")
var/list/possible_body_accessories = list()
@@ -1400,74 +1556,90 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/new_body_accessory = input(user, "Choose your body accessory:", "Character Preference") as null|anything in possible_body_accessories
if(new_body_accessory)
+ m_styles["tail"] = "None"
body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
if("facial")
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
if(new_facial)
- r_facial = hex2num(copytext(new_facial, 2, 4))
- g_facial = hex2num(copytext(new_facial, 4, 6))
- b_facial = hex2num(copytext(new_facial, 6, 8))
+ r_facial = color2R(new_facial)
+ g_facial = color2G(new_facial)
+ b_facial = color2B(new_facial)
+
+ if("secondary_facial")
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
+ var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
+ var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null
+ if(new_facial)
+ r_facial_sec = color2R(new_facial)
+ g_facial_sec = color2G(new_facial)
+ b_facial_sec = color2B(new_facial)
if("f_style")
- var/list/valid_facialhairstyles = list()
+ var/list/valid_facial_hairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(S.name == "Shaved")
- valid_facialhairstyles[facialhairstyle] = S
+
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
+ continue
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
continue
if(species == "Machine") //Species that can use prosthetic heads.
- var/obj/item/organ/external/head/H = new()
+ var/head_model
if(!rlimb_data["head"]) //Handle situations where the head is default.
- H.model = "Morpheus Cyberkinetics"
+ head_model = "Morpheus Cyberkinetics"
else
- H.model = rlimb_data["head"]
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(species in S.species_allowed)
- if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
- valid_facialhairstyles[facialhairstyle] = S
- continue
+ head_model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[head_model]
+ if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
- if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
- continue
- else if(!robohead.is_monitor && ("Human" in S.species_allowed))
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- if(!(species in S.species_allowed))
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
+ else //If the user is not a species who can have robotic heads, use the default handling.
+ if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles
if(new_f_style)
f_style = new_f_style
if("underwear")
- var/list/underwear_options
- if(gender == MALE)
- underwear_options = underwear_m
- else
- underwear_options = underwear_f
-
- var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in underwear_options
+ var/list/valid_underwear = list()
+ for(var/underwear in underwear_list)
+ var/datum/sprite_accessory/S = underwear_list[underwear]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_underwear[underwear] = underwear_list[underwear]
+ var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear
+ ShowChoices(user)
if(new_underwear)
underwear = new_underwear
- ShowChoices(user)
-
if("undershirt")
- var/new_undershirt
- if(gender == MALE)
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_m
- else
- new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in undershirt_f
+ var/list/valid_undershirts = list()
+ for(var/undershirt in undershirt_list)
+ var/datum/sprite_accessory/S = undershirt_list[undershirt]
+ if(gender == MALE && S.gender == FEMALE)
+ continue
+ if(gender == FEMALE && S.gender == MALE)
+ continue
+ if(!(species in S.species_allowed))
+ continue
+ valid_undershirts[undershirt] = undershirt_list[undershirt]
+ var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts
+ ShowChoices(user)
if(new_undershirt)
undershirt = new_undershirt
- ShowChoices(user)
if("socks")
var/list/valid_sockstyles = list()
@@ -1488,9 +1660,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("eyes")
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
if(new_eyes)
- r_eyes = hex2num(copytext(new_eyes, 2, 4))
- g_eyes = hex2num(copytext(new_eyes, 4, 6))
- b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ r_eyes = color2R(new_eyes)
+ g_eyes = color2G(new_eyes)
+ b_eyes = color2B(new_eyes)
if("s_tone")
if(species == "Human" || species == "Drask")
@@ -1506,9 +1678,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if((species in list("Unathi", "Tajaran", "Skrell", "Slime People", "Vulpkanin", "Machine")) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
if(new_skin)
- r_skin = hex2num(copytext(new_skin, 2, 4))
- g_skin = hex2num(copytext(new_skin, 4, 6))
- b_skin = hex2num(copytext(new_skin, 6, 8))
+ r_skin = color2R(new_skin)
+ g_skin = color2G(new_skin)
+ b_skin = color2B(new_skin)
if("ooccolor")
@@ -1594,8 +1766,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(new_state)
if("Normal")
if(limb == "head")
- m_style = "None"
- h_style = random_hair_style(gender, species)
+ m_styles["head"] = "None"
+ h_style = hair_styles_list["Bald"]
f_style = facial_hair_styles_list["Shaved"]
organ_data[limb] = null
rlimb_data[limb] = null
@@ -1640,11 +1812,15 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
if(subchoice)
choice = subchoice
- if(limb == "head")
- ha_style = "None"
- h_style = hair_styles_list["Bald"]
- f_style = facial_hair_styles_list["Shaved"]
- m_style = "None"
+ if(limb in list("head", "chest", "groin"))
+ if(species != "Machine")
+ return
+ if(limb == "head")
+ ha_style = "None"
+ alt_head = null
+ h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_styles["head"] = "None"
rlimb_data[limb] = choice
organ_data[limb] = "cyborg"
if(second_limb)
@@ -1655,7 +1831,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else
rlimb_data[second_limb] = choice
organ_data[second_limb] = "cyborg"
-
if("organs")
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
if(!organ_name) return
@@ -1847,16 +2022,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
//Head-specific
var/obj/item/organ/external/head/H = character.get_organ("head")
+
H.r_hair = r_hair
H.g_hair = g_hair
H.b_hair = b_hair
+ H.r_hair_sec = r_hair_sec
+ H.g_hair_sec = g_hair_sec
+ H.b_hair_sec = b_hair_sec
+
H.r_facial = r_facial
H.g_facial = g_facial
H.b_facial = b_facial
+ H.r_facial_sec = r_facial_sec
+ H.g_facial_sec = g_facial_sec
+ H.b_facial_sec = b_facial_sec
+
H.h_style = h_style
H.f_style = f_style
+
+ H.alt_head = alt_head
//End of head-specific.
character.r_skin = r_skin
@@ -1946,10 +2132,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
H.b_headacc = b_headacc
H.ha_style = ha_style
if(character.species.bodyflags & HAS_MARKINGS)
- character.r_markings = r_markings
- character.g_markings = g_markings
- character.b_markings = b_markings
- character.m_style = m_style
+ character.m_colours = m_colours
+ character.m_styles = m_styles
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index 4506d510754..1425f714183 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -110,23 +110,28 @@
hair_red,
hair_green,
hair_blue,
+ secondary_hair_red,
+ secondary_hair_green,
+ secondary_hair_blue,
facial_red,
facial_green,
facial_blue,
+ secondary_facial_red,
+ secondary_facial_green,
+ secondary_facial_blue,
skin_tone,
skin_red,
skin_green,
skin_blue,
- markings_red,
- markings_green,
- markings_blue,
+ marking_colours,
head_accessory_red,
head_accessory_green,
head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red,
eyes_green,
eyes_blue,
@@ -181,52 +186,57 @@
r_hair = text2num(query.item[8])
g_hair = text2num(query.item[9])
b_hair = text2num(query.item[10])
- r_facial = text2num(query.item[11])
- g_facial = text2num(query.item[12])
- b_facial = text2num(query.item[13])
- s_tone = text2num(query.item[14])
- r_skin = text2num(query.item[15])
- g_skin = text2num(query.item[16])
- b_skin = text2num(query.item[17])
- r_markings = text2num(query.item[18])
- g_markings = text2num(query.item[19])
- b_markings = text2num(query.item[20])
- r_headacc = text2num(query.item[21])
- g_headacc = text2num(query.item[22])
- b_headacc = text2num(query.item[23])
- h_style = query.item[24]
- f_style = query.item[25]
- m_style = query.item[26]
- ha_style = query.item[27]
- r_eyes = text2num(query.item[28])
- g_eyes = text2num(query.item[29])
- b_eyes = text2num(query.item[30])
- underwear = query.item[31]
- undershirt = query.item[32]
- backbag = text2num(query.item[33])
- b_type = query.item[34]
+ r_hair_sec = text2num(query.item[11])
+ g_hair_sec = text2num(query.item[12])
+ b_hair_sec = text2num(query.item[13])
+ r_facial = text2num(query.item[14])
+ g_facial = text2num(query.item[15])
+ b_facial = text2num(query.item[16])
+ r_facial_sec = text2num(query.item[17])
+ g_facial_sec = text2num(query.item[18])
+ b_facial_sec = text2num(query.item[19])
+ s_tone = text2num(query.item[20])
+ r_skin = text2num(query.item[21])
+ g_skin = text2num(query.item[22])
+ b_skin = text2num(query.item[23])
+ m_colours = params2list(query.item[24])
+ r_headacc = text2num(query.item[25])
+ g_headacc = text2num(query.item[26])
+ b_headacc = text2num(query.item[27])
+ h_style = query.item[28]
+ f_style = query.item[29]
+ m_styles = params2list(query.item[30])
+ ha_style = query.item[31]
+ alt_head = query.item[32]
+ r_eyes = text2num(query.item[33])
+ g_eyes = text2num(query.item[34])
+ b_eyes = text2num(query.item[35])
+ underwear = query.item[36]
+ undershirt = query.item[37]
+ backbag = text2num(query.item[38])
+ b_type = query.item[39]
//Jobs
- alternate_option = text2num(query.item[35])
- job_support_high = text2num(query.item[36])
- job_support_med = text2num(query.item[37])
- job_support_low = text2num(query.item[38])
- job_medsci_high = text2num(query.item[39])
- job_medsci_med = text2num(query.item[40])
- job_medsci_low = text2num(query.item[41])
- job_engsec_high = text2num(query.item[42])
- job_engsec_med = text2num(query.item[43])
- job_engsec_low = text2num(query.item[44])
- job_karma_high = text2num(query.item[45])
- job_karma_med = text2num(query.item[46])
- job_karma_low = text2num(query.item[47])
+ alternate_option = text2num(query.item[40])
+ job_support_high = text2num(query.item[41])
+ job_support_med = text2num(query.item[42])
+ job_support_low = text2num(query.item[43])
+ job_medsci_high = text2num(query.item[44])
+ job_medsci_med = text2num(query.item[45])
+ job_medsci_low = text2num(query.item[46])
+ job_engsec_high = text2num(query.item[47])
+ job_engsec_med = text2num(query.item[48])
+ job_engsec_low = text2num(query.item[49])
+ job_karma_high = text2num(query.item[50])
+ job_karma_med = text2num(query.item[51])
+ job_karma_low = text2num(query.item[52])
//Miscellaneous
- flavor_text = query.item[48]
- med_record = query.item[49]
- sec_record = query.item[50]
- gen_record = query.item[51]
+ flavor_text = query.item[53]
+ med_record = query.item[54]
+ sec_record = query.item[55]
+ gen_record = query.item[56]
// Apparently, the preceding vars weren't always encoded properly...
if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags!
flavor_text = html_encode(flavor_text)
@@ -236,17 +246,17 @@
sec_record = html_encode(sec_record)
if(findtext(gen_record, "<"))
gen_record = html_encode(gen_record)
- disabilities = text2num(query.item[52])
- player_alt_titles = params2list(query.item[53])
- organ_data = params2list(query.item[54])
- rlimb_data = params2list(query.item[55])
- nanotrasen_relation = query.item[56]
- speciesprefs = text2num(query.item[57])
+ disabilities = text2num(query.item[57])
+ player_alt_titles = params2list(query.item[58])
+ organ_data = params2list(query.item[59])
+ rlimb_data = params2list(query.item[60])
+ nanotrasen_relation = query.item[61]
+ speciesprefs = text2num(query.item[62])
//socks
- socks = query.item[58]
- body_accessory = query.item[59]
- gear = params2list(query.item[60])
+ socks = query.item[63]
+ body_accessory = query.item[64]
+ gear = params2list(query.item[65])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -262,23 +272,30 @@
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
+ r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec))
+ g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec))
+ b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec))
r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
+ r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec))
+ g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec))
+ b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec))
s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
- r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings))
- g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings))
- b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings))
+ for(var/marking_location in m_colours)
+ m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location])
r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc))
g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc))
b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc))
h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
- m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style))
+ for(var/marking_location in m_styles)
+ m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location])
ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style))
+ alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head))
r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
@@ -318,6 +335,9 @@
var/rlimblist
var/playertitlelist
var/gearlist
+
+ var/markingcolourslist = list2params(m_colours)
+ var/markingstyleslist = list2params(m_styles)
if(!isemptylist(organ_data))
organlist = list2params(organ_data)
if(!isemptylist(rlimb_data))
@@ -341,23 +361,28 @@
hair_red='[r_hair]',
hair_green='[g_hair]',
hair_blue='[b_hair]',
+ secondary_hair_red='[r_hair_sec]',
+ secondary_hair_green='[g_hair_sec]',
+ secondary_hair_blue='[b_hair_sec]',
facial_red='[r_facial]',
facial_green='[g_facial]',
facial_blue='[b_facial]',
+ secondary_facial_red='[r_facial_sec]',
+ secondary_facial_green='[g_facial_sec]',
+ secondary_facial_blue='[b_facial_sec]',
skin_tone='[s_tone]',
skin_red='[r_skin]',
skin_green='[g_skin]',
skin_blue='[b_skin]',
- markings_red='[r_markings]',
- markings_green='[g_markings]',
- markings_blue='[b_markings]',
+ marking_colours='[sanitizeSQL(markingcolourslist)]',
head_accessory_red='[r_headacc]',
head_accessory_green='[g_headacc]',
head_accessory_blue='[b_headacc]',
hair_style_name='[sanitizeSQL(h_style)]',
facial_style_name='[sanitizeSQL(f_style)]',
- marking_style_name='[sanitizeSQL(m_style)]',
+ marking_styles='[sanitizeSQL(markingstyleslist)]',
head_accessory_style_name='[sanitizeSQL(ha_style)]',
+ alt_head_name='[sanitizeSQL(alt_head)]',
eyes_red='[r_eyes]',
eyes_green='[g_eyes]',
eyes_blue='[b_eyes]',
@@ -406,14 +431,17 @@
INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender,
age, species, language,
hair_red, hair_green, hair_blue,
+ secondary_hair_red, secondary_hair_green, secondary_hair_blue,
facial_red, facial_green, facial_blue,
+ secondary_facial_red, secondary_facial_green, secondary_facial_blue,
skin_tone, skin_red, skin_green, skin_blue,
- markings_red, markings_green, markings_blue,
+ marking_colours,
head_accessory_red, head_accessory_green, head_accessory_blue,
hair_style_name,
facial_style_name,
- marking_style_name,
+ marking_styles,
head_accessory_style_name,
+ alt_head_name,
eyes_red, eyes_green, eyes_blue,
underwear, undershirt,
backbag, b_type, alternate_option,
@@ -433,14 +461,17 @@
('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]',
'[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]',
'[r_hair]', '[g_hair]', '[b_hair]',
+ '[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]',
'[r_facial]', '[g_facial]', '[b_facial]',
+ '[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]',
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
- '[r_markings]', '[g_markings]', '[b_markings]',
+ '[sanitizeSQL(markingcolourslist)]',
'[r_headacc]', '[g_headacc]', '[b_headacc]',
'[sanitizeSQL(h_style)]',
'[sanitizeSQL(f_style)]',
- '[sanitizeSQL(m_style)]',
+ '[sanitizeSQL(markingstyleslist)]',
'[sanitizeSQL(ha_style)]',
+ '[sanitizeSQL(alt_head)]',
'[r_eyes]', '[g_eyes]', '[b_eyes]',
'[underwear]', '[undershirt]',
'[backbag]', '[b_type]', '[alternate_option]',
diff --git a/code/modules/computer3/computers/communications.dm b/code/modules/computer3/computers/communications.dm
index 726de710a1a..a4fad8a16cb 100644
--- a/code/modules/computer3/computers/communications.dm
+++ b/code/modules/computer3/computers/communications.dm
@@ -66,16 +66,21 @@
if("main" in href_list)
state = STATE_DEFAULT
if("login" in href_list)
- var/mob/M = usr
- var/obj/item/I = M.get_active_hand()
+ if(!ishuman(usr))
+ to_chat(usr, "Access denied.")
+ return
+ var/mob/living/carbon/human/H = usr
+ var/obj/item/I = H.get_active_hand()
if(I)
I = I.GetID()
if(istype(I,/obj/item/weapon/card/id) && check_access(I))
authenticated = 1
if(access_captain in I.GetAccess())
authenticated = 2
- crew_announcement.announcer = GetNameAndAssignmentFromId(I)
-
+ var/obj/item/weapon/card/id = H.get_idcard(TRUE)
+ if(istype(id))
+ crew_announcement.announcer = GetNameAndAssignmentFromId(id)
+
if("logout" in href_list)
authenticated = 0
crew_announcement.announcer = ""
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 35e31dc9519..c7126795143 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -14,7 +14,7 @@
var/used = 0
/obj/item/device/fluff/tattoo_gun // Generic tattoo gun, make subtypes for different folks
- name = "dispoable tattoo pen"
+ name = "disposable tattoo pen"
desc = "A cheap plastic tattoo application pen."
icon = 'icons/obj/custom_items.dmi'
icon_state = "tatgun"
@@ -22,7 +22,7 @@
throwforce = 0
w_class = 1
var/tattoo_name = "tiger stripe tattoo" // Tat name for visible messages
- var/tattoo_icon = "Tiger Body" // body_accessory.dmi, new icons defined in sprite_accessories.dm
+ var/tattoo_icon = "Tiger-stripe Tattoo" // body_accessory.dmi, new icons defined in sprite_accessories.dm
var/tattoo_r = 1 // RGB values for the body markings
var/tattoo_g = 1
var/tattoo_b = 1
@@ -47,10 +47,15 @@
to_chat(user, "[target] has no skin, how do you expect to tattoo them?")
return
- if(target.m_style != "None")
+ if(target.m_styles["body"] != "None")
to_chat(user, "[target] already has body markings, any more would look silly!")
return
+ var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon]
+ if(!(target.species.name in temp_tatt.species_allowed))
+ to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.")
+ return
+
if(target == user)
to_chat(user, "You use the [src] to apply a [tattoo_name] to yourself!")
@@ -61,12 +66,8 @@
user.visible_message("[user] finishes the [tattoo_name] on [target].", "You finish the [tattoo_name].")
if(!used) // No exploiting do_after to tattoo multiple folks.
- target.m_style = tattoo_icon
- target.r_markings = tattoo_r
- target.g_markings = tattoo_g
- target.b_markings = tattoo_b
-
- target.update_markings()
+ target.change_markings(tattoo_icon, "body")
+ target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body")
playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
used = 1
@@ -98,9 +99,9 @@
if(!used)
var/ink_color = input("Please select an ink color.", "Tattoo Ink Color", rgb(tattoo_r, tattoo_g, tattoo_b)) as color|null
if(ink_color && !(user.incapacitated() || used) )
- tattoo_r = hex2num(copytext(ink_color, 2, 4))
- tattoo_g = hex2num(copytext(ink_color, 4, 6))
- tattoo_b = hex2num(copytext(ink_color, 6, 8))
+ tattoo_r = color2R(ink_color)
+ tattoo_g = color2G(ink_color)
+ tattoo_b = color2B(ink_color)
to_chat(user, "You change the color setting on the [src].")
diff --git a/code/modules/lighting/light_source.dm b/code/modules/lighting/light_source.dm
index da60e939987..fd92e6675f1 100644
--- a/code/modules/lighting/light_source.dm
+++ b/code/modules/lighting/light_source.dm
@@ -114,9 +114,9 @@
/datum/light_source/proc/parse_light_color()
if(light_color)
- lum_r = GetRedPart(light_color) / 255
- lum_g = GetGreenPart(light_color) / 255
- lum_b = GetBluePart(light_color) / 255
+ lum_r = color2R(light_color) / 255
+ lum_g = color2G(light_color) / 255
+ lum_b = color2B(light_color) / 255
else
lum_r = 1
lum_g = 1
@@ -195,7 +195,7 @@
effect_str.Cut()
effect_turf.Cut()
-
+
/datum/light_source/proc/forget_turf(turf/T)
var/idx = effect_turf.Find(T)
effect_turf.Cut(idx, idx + 1)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 41cfc4d3b28..eb58d39ea7c 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -4,32 +4,29 @@
AC.ui_interact(user, state = state)
/mob/living/carbon/human/proc/change_species(var/new_species)
- if(!new_species)
+ if(!new_species || species == new_species || !(new_species in all_species))
return
- if(species == new_species)
- return
-
- if(!(new_species in all_species))
- return
-
- set_species(new_species)
+ set_species(new_species, null, 1)
reset_hair()
+ if(species.bodyflags & HAS_MARKINGS)
+ reset_markings()
+
return 1
-/mob/living/carbon/human/proc/change_gender(var/gender, var/update_dna = 1)
+/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = organs_by_name["head"]
- if(src.gender == gender)
+ if(gender == new_gender)
return
- src.gender = gender
+ gender = new_gender
var/datum/sprite_accessory/hair/current_hair = hair_styles_list[H.h_style]
- if(current_hair.gender != NEUTER && current_hair.gender != src.gender)
+ if(current_hair.gender != NEUTER && current_hair.gender != gender)
reset_head_hair()
var/datum/sprite_accessory/hair/current_fhair = facial_hair_styles_list[H.f_style]
- if(current_fhair.gender != NEUTER && current_fhair.gender != src.gender)
+ if(current_fhair.gender != NEUTER && current_fhair.gender != gender)
reset_facial_hair()
if(update_dna)
@@ -40,13 +37,7 @@
/mob/living/carbon/human/proc/change_hair(var/hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!hair_style)
- return
-
- if(H.h_style == hair_style)
- return
-
- if(!(hair_style in hair_styles_list))
+ if(!hair_style || !H || H.h_style == hair_style || !(hair_style in hair_styles_list))
return
H.h_style = hair_style
@@ -56,13 +47,7 @@
/mob/living/carbon/human/proc/change_facial_hair(var/facial_hair_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!facial_hair_style)
- return
-
- if(H.f_style == facial_hair_style)
- return
-
- if(!(facial_hair_style in facial_hair_styles_list))
+ if(!facial_hair_style || !H || H.f_style == facial_hair_style || !(facial_hair_style in facial_hair_styles_list))
return
H.f_style = facial_hair_style
@@ -72,13 +57,7 @@
/mob/living/carbon/human/proc/change_head_accessory(var/head_accessory_style)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!head_accessory_style)
- return
-
- if(H.ha_style == head_accessory_style)
- return
-
- if(!(head_accessory_style in head_accessory_styles_list))
+ if(!head_accessory_style || !H || H.ha_style == head_accessory_style || !(head_accessory_style in head_accessory_styles_list))
return
H.ha_style = head_accessory_style
@@ -86,52 +65,95 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_markings(var/marking_style)
- if(!marking_style)
+/mob/living/carbon/human/proc/change_markings(var/marking_style, var/location = "body")
+ if(!marking_style || m_styles[location] == marking_style || !(marking_style in marking_styles_list))
return
- if(src.m_style == marking_style)
+ var/datum/sprite_accessory/body_markings/marking = marking_styles_list[marking_style]
+ if(marking.name != "None" && marking.marking_location != location)
return
- if(!(marking_style in marking_styles_list))
- return
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(location == "head")
+ if(!head_organ)
+ return
- src.m_style = marking_style
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(marking.name != "None" && (!H.heads_allowed || (!("All" in H.heads_allowed) && !(head_organ.alt_head in H.heads_allowed))))
+ return
+ else
+ if(!head_organ.alt_head || head_organ.alt_head == "None")
+ head_organ.alt_head = "None"
+ var/datum/sprite_accessory/body_markings/head/H = marking_styles_list[marking_style]
+ if(H.heads_allowed && !("All" in H.heads_allowed))
+ return
- update_markings()
+ if(location == "tail" && marking.name != "None")
+ var/datum/sprite_accessory/body_markings/tail/tail_marking = marking_styles_list[marking_style]
+ if(!body_accessory)
+ if(tail_marking.tails_allowed)
+ return
+ else
+ if(!tail_marking.tails_allowed || !(body_accessory.name in tail_marking.tails_allowed))
+ return
+
+ m_styles[location] = marking_style
+
+ if(location == "tail")
+ stop_tail_wagging()
+ else
+ update_markings()
return 1
/mob/living/carbon/human/proc/change_body_accessory(var/body_accessory_style)
var/found
- if(!body_accessory_style)
+ if(!body_accessory_style || (body_accessory && body_accessory.name == body_accessory_style))
return
- if(src.body_accessory)
- if(src.body_accessory.name == body_accessory_style)
- return
-
for(var/B in body_accessory_by_name)
if(B == body_accessory_style)
- src.body_accessory = body_accessory_by_name[body_accessory_style]
+ body_accessory = body_accessory_by_name[body_accessory_style]
found = 1
if(!found)
return
+ m_styles["tail"] = "None"
update_tail_layer()
return 1
+/mob/living/carbon/human/proc/change_alt_head(var/alternate_head)
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H || H.alt_head == alternate_head || (H.status & ORGAN_ROBOT) || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
+ return
+
+ H.alt_head = alternate_head
+
+ //Handle head markings if they're incompatible with the new alt head.
+ if(m_styles["head"])
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
+ if(!head_marking_style.heads_allowed || (!("All" in head_marking_style.heads_allowed) && !(H.alt_head in head_marking_style.heads_allowed)))
+ m_styles["head"] = "None"
+ update_markings()
+
+ update_body(1, 1) //Update the body and force limb icon regeneration to update the head with the new icon.
+ if(wear_mask)
+ update_inv_wear_mask()
+ return 1
+
/mob/living/carbon/human/proc/reset_hair()
reset_head_hair()
reset_facial_hair()
reset_head_accessory()
- if(m_style && m_style != "None") //Resets the markings if they were head markings.
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.marking_location == "head")
- reset_markings()
+ if(m_styles["head"] && m_styles["head"] != "None") //Resets head markings.
+ reset_markings("head")
/mob/living/carbon/human/proc/reset_head_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_hairstyles = generate_valid_hairstyles()
if(valid_hairstyles.len)
H.h_style = pick(valid_hairstyles)
@@ -143,6 +165,8 @@
/mob/living/carbon/human/proc/reset_facial_hair()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_facial_hairstyles = generate_valid_facial_hairstyles()
if(valid_facial_hairstyles.len)
H.f_style = pick(valid_facial_hairstyles)
@@ -151,17 +175,32 @@
H.f_style = "Shaved"
update_fhair()
-/mob/living/carbon/human/proc/reset_markings()
- var/list/valid_markings = generate_valid_markings()
- if(valid_markings.len)
- m_style = pick(valid_markings)
+/mob/living/carbon/human/proc/reset_markings(var/location)
+ var/list/valid_markings
+
+ if(location)
+ valid_markings = generate_valid_markings(location)
+ if(valid_markings.len)
+ m_styles[location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[location] = "None"
else
- //this shouldn't happen
- m_style = "None"
+ for(var/m_location in list("head", "body", "tail"))
+ valid_markings = generate_valid_markings(m_location)
+ if(valid_markings.len)
+ m_styles[m_location] = pick(valid_markings)
+ else
+ //this shouldn't happen
+ m_styles[m_location] = "None"
+
update_markings()
+ stop_tail_wagging()
/mob/living/carbon/human/proc/reset_head_accessory()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
var/list/valid_head_accessories = generate_valid_head_accessories()
if(valid_head_accessories.len)
H.ha_style = pick(valid_head_accessories)
@@ -193,32 +232,57 @@
update_body()
return 1
-/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ if(!H)
return
- H.r_hair = red
- H.g_hair = green
- H.b_hair = blue
+ if(!secondary)
+ if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
+ return
+
+ H.r_hair = red
+ H.g_hair = green
+ H.b_hair = blue
+ else
+ if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec)
+ return
+
+ H.r_hair_sec = red
+ H.g_hair_sec = green
+ H.b_hair_sec = blue
update_hair()
return 1
-/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue)
+/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary)
var/obj/item/organ/external/head/H = get_organ("head")
- if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ if(!H)
return
- H.r_facial = red
- H.g_facial = green
- H.b_facial = blue
+ if(!secondary)
+ if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
+ return
+
+ H.r_facial = red
+ H.g_facial = green
+ H.b_facial = blue
+ else
+ if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec)
+ return
+
+ H.r_facial_sec = red
+ H.g_facial_sec = green
+ H.b_facial_sec = blue
update_fhair()
return 1
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return
+
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
return
@@ -229,15 +293,16 @@
update_head_accessory()
return 1
-/mob/living/carbon/human/proc/change_marking_color(var/red, var/green, var/blue)
- if(red == r_markings && green == g_markings && blue == b_markings)
+/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body")
+ if(colour == m_colours[location])
return
- r_markings = red
- g_markings = green
- b_markings = blue
+ m_colours[location] = colour
- update_markings()
+ if(location == "tail")
+ update_tail_layer()
+ else
+ update_markings()
return 1
@@ -287,75 +352,66 @@
/mob/living/carbon/human/proc/generate_valid_hairstyles()
var/list/valid_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(hairstyle == "Bald") //Just in case.
+ valid_hairstyles += hairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- return
- if(H.species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_hairstyles += hairstyle //Give them their hairstyles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
- if(robohead.is_monitor) //If the hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head.
- valid_hairstyles += hairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
+ valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_hairstyles += hairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ valid_hairstyles += hairstyle
return valid_hairstyles
/mob/living/carbon/human/proc/generate_valid_facial_hairstyles()
var/list/valid_facial_hairstyles = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no hair.
+
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
+ if(facialhairstyle == "Shaved") //Just in case.
+ valid_facial_hairstyles += facialhairstyle
continue
- if(gender == FEMALE && S.gender == MALE)
+ if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!H)
- continue // No head, no hair
if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
- valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do.
- continue
- else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally.
- continue
+ if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
-
- if(robohead.is_monitor) //If the facial hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
- continue
- else
- if("Human" in S.species_allowed) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head.
- valid_facial_hairstyles += facialhairstyle
- continue
+ if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
+ valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the facial hair style allows, skip it. Otherwise, add it to the list.
- continue
- valid_facial_hairstyles += facialhairstyle
+ if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ valid_facial_hairstyles += facialhairstyle
return valid_facial_hairstyles
/mob/living/carbon/human/proc/generate_valid_head_accessories()
var/list/valid_head_accessories = new()
var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no head accessory.
+
for(var/head_accessory in head_accessory_styles_list)
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
@@ -365,18 +421,40 @@
return valid_head_accessories
-/mob/living/carbon/human/proc/generate_valid_markings()
+/mob/living/carbon/human/proc/generate_valid_markings(var/location = "body")
var/list/valid_markings = new()
var/obj/item/organ/external/head/H = get_organ("head")
- for(var/marking in marking_styles_list)
- var/datum/sprite_accessory/S = marking_styles_list[marking]
+ if(!H && location == "head")
+ return //No head, no head markings.
- if(!(species.name in S.species_allowed)) //If the user's head is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ for(var/marking in marking_styles_list)
+ var/datum/sprite_accessory/body_markings/S = marking_styles_list[marking]
+ if(S.name == "None")
+ valid_markings += marking
continue
- if(H.species.flags & ALL_RPARTS) //If the user is a species that can have a robotic head...
- var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
- continue
+ if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
+ continue
+ if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ continue
+ if(location == "tail")
+ if(!body_accessory)
+ if(S.tails_allowed)
+ continue
+ else
+ if(!S.tails_allowed || !(body_accessory.name in S.tails_allowed))
+ continue
+ if(location == "head")
+ var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
+ if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head...
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
+ continue
+ else if(H.alt_head && H.alt_head != "None") //If the user's got an alt head, validate markings for that head.
+ if(!M.heads_allowed || (!("All" in M.heads_allowed) && !(H.alt_head in M.heads_allowed)))
+ continue
+ else
+ if(M.heads_allowed && !("All" in M.heads_allowed))
+ continue
valid_markings += marking
return valid_markings
@@ -389,10 +467,24 @@
valid_body_accessories = body_accessory_by_name.Copy()
else
if(!istype(A))
- valid_body_accessories += "None" //The only null entry should be the "None" option.
+ valid_body_accessories["None"] = "None" //The only null entry should be the "None" option.
continue
- if(!(species.name in A.allowed_species)) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
- continue
- valid_body_accessories += B
+ if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ valid_body_accessories += B
- return valid_body_accessories
\ No newline at end of file
+ return valid_body_accessories
+
+/mob/living/carbon/human/proc/generate_valid_alt_heads()
+ var/list/valid_alt_heads = list()
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H)
+ return //No head, no alt heads.
+ valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option.
+ for(var/alternate_head in alt_heads_list)
+ var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
+ if(!(H.species.name in head.species_allowed))
+ continue
+
+ valid_alt_heads += alternate_head
+
+ return valid_alt_heads
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/body_accessories.dm b/code/modules/mob/living/carbon/human/body_accessories.dm
index f4b95eec4d4..8744a09ea4d 100644
--- a/code/modules/mob/living/carbon/human/body_accessories.dm
+++ b/code/modules/mob/living/carbon/human/body_accessories.dm
@@ -112,36 +112,30 @@ var/global/list/body_accessory_by_species = list("None" = null)
//Vulpkanin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
-
icon_state = "vulptail2"
animated_icon_state = "vulptail2_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_3
name = "Vulpkanin Alt 2 (Straight)"
-
icon_state = "vulptail3"
animated_icon_state = "vulptail3_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_4
name = "Vulpkanin Alt 3 (Tiny)"
-
icon_state = "vulptail4"
animated_icon_state = "vulptail4_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_5
name = "Vulpkanin Alt 4 (Short)"
-
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
/datum/body_accessory/tail/vulpkanin_6
name = "Vulpkanin Alt 5 (Straight Bushy)"
-
icon_state = "vulptail6"
animated_icon_state = "vulptail6_a"
allowed_species = list("Vulpkanin")
-
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index df78c286254..4e8ab049927 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -155,11 +155,19 @@
if(istype(H))
if(H.f_style)
- H.f_style = "Shaved"
+ H.f_style = initial(H.f_style)
if(H.h_style)
- H.h_style = "Bald"
+ H.h_style = initial(H.h_style)
+ if(H.ha_style)
+ H.ha_style = initial(H.ha_style)
+ if(H.alt_head)
+ H.alt_head = initial(H.alt_head)
+ H.handle_alt_icon()
+ m_styles = DEFAULT_MARKING_STYLES
update_fhair(0)
update_hair(0)
+ update_head_accessory(0)
+ update_markings(0)
mutations.Add(SKELETON)
mutations.Add(NOCLONE)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ed48c229b89..561e60a3522 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -709,12 +709,19 @@
if(!.) . = if_no_id //to prevent null-names making the mob unclickable
return
-//gets ID card object from special clothes slot or null.
-/mob/living/carbon/human/proc/get_idcard()
+//gets ID card object from special clothes slot or, if applicable, hands as well
+/mob/living/carbon/human/proc/get_idcard(var/check_hands = FALSE)
var/obj/item/weapon/card/id/id = wear_id
var/obj/item/device/pda/pda = wear_id
if(istype(pda) && pda.id)
id = pda.id
+
+ if(check_hands)
+ if(istype(get_active_hand(), /obj/item/weapon/card/id))
+ id = get_active_hand()
+ else if(istype(get_inactive_hand(), /obj/item/weapon/card/id))
+ id = get_inactive_hand()
+
if(istype(id))
return id
@@ -1472,7 +1479,6 @@
to_chat(usr, "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
-
var/datum/species/oldspecies = species
if(!dna)
if(!new_species)
@@ -1525,9 +1531,9 @@
if(species.base_color && default_colour)
//Apply colour.
- r_skin = hex2num(copytext(species.base_color, 2, 4))
- g_skin = hex2num(copytext(species.base_color, 4, 6))
- b_skin = hex2num(copytext(species.base_color, 6, 8))
+ r_skin = color2R(species.base_color)
+ g_skin = color2G(species.base_color)
+ b_skin = color2B(species.base_color)
else
r_skin = 0
g_skin = 0
@@ -1542,37 +1548,47 @@
var/obj/item/organ/external/head/H = get_organ("head")
if(species.default_hair)
H.h_style = species.default_hair
+ else
+ H.h_style = "Bald"
if(species.default_fhair)
H.f_style = species.default_fhair
+ else
+ H.f_style = "Shaved"
if(species.default_headacc)
H.ha_style = species.default_headacc
+ else
+ H.ha_style = "None"
if(species.default_hair_colour)
//Apply colour.
- H.r_hair = hex2num(copytext(species.default_hair_colour, 2, 4))
- H.g_hair = hex2num(copytext(species.default_hair_colour, 4, 6))
- H.b_hair = hex2num(copytext(species.default_hair_colour, 6, 8))
+ H.r_hair = color2R(species.default_hair_colour)
+ H.g_hair = color2G(species.default_hair_colour)
+ H.b_hair = color2B(species.default_hair_colour)
else
H.r_hair = 0
H.g_hair = 0
H.b_hair = 0
if(species.default_fhair_colour)
- H.r_facial = hex2num(copytext(species.default_fhair_colour, 2, 4))
- H.g_facial = hex2num(copytext(species.default_fhair_colour, 4, 6))
- H.b_facial = hex2num(copytext(species.default_fhair_colour, 6, 8))
+ H.r_facial = color2R(species.default_fhair_colour)
+ H.g_facial = color2G(species.default_fhair_colour)
+ H.b_facial = color2B(species.default_fhair_colour)
else
H.r_facial = 0
H.g_facial = 0
H.b_facial = 0
if(species.default_headacc_colour)
- H.r_headacc = hex2num(copytext(species.default_headacc_colour, 2, 4))
- H.g_headacc = hex2num(copytext(species.default_headacc_colour, 4, 6))
- H.b_headacc = hex2num(copytext(species.default_headacc_colour, 6, 8))
+ H.r_headacc = color2R(species.default_headacc_colour)
+ H.g_headacc = color2G(species.default_headacc_colour)
+ H.b_headacc = color2B(species.default_headacc_colour)
else
H.r_headacc = 0
H.g_headacc = 0
H.b_headacc = 0
+ m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None".
+ m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
+ body_accessory = null
+
if(!dna)
dna = new /datum/dna(null)
dna.species = species.name
@@ -1673,16 +1689,13 @@
if(!head_organ)
return
if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
- var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null
+ var/optic_colour = input(src, "Select optic colour", m_colours["head"]) as color|null
if(incapacitated())
to_chat(src, "You were interrupted while changing the colour of your optics.")
return
if(optic_colour)
- r_markings = hex2num(copytext(optic_colour, 2, 4))
- g_markings = hex2num(copytext(optic_colour, 4, 6))
- b_markings = hex2num(copytext(optic_colour, 6, 8))
+ change_markings(optic_colour, "head")
- update_markings()
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_list)
@@ -1690,14 +1703,12 @@
if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
- var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
+ var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
if(incapacitated())
to_chat(src, "You were interrupted while changing your monitor display.")
return
if(new_style)
- head_organ.h_style = new_style
-
- update_hair()
+ change_hair(new_style)
//Putting a couple of procs here that I don't know where else to dump.
//Mostly going to be used for Vox and Vox Armalis, but other human mobs might like them (for adminbuse).
@@ -1977,6 +1988,12 @@
var/obj/item/weapon/card/id/id = wear_id
if(istype(id) && id.is_untrackable())
return 0
+ if(wear_pda)
+ var/obj/item/device/pda/pda = wear_pda
+ if(istype(pda))
+ var/obj/item/weapon/card/id/id = pda.id
+ if(istype(id) && id.is_untrackable())
+ return 0
if(istype(head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = head
if(hat.blockTracking)
@@ -1992,6 +2009,8 @@
if(wear_id)
. |= wear_id.GetAccess()
+ if(wear_pda)
+ . |= wear_pda.GetAccess()
if(istype(w_uniform, /obj/item/clothing/under))
var/obj/item/clothing/under/U = w_uniform
if(U.accessories)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 272cb65e33a..0d30c5c8265 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -4,10 +4,8 @@ var/global/default_martial_art = new/datum/martial_art
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
- var/r_markings = 0
- var/g_markings = 0
- var/b_markings = 0
- var/m_style = "None"
+ var/list/m_colours = DEFAULT_MARKING_COLOURS //All colours set to #000000.
+ var/list/m_styles = DEFAULT_MARKING_STYLES //All markings set to None.
var/s_tone = 0 //Skin tone
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 8288c2dbd8b..50f1e7cd342 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -152,7 +152,7 @@
mutations.Remove(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
@@ -167,7 +167,7 @@
mutations.Add(FAT)
update_mutantrace(0)
update_mutations(0)
- update_body(0)
+ update_body(0, 1)
update_inv_w_uniform(0)
update_inv_wear_suit()
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 72e6ff63314..26ca4af83e8 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -142,7 +142,7 @@
message = uppertext(message)
verb = "yells loudly"
- if(locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs)
+ if((COMIC in mutations) || (locate(/obj/item/organ/internal/cyberimp/brain/clown_voice) in internal_organs))
message = "[message]"
returns[1] = message
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index b025904c92d..540cbca31f1 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -123,11 +123,11 @@
var/female_scream_sound = 'sound/goonstation/voice/female_scream.ogg'
//Default hair/headacc style vars.
- var/default_hair = "Bald" //Default hair style for newly created humans unless otherwise set.
+ var/default_hair //Default hair style for newly created humans unless otherwise set.
var/default_hair_colour
- var/default_fhair = "Shaved" //Default facial hair style for newly created humans unless otherwise set.
+ var/default_fhair //Default facial hair style for newly created humans unless otherwise set.
var/default_fhair_colour
- var/default_headacc = "None" //Default head accessory style for newly created humans unless otherwise set.
+ var/default_headacc //Default head accessory style for newly created humans unless otherwise set.
var/default_headacc_colour
//Defining lists of icon skin tones for species that have them.
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index ebaefe02c81..84cb86db417 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -8,7 +8,7 @@
language = "Sol Common"
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_TONE
+ bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
unarmed_type = /datum/unarmed_attack/punch
blurb = "Humanity originated in the Sol system, and over the last five centuries has spread \
@@ -40,7 +40,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
+ bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
dietflags = DIET_CARN
cold_level_1 = 280 //Default 260 - Lower is better
@@ -112,13 +112,11 @@
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
- base_color = "#333333"
- //Default styles for created mobs.
- default_headacc = "Tajaran Ears"
+ base_color = "#424242"
butt_sprite = "tajaran"
has_organ = list(
@@ -164,11 +162,11 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
+ bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
- base_color = "#B43214"
+ base_color = "#CF4D2F"
butt_sprite = "vulp"
has_organ = list(
@@ -212,7 +210,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR
+ bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -287,7 +285,7 @@
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
- bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED
+ bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
blood_color = "#2299FC"
flesh_color = "#808D11"
@@ -705,6 +703,7 @@
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
+ bodyflags = HAS_BODY_MARKINGS
dietflags = DIET_HERB
reagent_tag = PROCESS_ORG
blood_color = "#A200FF"
@@ -860,7 +859,7 @@
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
- bodyflags = HAS_SKIN_COLOR | HAS_MARKINGS | HAS_HEAD_ACCESSORY
+ bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
@@ -951,7 +950,7 @@
flags = IS_WHITELISTED | HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
- bodyflags = FEET_CLAWS | HAS_SKIN_TONE
+ bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
cold_level_1 = -1 //Default 260 - Lower is better
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 8f7ed81a5fa..037e5234d27 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -212,15 +212,15 @@ var/global/list/damage_icon_parts = list()
if(update_icons) update_icons()
//BASE MOB SPRITE
-/mob/living/carbon/human/proc/update_body(var/update_icons=1)
+/mob/living/carbon/human/proc/update_body(var/update_icons=1, var/rebuild_base=0)
var/husk_color_mod = rgb(96,88,80)
var/hulk_color_mod = rgb(48,224,40)
- var/husk = (HUSK in src.mutations)
- var/fat = (FAT in src.mutations)
- var/hulk = (HULK in src.mutations)
- var/skeleton = (SKELETON in src.mutations)
+ var/husk = (HUSK in mutations)
+ var/fat = (FAT in mutations)
+ var/hulk = (HULK in mutations)
+ var/skeleton = (SKELETON in mutations)
if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
species.updatespeciescolor(src)
@@ -262,7 +262,7 @@ var/global/list/damage_icon_parts = list()
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
- if(human_icon_cache[icon_key])
+ if(human_icon_cache[icon_key] && !rebuild_base)
base_icon = human_icon_cache[icon_key]
else
//BEGIN CACHED ICON GENERATION.
@@ -309,7 +309,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if(src.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs...
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -360,29 +360,32 @@ var/global/list/damage_icon_parts = list()
//MARKINGS OVERLAY
/mob/living/carbon/human/proc/update_markings(var/update_icons=1)
- //Reset our markings
+ //Reset our markings.
overlays_standing[MARKINGS_LAYER] = null
+ //Base icon.
+ var/icon/markings_standing = new/icon('icons/mob/body_accessory.dmi',"accessory_none_s")
+
+ //Body markings.
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
- if(!chest_organ || chest_organ.is_stump() || (chest_organ.status & ORGAN_DESTROYED) )
- if(update_icons) update_icons()
- return
-
- //base icons
- var/icon/markings_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
-
- if(m_style && m_style != "None")
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style)
- var/obj/item/organ/external/head/head_organ = get_organ("head")
- if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head")
- return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example.
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- markings_standing.Blend(markings_s, ICON_OVERLAY)
- else
- //warning("Invalid m_style for [species.name]: [m_style]")
+ if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ if(body_marking_style.do_colouration)
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ markings_standing.Blend(b_marking_s, ICON_OVERLAY)
+ //Head markings.
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ markings_standing.Blend(h_marking_s, ICON_OVERLAY)
overlays_standing[MARKINGS_LAYER] = image(markings_standing)
@@ -399,7 +402,7 @@ var/global/list/damage_icon_parts = list()
return
//masks and helmets can obscure our head accessory
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -426,15 +429,15 @@ var/global/list/damage_icon_parts = list()
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
- overlays_standing[HAIR_LAYER] = null
+ overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -454,13 +457,19 @@ var/global/list/damage_icon_parts = list()
else if(hair_style.do_colouration)
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
//Having it this way preserves animations. Useful for IPC screens.
else
//warning("Invalid h_style for [species.name]: [h_style]")
//hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish?
- overlays_standing[HAIR_LAYER] = image(hair_standing)
+ overlays_standing[HAIR_LAYER] = image(hair_standing)
if(update_icons) update_icons()
@@ -468,15 +477,15 @@ var/global/list/damage_icon_parts = list()
//FACIAL HAIR OVERLAY
/mob/living/carbon/human/proc/update_fhair(var/update_icons=1)
//Reset our facial hair
- overlays_standing[FHAIR_LAYER] = null
+ overlays_standing[FHAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
- if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(update_icons) update_icons()
return
//masks and helmets can obscure our facial hair, unless we're a synthetic
- if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
+ if((head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR)))
if(update_icons) update_icons()
return
@@ -492,11 +501,18 @@ var/global/list/damage_icon_parts = list()
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_standing.Blend(facial_s, ICON_OVERLAY)
else
//warning("Invalid f_style for [species.name]: [f_style]")
- overlays_standing[FHAIR_LAYER] = image(face_standing)
+ overlays_standing[FHAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -536,7 +552,7 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_mutantrace(var/update_icons=1)
//BS12 EDIT
- var/skel = (SKELETON in src.mutations)
+ var/skel = (SKELETON in mutations)
if(skel)
skeleton = 'icons/mob/human_races/r_skeleton.dmi'
else
@@ -562,7 +578,7 @@ var/global/list/damage_icon_parts = list()
..()
if(notransform) return
update_mutations(0)
- update_body(0)
+ update_body(0, 1) //Update the body and force limb icon regeneration.
update_hair(0)
update_head_accessory(0)
update_fhair(0)
@@ -997,13 +1013,21 @@ var/global/list/damage_icon_parts = list()
if(inv)
inv.update_icon()
if(wear_mask && (istype(wear_mask, /obj/item/clothing/mask) || istype(wear_mask, /obj/item/clothing/accessory)))
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ var/datum/sprite_accessory/alt_heads/alternate_head
+ if(head_organ.alt_head && head_organ.alt_head != "None")
+ alternate_head = alt_heads_list[head_organ.alt_head]
+
var/image/standing
+ var/icon/mask_icon = new(wear_mask.icon)
if(wear_mask.icon_override)
- standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.icon_override)
+ standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state]")
+ mask_icon = new(wear_mask.sprite_sheets[species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
- standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]")
+ standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
@@ -1053,7 +1077,7 @@ var/global/list/damage_icon_parts = list()
clear_alert("legcuffed")
if(legcuffed)
overlays_standing[LEGCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "legcuff1")
- throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = src.legcuffed)
+ throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed)
if(m_intent != "walk")
m_intent = "walk"
if(hud_used && hud_used.move_intent)
@@ -1121,71 +1145,66 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_tail_layer(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(new/icon(accessory_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(accessory_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(accessory_s,dir=WEST),dir=WEST)
-
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
// Creates a blank icon, and copies accessory_s' north direction sprite into it
// before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
+ var/icon/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- temp2.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(new/icon(tail_s,dir=SOUTH),dir=SOUTH)
- temp1.Insert(new/icon(tail_s,dir=EAST),dir=EAST)
- temp1.Insert(new/icon(tail_s,dir=WEST),dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tail_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tail_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(new/icon(tail_s,dir=NORTH),dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
+ over.Insert(new/icon(tail_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tail_s)
+ overlays_standing[TAIL_LAYER] = image(tail_s)
if(update_icons)
update_icons()
@@ -1193,70 +1212,67 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/start_tail_wagging(var/update_icons=1)
overlays_standing[TAIL_UNDERLIMBS_LAYER] = null // SEW direction icons, overlayed by LIMBS_LAYER.
- overlays_standing[TAIL_LAYER] = null // This will be one of two things:
- // If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
- // Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions.
+ overlays_standing[TAIL_LAYER] = null /* This will be one of two things:
+ If the species' tail is overlapped by limbs, this will be only the N direction icon so tails can still appear on the outside of uniforms and such.
+ Otherwise, since the user's tail isn't overlapped by limbs, it will be a full icon with all directions. */
+
+ var/icon/tail_marking_icon
+ var/datum/sprite_accessory/body_markings/tail/tail_marking_style
+ if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ tail_marking_style = marking_styles_list[tail_marking]
+ tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
+ tail_marking_icon.Blend(m_colours["tail"], ICON_ADD)
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
if(species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
+ accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(body_accessory.allowed_species)
- if(species.name in body_accessory.allowed_species)
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp1 = temp
- else
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp1 = temp
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
- temp1.Insert(accessory_s,dir=SOUTH)
- temp1.Insert(accessory_s,dir=EAST)
- temp1.Insert(accessory_s,dir=WEST)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
+ if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(species.name in body_accessory.allowed_species) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "[species.tail]_delay")
- temp2 = temp
- else // Else if the user's species is not in the list of allowed species for the currently selected body accessory, this point must have been reached by admin-override. Use vulpkanin timings as default.
- var/icon/temp = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "vulptail_delay")
- temp2 = temp
-
- temp2.Insert(accessory_s,dir=NORTH)
-
- overlays_standing[TAIL_LAYER] = image(temp2, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
+ overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else if(species.tail && species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]w_s")
if(species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
- if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
+ if(tail_marking_icon)
+ tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/temp1 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp1.Insert(tailw_s,dir=SOUTH)
- temp1.Insert(tailw_s,dir=EAST)
- temp1.Insert(tailw_s,dir=WEST)
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
+ under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
+ under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
- overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(temp1)
+ overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
- // Creates a blank icon, and copies accessory_s' north direction sprite into it
- // before passing that to the tail layer that overlays uniforms and such.
- var/icon/temp2 = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_delay")
- temp2.Insert(tailw_s,dir=NORTH)
+ // Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
- overlays_standing[TAIL_LAYER] = image(temp2)
+ overlays_standing[TAIL_LAYER] = image(over)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
- overlays_standing[TAIL_LAYER] = image(tailw_s)
+ overlays_standing[TAIL_LAYER] = image(tailw_s)
if(update_icons)
update_icons()
@@ -1282,17 +1298,17 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.icon_override)
var/icon_path = "[wear_suit.icon_override]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
- var/icon/icon_file
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
- icon_file = new(icon_path)
- standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
+ var/icon/icon_file = new(icon_path)
+ if(wear_suit.icon_state in icon_file.IconStates())
+ standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
else
if(wear_suit.icon_state in C.IconStates())
standing = image("icon" = C, "icon_state" = "[wear_suit.icon_state]")
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 2f44caf161a..3987b709e3e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -80,9 +80,6 @@ proc/get_radio_key_from_channel(var/channel)
verb = "stammers"
speech_problem_flag = 1
- if(COMIC in mutations)
- message = "[message]"
-
if(!IsVocal())
message = ""
speech_problem_flag = 1
diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm
index dfa79a0d0d1..104c2746d16 100644
--- a/code/modules/mob/living/silicon/pai/software_modules.dm
+++ b/code/modules/mob/living/silicon/pai/software_modules.dm
@@ -547,8 +547,7 @@
else
var/datum/gas_mixture/env = T.return_air()
data["reading"] = 1
- var/pres = env.return_pressure() * 10
- data["pressure"] = "[round(pres/10)].[pres%10]"
+ data["pressure"] = env.return_pressure()
data["temperature"] = round(env.temperature)
data["temperatureC"] = round(env.temperature-T0C)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 7e771b2f372..335ecbcd1f6 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -730,18 +730,18 @@ var/list/robot_verbs_default = list(
else
to_chat(user, "Unable to locate a radio.")
- else if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
+ else if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) // trying to unlock the interface with an ID card
if(emagged)//still allow them to open the cover
- to_chat(user, "The interface seems slightly damaged")
+ to_chat(user, "The interface seems slightly damaged.")
if(opened)
to_chat(user, "You must close the cover to swipe an ID card.")
else
- if(allowed(usr))
+ if(allowed(W))
locked = !locked
to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.")
update_icons()
else
- to_chat(user, "\red Access denied.")
+ to_chat(user, "Access denied.")
else if(istype(W, /obj/item/borg/upgrade/))
var/obj/item/borg/upgrade/U = W
@@ -957,29 +957,15 @@ var/list/robot_verbs_default = list(
user.visible_message("[user] pets [src]!", \
"You pet [src]!")
-/mob/living/silicon/robot/proc/allowed(mob/M)
- //check if it doesn't require any access at all
- if(check_access(null))
+/mob/living/silicon/robot/proc/allowed(obj/item/I)
+ var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob
+ dummy.req_access = req_access
+
+ if(dummy.check_access(I))
+ qdel(dummy)
return 1
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- //if they are holding or wearing a card that has access, that works
- if(check_access(H.get_active_hand()) || check_access(H.wear_id))
- return 1
- return 0
-
-/mob/living/silicon/robot/proc/check_access(obj/item/weapon/card/id/I)
- if(!istype(req_access, /list)) //something's very wrong
- return 1
-
- var/list/L = req_access
- if(!L.len) //no requirements
- return 1
- if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
- return 0
- for(var/req in req_access)
- if(req in I.access) //have one of the required accesses
- return 1
+
+ qdel(dummy)
return 0
/mob/living/silicon/robot/update_icons()
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index cf8a7f05574..f0bcbfe0312 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -1,6 +1,10 @@
/datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H
/datum/preferences/proc/random_character(gender_override)
+ var/datum/robolimb/robohead
+ if(species == "Machine")
+ var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
+ robohead = all_robolimbs[head_model]
if(gender_override)
gender = gender_override
else
@@ -8,18 +12,41 @@
underwear = random_underwear(gender, species)
undershirt = random_undershirt(gender, species)
socks = random_socks(gender, species)
- if(species in list("Human", "Drask"))
- s_tone = random_skin_tone()
- h_style = random_hair_style(gender, species)
- f_style = random_facial_hair_style(gender, species)
- if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
+ if(species == "Vulpkanin")
+ body_accessory = random_body_accessory(species)
+ if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed.
+ body_accessory = null
+ if(species in list("Human", "Drask", "Vox"))
+ s_tone = random_skin_tone(species)
+ h_style = random_hair_style(gender, species, robohead)
+ f_style = random_facial_hair_style(gender, species, robohead)
+ if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
randomize_hair_color("hair")
- randomize_hair_color("facial")
- randomize_eyes_color()
- if(species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Vulpkanin")
+ randomize_hair_color("facial")
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))
+ ha_style = random_head_accessory(species)
+ var/list/colours = randomize_skin_color(1)
+ r_headacc = colours["red"]
+ g_headacc = colours["green"]
+ b_headacc = colours["blue"]
+ if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin"))
+ m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask"))
+ m_styles["body"] = random_marking_style("body", species)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
+ m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
+ var/list/colours = randomize_skin_color(1)
+ m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"])
+ if(species != "Machine")
+ randomize_eyes_color()
+ if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin"))
randomize_skin_color()
backbag = 2
- age = rand(AGE_MIN,AGE_MAX)
+ age = rand(AGE_MIN, AGE_MAX)
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
@@ -130,7 +157,7 @@
g_eyes = green
b_eyes = blue
-/datum/preferences/proc/randomize_skin_color()
+/datum/preferences/proc/randomize_skin_color(var/pass_to_list)
var/red
var/green
var/blue
@@ -174,9 +201,17 @@
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
+ if(pass_to_list)
+ var/list/colours = list(
+ "red" = red,
+ "blue" = blue,
+ "green" = green
+ )
+ return colours
+ else
+ r_skin = red
+ g_skin = green
+ b_skin = blue
/datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack")
switch(backbag)
@@ -222,26 +257,12 @@
fat="_fat"
preview_icon = new /icon(icobase, "torso_[g][fat]")
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
- preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
-
- //Tail
- if(current_species && (current_species.bodyflags & HAS_TAIL))
- var/tail_icon
- var/tail_icon_state
-
- if(body_accessory)
- var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
- tail_icon = accessory.icon
- tail_icon_state = accessory.icon_state
- else
- tail_icon = "icons/effects/species.dmi"
- if(coloured_tail)
- tail_icon_state = "[coloured_tail]_s"
- else
- tail_icon_state = "[current_species.tail]_s"
-
- var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
- preview_icon.Blend(temp, ICON_OVERLAY)
+ var/head = "head"
+ if(alt_head && current_species.bodyflags & HAS_ALT_HEADS)
+ var/datum/sprite_accessory/alt_heads/H = alt_heads_list[alt_head]
+ if(H.icon_state)
+ head = H.icon_state
+ preview_icon.Blend(new /icon(icobase, "[head]_[g]"), ICON_OVERLAY)
for(var/name in list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand"))
if(organ_data[name] == "amputated") continue
@@ -266,13 +287,53 @@
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
- //Body Markings
- if(current_species && (current_species.bodyflags & HAS_MARKINGS))
- var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
- if(marking_style && marking_style.species_allowed)
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
- preview_icon.Blend(markings_s, ICON_OVERLAY)
+ //Tail
+ if(current_species && (current_species.bodyflags & HAS_TAIL))
+ var/tail_icon
+ var/tail_icon_state
+
+ if(body_accessory)
+ var/datum/body_accessory/accessory = body_accessory_by_name[body_accessory]
+ tail_icon = accessory.icon
+ tail_icon_state = accessory.icon_state
+ else
+ tail_icon = "icons/effects/species.dmi"
+ if(coloured_tail)
+ tail_icon_state = "[coloured_tail]_s"
+ else
+ tail_icon_state = "[current_species.tail]_s"
+
+ var/icon/temp = new /icon("icon" = tail_icon, "icon_state" = tail_icon_state)
+
+ if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
+ temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
+
+ if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS))
+ var/tail_marking = m_styles["tail"]
+ var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
+ if(tail_marking_style && tail_marking_style.species_allowed)
+ var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
+ t_marking_s.Blend(m_colours["tail"], ICON_ADD)
+ temp.Blend(t_marking_s, ICON_OVERLAY)
+
+ preview_icon.Blend(temp, ICON_OVERLAY)
+
+ //Markings
+ if(current_species && ((current_species.bodyflags & HAS_HEAD_MARKINGS) || (current_species.bodyflags & HAS_BODY_MARKINGS)))
+ if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ var/body_marking = m_styles["body"]
+ var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
+ if(body_marking_style && body_marking_style.species_allowed)
+ var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
+ b_marking_s.Blend(m_colours["body"], ICON_ADD)
+ preview_icon.Blend(b_marking_s, ICON_OVERLAY)
+ if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ var/head_marking = m_styles["head"]
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed)
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ h_marking_s.Blend(m_colours["head"], ICON_ADD)
+ preview_icon.Blend(h_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
@@ -289,6 +350,13 @@
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
+
+ if(hair_style.secondary_theme)
+ var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
+ if(!hair_style.no_sec_colour)
+ hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD)
+ hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
+
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
@@ -306,6 +374,13 @@
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
else
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
+
+ if(facial_hair_style.secondary_theme)
+ var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
+ if(!facial_hair_style.no_sec_colour)
+ facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD)
+ facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
+
face_s.Blend(facial_s, ICON_OVERLAY)
var/icon/underwear_s = null
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 3ade5970d03..0e8f3456335 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -25,14 +25,15 @@
for(var/path in subtypesof(prototype))
var/datum/sprite_accessory/D = new path()
- L[D.name] = D
+ if(D.name)
+ L[D.name] = D
- switch(D.gender)
- if(MALE) male[D.name] = D
- if(FEMALE) female[D.name] = D
- else
- male[D.name] = D
- female[D.name] = D
+ switch(D.gender)
+ if(MALE) male[D.name] = D
+ if(FEMALE) female[D.name] = D
+ else
+ male[D.name] = D
+ female[D.name] = D
return L
/datum/sprite_accessory
@@ -43,8 +44,12 @@
// Restrict some styles to specific species
var/list/species_allowed = list("Human", "Slime People")
- var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/models_allowed = list() //Specifies which, if any, hairstyles or markings can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/list/heads_allowed = null //Specifies which, if any, alt heads a head marking, hairstyle or facial hair style is compatible with.
+ var/list/tails_allowed = null //Specifies which, if any, tails a tail marking is compatible with.
var/marking_location //Specifies which bodypart a body marking is located on.
+ var/secondary_theme = null //If exists, there's a secondary colour to that hair style and the secondary theme's icon state's suffix is equal to this.
+ var/no_sec_colour = null //If exists, prohibit the colouration of the secondary theme.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -61,492 +66,762 @@
/datum/sprite_accessory/hair
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
- bald
- name = "Bald"
- icon_state = "bald"
- gender = MALE
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton")
+/datum/sprite_accessory/hair/bald
+ name = "Bald"
+ icon_state = "bald"
+ species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran")
- short
- name = "Short Hair" // try to capatilize the names please~
- icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
+/datum/sprite_accessory/hair/short
+ name = "Short Hair" // try to capatilize the names please~
+ icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
- cut
- name = "Cut Hair"
- icon_state = "hair_c"
+/datum/sprite_accessory/hair/cut
+ name = "Cut Hair"
+ icon_state = "hair_c"
- long
- name = "Shoulder-length Hair"
- icon_state = "hair_b"
+/datum/sprite_accessory/hair/long
+ name = "Shoulder-length Hair"
+ icon_state = "hair_b"
- longalt
- name = "Shoulder-length Hair Alt"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longalt
+ name = "Shoulder-length Hair Alt"
+ icon_state = "hair_longfringe"
- /*longish
- name = "Longer Hair"
- icon_state = "hair_b2"*/
+/*/datum/sprite_accessory/hair/longish
+ name = "Longer Hair"
+ icon_state = "hair_b2"*/
- longer
- name = "Long Hair"
- icon_state = "hair_vlong"
+/datum/sprite_accessory/hair/longer
+ name = "Long Hair"
+ icon_state = "hair_vlong"
- longeralt
- name = "Long Hair Alt"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longeralt
+ name = "Long Hair Alt"
+ icon_state = "hair_vlongfringe"
- longest
- name = "Very Long Hair"
- icon_state = "hair_longest"
+/datum/sprite_accessory/hair/longest
+ name = "Very Long Hair"
+ icon_state = "hair_longest"
- longfringe
- name = "Long Fringe"
- icon_state = "hair_longfringe"
+/datum/sprite_accessory/hair/longfringe
+ name = "Long Fringe"
+ icon_state = "hair_longfringe"
- longestalt
- name = "Longer Fringe"
- icon_state = "hair_vlongfringe"
+/datum/sprite_accessory/hair/longestalt
+ name = "Longer Fringe"
+ icon_state = "hair_vlongfringe"
- halfbang
- name = "Half-banged Hair"
- icon_state = "hair_halfbang"
+/datum/sprite_accessory/hair/halfbang
+ name = "Half-banged Hair"
+ icon_state = "hair_halfbang"
- halfbangalt
- name = "Half-banged Hair Alt"
- icon_state = "hair_halfbang_alt"
+/datum/sprite_accessory/hair/halfbangalt
+ name = "Half-banged Hair Alt"
+ icon_state = "hair_halfbang_alt"
- ponytail1
- name = "Ponytail male"
- icon_state = "hair_ponytailm"
- gender = MALE
+/datum/sprite_accessory/hair/ponytail1
+ name = "Ponytail male"
+ icon_state = "hair_ponytailm"
+ gender = MALE
- ponytail2
- name = "Ponytail female"
- icon_state = "hair_ponytailf"
- gender = FEMALE
+/datum/sprite_accessory/hair/ponytail2
+ name = "Ponytail female"
+ icon_state = "hair_ponytailf"
+ gender = FEMALE
- ponytail3
- name = "Ponytail alt"
- icon_state = "hair_ponytail3"
+/datum/sprite_accessory/hair/ponytail3
+ name = "Ponytail alt"
+ icon_state = "hair_ponytail3"
- sideponytail
- name = "Side Ponytail"
- icon_state = "hair_stail"
- gender = FEMALE
+/datum/sprite_accessory/hair/sideponytail
+ name = "Side Ponytail"
+ icon_state = "hair_stail"
+ gender = FEMALE
- highponytail
- name = "High Ponytail"
- icon_state = "hair_highponytail"
- gender = FEMALE
+/datum/sprite_accessory/hair/highponytail
+ name = "High Ponytail"
+ icon_state = "hair_highponytail"
+ gender = FEMALE
+/datum/sprite_accessory/hair/wisp
+ name = "Wisp"
+ icon_state = "hair_wisp"
+ gender = FEMALE
- wisp
- name = "Wisp"
- icon_state = "hair_wisp"
- gender = FEMALE
+/datum/sprite_accessory/hair/parted
+ name = "Parted"
+ icon_state = "hair_parted"
- parted
- name = "Parted"
- icon_state = "hair_parted"
+/datum/sprite_accessory/hair/pompadour
+ name = "Pompadour"
+ icon_state = "hair_pompadour"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- pompadour
- name = "Pompadour"
- icon_state = "hair_pompadour"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/quiff
+ name = "Quiff"
+ icon_state = "hair_quiff"
+ gender = MALE
- quiff
- name = "Quiff"
- icon_state = "hair_quiff"
- gender = MALE
+/datum/sprite_accessory/hair/bedhead
+ name = "Bedhead"
+ icon_state = "hair_bedhead"
- bedhead
- name = "Bedhead"
- icon_state = "hair_bedhead"
+/datum/sprite_accessory/hair/bedhead2
+ name = "Bedhead 2"
+ icon_state = "hair_bedheadv2"
- bedhead2
- name = "Bedhead 2"
- icon_state = "hair_bedheadv2"
+/datum/sprite_accessory/hair/bedhead3
+ name = "Bedhead 3"
+ icon_state = "hair_bedheadv3"
- bedhead3
- name = "Bedhead 3"
- icon_state = "hair_bedheadv3"
+/datum/sprite_accessory/hair/beehive
+ name = "Beehive"
+ icon_state = "hair_beehive"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- beehive
- name = "Beehive"
- icon_state = "hair_beehive"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bobcurl
+ name = "Bobcurl"
+ icon_state = "hair_bobcurl"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bobcurl
- name = "Bobcurl"
- icon_state = "hair_bobcurl"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bob
+ name = "Bob"
+ icon_state = "hair_bobcut"
+ gender = FEMALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- bob
- name = "Bob"
- icon_state = "hair_bobcut"
- gender = FEMALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/bowl
+ name = "Bowl"
+ icon_state = "hair_bowlcut"
+ gender = MALE
- bowl
- name = "Bowl"
- icon_state = "hair_bowlcut"
- gender = MALE
+/datum/sprite_accessory/hair/braid2
+ name = "Long Braid"
+ icon_state = "hair_hbraid"
+ gender = FEMALE
- braid2
- name = "Long Braid"
- icon_state = "hair_hbraid"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid_hip
+ name = "Hippie Braid"
+ icon_state = "hair_hipbraid"
+ secondary_theme = "beads"
- buzz
- name = "Buzzcut"
- icon_state = "hair_buzzcut"
- gender = MALE
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/braid_hip_una
+ name = "Unathi Hippie Braid"
+ icon_state = "hair_ubraid"
+ species_allowed = list("Unathi")
+ secondary_theme = "beads"
- crew
- name = "Crewcut"
- icon_state = "hair_crewcut"
- gender = MALE
+/datum/sprite_accessory/hair/buzz
+ name = "Buzzcut"
+ icon_state = "hair_buzzcut"
+ gender = MALE
+ species_allowed = list("Human", "Slime People", "Unathi")
- combover
- name = "Combover"
- icon_state = "hair_combover"
- gender = MALE
+/datum/sprite_accessory/hair/crew
+ name = "Crewcut"
+ icon_state = "hair_crewcut"
+ gender = MALE
- devillock
- name = "Devil Lock"
- icon_state = "hair_devilock"
+/datum/sprite_accessory/hair/combover
+ name = "Combover"
+ icon_state = "hair_combover"
+ gender = MALE
- dreadlocks
- name = "Dreadlocks"
- icon_state = "hair_dreads"
+/datum/sprite_accessory/hair/devillock
+ name = "Devil Lock"
+ icon_state = "hair_devilock"
- curls
- name = "Curls"
- icon_state = "hair_curls"
+/datum/sprite_accessory/hair/dreadlocks
+ name = "Dreadlocks"
+ icon_state = "hair_dreads"
- afro
- name = "Afro"
- icon_state = "hair_afro"
+/datum/sprite_accessory/hair/curls
+ name = "Curls"
+ icon_state = "hair_curls"
- afro2
- name = "Afro 2"
- icon_state = "hair_afro2"
+/datum/sprite_accessory/hair/afro
+ name = "Afro"
+ icon_state = "hair_afro"
- afro_large
- name = "Big Afro"
- icon_state = "hair_bigafro"
- gender = MALE
+/datum/sprite_accessory/hair/afro2
+ name = "Afro 2"
+ icon_state = "hair_afro2"
- sargeant
- name = "Flat Top"
- icon_state = "hair_sargeant"
- gender = MALE
+/datum/sprite_accessory/hair/afro_large
+ name = "Big Afro"
+ icon_state = "hair_bigafro"
+ gender = MALE
- emo
- name = "Emo"
- icon_state = "hair_emo"
+/datum/sprite_accessory/hair/sergeant
+ name = "Flat Top"
+ icon_state = "hair_sergeant"
+ gender = MALE
- fag
- name = "Flow Hair"
- icon_state = "hair_f"
+/datum/sprite_accessory/hair/emo
+ name = "Emo"
+ icon_state = "hair_emo"
- feather
- name = "Feather"
- icon_state = "hair_feather"
+/datum/sprite_accessory/hair/fag
+ name = "Flow Hair"
+ icon_state = "hair_f"
- hitop
- name = "Hitop"
- icon_state = "hair_hitop"
- gender = MALE
+/datum/sprite_accessory/hair/feather
+ name = "Feather"
+ icon_state = "hair_feather"
- mohawk
- name = "Mohawk"
- icon_state = "hair_d"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/hitop
+ name = "Hitop"
+ icon_state = "hair_hitop"
+ gender = MALE
- jensen
- name = "Adam Jensen Hair"
- icon_state = "hair_jensen"
- gender = MALE
+/datum/sprite_accessory/hair/mohawk
+ name = "Mohawk"
+ icon_state = "hair_d"
+ species_allowed = list("Human", "Slime People", "Unathi")
- cia
- name = "CIA"
- icon_state = "hair_cia"
- gender = MALE
+/datum/sprite_accessory/hair/jensen
+ name = "Adam Jensen Hair"
+ icon_state = "hair_jensen"
+ gender = MALE
- mulder
- name = "Mulder"
- icon_state = "hair_mulder"
- gender = MALE
+/datum/sprite_accessory/hair/cia
+ name = "CIA"
+ icon_state = "hair_cia"
+ gender = MALE
- gelled
- name = "Gelled Back"
- icon_state = "hair_gelled"
- gender = FEMALE
+/datum/sprite_accessory/hair/mulder
+ name = "Mulder"
+ icon_state = "hair_mulder"
+ gender = MALE
- gentle
- name = "Gentle"
- icon_state = "hair_gentle"
- gender = FEMALE
+/datum/sprite_accessory/hair/gelled
+ name = "Gelled Back"
+ icon_state = "hair_gelled"
+ gender = FEMALE
- spiky
- name = "Spiky"
- icon_state = "hair_spikey"
- species_allowed = list("Human", "Unathi")
+/datum/sprite_accessory/hair/gentle
+ name = "Gentle"
+ icon_state = "hair_gentle"
+ gender = FEMALE
- kusangi
- name = "Kusanagi Hair"
- icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/spiky
+ name = "Spiky"
+ icon_state = "hair_spikey"
+ species_allowed = list("Human", "Slime People", "Unathi")
- kagami
- name = "Pigtails"
- icon_state = "hair_kagami"
- gender = FEMALE
+/datum/sprite_accessory/hair/kusanagi
+ name = "Kusanagi Hair"
+ icon_state = "hair_kusanagi"
- himecut
- name = "Hime Cut"
- icon_state = "hair_himecut"
- gender = FEMALE
+/datum/sprite_accessory/hair/kagami
+ name = "Pigtails"
+ icon_state = "hair_kagami"
+ gender = FEMALE
- braid
- name = "Floorlength Braid"
- icon_state = "hair_braid"
- gender = FEMALE
+/datum/sprite_accessory/hair/himecut
+ name = "Hime Cut"
+ icon_state = "hair_himecut"
+ gender = FEMALE
- odango
- name = "Odango"
- icon_state = "hair_odango"
- gender = FEMALE
+/datum/sprite_accessory/hair/braid
+ name = "Floorlength Braid"
+ icon_state = "hair_braid"
+ gender = FEMALE
- ombre
- name = "Ombre"
- icon_state = "hair_ombre"
- gender = FEMALE
+/datum/sprite_accessory/hair/odango
+ name = "Odango"
+ icon_state = "hair_odango"
+ gender = FEMALE
- updo
- name = "Updo"
- icon_state = "hair_updo"
- gender = FEMALE
+/datum/sprite_accessory/hair/ombre
+ name = "Ombre"
+ icon_state = "hair_ombre"
+ gender = FEMALE
- skinhead
- name = "Skinhead"
- icon_state = "hair_skinhead"
+/datum/sprite_accessory/hair/updo
+ name = "Updo"
+ icon_state = "hair_updo"
+ gender = FEMALE
- balding
- name = "Balding Hair"
- icon_state = "hair_e"
- gender = MALE // turnoff!
+/datum/sprite_accessory/hair/skinhead
+ name = "Skinhead"
+ icon_state = "hair_skinhead"
- longemo
- name = "Long Emo"
- icon_state = "hair_emolong"
- gender = FEMALE
+/datum/sprite_accessory/hair/balding
+ name = "Balding Hair"
+ icon_state = "hair_e"
+ gender = MALE // turnoff!
+
+/datum/sprite_accessory/hair/longemo
+ name = "Long Emo"
+ icon_state = "hair_emolong"
+ gender = FEMALE
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- birdnest
- name = "Bird Nest"
- icon_state = "hair_birdnest"
+/datum/sprite_accessory/hair/birdnest
+ name = "Bird Nest"
+ icon_state = "hair_birdnest"
- unkept
- name = "Unkempt"
- icon_state = "hair_unkept"
+/datum/sprite_accessory/hair/unkept
+ name = "Unkempt"
+ icon_state = "hair_unkept"
- duelist
- name = "Duelist"
- icon_state = "hair_duelist"
- gender = MALE
+/datum/sprite_accessory/hair/duelist
+ name = "Duelist"
+ icon_state = "hair_duelist"
+ gender = MALE
- modern
- name = "Modern"
- icon_state = "hair_modern"
- gender = FEMALE
+/datum/sprite_accessory/hair/modern
+ name = "Modern"
+ icon_state = "hair_modern"
+ gender = FEMALE
- unshavenmohawk
- name = "Unshaven Mohawk"
- icon_state = "hair_unshavenmohawk"
- gender = MALE
+/datum/sprite_accessory/hair/unshavenmohawk
+ name = "Unshaven Mohawk"
+ icon_state = "hair_unshavenmohawk"
+ gender = MALE
- drills
- name = "Twincurls"
- icon_state = "hair_twincurl"
- gender = FEMALE
+/datum/sprite_accessory/hair/drills
+ name = "Twincurls"
+ icon_state = "hair_twincurl"
+ gender = FEMALE
- minidrills
- name = "Twincurls 2"
- icon_state = "hair_twincurl2"
- gender = FEMALE
+/datum/sprite_accessory/hair/minidrills
+ name = "Twincurls 2"
+ icon_state = "hair_twincurl2"
+ gender = FEMALE
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
+/datum/sprite_accessory/hair/ipc
+ species_allowed = list("Machine")
- ipc_screen_pink
- name = "Pink IPC Screen"
- icon_state = "ipc_pink"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_pink
+ name = "Pink IPC Screen"
+ icon_state = "ipc_pink"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_red
- name = "Red IPC Screen"
- icon_state = "ipc_red"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_red
+ name = "Red IPC Screen"
+ icon_state = "ipc_red"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_green
- name = "Green IPC Screen"
- icon_state = "ipc_green"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_green
+ name = "Green IPC Screen"
+ icon_state = "ipc_green"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_blue
- name = "Blue IPC Screen"
- icon_state = "ipc_blue"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_blue
+ name = "Blue IPC Screen"
+ icon_state = "ipc_blue"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_breakout
- name = "Breakout IPC Screen"
- icon_state = "ipc_breakout"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_breakout
+ name = "Breakout IPC Screen"
+ icon_state = "ipc_breakout"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_eight
- name = "Eight IPC Screen"
- icon_state = "ipc_eight"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_eight
+ name = "Eight IPC Screen"
+ icon_state = "ipc_eight"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rainbow
- name = "Rainbow IPC Screen"
- icon_state = "ipc_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rainbow
+ name = "Rainbow IPC Screen"
+ icon_state = "ipc_rainbow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_goggles
- name = "Goggles IPC Screen"
- icon_state = "ipc_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_goggles
+ name = "Goggles IPC Screen"
+ icon_state = "ipc_goggles"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_heart
- name = "Heart IPC Screen"
- icon_state = "ipc_heart"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_heart
+ name = "Heart IPC Screen"
+ icon_state = "ipc_heart"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_monoeye
- name = "Monoeye IPC Screen"
- icon_state = "ipc_monoeye"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_monoeye
+ name = "Monoeye IPC Screen"
+ icon_state = "ipc_monoeye"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_nature
- name = "Nature IPC Screen"
- icon_state = "ipc_nature"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_nature
+ name = "Nature IPC Screen"
+ icon_state = "ipc_nature"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_orange
- name = "Orange IPC Screen"
- icon_state = "ipc_orange"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_orange
+ name = "Orange IPC Screen"
+ icon_state = "ipc_orange"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_purple
- name = "Purple IPC Screen"
- icon_state = "ipc_purple"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_purple
+ name = "Purple IPC Screen"
+ icon_state = "ipc_purple"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_shower
- name = "Shower IPC Screen"
- icon_state = "ipc_shower"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_shower
+ name = "Shower IPC Screen"
+ icon_state = "ipc_shower"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_static
- name = "Static IPC Screen"
- icon_state = "ipc_static"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_static
+ name = "Static IPC Screen"
+ icon_state = "ipc_static"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_yellow
- name = "Yellow IPC Screen"
- icon_state = "ipc_yellow"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_yellow
+ name = "Yellow IPC Screen"
+ icon_state = "ipc_yellow"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_scrolling
- name = "Scanline IPC Screen"
- icon_state = "ipc_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_scrolling
+ name = "Scanline IPC Screen"
+ icon_state = "ipc_scroll"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_console
- name = "Console IPC Screen"
- icon_state = "ipc_console"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_console
+ name = "Console IPC Screen"
+ icon_state = "ipc_console"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_rgb
- name = "RGB IPC Screen"
- icon_state = "ipc_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_rgb
+ name = "RGB IPC Screen"
+ icon_state = "ipc_rgb"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- ipc_screen_glider
- name = "Glider IPC Screen"
- icon_state = "ipc_gol_glider"
- species_allowed = list("Machine")
- models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+/datum/sprite_accessory/hair/ipc/ipc_screen_glider
+ name = "Glider IPC Screen"
+ icon_state = "ipc_gol_glider"
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
- hesphiastos_alt_off
- name = "Dark Hesphiastos Screen"
- icon_state = "hesphiastos_alt_off"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_off
+ name = "Dark Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_off"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_pink
- name = "Pink Hesphiastos Screen"
- icon_state = "hesphiastos_alt_pink"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_pink
+ name = "Pink Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_pink"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_orange
- name = "Orange Hesphiastos Screen"
- icon_state = "hesphiastos_alt_orange"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_orange
+ name = "Orange Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_orange"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_goggle
- name = "Goggles Hesphiastos Screen"
- icon_state = "hesphiastos_alt_goggles"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_goggle
+ name = "Goggles Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_goggles"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_scroll
- name = "Scrolling Hesphiastos Screen"
- icon_state = "hesphiastos_alt_scroll"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_scroll
+ name = "Scrolling Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_scroll"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rgb
- name = "RGB Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rgb"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rgb
+ name = "RGB Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rgb"
+ models_allowed = list("Hesphiastos Industries alt.")
- hesphiastos_alt_rainbow
- name = "Rainbow Hesphiastos Screen"
- icon_state = "hesphiastos_alt_rainbow"
- species_allowed = list("Machine")
- models_allowed = list("Hesphiastos Industries alt.")
+/datum/sprite_accessory/hair/ipc/hesphiastos_alt_rainbow
+ name = "Rainbow Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rainbow"
+ models_allowed = list("Hesphiastos Industries alt.")
+
+/*
+///////////////////////////////////
+/ =---------------------------= /
+/ == Alien Style Definitions == /
+/ =---------------------------= /
+///////////////////////////////////
+*/
+
+/datum/sprite_accessory/hair/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/hair/unathi/una_horns
+ name = "Unathi Horns"
+ icon_state = "soghun_horns"
+
+/datum/sprite_accessory/hair/skrell
+ species_allowed = list("Skrell")
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_m
+ name = "Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+
+/datum/sprite_accessory/hair/skrell/skr_tentacle_f
+ name = "Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+
+/datum/sprite_accessory/hair/skrell/skr_gold_m
+ name = "Gold plated Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_gold_f
+ name = "Gold chained Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "gold"
+ no_sec_colour = 1
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_m
+ name = "Cloth draped Skrell Male Tentacles"
+ icon_state = "skrell_hair_m"
+ gender = MALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/skrell/skr_clothtentacle_f
+ name = "Cloth draped Skrell Female Tentacles"
+ icon_state = "skrell_hair_f"
+ gender = FEMALE
+ secondary_theme = "cloth"
+
+/datum/sprite_accessory/hair/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/hair/tajara/taj_hair_clean
+ name = "Tajara Clean"
+ icon_state = "hair_clean"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bangs
+ name = "Tajara Bangs"
+ icon_state = "hair_bangs"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_braid
+ name = "Tajara Braid"
+ icon_state = "hair_tbraid"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_shaggy
+ name = "Tajara Shaggy"
+ icon_state = "hair_shaggy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_mohawk
+ name = "Tajaran Mohawk"
+ icon_state = "hair_mohawk"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_plait
+ name = "Tajara Plait"
+ icon_state = "hair_plait"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_straight
+ name = "Tajara Straight"
+ icon_state = "hair_straight"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_long
+ name = "Tajara Long"
+ icon_state = "hair_long"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_rattail
+ name = "Tajara Rat Tail"
+ icon_state = "hair_rattail"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_spiky
+ name = "Tajara Spikey"
+ icon_state = "hair_tajspikey"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_messy
+ name = "Tajara Messy"
+ icon_state = "hair_messy"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_curls
+ name = "Tajara Curly"
+ icon_state = "hair_curly"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_retro
+ name = "Tajaran Ladies' Retro"
+ icon_state = "hair_ladies_retro"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_victory
+ name = "Tajara Victory Curls"
+ icon_state = "hair_victory"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_bob
+ name = "Tajara Bob"
+ icon_state = "hair_tbob"
+
+/datum/sprite_accessory/hair/tajara/taj_hair_fingercurl
+ name = "Tajara Finger Curls"
+ icon_state = "hair_fingerwave"
+
+/datum/sprite_accessory/hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kajam
+ name = "Kajam"
+ icon_state = "kajam"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_keid
+ name = "Keid"
+ icon_state = "keid"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_adhara
+ name = "Adhara"
+ icon_state = "adhara"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_kleeia
+ name = "Kleeia"
+ icon_state = "kleeia"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_mizar
+ name = "Mizar"
+ icon_state = "mizar"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_apollo
+ name = "Apollo"
+ icon_state = "apollo"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_belle
+ name = "Belle"
+ icon_state = "belle"
+ secondary_theme = "bands"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_bun
+ name = "Bun"
+ icon_state = "bun"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_jagged
+ name = "Jagged"
+ icon_state = "jagged"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_curl
+ name = "Curl"
+ icon_state = "curl"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_hawk
+ name = "Hawk"
+ icon_state = "hawk"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_anita
+ name = "Anita"
+ icon_state = "anita"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_short
+ name = "Short"
+ icon_state = "short"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_spike
+ name = "Spike"
+ icon_state = "spike"
+
+/datum/sprite_accessory/hair/vulpkanin/vulp_hair_braided
+ name = "Braided"
+ icon_state = "braided"
+ secondary_theme = "beads"
+
+/datum/sprite_accessory/hair/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/hair/vox/vox_quills_short
+ name = "Short Vox Quills"
+ icon_state = "vox_shortquills"
+
+/datum/sprite_accessory/hair/vox/vox_crestedquills
+ name = "Crested Vox Quills"
+ icon_state = "vox_crestedquills"
+
+/datum/sprite_accessory/hair/vox/vox_tielquills
+ name = "Vox Tiel Quills"
+ icon_state = "vox_tielquills"
+
+/datum/sprite_accessory/hair/vox/vox_emperorquills
+ name = "Vox Emperor Quills"
+ icon_state = "vox_emperorquills"
+
+/datum/sprite_accessory/hair/vox/vox_keelquills
+ name = "Vox Keel Quills"
+ icon_state = "vox_keelquills"
+
+/datum/sprite_accessory/hair/vox/vox_keetquills
+ name = "Vox Keet Quills"
+ icon_state = "vox_keetquills"
+
+/datum/sprite_accessory/hair/vox/vox_quills_kingly
+ name = "Kingly Vox Quills"
+ icon_state = "vox_kingly"
+
+/datum/sprite_accessory/hair/vox/vox_quills_fluff
+ name = "Fluffy Vox Quills"
+ icon_state = "vox_afro"
+
+/datum/sprite_accessory/hair/vox/vox_quills_mohawk
+ name = "Vox Quill Mohawk"
+ icon_state = "vox_mohawk"
+
+/datum/sprite_accessory/hair/vox/vox_quills_long
+ name = "Long Vox Quills"
+ icon_state = "vox_yasu"
+
+/datum/sprite_accessory/hair/vox/vox_horns
+ name = "Vox Spikes"
+ icon_state = "vox_horns"
+
+/datum/sprite_accessory/hair/vox/vox_nights
+ name = "Vox Pigtails"
+ icon_state = "vox_nights"
+
+/datum/sprite_accessory/hair/vox/vox_razor
+ name = "Vox Razorback"
+ icon_state = "vox_razor"
+
+/datum/sprite_accessory/hair/vox/vox_razor_clipped
+ name = "Clipped Vox Razorback"
+ icon_state = "vox_razor_clipped"
+
+// Apollo-specific
+
+/datum/sprite_accessory/hair/wryn
+ species_allowed = list("Wryn")
+
+/datum/sprite_accessory/hair/wryn/wry_antennae_default
+ name = "Antennae"
+ icon_state = "wryn_antennae"
+
+/datum/sprite_accessory/hair/nucleation
+ species_allowed = list("Nucleation")
+
+/datum/sprite_accessory/hair/nucleation/nuc_crystals
+ name = "Nucleation Crystals"
+ icon_state = "nuc_crystal"
+
+/datum/sprite_accessory/hair/nucleation/nuc_betaburns
+ name = "Nucleation Beta Burns"
+ icon_state = "nuc_betaburns"
+
+/datum/sprite_accessory/hair/nucleation/nuc_fallout
+ name = "Nucleation Fallout"
+ icon_state = "nuc_fallout"
+
+/datum/sprite_accessory/hair/nucleation/nuc_frission
+ name = "Nucleation Frission"
+ icon_state = "nuc_frission"
+
+/datum/sprite_accessory/hair/nucleation/nuc_radical
+ name = "Nucleation Free Radical"
+ icon_state = "nuc_radical"
+
+/datum/sprite_accessory/hair/nucleation/nuc_gammaray
+ name = "Nucleation Gamma Ray"
+ icon_state = "nuc_gammaray"
+
+/datum/sprite_accessory/hair/nucleation/nuc_neutron
+ name = "Nucleation Neutron Bomb"
+ icon_state = "nuc_neutron"
/*
@@ -558,559 +833,232 @@
*/
/datum/sprite_accessory/facial_hair
-
icon = 'icons/mob/human_face.dmi'
gender = MALE // barf (unless you're a dorf, dorfs dig chix /w beards :P)
- shaved
- name = "Shaved"
- icon_state = "bald"
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
+/datum/sprite_accessory/facial_hair/shaved
+ name = "Shaved"
+ icon_state = "bald"
+ gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
- watson
- name = "Watson Mustache"
- icon_state = "facial_watson"
+/datum/sprite_accessory/facial_hair/watson
+ name = "Watson Mustache"
+ icon_state = "facial_watson"
- hogan
- name = "Hulk Hogan Mustache"
- icon_state = "facial_hogan" //-Neek
+/datum/sprite_accessory/facial_hair/hogan
+ name = "Hulk Hogan Mustache"
+ icon_state = "facial_hogan" //-Neek
- vandyke
- name = "Van Dyke Mustache"
- icon_state = "facial_vandyke"
+/datum/sprite_accessory/facial_hair/vandyke
+ name = "Van Dyke Mustache"
+ icon_state = "facial_vandyke"
- chaplin
- name = "Square Mustache"
- icon_state = "facial_chaplin"
+/datum/sprite_accessory/facial_hair/chaplin
+ name = "Square Mustache"
+ icon_state = "facial_chaplin"
- selleck
- name = "Selleck Mustache"
- icon_state = "facial_selleck"
+/datum/sprite_accessory/facial_hair/selleck
+ name = "Selleck Mustache"
+ icon_state = "facial_selleck"
- neckbeard
- name = "Neckbeard"
- icon_state = "facial_neckbeard"
+/datum/sprite_accessory/facial_hair/neckbeard
+ name = "Neckbeard"
+ icon_state = "facial_neckbeard"
- fullbeard
- name = "Full Beard"
- icon_state = "facial_fullbeard"
+/datum/sprite_accessory/facial_hair/fullbeard
+ name = "Full Beard"
+ icon_state = "facial_fullbeard"
- longbeard
- name = "Long Beard"
- icon_state = "facial_longbeard"
+/datum/sprite_accessory/facial_hair/longbeard
+ name = "Long Beard"
+ icon_state = "facial_longbeard"
- vlongbeard
- name = "Very Long Beard"
- icon_state = "facial_wise"
+/datum/sprite_accessory/facial_hair/vlongbeard
+ name = "Very Long Beard"
+ icon_state = "facial_wise"
- elvis
- name = "Elvis Sideburns"
- icon_state = "facial_elvis"
- species_allowed = list("Human","Unathi")
+/datum/sprite_accessory/facial_hair/elvis
+ name = "Elvis Sideburns"
+ icon_state = "facial_elvis"
+ species_allowed = list("Human", "Slime People", "Unathi")
- abe
- name = "Abraham Lincoln Beard"
- icon_state = "facial_abe"
+/datum/sprite_accessory/facial_hair/abe
+ name = "Abraham Lincoln Beard"
+ icon_state = "facial_abe"
- chinstrap
- name = "Chinstrap"
- icon_state = "facial_chin"
+/datum/sprite_accessory/facial_hair/chinstrap
+ name = "Chinstrap"
+ icon_state = "facial_chin"
- hip
- name = "Hipster Beard"
- icon_state = "facial_hip"
+/datum/sprite_accessory/facial_hair/hip
+ name = "Hipster Beard"
+ icon_state = "facial_hip"
- gt
- name = "Goatee"
- icon_state = "facial_gt"
+/datum/sprite_accessory/facial_hair/gt
+ name = "Goatee"
+ icon_state = "facial_gt"
- jensen
- name = "Adam Jensen Beard"
- icon_state = "facial_jensen"
+/datum/sprite_accessory/facial_hair/jensen
+ name = "Adam Jensen Beard"
+ icon_state = "facial_jensen"
- dwarf
- name = "Dwarf Beard"
- icon_state = "facial_dwarf"
+/datum/sprite_accessory/facial_hair/dwarf
+ name = "Dwarf Beard"
+ icon_state = "facial_dwarf"
//////////////////////////////
//////START VG HAIRSTYLES/////
//////////////////////////////
- britstache
- name = "Brit Stache"
- icon_state = "facial_britstache"
+/datum/sprite_accessory/facial_hair/britstache
+ name = "Brit Stache"
+ icon_state = "facial_britstache"
- martialartist
- name = "Martial Artist"
- icon_state = "facial_martialartist"
+/datum/sprite_accessory/facial_hair/martialartist
+ name = "Martial Artist"
+ icon_state = "facial_martialartist"
- moonshiner
- name = "Moonshiner"
- icon_state = "facial_moonshiner"
+/datum/sprite_accessory/facial_hair/moonshiner
+ name = "Moonshiner"
+ icon_state = "facial_moonshiner"
- tribeard
- name = "Tri-beard"
- icon_state = "facial_tribeard"
+/datum/sprite_accessory/facial_hair/tribeard
+ name = "Tri-beard"
+ icon_state = "facial_tribeard"
- unshaven
- name = "Unshaven"
- icon_state = "facial_unshaven"
+/datum/sprite_accessory/facial_hair/unshaven
+ name = "Unshaven"
+ icon_state = "facial_unshaven"
//////////////////////////////
//////END VG HAIRSTYLES///////
//////////////////////////////
-/*
-///////////////////////////////////
-/ =---------------------------= /
-/ == Alien Style Definitions == /
-/ =---------------------------= /
-///////////////////////////////////
-*/
+/datum/sprite_accessory/facial_hair/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/hair
+/datum/sprite_accessory/facial_hair/tajara/taj_sideburns
+ name = "Tajara Sideburns"
+ icon_state = "facial_sideburns"
- una_horns
- name = "Unathi Horns"
- icon_state = "soghun_horns"
- species_allowed = list("Unathi")
+/datum/sprite_accessory/facial_hair/tajara/taj_mutton
+ name = "Tajara Mutton"
+ icon_state = "facial_mutton"
- skr_tentacle_m
- name = "Skrell Male Tentacles"
- icon_state = "skrell_hair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_pencilstache
+ name = "Tajara Pencilstache"
+ icon_state = "facial_pencilstache"
- skr_tentacle_f
- name = "Skrell Female Tentacles"
- icon_state = "skrell_hair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_moustache
+ name = "Tajara Moustache"
+ icon_state = "facial_moustache"
- skr_gold_m
- name = "Gold plated Skrell Male Tentacles"
- icon_state = "skrell_goldhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/tajara/taj_goatee
+ name = "Tajara Goatee"
+ icon_state = "facial_goatee"
- skr_gold_f
- name = "Gold chained Skrell Female Tentacles"
- icon_state = "skrell_goldhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
+/datum/sprite_accessory/facial_hair/tajara/taj_smallstache
+ name = "Tajara Smallstache"
+ icon_state = "facial_smallstache"
+
+/datum/sprite_accessory/facial_hair/vox
+ species_allowed = list("Vox")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vox/vox_colonel
+ name = "Vox Colonel Beard"
+ icon_state = "vox_colonel"
+
+/datum/sprite_accessory/facial_hair/vox/vox_long
+ name = "Long Mustache"
+ icon_state = "vox_fu"
+
+/datum/sprite_accessory/facial_hair/vox/vox_neck
+ name = "Neck Quills"
+ icon_state = "vox_neck"
+
+/datum/sprite_accessory/facial_hair/vox/vox_beard
+ name = "Vox Quill Beard"
+ icon_state = "vox_beard"
+
+/datum/sprite_accessory/facial_hair/vulpkanin
+ species_allowed = list("Vulpkanin")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_blaze
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_brows
+ name = "Vulpine and Brows"
+ icon_state = "vulp_facial_vulpine_brows"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_vulpine_fluff
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_mask
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_patch
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_ruff
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_kita
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/facial_hair/vulpkanin/vulp_swift
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/facial_hair/unathi
+ species_allowed = list("Unathi")
+ gender = NEUTER
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_long
+ name = "Long Spines"
+ icon_state = "soghun_longspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_spines_short
+ name = "Short Spines"
+ icon_state = "soghun_shortspines"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_aquatic
+ name = "Aquatic Frills"
+ icon_state = "soghun_aquaticfrills"
- skr_clothtentacle_m
- name = "Cloth draped Skrell Male Tentacles"
- icon_state = "skrell_clothhair_m"
- species_allowed = list("Skrell")
- gender = MALE
+/datum/sprite_accessory/facial_hair/unathi/una_frills_long
+ name = "Long Frills"
+ icon_state = "soghun_longfrills"
- skr_clothtentacle_f
- name = "Cloth draped Skrell Female Tentacles"
- icon_state = "skrell_clothhair_f"
- species_allowed = list("Skrell")
- gender = FEMALE
-
- taj_ears
- name = "Tajaran Ears"
- icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-
- taj_ears_clean
- name = "Tajara Clean"
- icon_state = "hair_clean"
- species_allowed = list("Tajaran")
-
- taj_ears_bangs
- name = "Tajara Bangs"
- icon_state = "hair_bangs"
- species_allowed = list("Tajaran")
-
- taj_ears_braid
- name = "Tajara Braid"
- icon_state = "hair_tbraid"
- species_allowed = list("Tajaran")
-
- taj_ears_shaggy
- name = "Tajara Shaggy"
- icon_state = "hair_shaggy"
- species_allowed = list("Tajaran")
-
- taj_ears_mohawk
- name = "Tajaran Mohawk"
- icon_state = "hair_mohawk"
- species_allowed = list("Tajaran")
-
- taj_ears_plait
- name = "Tajara Plait"
- icon_state = "hair_plait"
- species_allowed = list("Tajaran")
-
- taj_ears_straight
- name = "Tajara Straight"
- icon_state = "hair_straight"
- species_allowed = list("Tajaran")
-
- taj_ears_long
- name = "Tajara Long"
- icon_state = "hair_long"
- species_allowed = list("Tajaran")
-
- taj_ears_rattail
- name = "Tajara Rat Tail"
- icon_state = "hair_rattail"
- species_allowed = list("Tajaran")
-
- taj_ears_spiky
- name = "Tajara Spiky"
- icon_state = "hair_tajspiky"
- species_allowed = list("Tajaran")
-
- taj_ears_messy
- name = "Tajara Messy"
- icon_state = "hair_messy"
- species_allowed = list("Tajaran")
-
-//Vulpkanin
-
- vulp_hair_none
- name = "None"
- icon_state = "bald"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kajam
- name = "Kajam"
- icon_state = "kajam"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_keid
- name = "Keid"
- icon_state = "keid"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_adhara
- name = "Adhara"
- icon_state = "adhara"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_kleeia
- name = "Kleeia"
- icon_state = "kleeia"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_mizar
- name = "Mizar"
- icon_state = "mizar"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_apollo
- name = "Apollo"
- icon_state = "apollo"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_belle
- name = "Belle"
- icon_state = "belle"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_bun
- name = "Bun"
- icon_state = "bun"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_jagged
- name = "Jagged"
- icon_state = "jagged"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_curl
- name = "Curl"
- icon_state = "curl"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_hawk
- name = "Hawk"
- icon_state = "hawk"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_anita
- name = "Anita"
- icon_state = "anita"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_short
- name = "Short"
- icon_state = "short"
- species_allowed = list("Vulpkanin")
-
- vulp_hair_spike
- name = "Spike"
- icon_state = "spike"
- species_allowed = list("Vulpkanin")
-
-//Vox
-
- vox_quills_short
- name = "Short Vox Quills"
- icon_state = "vox_shortquills"
- species_allowed = list("Vox")
-
- vox_crestedquills
- name = "Crested Vox Quills"
- icon_state = "vox_crestedquills"
- species_allowed = list("Vox")
-
- vox_tielquills
- name = "Vox Tiel Quills"
- icon_state = "vox_tielquills"
- species_allowed = list("Vox")
-
- vox_emperorquills
- name = "Vox Emperor Quills"
- icon_state = "vox_emperorquills"
- species_allowed = list("Vox")
-
- vox_keelquills
- name = "Vox Keel Quills"
- icon_state = "vox_keelquills"
- species_allowed = list("Vox")
-
- vox_keetquills
- name = "Vox Keet Quills"
- icon_state = "vox_keetquills"
- species_allowed = list("Vox")
-
- vox_quills_kingly
- name = "Kingly Vox Quills"
- icon_state = "vox_kingly"
- species_allowed = list("Vox")
-
- vox_quills_fluff
- name = "Fluffy Vox Quills"
- icon_state = "vox_afro"
- species_allowed = list("Vox")
-
- vox_quills_mohawk
- name = "Vox Quill Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list("Vox")
-
- vox_quills_long
- name = "Long Vox Quills"
- icon_state = "vox_yasu"
- species_allowed = list("Vox")
-
- vox_horns
- name = "Vox Spikes"
- icon_state = "vox_horns"
- species_allowed = list("Vox")
-
- vox_nights
- name = "Vox Pigtails"
- icon_state = "vox_nights"
- species_allowed = list("Vox")
-
- vox_razor
- name = "Vox Razorback"
- icon_state = "vox_razor"
- species_allowed = list("Vox")
-
-// Apollo-specific
-
- //Wryn antennae
-
- wry_antennae_default
- name = "Antennae"
- icon_state = "wryn_antennae"
- species_allowed = list("Wryn")
-
- //Nucleation "hairstyles"
-
- nuc_crystals
- name = "Nucleation Crystals"
- icon_state = "nuc_crystal"
- species_allowed = list("Nucleation")
-
- nuc_betaburns
- name = "Nucleation Beta Burns"
- icon_state = "nuc_betaburns"
- species_allowed = list("Nucleation")
-
- nuc_fallout
- name = "Nucleation Fallout"
- icon_state = "nuc_fallout"
- species_allowed = list("Nucleation")
-
- nuc_frission
- name = "Nucleation Frission"
- icon_state = "nuc_frission"
- species_allowed = list("Nucleation")
-
- nuc_radical
- name = "Nucleation Free Radical"
- icon_state = "nuc_radical"
- species_allowed = list("Nucleation")
-
- nuc_gammaray
- name = "Nucleation Gamma Ray"
- icon_state = "nuc_gammaray"
- species_allowed = list("Nucleation")
-
- nuc_neutron
- name = "Nucleation Neutron Bomb"
- icon_state = "nuc_neutron"
- species_allowed = list("Nucleation")
-
-/datum/sprite_accessory/facial_hair
-
-//Tajara
-
- taj_sideburns
- name = "Tajara Sideburns"
- icon_state = "facial_sideburns"
- species_allowed = list("Tajaran")
-
- taj_mutton
- name = "Tajara Mutton"
- icon_state = "facial_mutton"
- species_allowed = list("Tajaran")
-
- taj_pencilstache
- name = "Tajara Pencilstache"
- icon_state = "facial_pencilstache"
- species_allowed = list("Tajaran")
-
- taj_moustache
- name = "Tajara Moustache"
- icon_state = "facial_moustache"
- species_allowed = list("Tajaran")
-
- taj_goatee
- name = "Tajara Goatee"
- icon_state = "facial_goatee"
- species_allowed = list("Tajaran")
-
- taj_smallstache
- name = "Tajara Smallstache"
- icon_state = "facial_smallstache"
- species_allowed = list("Tajaran")
-
-//Vox
-
- vox_colonel
- name = "Vox Colonel Beard"
- icon_state = "vox_colonel"
- species_allowed = list("Vox")
-
- vox_long
- name = "Long Mustache"
- icon_state = "vox_fu"
- species_allowed = list("Vox")
-
- vox_neck
- name = "Neck Quills"
- icon_state = "vox_neck"
- species_allowed = list("Vox")
-
- vox_beard
- name = "Vox Quill Beard"
- icon_state = "vox_beard"
- species_allowed = list("Vox")
-
-//Vulpkanin
-
- vulp_blaze
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_vulpine_fluff
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_mask
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_patch
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_ruff
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_kita
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
- vulp_swift
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
- gender = NEUTER
-
-//Unathi
-
- una_spines_long
- name = "Long Spines"
- icon_state = "soghun_longspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_spines_short
- name = "Short Spines"
- icon_state = "soghun_shortspines"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_long
- name = "Long Frills"
- icon_state = "soghun_longfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_short
- name = "Short Frills"
- icon_state = "soghun_shortfrills"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_long
- name = "Long Webbed Frills"
- icon_state = "soghun_longfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_short
- name = "Short Webbed Frills"
- icon_state = "soghun_shortfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
-
- una_frills_webbed_aquatic
- name = "Aquatic Frills"
- icon_state = "soghun_aquaticfrills_webbed"
- species_allowed = list("Unathi")
- gender = NEUTER
+/datum/sprite_accessory/facial_hair/unathi/una_frills_short
+ name = "Short Frills"
+ icon_state = "soghun_shortfrills"
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_aquatic
+ name = "Aquatic Webbed Frills"
+ icon_state = "soghun_aquaticfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_long
+ name = "Long Webbed Frills"
+ icon_state = "soghun_longfrills"
+ secondary_theme = "webbing"
+
+/datum/sprite_accessory/facial_hair/unathi/una_frills_webbed_short
+ name = "Short Webbed Frills"
+ icon_state = "soghun_shortfrills"
+ secondary_theme = "webbing"
//skin styles - WIP
//going to have to re-integrate this with surgery
@@ -1118,420 +1066,355 @@
/datum/sprite_accessory/skin
icon = 'icons/mob/human_races/r_human.dmi'
- human
- name = "Default human skin"
- icon_state = "default"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human
+ name = "Default human skin"
+ icon_state = "default"
+ species_allowed = list("Human")
- human_tatt01
- name = "Tatt01 human skin"
- icon_state = "tatt1"
- species_allowed = list("Human")
+/datum/sprite_accessory/skin/human/human_tatt01
+ name = "Tatt01 human skin"
+ icon_state = "tatt1"
- tajaran
- name = "Default tajaran skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_tajaran.dmi'
- species_allowed = list("Tajaran")
+/datum/sprite_accessory/skin/tajaran
+ name = "Default tajaran skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_tajaran.dmi'
+ species_allowed = list("Tajaran")
- vulpkanin
- name = "Default Vulpkanin skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_vulpkanin.dmi'
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/skin/vulpkanin
+ name = "Default Vulpkanin skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_vulpkanin.dmi'
+ species_allowed = list("Vulpkanin")
- unathi
- name = "Default Unathi skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_lizard.dmi'
- species_allowed = list("Unathi")
+/datum/sprite_accessory/skin/unathi
+ name = "Default Unathi skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_lizard.dmi'
+ species_allowed = list("Unathi")
- skrell
- name = "Default skrell skin"
- icon_state = "default"
- icon = 'icons/mob/human_races/r_skrell.dmi'
- species_allowed = list("Skrell")
+/datum/sprite_accessory/skin/skrell
+ name = "Default skrell skin"
+ icon_state = "default"
+ icon = 'icons/mob/human_races/r_skrell.dmi'
+ species_allowed = list("Skrell")
///////////////////////////
// Underwear Definitions //
///////////////////////////
/datum/sprite_accessory/underwear
icon = 'icons/mob/underwear.dmi'
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+/datum/sprite_accessory/underwear/nude
+ name = "Nude"
+ icon_state = null
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
- nude
- name = "Nude"
- icon_state = null
- gender = NEUTER
+/datum/sprite_accessory/underwear/male
+ gender = MALE
- male_white
- name = "Mens White"
- icon_state = "male_white"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_white
+ name = "Mens White"
+ icon_state = "male_white"
- male_grey
- name = "Mens Grey"
- icon_state = "male_grey"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey"
+ icon_state = "male_grey"
- male_grey
- name = "Mens Grey Alt"
- icon_state = "male_greyalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_grey
+ name = "Mens Grey Alt"
+ icon_state = "male_greyalt"
- male_green
- name = "Mens Green"
- icon_state = "male_green"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_green
+ name = "Mens Green"
+ icon_state = "male_green"
- male_blue
- name = "Mens Blue"
- icon_state = "male_blue"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_blue
+ name = "Mens Blue"
+ icon_state = "male_blue"
- male_red
- name = "Mens Red"
- icon_state = "male_red"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_red
+ name = "Mens Red"
+ icon_state = "male_red"
- male_black
- name = "Mens Black"
- icon_state = "male_black"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black
+ name = "Mens Black"
+ icon_state = "male_black"
- male_black_alt
- name = "Mens Black Alt"
- icon_state = "male_blackalt"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_black_alt
+ name = "Mens Black Alt"
+ icon_state = "male_blackalt"
- male_striped
- name = "Mens Striped"
- icon_state = "male_stripe"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_striped
+ name = "Mens Striped"
+ icon_state = "male_stripe"
- male_heart
- name = "Mens Hearts"
- icon_state = "male_hearts"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_heart
+ name = "Mens Hearts"
+ icon_state = "male_hearts"
- male_kinky
- name = "Mens Kinky"
- icon_state = "male_kinky"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_kinky
+ name = "Mens Kinky"
+ icon_state = "male_kinky"
- male_mankini
- name = "Mankini"
- icon_state = "male_mankini"
- gender = MALE
+/datum/sprite_accessory/underwear/male/male_mankini
+ name = "Mankini"
+ icon_state = "male_mankini"
- female_red
- name = "Ladies Red"
- icon_state = "female_red"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female
+ gender = FEMALE
- female_green
- name = "Ladies Green"
- icon_state = "female_green"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_red
+ name = "Ladies Red"
+ icon_state = "female_red"
- female_white
- name = "Ladies White"
- icon_state = "female_white"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_green
+ name = "Ladies Green"
+ icon_state = "female_green"
- female_whiter
- name = "Ladies Whiter"
- icon_state = "female_whiter"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_white
+ name = "Ladies White"
+ icon_state = "female_white"
- female_whitealt
- name = "Ladies White Alt"
- icon_state = "female_whitealt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whiter
+ name = "Ladies Whiter"
+ icon_state = "female_whiter"
- female_yellow
- name = "Ladies Yellow"
- icon_state = "female_yellow"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_whitealt
+ name = "Ladies White Alt"
+ icon_state = "female_whitealt"
- female_blue
- name = "Ladies Blue"
- icon_state = "female_blue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_yellow
+ name = "Ladies Yellow"
+ icon_state = "female_yellow"
- female_babyblue
- name = "Ladies Baby Blue"
- icon_state = "female_babyblue"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blue
+ name = "Ladies Blue"
+ icon_state = "female_blue"
+/datum/sprite_accessory/underwear/female/female_babyblue
+ name = "Ladies Baby Blue"
+ icon_state = "female_babyblue"
- female_black
- name = "Ladies Black"
- icon_state = "female_black"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_black
+ name = "Ladies Black"
+ icon_state = "female_black"
- female_blacker
- name = "Ladies Blacker"
- icon_state = "female_blacker"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blacker
+ name = "Ladies Blacker"
+ icon_state = "female_blacker"
- female_blackalt
- name = "Ladies Black Alt"
- icon_state = "female_blackalt"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_blackalt
+ name = "Ladies Black Alt"
+ icon_state = "female_blackalt"
- female_kinky
- name = "Ladies Kinky"
- icon_state = "female_kinky"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_kinky
+ name = "Ladies Kinky"
+ icon_state = "female_kinky"
- female_babydoll
- name = "Ladies Full Grey"
- icon_state = "female_babydoll"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_babydoll
+ name = "Ladies Full Grey"
+ icon_state = "female_babydoll"
- female_pink
- name = "Ladies Pink"
- icon_state = "female_pink"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_pink
+ name = "Ladies Pink"
+ icon_state = "female_pink"
- female_thong
- name = "Ladies Thong"
- icon_state = "female_thong"
- gender = FEMALE
+/datum/sprite_accessory/underwear/female/female_thong
+ name = "Ladies Thong"
+ icon_state = "female_thong"
////////////////////////////
// Undershirt Definitions //
////////////////////////////
/datum/sprite_accessory/undershirt
icon = 'icons/mob/underwear.dmi'
-
- species_allowed = list("Human", "Unathi", "Vox", "Diona", "Vulpkanin", "Kidan", "Grey", "Plasmaman", "Skeleton", "Machine")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/undershirt/nude
name = "Nude"
icon_state = null
- gender = NEUTER
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
//plain color shirts
/datum/sprite_accessory/undershirt/shirt_white
name = "White Shirt"
icon_state = "shirt_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_black
name = "Black Shirt"
icon_state = "shirt_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blacker
name = "Blacker Shirt"
icon_state = "shirt_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_grey
name = "Grey Shirt"
icon_state = "shirt_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_red
name = "Red Shirt"
icon_state = "shirt_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_blue
name = "Blue Shirt"
icon_state = "shirt_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_yellow
name = "Yellow Shirt"
icon_state = "shirt_yellow"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_green
name = "Green Shirt"
icon_state = "shirt_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkblue
name = "Dark Blue Shirt"
icon_state = "shirt_darkblue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkred
name = "Dark Red Shirt"
icon_state = "shirt_darkred"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_darkgreen
name = "Dark Green Shirt"
icon_state = "shirt_darkgreen"
- gender = NEUTER
//end plain color shirts
+//graphic shirts
/datum/sprite_accessory/undershirt/shirt_heart
name = "Heart Shirt"
icon_state = "shirt_heart"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_corgi
name = "Corgi Shirt"
icon_state = "shirt_corgi"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_clown
name = "Clown Shirt"
icon_state = "shirt_clown"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_alien
name = "Alien Shirt"
icon_state = "shirt_alien"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_jack
name = "Union Jack Shirt"
icon_state = "shirt_jack"
- gender = NEUTER
/datum/sprite_accessory/undershirt/love_nt
name = "I Love NT Shirt"
icon_state = "shirt_lovent"
- gender = NEUTER
/datum/sprite_accessory/undershirt/peace
name = "Peace Shirt"
icon_state = "shirt_peace"
- gender = NEUTER
/datum/sprite_accessory/undershirt/mondmondjaja
name = "Band Shirt"
icon_state = "shirt_band"
- gender = NEUTER
/datum/sprite_accessory/undershirt/pacman
name = "Pogoman Shirt"
icon_state = "shirt_pogoman"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_ss13
name = "SS13 Shirt"
icon_state = "shirt_ss13"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_question
name = "Question Mark Shirt"
icon_state = "shirt_question"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_skull
name = "Skull Shirt"
icon_state = "shirt_skull"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_commie
name = "Communist Shirt"
icon_state = "shirt_commie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_nano
name = "Nanotrasen Shirt"
icon_state = "shirt_nano"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_meat
name = "Meat Shirt"
icon_state = "shirt_meat"
- gender = NEUTER
/datum/sprite_accessory/undershirt/shirt_tiedie
name = "Tiedie Shirt"
icon_state = "shirt_tiedie"
- gender = NEUTER
/datum/sprite_accessory/undershirt/blue_striped
name = "Striped Blue Shirt"
icon_state = "shirt_bluestripe"
- gender = NEUTER
/datum/sprite_accessory/undershirt/brightblue_striped
name = "Striped Bright Blue Shirt"
icon_state = "shirt_brightbluestripe"
- gender = NEUTER
-
+//end graphic shirts
//short sleeved
/datum/sprite_accessory/undershirt/short_white
name = "White Short-sleeved Shirt"
icon_state = "short_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_purple
name = "Purple Short-sleeved Shirt"
icon_state = "short_purple"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_blue
name = "Blue Short-sleeved Shirt"
icon_state = "short_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_green
name = "Green Short-sleeved Shirt"
icon_state = "short_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/short_black
name = "Black Short-sleeved Shirt"
icon_state = "short_black"
- gender = NEUTER
//end short sleeved
//polo shirts
/datum/sprite_accessory/undershirt/polo_blue
name = "Blue Polo Shirt"
icon_state = "polo_blue"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_red
name = "Red Polo Shirt"
icon_state = "polo_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/polo_greyelllow
name = "Grey-Yellow Polo Shirt"
icon_state = "polo_greyellow"
- gender = NEUTER
//end polo shirts
//sport shirts
/datum/sprite_accessory/undershirt/sport_green
name = "Green Sports Shirt"
icon_state = "sport_green"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_red
name = "Red Sports Shirt"
icon_state = "sport_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/sport_blue
name = "Blue Sports Shirt"
icon_state = "sport_blue"
- gender = NEUTER
-//end sport shirts
/datum/sprite_accessory/undershirt/jersey_red
name = "Red Jersey"
icon_state = "jersey_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/jersey_blue
name = "Blue Jersey"
icon_state = "jersey_blue"
- gender = NEUTER
-
+//end sport shirts
//tanktops
/datum/sprite_accessory/undershirt/tank_redtop
@@ -1552,39 +1435,30 @@
/datum/sprite_accessory/undershirt/tank_white
name = "White Tank-Top"
icon_state = "tank_white"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_black
name = "Black Tank-Top"
icon_state = "tank_black"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_blacker
name = "Blacker Tank-Top"
icon_state = "tank_blacker"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_grey
name = "Grey Tank-Top"
icon_state = "tank_grey"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_red
name = "Red Tank-Top"
icon_state = "tank_red"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_fire
name = "Fire Tank-Top"
icon_state = "tank_fire"
- gender = NEUTER
/datum/sprite_accessory/undershirt/tank_stripes
name = "Striped Tank-Top"
icon_state = "tank_stripes"
- gender = NEUTER
-
-
//end tanktops
///////////////////////
@@ -1592,174 +1466,127 @@
///////////////////////
/datum/sprite_accessory/socks
icon = 'icons/mob/underwear.dmi'
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton")
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask")
+ gender = NEUTER
/datum/sprite_accessory/socks/nude
name = "Nude"
icon_state = null
- gender = NEUTER
- species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
-
+ species_allowed = list("Human", "Unathi", "Diona", "Vulpkanin", "Tajaran", "Kidan", "Grey", "Plasmaman", "Machine", "Skeleton", "Drask", "Vox")
/datum/sprite_accessory/socks/white_norm
name = "Normal White"
icon_state = "white_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_norm
name = "Normal Black"
icon_state = "black_norm"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_short
name = "Short White"
icon_state = "white_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_short
name = "Short Black"
icon_state = "black_short"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_knee
name = "Knee-high White"
icon_state = "white_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/black_knee
name = "Knee-high Black"
icon_state = "black_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_knee
name = "Knee-high Thin"
icon_state = "thin_knee"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_knee
name = "Knee-high Striped"
icon_state = "striped_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_knee
name = "Knee-high Rainbow"
icon_state = "rainbow_knee"
- gender = NEUTER
-
/datum/sprite_accessory/socks/white_thigh
name = "Thigh-high White"
icon_state = "white_thigh"
- gender = NEUTER
/datum/sprite_accessory/socks/black_thigh
name = "Thigh-high Black"
icon_state = "black_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/thin_thigh
name = "Thigh-high Thin"
icon_state = "thin_thigh"
gender = FEMALE
-
/datum/sprite_accessory/socks/striped_thigh
name = "Thigh-high Striped"
icon_state = "striped_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/rainbow_thigh
name = "Thigh-high Rainbow"
icon_state = "rainbow_thigh"
- gender = NEUTER
-
/datum/sprite_accessory/socks/pantyhose
name = "Pantyhose"
icon_state = "pantyhose"
gender = FEMALE
-
/datum/sprite_accessory/socks/black_fishnet
name = "Black Fishnet"
icon_state = "black_fishnet"
- gender = NEUTER
-/datum/sprite_accessory/socks/vox_white
+/datum/sprite_accessory/socks/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/socks/vox/vox_white
name = "Vox White"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black
+/datum/sprite_accessory/socks/vox/vox_black
name = "Vox Black"
icon_state = "vox_black"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin
+/datum/sprite_accessory/socks/vox/vox_thin
name = "Vox Black Thin"
icon_state = "vox_blackthin"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow
+/datum/sprite_accessory/socks/vox/vox_rainbow
name = "Vox Rainbow"
icon_state = "vox_rainbow"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_stripped
+/datum/sprite_accessory/socks/vox/vox_stripped
name = "Vox Striped"
icon_state = "vox_white"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_white_thigh
+/datum/sprite_accessory/socks/vox/vox_white_thigh
name = "Vox Thigh-high White"
icon_state = "vox_whiteTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_black_thigh
+/datum/sprite_accessory/socks/vox/vox_black_thigh
name = "Vox Thigh-high Black"
icon_state = "vox_blackTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_thin_thigh
+/datum/sprite_accessory/socks/vox/vox_thin_thigh
name = "Vox Thigh-high Thin"
icon_state = "vox_blackthinTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_rainbow_thigh
+/datum/sprite_accessory/socks/vox/vox_rainbow_thigh
name = "Vox Thigh-high Rainbow"
icon_state = "vox_rainbowTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_striped_thigh
+/datum/sprite_accessory/socks/vox/vox_striped_thigh
name = "Vox Thigh-high Striped"
icon_state = "vox_stripedTH"
- gender = NEUTER
- species_allowed = list("Vox")
-/datum/sprite_accessory/socks/vox_fishnet
+/datum/sprite_accessory/socks/vox/vox_fishnet
name = "Vox Fishnets"
icon_state = "vox_fishnet"
- gender = NEUTER
- species_allowed = list("Vox")
/* HEAD ACCESSORY */
@@ -1773,185 +1600,494 @@
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/head_accessory/simple
- name = "Simple"
+/datum/sprite_accessory/head_accessory/unathi
species_allowed = list("Unathi")
+
+/datum/sprite_accessory/head_accessory/unathi/simple
+ name = "Simple"
icon_state = "horns_simple"
-/datum/sprite_accessory/head_accessory/short
+/datum/sprite_accessory/head_accessory/unathi/short
name = "Short"
- species_allowed = list("Unathi")
icon_state = "horns_short"
-/datum/sprite_accessory/head_accessory/curled
+/datum/sprite_accessory/head_accessory/unathi/curled
name = "Curled"
- species_allowed = list("Unathi")
icon_state = "horns_curled"
-/datum/sprite_accessory/head_accessory/ram
+/datum/sprite_accessory/head_accessory/unathi/ram
name = "Ram"
- species_allowed = list("Unathi")
icon_state = "horns_ram"
-/datum/sprite_accessory/head_accessory/vulp_earfluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpkanin Earfluff"
- icon_state = "vulp_facial_earfluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara
+ species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/vulp_blaze
- icon = 'icons/mob/human_face.dmi'
- name = "Blaze"
- icon_state = "vulp_facial_blaze"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine"
- icon_state = "vulp_facial_vulpine"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff
- icon = 'icons/mob/human_face.dmi'
- name = "Vulpine and Earfluff"
- icon_state = "vulp_facial_vulpine_fluff"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
-/datum/sprite_accessory/head_accessory/vulp_mask
- icon = 'icons/mob/human_face.dmi'
- name = "Mask"
- icon_state = "vulp_facial_mask"
- species_allowed = list("Vulpkanin")
+/datum/sprite_accessory/head_accessory/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
-/datum/sprite_accessory/head_accessory/vulp_patch
- icon = 'icons/mob/human_face.dmi'
- name = "Patch"
- icon_state = "vulp_facial_patch"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_ruff
- icon = 'icons/mob/human_face.dmi'
- name = "Ruff"
- icon_state = "vulp_facial_ruff"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_kita
- icon = 'icons/mob/human_face.dmi'
- name = "Kita"
- icon_state = "vulp_facial_kita"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/vulp_swift
- icon = 'icons/mob/human_face.dmi'
- name = "Swift"
- icon_state = "vulp_facial_swift"
- species_allowed = list("Vulpkanin")
-
-/datum/sprite_accessory/head_accessory/taj_ears
+/datum/sprite_accessory/head_accessory/tajara/taj_ears
icon = 'icons/mob/human_face.dmi'
name = "Tajaran Ears"
icon_state = "ears_plain"
- species_allowed = list("Tajaran")
-/datum/sprite_accessory/head_accessory/ipc_antennae
+/datum/sprite_accessory/head_accessory/tajara/taj_nose
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/head_accessory/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_earfluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpkanin Earfluff"
+ icon_state = "vulp_facial_earfluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_blaze
+ icon = 'icons/mob/human_face.dmi'
+ name = "Blaze"
+ icon_state = "vulp_facial_blaze"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine"
+ icon_state = "vulp_facial_vulpine"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_vulpine_fluff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Vulpine and Earfluff"
+ icon_state = "vulp_facial_vulpine_fluff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_mask
+ icon = 'icons/mob/human_face.dmi'
+ name = "Mask"
+ icon_state = "vulp_facial_mask"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_patch
+ icon = 'icons/mob/human_face.dmi'
+ name = "Patch"
+ icon_state = "vulp_facial_patch"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_ruff
+ icon = 'icons/mob/human_face.dmi'
+ name = "Ruff"
+ icon_state = "vulp_facial_ruff"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_kita
+ icon = 'icons/mob/human_face.dmi'
+ name = "Kita"
+ icon_state = "vulp_facial_kita"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_swift
+ icon = 'icons/mob/human_face.dmi'
+ name = "Swift"
+ icon_state = "vulp_facial_swift"
+
+/datum/sprite_accessory/head_accessory/vulpkanin/vulp_nose
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/head_accessory/ipc
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc/ipc_antennae
name = "Antennae"
icon_state = "antennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tv_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tv_antennae
name = "T.V. Antennae"
icon_state = "tvantennae"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_tesla_antennae
+/datum/sprite_accessory/head_accessory/ipc/ipc_tesla_antennae
name = "Tesla Antennae"
icon_state = "tesla"
- species_allowed = list("Machine")
-/datum/sprite_accessory/head_accessory/ipc_light
+/datum/sprite_accessory/head_accessory/ipc/ipc_light
name = "Head Light"
icon_state = "light"
- species_allowed = list("Machine")
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine")
+ species_allowed = list("Unathi", "Tajaran", "Vulpkanin", "Machine", "Vox")
icon_state = "accessory_none"
+ marking_location = "body"
/datum/sprite_accessory/body_markings/none
name = "None"
species_allowed = list("Human", "Unathi", "Diona", "Grey", "Machine", "Tajaran", "Vulpkanin", "Slime People", "Skeleton", "Vox")
icon_state = "accessory_none"
-/datum/sprite_accessory/body_markings/stripe
- name = "Stripe"
- species_allowed = list("Unathi")
- icon_state = "markings_stripe"
-
/datum/sprite_accessory/body_markings/tiger
name = "Tiger Body"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
-/datum/sprite_accessory/body_markings/tigerhead
- name = "Tiger Body and Head"
- species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
- icon_state = "markings_tigerhead"
-
-/datum/sprite_accessory/body_markings/tigerheadface_taj
- name = "Tajaran Tiger Body, Head and Face"
- species_allowed = list("Tajaran")
- icon_state = "markings_tigerheadface_taj"
-
-/datum/sprite_accessory/body_markings/tigerheadface_vulp
- name = "Vulpkanin Tiger Body, Head and Face"
- species_allowed = list("Vulpkanin")
- icon_state = "markings_tigerheadface_vulp"
-
-/datum/sprite_accessory/body_markings/tigerheadface_una
- name = "Unathi Tiger Body, Head and Face"
+/datum/sprite_accessory/body_markings/unathi
species_allowed = list("Unathi")
- icon_state = "markings_tigerheadface_una"
-/datum/sprite_accessory/body_markings/optics
+/datum/sprite_accessory/body_markings/unathi/stripe_una
+ name = "Unathi Stripe"
+ icon_state = "markings_stripe_una"
+
+/datum/sprite_accessory/body_markings/unathi/belly_narrow_una
+ name = "Unathi Belly"
+ icon_state = "markings_belly_narrow_una"
+
+/datum/sprite_accessory/body_markings/unathi/banded_una
+ name = "Unathi Banded"
+ icon_state = "markings_banded_una"
+
+/datum/sprite_accessory/body_markings/unathi/points_una
+ name = "Unathi Points"
+ icon_state = "markings_points_una"
+
+/datum/sprite_accessory/body_markings/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/tajara/belly_flat_taj
+ name = "Tajaran Belly"
+ icon_state = "markings_belly_flat_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_crest_taj
+ name = "Tajaran Chest Crest"
+ icon_state = "markings_belly_crest_taj"
+
+/datum/sprite_accessory/body_markings/tajara/belly_full_taj
+ name = "Tajaran Belly 2"
+ icon_state = "markings_belly_full_taj"
+
+/datum/sprite_accessory/body_markings/tajara/points_taj
+ name = "Tajaran Points"
+ icon_state = "markings_points_taj"
+
+/datum/sprite_accessory/body_markings/tajara/patchy_taj
+ name = "Tajaran Patches"
+ icon_state = "markings_patch_taj"
+
+/datum/sprite_accessory/body_markings/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_fox_vulp
+ name = "Vulpkanin Belly"
+ icon_state = "markings_belly_fox_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_full_vulp
+ name = "Vulpkanin Belly 2"
+ icon_state = "markings_belly_full_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/belly_crest_vulp
+ name = "Vulpkanin Belly Crest"
+ icon_state = "markings_belly_crest_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_vulp
+ name = "Vulpkanin Points"
+ icon_state = "markings_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_vulp
+ name = "Vulpkanin Points and Belly"
+ icon_state = "markings_points_fade_belly_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_fade_belly_alt_vulp
+ name = "Vulpkanin Points and Belly Alt."
+ icon_state = "markings_points_fade_belly_alt_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_sharp_vulp
+ name = "Vulpkanin Points 2"
+ icon_state = "markings_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/vulpkanin/points_crest_vulp
+ name = "Vulpkanin Points and Crest"
+ icon_state = "markings_points_crest_vulp"
+
+/datum/sprite_accessory/body_markings/drask
+ species_allowed = list("Drask")
+
+/datum/sprite_accessory/body_markings/drask/arm_spines_drask
+ name = "Drask Arm Spines"
+ icon_state = "markings_armspines_drask"
+
+/datum/sprite_accessory/body_markings/head
+ marking_location = "head"
+ species_allowed = list()
+
+/datum/sprite_accessory/body_markings/head/tajara
+ species_allowed = list("Tajaran")
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_head_taj
+ name = "Tajaran Tiger Head"
+ icon_state = "markings_head_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/tiger_face_taj
+ name = "Tajaran Tiger Head and Face"
+ icon_state = "markings_face_tiger_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/outears_taj
+ name = "Tajaran Outer Ears"
+ icon_state = "markings_face_outears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/inears_taj
+ name = "Tajaran Inner Ears"
+ icon_state = "markings_face_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/nose_taj
+ name = "Tajaran Nose"
+ icon_state = "markings_face_nose_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_taj
+ name = "Tajaran Muzzle"
+ icon_state = "markings_face_muzzle_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_and_inears_taj
+ name = "Tajaran Muzzle and Inner Ears"
+ icon_state = "markings_face_muzzle_and_inears_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/muzzle_alt_taj //Companion marking for Tajaran Belly 2.
+ name = "Tajaran Muzzle 2"
+ icon_state = "markings_face_full_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/points_taj //Companion marking for Tajaran Points.
+ name = "Tajaran Points Head"
+ icon_state = "markings_face_points_taj"
+
+/datum/sprite_accessory/body_markings/head/tajara/patchy_taj //Companion marking for Tajaran Patches.
+ name = "Tajaran Patches Head"
+ icon_state = "markings_face_patch_taj"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_head_vulp
+ name = "Vulpkanin Tiger Head"
+ icon_state = "markings_head_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/tiger_face_vulp
+ name = "Vulpkanin Tiger Head and Face"
+ icon_state = "markings_face_tiger_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/nose_default_vulp
+ name = "Vulpkanin Nose"
+ icon_state = "markings_face_nose_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle"
+ icon_state = "markings_face_full_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt..
+ name = "Vulpkanin Muzzle and Ears"
+ icon_state = "markings_face_full_ears_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_fade_vulp //Companion marking for Vulpkanin Points Fade.
+ name = "Vulpkanin Points Head"
+ icon_state = "markings_face_points_fade_vulp"
+
+/datum/sprite_accessory/body_markings/head/vulpkanin/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp.
+ name = "Vulpkanin Points Head 2"
+ icon_state = "markings_face_points_sharp_vulp"
+
+/datum/sprite_accessory/body_markings/head/unathi
+ species_allowed = list("Unathi")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_head_una
+ name = "Unathi Tiger Head"
+ icon_state = "markings_head_tiger_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/tiger_face_una
+ name = "Unathi Tiger Head and Face"
+ icon_state = "markings_face_tiger_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_una_round
+ name = "Unathi Round Snout"
+ icon_state = "markings_face_snout_una_round"
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_lower_una_round
+ name = "Unathi Lower Round Snout"
+ icon_state = "markings_face_snout_lower_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/banded_una //Companion marking for Unathi Banded.
+ name = "Unathi Banded Head"
+ icon_state = "markings_face_banded_una"
+ heads_allowed = list("All")
+
+/datum/sprite_accessory/body_markings/head/unathi/snout_narrow_una //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Snout 2"
+ icon_state = "markings_face_narrow_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/points_una //Companion marking for Unathi Points.
+ name = "Unathi Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp
+ heads_allowed = list("Unathi Sharp Snout")
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/tiger_face_una_sharp
+ name = "Unathi Sharp Tiger Head and Face"
+ icon_state = "markings_face_tiger_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_una_sharp
+ name = "Unathi Sharp Snout"
+ icon_state = "markings_face_snout_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly.
+ name = "Unathi Sharp Snout 2"
+ icon_state = "markings_face_narrow_una_sharp"
+
+/datum/sprite_accessory/body_markings/head/unathi/sharp/points_una_sharp //Companion marking for Unathi Points.
+ name = "Unathi Sharp Points Head"
+ icon_state = "markings_face_points_una"
+
+/datum/sprite_accessory/body_markings/head/optics
name = "Humanoid Optics"
species_allowed = list("Machine")
icon_state = "optics"
models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm
- marking_location = "head"
-/datum/sprite_accessory/body_markings/optics/bishop_alt
+/datum/sprite_accessory/body_markings/head/optics/bishop_alt
name = "Bishop Alt. Optics"
- species_allowed = list("Machine")
icon_state = "bishop_alt_optics"
models_allowed = list("Bishop Cybernetics alt.")
-/datum/sprite_accessory/body_markings/optics/morpheus_alt
+/datum/sprite_accessory/body_markings/head/optics/morpheus_alt
name = "Morpheus Alt. Optics"
- species_allowed = list("Machine")
icon_state = "morpheus_alt_optics"
models_allowed = list("Morpheus Cyberkinetics alt.")
-/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt
+/datum/sprite_accessory/body_markings/head/optics/wardtakahashi_alt
name = "Ward-Takahashi Alt. Optics"
- species_allowed = list("Machine")
icon_state = "wardtakahashi_alt_optics"
models_allowed = list("Ward-Takahashi alt.")
-/datum/sprite_accessory/body_markings/optics/xion_alt
+/datum/sprite_accessory/body_markings/head/optics/xion_alt
name = "Xion Alt. Optics"
- species_allowed = list("Machine")
icon_state = "xion_alt_optics"
models_allowed = list("Xion Manufacturing Group alt.")
/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm
- name = "base tattoo"
- species_allowed = list()
+ species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/tattoo/elliot
name = "Elliot Circuit Tattoo"
- icon_state = "campbell_tattoo"
\ No newline at end of file
+ icon_state = "campbell_tattoo"
+ species_allowed = null
+
+/datum/sprite_accessory/body_markings/tattoo/tiger_body
+ name = "Tiger-stripe Tattoo"
+ species_allowed = list("Human", "Unathi", "Vulpkanin", "Tajaran", "Skrell")
+ icon_state = "markings_tiger"
+
+/datum/sprite_accessory/body_markings/tattoo/heart
+ name = "Heart Tattoo"
+ icon_state = "markings_tattoo_heart"
+
+/datum/sprite_accessory/body_markings/tattoo/hive
+ name = "Hive Tattoo"
+ icon_state = "markings_tattoo_hive"
+
+/datum/sprite_accessory/body_markings/tattoo/nightling
+ name = "Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling"
+
+/datum/sprite_accessory/body_markings/tattoo/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tattoo/vox/heart_vox
+ name = "Vox Heart Tattoo"
+ icon_state = "markings_tattoo_heart_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/hive_vox
+ name = "Vox Hive Tattoo"
+ icon_state = "markings_tattoo_hive_vox"
+
+/datum/sprite_accessory/body_markings/tattoo/vox/nightling_vox
+ name = "Vox Nightling Tattoo"
+ icon_state = "markings_tattoo_nightling_vox"
+
+/datum/sprite_accessory/body_markings/tail
+ species_allowed = list()
+ icon_state = "accessory_none"
+ marking_location = "tail"
+ tails_allowed = null
+
+/datum/sprite_accessory/body_markings/tail/vox
+ species_allowed = list("Vox")
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_band
+ name = "Vox Tail Band"
+ icon_state = "markings_voxtail_band"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_tip
+ name = "Vox Tail Tip"
+ icon_state = "markings_voxtail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vox/vox_stripe
+ name = "Vox Tail Stripe"
+ icon_state = "markings_voxtail_stripe"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin
+ species_allowed = list("Vulpkanin")
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_tip
+ name = "Vulpkanin Default Tail Tip"
+ icon_state = "markings_vulptail_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_default_fade
+ name = "Vulpkanin Default Tail Fade"
+ icon_state = "markings_vulptail_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_bushy_fluff
+ name = "Vulpkanin Bushy Tail Fluff"
+ tails_allowed = list("Vulpkanin Alt 1 (Bushy)")
+ icon_state = "markings_vulptail2_fluff"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_short_tip
+ name = "Vulpkanin Short Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 4 (Short)")
+ icon_state = "markings_vulptail5_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_tip
+ name = "Vulpkanin Bushy Straight Tail Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_tip"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_fade
+ name = "Vulpkanin Bushy Straight Tail Fade"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_fade"
+
+/datum/sprite_accessory/body_markings/tail/vulpkanin/vulp_hybrid_silverf
+ name = "Vulpkanin Bushy Straight Tail Black Fade White Tip"
+ tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
+ icon_state = "markings_vulptail6_silverf"
+
+/* ALT HEADS */
+
+/datum/sprite_accessory/alt_heads
+ icon = null
+ icon_state = null
+ species_allowed = null
+ var/suffix = null
+
+/datum/sprite_accessory/alt_heads/none
+ name = "None"
+
+/datum/sprite_accessory/alt_heads/una_sharp_snout
+ name = "Unathi Sharp Snout"
+ species_allowed = list("Unathi")
+ icon_state = "head_sharp"
+ suffix = "sharp"
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 8606dafbd31..21c14077886 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -7,8 +7,11 @@
var/list/valid_hairstyles = list()
var/list/valid_facial_hairstyles = list()
var/list/valid_head_accessories = list()
- var/list/valid_marking_styles = list()
+ var/list/valid_head_marking_styles = list()
+ var/list/valid_body_marking_styles = list()
+ var/list/valid_tail_marking_styles = list()
var/list/valid_body_accessories = list()
+ var/list/valid_alt_head_styles = list()
var/check_whitelist
var/list/whitelist
@@ -48,7 +51,7 @@
else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1; i <= owner.species.icon_skin_tones.len; i++)
+ for(var/i = 1 to owner.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
prompt += "[i] = [owner.species.icon_skin_tones[i]]"
@@ -66,9 +69,9 @@
if(can_change_skin_color())
var/new_skin = input(usr, "Choose your character's skin colour: ", "Skin Color", rgb(owner.r_skin, owner.g_skin, owner.b_skin)) as color|null
if(new_skin && can_still_topic(state))
- var/r_skin = hex2num(copytext(new_skin, 2, 4))
- var/g_skin = hex2num(copytext(new_skin, 4, 6))
- var/b_skin = hex2num(copytext(new_skin, 6, 8))
+ var/r_skin = color2R(new_skin)
+ var/g_skin = color2G(new_skin)
+ var/b_skin = color2B(new_skin)
if(owner.change_skin_color(r_skin, g_skin, b_skin))
update_dna()
return 1
@@ -81,12 +84,22 @@
if(can_change(APPEARANCE_HAIR_COLOR))
var/new_hair = input("Please select hair color.", "Hair Color", rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair)) as color|null
if(new_hair && can_still_topic(state))
- var/r_hair = hex2num(copytext(new_hair, 2, 4))
- var/g_hair = hex2num(copytext(new_hair, 4, 6))
- var/b_hair = hex2num(copytext(new_hair, 6, 8))
+ var/r_hair = color2R(new_hair)
+ var/g_hair = color2G(new_hair)
+ var/b_hair = color2B(new_hair)
if(owner.change_hair_color(r_hair, g_hair, b_hair))
update_dna()
return 1
+ if(href_list["secondary_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_HAIR_COLOR))
+ var/new_hair = input("Please select secondary hair color.", "Secondary Hair Color", rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec)) as color|null
+ if(new_hair && can_still_topic(state))
+ var/r_hair_sec = color2R(new_hair)
+ var/g_hair_sec = color2G(new_hair)
+ var/b_hair_sec = color2B(new_hair)
+ if(owner.change_hair_color(r_hair_sec, g_hair_sec, b_hair_sec, 1))
+ update_dna()
+ return 1
if(href_list["facial_hair"])
if(can_change(APPEARANCE_FACIAL_HAIR) && (href_list["facial_hair"] in valid_facial_hairstyles))
if(owner.change_facial_hair(href_list["facial_hair"]))
@@ -96,12 +109,22 @@
if(can_change(APPEARANCE_FACIAL_HAIR_COLOR))
var/new_facial = input("Please select facial hair color.", "Facial Hair Color", rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial)) as color|null
if(new_facial && can_still_topic(state))
- var/r_facial = hex2num(copytext(new_facial, 2, 4))
- var/g_facial = hex2num(copytext(new_facial, 4, 6))
- var/b_facial = hex2num(copytext(new_facial, 6, 8))
+ var/r_facial = color2R(new_facial)
+ var/g_facial = color2G(new_facial)
+ var/b_facial = color2B(new_facial)
if(owner.change_facial_hair_color(r_facial, g_facial, b_facial))
update_dna()
return 1
+ if(href_list["secondary_facial_hair_color"])
+ if(can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR))
+ var/new_facial = input("Please select secondary facial hair color.", "Secondary Facial Hair Color", rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec)) as color|null
+ if(new_facial && can_still_topic(state))
+ var/r_facial_sec = color2R(new_facial)
+ var/g_facial_sec = color2G(new_facial)
+ var/b_facial_sec = color2B(new_facial)
+ if(owner.change_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec, 1))
+ update_dna()
+ return 1
if(href_list["eye_color"])
if(can_change(APPEARANCE_EYE_COLOR))
var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes)
@@ -114,9 +137,9 @@
eyes_blue = eyes_organ.eye_colour[3]
var/new_eyes = input("Please select eye color.", "Eye Color", rgb(eyes_red, eyes_green, eyes_blue)) as color|null
if(new_eyes && can_still_topic(state))
- var/r_eyes = hex2num(copytext(new_eyes, 2, 4))
- var/g_eyes = hex2num(copytext(new_eyes, 4, 6))
- var/b_eyes = hex2num(copytext(new_eyes, 6, 8))
+ var/r_eyes = color2R(new_eyes)
+ var/g_eyes = color2G(new_eyes)
+ var/b_eyes = color2B(new_eyes)
if(owner.change_eye_color(r_eyes, g_eyes, b_eyes))
update_dna()
return 1
@@ -129,31 +152,60 @@
if(can_change_head_accessory())
var/new_head_accessory = input("Please select head accessory color.", "Head Accessory Color", rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc)) as color|null
if(new_head_accessory && can_still_topic(state))
- var/r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
- var/g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
- var/b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
+ var/r_headacc = color2R(new_head_accessory)
+ var/g_headacc = color2G(new_head_accessory)
+ var/b_headacc = color2B(new_head_accessory)
if(owner.change_head_accessory_color(r_headacc, g_headacc, b_headacc))
update_dna()
return 1
- if(href_list["marking"])
- if(can_change_markings() && (href_list["marking"] in valid_marking_styles))
- if(owner.change_markings(href_list["marking"]))
+ if(href_list["head_marking"])
+ if(can_change_markings("head") && (href_list["head_marking"] in valid_head_marking_styles))
+ if(owner.change_markings(href_list["head_marking"], "head"))
update_dna()
return 1
- if(href_list["marking_color"])
- if(can_change_markings())
- var/new_markings = input("Please select marking color.", "Marking Color", rgb(owner.r_markings, owner.g_markings, owner.b_markings)) as color|null
+ if(href_list["head_marking_color"])
+ if(can_change_markings("head"))
+ var/new_markings = input("Please select head marking color.", "Marking Color", owner.m_colours["head"]) as color|null
if(new_markings && can_still_topic(state))
- var/r_markings = hex2num(copytext(new_markings, 2, 4))
- var/g_markings = hex2num(copytext(new_markings, 4, 6))
- var/b_markings = hex2num(copytext(new_markings, 6, 8))
- if(owner.change_marking_color(r_markings, g_markings, b_markings))
+ if(owner.change_marking_color(new_markings, "head"))
+ update_dna()
+ return 1
+ if(href_list["body_marking"])
+ if(can_change_markings("body") && (href_list["body_marking"] in valid_body_marking_styles))
+ if(owner.change_markings(href_list["body_marking"], "body"))
+ update_dna()
+ return 1
+ if(href_list["body_marking_color"])
+ if(can_change_markings("body"))
+ var/new_markings = input("Please select body marking color.", "Marking Color", owner.m_colours["body"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "body"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking"])
+ if(can_change_markings("tail") && (href_list["tail_marking"] in valid_tail_marking_styles))
+ if(owner.change_markings(href_list["tail_marking"], "tail"))
+ update_dna()
+ return 1
+ if(href_list["tail_marking_color"])
+ if(can_change_markings("tail"))
+ var/new_markings = input("Please select tail marking color.", "Marking Color", owner.m_colours["tail"]) as color|null
+ if(new_markings && can_still_topic(state))
+ if(owner.change_marking_color(new_markings, "tail"))
update_dna()
return 1
if(href_list["body_accessory"])
if(can_change_body_accessory() && (href_list["body_accessory"] in valid_body_accessories))
if(owner.change_body_accessory(href_list["body_accessory"]))
update_dna()
+ cut_and_generate_data()
+ return 1
+ if(href_list["alt_head"])
+ if(can_change_alt_head() && (href_list["alt_head"] in valid_alt_head_styles))
+ if(owner.change_alt_head(href_list["alt_head"]))
+ update_dna()
+ head_organ = owner.get_organ("head") //Update the head with the new information.
+ cut_and_generate_data()
return 1
return 0
@@ -199,13 +251,32 @@
data["facial_hair_styles"] = facial_hair_styles
data["facial_hair_style"] = (head_organ ? head_organ.f_style : "Shaved")
- data["change_markings"] = can_change_markings()
- if(data["change_markings"])
- var/marking_styles[0]
- for(var/marking_style in valid_marking_styles)
- marking_styles[++marking_styles.len] = list("markingstyle" = marking_style)
- data["marking_styles"] = marking_styles
- data["marking_style"] = owner.m_style
+ data["change_head_markings"] = can_change_markings("head")
+ if(data["change_head_markings"])
+ var/m_style = owner.m_styles["head"]
+ var/head_marking_styles[0]
+ for(var/head_marking_style in valid_head_marking_styles)
+ head_marking_styles[++head_marking_styles.len] = list("headmarkingstyle" = head_marking_style)
+ data["head_marking_styles"] = head_marking_styles
+ data["head_marking_style"] = m_style
+
+ data["change_body_markings"] = can_change_markings("body")
+ if(data["change_body_markings"])
+ var/m_style = owner.m_styles["body"]
+ var/body_marking_styles[0]
+ for(var/body_marking_style in valid_body_marking_styles)
+ body_marking_styles[++body_marking_styles.len] = list("bodymarkingstyle" = body_marking_style)
+ data["body_marking_styles"] = body_marking_styles
+ data["body_marking_style"] = m_style
+
+ data["change_tail_markings"] = can_change_markings("tail")
+ if(data["change_tail_markings"])
+ var/m_style = owner.m_styles["tail"]
+ var/tail_marking_styles[0]
+ for(var/tail_marking_style in valid_tail_marking_styles)
+ tail_marking_styles[++tail_marking_styles.len] = list("tailmarkingstyle" = tail_marking_style)
+ data["tail_marking_styles"] = tail_marking_styles
+ data["tail_marking_style"] = m_style
data["change_body_accessory"] = can_change_body_accessory()
if(data["change_body_accessory"])
@@ -213,15 +284,24 @@
for(var/body_accessory_style in valid_body_accessories)
body_accessory_styles[++body_accessory_styles.len] = list("bodyaccessorystyle" = body_accessory_style)
data["body_accessory_styles"] = body_accessory_styles
- var/datum/body_accessory/BA
- if(owner.body_accessory)
- BA = owner.body_accessory.name
- data["body_accessory_style"] = BA
+ data["body_accessory_style"] = (owner.body_accessory ? owner.body_accessory.name : "None")
+
+ data["change_alt_head"] = can_change_alt_head()
+ if(data["change_alt_head"])
+ var/alt_head_styles[0]
+ for(var/alt_head_style in valid_alt_head_styles)
+ alt_head_styles[++alt_head_styles.len] = list("altheadstyle" = alt_head_style)
+ data["alt_head_styles"] = alt_head_styles
+ data["alt_head_style"] = head_organ.alt_head
data["change_head_accessory_color"] = can_change_head_accessory()
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
+ data["change_secondary_hair_color"] = can_change(APPEARANCE_SECONDARY_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
- data["change_marking_color"] = can_change_markings()
+ data["change_secondary_facial_hair_color"] = can_change(APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR)
+ data["change_head_marking_color"] = can_change_markings("head")
+ data["change_body_marking_color"] = can_change_markings("body")
+ data["change_tail_marking_color"] = can_change_markings("tail")
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
ui = new(user, src, ui_key, "appearance_changer.tmpl", "[src]", 800, 450, state = state)
@@ -248,19 +328,41 @@
return 0
return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
-/datum/nano_module/appearance_changer/proc/can_change_markings()
- return owner && (flags & APPEARANCE_MARKINGS) && (owner.species.bodyflags & HAS_MARKINGS)
+/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
+ var/marking_flag = HAS_BODY_MARKINGS
+ var/body_flags = owner.species.bodyflags
+ if(location == "head")
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ body_flags = head_organ.species.bodyflags
+ marking_flag = HAS_HEAD_MARKINGS
+ if(location == "body")
+ marking_flag = HAS_BODY_MARKINGS
+ if(location == "tail")
+ marking_flag = HAS_TAIL_MARKINGS
+
+ return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+/datum/nano_module/appearance_changer/proc/can_change_alt_head()
+ if(!head_organ)
+ log_debug("Missing head!")
+ return 0
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
valid_hairstyles.Cut()
valid_facial_hairstyles.Cut()
valid_head_accessories.Cut()
- valid_marking_styles.Cut()
+ valid_head_marking_styles.Cut()
+ valid_body_marking_styles.Cut()
+ valid_tail_marking_styles.Cut()
valid_body_accessories.Cut()
+ valid_alt_head_styles.Cut()
generate_data()
/datum/nano_module/appearance_changer/proc/generate_data()
@@ -273,7 +375,13 @@
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
if(!valid_head_accessories.len)
valid_head_accessories = owner.generate_valid_head_accessories()
- if(!valid_marking_styles.len)
- valid_marking_styles = owner.generate_valid_markings()
+ if(!valid_head_marking_styles.len)
+ valid_head_marking_styles = owner.generate_valid_markings("head")
+ if(!valid_body_marking_styles.len)
+ valid_body_marking_styles = owner.generate_valid_markings("body")
+ if(!valid_tail_marking_styles.len)
+ valid_tail_marking_styles = owner.generate_valid_markings("tail")
if(!valid_body_accessories.len)
valid_body_accessories = owner.generate_valid_body_accessories()
+ if(!valid_alt_head_styles.len)
+ valid_alt_head_styles = owner.generate_valid_alt_heads()
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 99a1660ba35..8d920a7e736 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -49,7 +49,7 @@
/obj/item/weapon/gun/energy/gun/hos
name = "\improper X-01 MultiPhase Energy Gun"
- desc = "This is a expensive, modern recreation of a antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
+ desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time."
icon_state = "hoslaser"
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 85657dd2b5b..232d2a9b3c5 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -255,20 +255,20 @@
/obj/machinery/disposal/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
- var/pressure = 100 * air_contents.return_pressure() / (SEND_PRESSURE)
+ var/pressure = Clamp(100* air_contents.return_pressure() / (SEND_PRESSURE), 0, 100)
var/pressure_round = round(pressure,1)
data["isAI"] = isAI(user)
data["flushing"] = flush
data["mode"] = mode
if(mode <= 0)
- data["pumpstatus"] = ""
+ data["pumpstatus"] = "N/A"
else if(mode == 1)
- data["pumpstatus"] = "(pressurizing)"
+ data["pumpstatus"] = "Pressurizing"
else if(mode == 2)
- data["pumpstatus"] = "(ready)"
+ data["pumpstatus"] = "Ready"
else
- data["pumpstatus"] = "(idle)"
+ data["pumpstatus"] = "Idle"
data["pressure"] = pressure_round
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
diff --git a/code/modules/security_levels/keycard authentication.dm b/code/modules/security_levels/keycard authentication.dm
index 188bf7597c2..8ff0ed6eb64 100644
--- a/code/modules/security_levels/keycard authentication.dm
+++ b/code/modules/security_levels/keycard authentication.dm
@@ -3,6 +3,7 @@
desc = "This device is used to trigger station functions, which require more than one ID card to authenticate."
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
+
var/active = 0 //This gets set to 1 on all devices except the one where the initial request was made.
var/event = ""
var/screen = 1
@@ -14,25 +15,25 @@
var/mob/event_triggered_by
var/mob/event_confirmed_by
var/ert_reason = "Reason for ERT"
- //1 = select event
- //2 = authenticate
- anchored = 1.0
+
+ anchored = 1
use_power = 1
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
+
+ req_access = list(access_keycard_auth)
/obj/machinery/keycard_auth/attack_ai(mob/user as mob)
- to_chat(user, "The station AI is not to interact with these devices.")
+ to_chat(user, "The station AI is not to interact with these devices.")
return
/obj/machinery/keycard_auth/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
- if(istype(W,/obj/item/weapon/card/id))
- var/obj/item/weapon/card/id/ID = W
- if(access_keycard_auth in ID.access)
+ if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))
+ if(check_access(W))
if(active == 1)
//This is not the device that made the initial request. It is the device confirming the request.
if(event_source)
@@ -44,6 +45,8 @@
return
event_triggered_by = usr
broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices
+ else
+ to_chat(user, "Access denied.")
/obj/machinery/keycard_auth/power_change()
if(powered(ENVIRON))
@@ -51,16 +54,16 @@
icon_state = "auth_off"
else
stat |= NOPOWER
+
+/obj/machinery/keycard_auth/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/keycard_auth/attack_hand(mob/user as mob)
- if(!user.IsAdvancedToolUser())
- return 0
+ if(..())
+ return 1
ui_interact(user)
/obj/machinery/keycard_auth/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- if(user.stat || stat & (NOPOWER|BROKEN))
- to_chat(user, "This device is not powered.")
- return
if(busy)
to_chat(user, "This device is busy.")
return
@@ -74,19 +77,18 @@
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui)
- ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 520, 320)
+ ui = new(user, src, ui_key, "keycard_auth.tmpl", "Keycard Authentication Device UI", 540, 320)
ui.set_initial_data(data)
ui.open()
/obj/machinery/keycard_auth/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(busy)
to_chat(usr, "This device is busy.")
return
- if(usr.stat || stat & (BROKEN|NOPOWER))
- to_chat(usr, "This device is without power.")
- return
+
if(href_list["triggerevent"])
event = href_list["triggerevent"]
screen = 2
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index a0dcd29525f..794bf2a3e9f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -162,9 +162,9 @@
var/obj/item/organ/external/head/H = target.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe.
- H.h_style = ""
- H.f_style = ""
- target.m_style = ""
+ H.h_style = "Bald"
+ H.f_style = "Shaved"
+ target.m_styles["head"] = "None"
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index d10fea6b7aa..ce4b55efb11 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -860,11 +860,13 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/mutate()
src.status |= ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly render the deformed sprite.
/obj/item/organ/external/proc/unmutate()
src.status &= ~ORGAN_MUTATED
- if(owner) owner.update_body()
+ if(owner)
+ owner.update_body(1, 1) //Forces all bodyparts to update in order to correctly return them to normal.
/obj/item/organ/external/proc/get_damage() //returns total damage
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index 31ef55f4919..272adcad52c 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -107,13 +107,14 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
- if(owner.m_style)
- var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style]
- if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head")
- var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
- if(marking_style.do_colouration)
- markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD)
- overlays |= markings_s
+ var/head_marking = owner.m_styles["head"]
+ if(head_marking && head_marking != "None")
+ var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
+ if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
+ if(head_marking_style.do_colouration)
+ h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
+ overlays |= h_marking_s
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
@@ -158,6 +159,10 @@ var/global/list/limb_icon_cache = list()
gender = "f"
else
gender = "m"
+ if(limb_name == "head")
+ var/obj/item/organ/external/head/head_organ = src
+ head_organ.handle_alt_icon()
+
new_icon_state = "[icon_name][gender ? "_[gender]" : ""]"
if(skeletal)
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 02351f523a8..faa6c403355 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -159,11 +159,15 @@
gendered_icon = 1
encased = "skull"
var/can_intake_reagents = 1
+ var/alt_head = "None"
//Hair colour and style
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
+ var/r_hair_sec = 0
+ var/g_hair_sec = 0
+ var/b_hair_sec = 0
var/h_style = "Bald"
//Head accessory colour and style
@@ -176,6 +180,9 @@
var/r_facial = 0
var/g_facial = 0
var/b_facial = 0
+ var/r_facial_sec = 0
+ var/g_facial_sec = 0
+ var/b_facial_sec = 0
var/f_style = "Shaved"
/obj/item/organ/external/head/remove()
@@ -197,6 +204,8 @@
if(owner)//runtimer no runtiming
owner.update_hair()
owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
@@ -213,6 +222,17 @@
if(burn_dam > 40)
disfigure("burn")
+/obj/item/organ/external/head/proc/handle_alt_icon()
+ if(alt_head && alt_heads_list[alt_head])
+ var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[alt_head]
+ if(alternate_head.icon_state)
+ icon_name = alternate_head.icon_state
+ else //If alternate_head.icon_state doesn't exist, that means alternate_head is "None", so default icon_name back to "head".
+ icon_name = initial(icon_name)
+ else //If alt_head is null, set it to "None" and default icon_name for sanity.
+ alt_head = initial(alt_head)
+ icon_name = initial(icon_name)
+
/obj/item/organ/external/head/set_dna(datum/dna/new_dna)
..()
new_dna.write_head_attributes(src)
diff --git a/html/changelog.html b/html/changelog.html
index 6ab1e019045..2d41f163168 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,47 @@
-->
+
23 October 2016
+
KasparoVy updated:
+
+ - Refactors markings. Now split into head, body and tail markings.
+ - Refactors morph again. Changes made while morphing are now reflected instantly on your sprite.
+ - Darkens Vulpkanin and Tajara for improved colour fidelity. Species base colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj to keep the same colour on your character.
+ - Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add 23 to the R, G and B values of your facial hair/head accessory to keep the same colour on your character.
+ - Darkens Unathi frills and horns. Add 27 to the R, G and B values of your frills and 21 for horns to keep the same colour on your character.
+ - Vulpkanin tails are now split-rendered. Tails overlap hair when facing north, but are overlapped by hair when facing all other directions. No other differences, only affects the fluffy husky tail.
+ - The heads of tiger markings have been isolated and can now be coloured independently.
+ - Hair can now cover facial hair, and glasses are no longer covered by facial hair and head accessories. Means that two-piece Vulpkanin facial fur patterns won't almost entirely cover whatever glasses they're wearing.
+ - Tajaran head and facial hair have been darkened. Add 28 to the R, G and B values of your Tajara head/facial hair to keep the same colour on your character.
+ - Vulpkanin head hair and one facial hair style has been darkened. Refer to PR notes for darkening factors.
+ - The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS flags are for specific locations (head, body, tail).
+ - Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - Naked Humans and Skrell will no longer have exposed flesh poking out their wrists when facing east or west. Male Humans now no longer lack a butt pixel when facing east or west.
+ - Mutated limbs now render correctly as soon as they're mutated.
+ - Mobs will now correctly appear as fat/skinny.
+ - Species with TAIL_OVERLAPPED will no longer wag tail at max speed when facing north.
+ - Species with TAIL_OVERLAPPED and body accessories won't crash the game when they wag.
+ - Tiger Head and Face markings adjusted so they don't look ugly on certain species' ears.
+ - Fixes issue where Unathi dorsal stripe didn't render.
+ - Tajaran ears are no longer in their hair sprites, but on their actual heads.
+ - The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and will now be rendered correctly on a body regardless of species bodyflags.
+ - Changing a person's species via CMA will no longer result in a mob with all the same cosmetic attributes as the old species.
+ - Dressers now have species fitting checks for undergarments. Drask are now able to wear undershirts and underwear like they were originally meant to.
+ - Adds some head markings for Tajara and Vulpkanin.
+ - Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - Adds tail markings for Vox and Vulpkanin.
+ - Adds 5 Tajaran hairstyles.
+ - Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with certain jackets as much.
+ - Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - Adds a facial hairstyle for Vulpkanin.
+ - Adds secondary hair (head and facial) themes. Skrell can now colour their tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles can be coloured and the same with the webbing in Unathi frills. Can be changed at nanomirrors, via morph and CMA.
+ - Adds alternate heads. Unathi can now choose a head with a sharp snout. Can be changed via morph and CMA.
+ - Helper procs to convert a hex colour into either R, G, or B.
+ - Markings, body accessories, head accessories, alt heads and their colours (if they have colours) can now be randomized at the character preferences screen.
+ - Adds a system that attempts to fit mobs with alternate heads with appropriate mask sprites. The sprites just need to be suffixed with the alt_head suffix in sprite_accessories.dm.
+ - Adds mask sprites tweaked to fit the new Unathi alternate head to go along with the new alt. head mask fitting system.
+
+
15 October 2016
Crazylemon64 updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 9dfe354606f..7f682f24250 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2978,3 +2978,73 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
messages.
- bugfix: Fixed camera monitors immobilizing you if you reconnect while using one.
- bugfix: Fixed selecting datum types through SDQL2 never returning any datums.
+2016-10-23:
+ KasparoVy:
+ - tweak: Refactors markings. Now split into head, body and tail markings.
+ - tweak: Refactors morph again. Changes made while morphing are now reflected instantly
+ on your sprite.
+ - tweak: Darkens Vulpkanin and Tajara for improved colour fidelity. Species base
+ colour changed to compensate. Add 27 to R, G and B values if Vulp, 15 if Taj
+ to keep the same colour on your character.
+ - tweak: Darkens Vulpkanin facial fur patterns for improved colour fidelity. Add
+ 23 to the R, G and B values of your facial hair/head accessory to keep the same
+ colour on your character.
+ - tweak: Darkens Unathi frills and horns. Add 27 to the R, G and B values of your
+ frills and 21 for horns to keep the same colour on your character.
+ - tweak: Vulpkanin tails are now split-rendered. Tails overlap hair when facing
+ north, but are overlapped by hair when facing all other directions. No other
+ differences, only affects the fluffy husky tail.
+ - tweak: The heads of tiger markings have been isolated and can now be coloured
+ independently.
+ - tweak: Hair can now cover facial hair, and glasses are no longer covered by facial
+ hair and head accessories. Means that two-piece Vulpkanin facial fur patterns
+ won't almost entirely cover whatever glasses they're wearing.
+ - tweak: Tajaran head and facial hair have been darkened. Add 28 to the R, G and
+ B values of your Tajara head/facial hair to keep the same colour on your character.
+ - tweak: Vulpkanin head hair and one facial hair style has been darkened. Refer
+ to PR notes for darkening factors.
+ - tweak: The HAS_MARKINGS flag now represents all marking locations. The HAS_location_MARKINGS
+ flags are for specific locations (head, body, tail).
+ - tweak: Improves the quality of some Vulpkanin/Tajara/Unathi mask sprites.
+ - bugfix: Naked Humans and Skrell will no longer have exposed flesh poking out their
+ wrists when facing east or west. Male Humans now no longer lack a butt pixel
+ when facing east or west.
+ - bugfix: Mutated limbs now render correctly as soon as they're mutated.
+ - bugfix: Mobs will now correctly appear as fat/skinny.
+ - bugfix: Species with TAIL_OVERLAPPED will no longer wag tail at max speed when
+ facing north.
+ - bugfix: Species with TAIL_OVERLAPPED and body accessories won't crash the game
+ when they wag.
+ - bugfix: Tiger Head and Face markings adjusted so they don't look ugly on certain
+ species' ears.
+ - bugfix: Fixes issue where Unathi dorsal stripe didn't render.
+ - bugfix: Tajaran ears are no longer in their hair sprites, but on their actual
+ heads.
+ - bugfix: The adminbus body accessory now overrides the TAIL_OVERLAPPED flag and
+ will now be rendered correctly on a body regardless of species bodyflags.
+ - bugfix: Changing a person's species via CMA will no longer result in a mob with
+ all the same cosmetic attributes as the old species.
+ - bugfix: Dressers now have species fitting checks for undergarments. Drask are
+ now able to wear undershirts and underwear like they were originally meant to.
+ - rscadd: Adds some head markings for Tajara and Vulpkanin.
+ - rscadd: Adds body marking(s) for Tajara, Vulpkanin, Unathi and Drask.
+ - rscadd: Adds tail markings for Vox and Vulpkanin.
+ - rscadd: Adds 5 Tajaran hairstyles.
+ - rscadd: Adds a tweaked version of an existing Vox hairstyle. Shouldn't clip with
+ certain jackets as much.
+ - rscadd: Adds a hairstyle for Humans, Unathi and Vulpkanin.
+ - rscadd: Adds a facial hairstyle for Vulpkanin.
+ - rscadd: Adds secondary hair (head and facial) themes. Skrell can now colour their
+ tentacle cloths independently, the beads in the Tajaran/Hippie braid hairstyles
+ can be coloured and the same with the webbing in Unathi frills. Can be changed
+ at nanomirrors, via morph and CMA.
+ - rscadd: Adds alternate heads. Unathi can now choose a head with a sharp snout.
+ Can be changed via morph and CMA.
+ - rscadd: Helper procs to convert a hex colour into either R, G, or B.
+ - rscadd: Markings, body accessories, head accessories, alt heads and their colours
+ (if they have colours) can now be randomized at the character preferences screen.
+ - rscadd: Adds a system that attempts to fit mobs with alternate heads with appropriate
+ mask sprites. The sprites just need to be suffixed with the alt_head suffix
+ in sprite_accessories.dm.
+ - imageadd: Adds mask sprites tweaked to fit the new Unathi alternate head to go
+ along with the new alt. head mask fitting system.
diff --git a/html/changelogs/AutoChangeLog-pr-5811.yml b/html/changelogs/AutoChangeLog-pr-5811.yml
new file mode 100644
index 00000000000..33d9eb32a8b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-5811.yml
@@ -0,0 +1,7 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - bugfix: "Fixes a bug where changing your alt head required two icon updates to show."
+ - bugfix: "Fixes a bug where you couldn't choose head marking styles that would ordinarily be available regardless of your alt head."
+ - bugfix: "Fixes a bug where Tajara couldn't choose undergarments."
+ - bugfix: "Resolves an issue with the Vulpkanin Jagged hairstyle missing a pixel."
diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi
index ee3da07c3c5..87c047f397a 100644
Binary files a/icons/effects/species.dmi and b/icons/effects/species.dmi differ
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index c45bd957a1a..6e94d89854d 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index ad4f2d137a6..02bbf79ad76 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 79df46605a2..bf6507c412c 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/r_def_human.dmi b/icons/mob/human_races/r_def_human.dmi
index 9d6af67be61..92ee97b4aba 100644
Binary files a/icons/mob/human_races/r_def_human.dmi and b/icons/mob/human_races/r_def_human.dmi differ
diff --git a/icons/mob/human_races/r_def_lizard.dmi b/icons/mob/human_races/r_def_lizard.dmi
index 3926ca17092..e1c40712b23 100644
Binary files a/icons/mob/human_races/r_def_lizard.dmi and b/icons/mob/human_races/r_def_lizard.dmi differ
diff --git a/icons/mob/human_races/r_def_tajaran.dmi b/icons/mob/human_races/r_def_tajaran.dmi
index 1e7da69c495..e62f4228fc6 100644
Binary files a/icons/mob/human_races/r_def_tajaran.dmi and b/icons/mob/human_races/r_def_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_grey.dmi b/icons/mob/human_races/r_grey.dmi
index d270ab83934..4f603380545 100644
Binary files a/icons/mob/human_races/r_grey.dmi and b/icons/mob/human_races/r_grey.dmi differ
diff --git a/icons/mob/human_races/r_human.dmi b/icons/mob/human_races/r_human.dmi
index 0aa7295b8d3..0cbbde7fb3a 100644
Binary files a/icons/mob/human_races/r_human.dmi and b/icons/mob/human_races/r_human.dmi differ
diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi
index 457e50b204e..d60ae4979df 100644
Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ
diff --git a/icons/mob/human_races/r_skrell.dmi b/icons/mob/human_races/r_skrell.dmi
index f1c4966dc51..586714c7da8 100644
Binary files a/icons/mob/human_races/r_skrell.dmi and b/icons/mob/human_races/r_skrell.dmi differ
diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi
index c287ef822f3..3f45032951d 100644
Binary files a/icons/mob/human_races/r_tajaran.dmi and b/icons/mob/human_races/r_tajaran.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index 0f1b6956c10..3bcdb3539b7 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/species/tajaran/mask.dmi b/icons/mob/species/tajaran/mask.dmi
index ea17113a2fc..9217fb7730c 100644
Binary files a/icons/mob/species/tajaran/mask.dmi and b/icons/mob/species/tajaran/mask.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 4ad3b228849..46b11152ba7 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/mask.dmi b/icons/mob/species/unathi/mask.dmi
index a211a035012..e0571e592db 100644
Binary files a/icons/mob/species/unathi/mask.dmi and b/icons/mob/species/unathi/mask.dmi differ
diff --git a/icons/mob/species/vox/mask.dmi b/icons/mob/species/vox/mask.dmi
index b39ee5577a6..93dacb8f058 100644
Binary files a/icons/mob/species/vox/mask.dmi and b/icons/mob/species/vox/mask.dmi differ
diff --git a/icons/mob/species/vulpkanin/mask.dmi b/icons/mob/species/vulpkanin/mask.dmi
index f0353c1766d..14a70e1bb4c 100644
Binary files a/icons/mob/species/vulpkanin/mask.dmi and b/icons/mob/species/vulpkanin/mask.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 886076f21d2..47a3ce113e2 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -23,7 +23,7 @@
{{/if}}
-{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_marking_color}}
+{{if data.change_eye_color || data.change_skin_tone || data.change_skin_color || data.change_head_accessory_color || data.change_hair_color || data.change_facial_hair_color || data.change_head_marking_color || data.change_body_marking_color || data.change_tail_marking_color}}
Colors:
@@ -44,11 +44,23 @@
{{if data.change_hair_color}}
{{:helper.link('Change hair color', null, { 'hair_color' : 1})}}
{{/if}}
+ {{if data.change_secondary_hair_color}}
+ {{:helper.link('Change secondary hair color', null, { 'secondary_hair_color' : 1})}}
+ {{/if}}
{{if data.change_facial_hair_color}}
{{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}}
{{/if}}
- {{if data.change_marking_color}}
- {{:helper.link('Change marking color', null, { 'marking_color' : 1})}}
+ {{if data.change_secondary_facial_hair_color}}
+ {{:helper.link('Change secondary facial hair color', null, { 'secondary_facial_hair_color' : 1})}}
+ {{/if}}
+ {{if data.change_head_marking_color}}
+ {{:helper.link('Change head marking color', null, { 'head_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_body_marking_color}}
+ {{:helper.link('Change body marking color', null, { 'body_marking_color' : 1})}}
+ {{/if}}
+ {{if data.change_tail_marking_color}}
+ {{:helper.link('Change tail marking color', null, { 'tail_marking_color' : 1})}}
{{/if}}
@@ -93,14 +105,40 @@
{{/if}}
-{{if data.change_markings}}
+{{if data.change_head_markings}}
- Marking styles:
+ Head Marking styles:
- {{for data.marking_styles}}
- {{:helper.link(value.markingstyle, null, { 'marking' : value.markingstyle}, null, data.marking_style == value.markingstyle ? 'selected' : null)}}
+ {{for data.head_marking_styles}}
+ {{:helper.link(value.headmarkingstyle, null, { 'head_marking' : value.headmarkingstyle}, null, data.head_marking_style == value.headmarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_body_markings}}
+
+
+ Body Marking styles:
+
+
+ {{for data.body_marking_styles}}
+ {{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
+
+{{if data.change_tail_markings}}
+
+
+ Tail Marking styles:
+
+
+ {{for data.tail_marking_styles}}
+ {{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}}
{{/for}}
@@ -118,3 +156,16 @@
{{/if}}
+
+{{if data.change_alt_head}}
+
+
+ Alternate Heads:
+
+
+ {{for data.alt_head_styles}}
+ {{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/nano/templates/chem_dispenser.tmpl b/nano/templates/chem_dispenser.tmpl
index cec3028652e..f8988e35e43 100644
--- a/nano/templates/chem_dispenser.tmpl
+++ b/nano/templates/chem_dispenser.tmpl
@@ -78,24 +78,12 @@ Used In File(s): \code\modules\reagents\Chemistry-Machinery.dm
{{empty}}
-
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- is empty
+ {{if data.glass}}Glass{{else}}Beaker{{/if}} is empty
{{/for}}
{{else}}
- No
- {{if data.glass}}
- Glass
- {{else}}
- Beaker
- {{/if}}
- loaded
+ No {{if data.glass}}Glass{{else}}Beaker{{/if}} loaded
{{/if}}
diff --git a/nano/templates/disposal_bin.tmpl b/nano/templates/disposal_bin.tmpl
index c68389a95cb..d211b3fbb17 100644
--- a/nano/templates/disposal_bin.tmpl
+++ b/nano/templates/disposal_bin.tmpl
@@ -31,6 +31,13 @@ Used In File(s): \code\modules\recycling\disposal.dm
{{:helper.link('On', 'gear', {'pump' : 1}, data.mode > 0 ? 'selected' : '')}}
{{:helper.link('Off', 'gear', {'pump' : 0}, data.mode <= 0 ? 'selected' : '')}}
+
+
+
+
+ Pump Status:
+
+
{{:data.pumpstatus}}
diff --git a/nano/templates/keycard_auth.tmpl b/nano/templates/keycard_auth.tmpl
index 7f8f24b80eb..af58b061a9f 100644
--- a/nano/templates/keycard_auth.tmpl
+++ b/nano/templates/keycard_auth.tmpl
@@ -29,7 +29,7 @@ Used In File(s): \code\modules\security_levels\keycard_authentication.dm
{{/if}}
-
+ Please swipe your card to authorize the following event:
{{:data.event}}
{{:helper.link('Back', 'close', { 'reset' : 1 })}}
{{/if}}