Merge pull request #5147 from KasparoVy/tail-markings
Refactors Markings, Adds Tail (some body and head) markings, Adds Alt heads, Secondary (F)Hair Themes, Darkens Vulp/Taj + Unathi horns/frills, Sprite adjustments and more...
@@ -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` mediumtext 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` mediumtext 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,
|
||||
|
||||
@@ -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` mediumtext 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` mediumtext 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,
|
||||
|
||||
@@ -59,10 +59,13 @@
|
||||
#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 TAIL_WAGGING 4096
|
||||
#define NO_EYES 8192
|
||||
#define HAS_FUR 16384
|
||||
#define HAS_ALT_HEADS 32768
|
||||
|
||||
//Species Diet Flags
|
||||
#define DIET_CARN 1
|
||||
|
||||
@@ -214,14 +214,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 FHAIR_LAYER 17
|
||||
#define HAIR_LAYER 18 //TODO: make part of head layer?
|
||||
#define HEAD_ACCESSORY_LAYER 19
|
||||
#define GLASSES_LAYER 20
|
||||
#define TAIL_LAYER 21 //bs12 specific. this hack is probably gonna come back to haunt me
|
||||
#define FACEMASK_LAYER 22
|
||||
#define HEAD_LAYER 23
|
||||
#define COLLAR_LAYER 24
|
||||
|
||||
@@ -72,15 +72,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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
var/global/list/head_accessory_styles_list = list() //stores /datum/sprite_accessory/head_accessory indexed by name
|
||||
//Marking styles
|
||||
var/global/list/marking_styles_list = list() //stores /datum/sprite_accessory/body_markings indexed by name
|
||||
var/global/list/head_marking_styles_list = list()
|
||||
var/global/list/body_marking_styles_list = list()
|
||||
var/global/list/tail_marking_styles_list = list()
|
||||
//Hairstyles
|
||||
var/global/list/hair_styles_list = list() //stores /datum/sprite_accessory/hair indexed by name
|
||||
var/global/list/hair_styles_male_list = list()
|
||||
@@ -23,6 +26,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")
|
||||
|
||||
|
||||
@@ -140,7 +140,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
|
||||
@@ -182,6 +187,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
|
||||
@@ -199,15 +211,33 @@ 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))
|
||||
var/list/marking_styles = params2list(H.m_styles)
|
||||
var/list/marking_colours = params2list(H.m_colours)
|
||||
if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
|
||||
var/body_marking = marking_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(rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8))), ICON_ADD)
|
||||
face_s.Blend(b_marking_s, ICON_OVERLAY)
|
||||
if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
|
||||
var/head_marking = marking_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(rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8))), ICON_ADD)
|
||||
face_s.Blend(h_marking_s, ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(face_s, ICON_OVERLAY)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -154,9 +162,16 @@ var/global/list/bad_blocks[0]
|
||||
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 = "head=None;\
|
||||
body=None;\
|
||||
tail=None"
|
||||
|
||||
var/list/marking_styles = params2list(character.m_styles)
|
||||
var/list/marking_colours = params2list(character.m_colours)
|
||||
var/head_marks = marking_styles_list.Find(marking_styles["head"])
|
||||
var/body_marks = marking_styles_list.Find(marking_styles["body"])
|
||||
var/tail_marks = marking_styles_list.Find(marking_styles["tail"])
|
||||
|
||||
SetUIValueRange(DNA_UI_HAIR_R, H.r_hair, 255, 1)
|
||||
SetUIValueRange(DNA_UI_HAIR_G, H.g_hair, 255, 1)
|
||||
@@ -178,9 +193,17 @@ var/global/list/bad_blocks[0]
|
||||
SetUIValueRange(DNA_UI_HACC_G, H.g_headacc, 255, 1)
|
||||
SetUIValueRange(DNA_UI_HACC_B, H.b_headacc, 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, hex2num(copytext(marking_colours["head"], 2, 4)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_G, hex2num(copytext(marking_colours["head"], 4, 6)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_HEAD_MARK_B, hex2num(copytext(marking_colours["head"], 6, 8)), 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_R, hex2num(copytext(marking_colours["body"], 2, 4)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_G, hex2num(copytext(marking_colours["body"], 4, 6)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_BODY_MARK_B, hex2num(copytext(marking_colours["body"], 6, 8)), 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_R, hex2num(copytext(marking_colours["tail"], 2, 4)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_G, hex2num(copytext(marking_colours["tail"], 4, 6)), 255, 1)
|
||||
SetUIValueRange(DNA_UI_TAIL_MARK_B, hex2num(copytext(marking_colours["tail"], 6, 8)), 255, 1)
|
||||
|
||||
SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
|
||||
|
||||
@@ -190,7 +213,9 @@ var/global/list/bad_blocks[0]
|
||||
SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len, 1)
|
||||
/*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/
|
||||
SetUIValueRange(DNA_UI_HACC_STYLE, headacc, head_accessory_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()
|
||||
|
||||
@@ -152,10 +152,10 @@
|
||||
head_organ.g_headacc = dna.GetUIValueRange(DNA_UI_HACC_G, 255)
|
||||
head_organ.b_headacc = dna.GetUIValueRange(DNA_UI_HACC_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)
|
||||
|
||||
var/list/marking_colours = params2list(H.m_colours)
|
||||
marking_colours["head"] = "#[num2hex(dna.GetUIValueRange(DNA_UI_HEAD_MARK_R,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_HEAD_MARK_G,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_HEAD_MARK_B,255),2)]"
|
||||
marking_colours["body"] = "#[num2hex(dna.GetUIValueRange(DNA_UI_BODY_MARK_R,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_BODY_MARK_G,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_BODY_MARK_B,255),2)]"
|
||||
marking_colours["tail"] = "#[num2hex(dna.GetUIValueRange(DNA_UI_TAIL_MARK_R,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_TAIL_MARK_G,255),2)][num2hex(dna.GetUIValueRange(DNA_UI_TAIL_MARK_B,255),2)]"
|
||||
|
||||
H.update_eyes()
|
||||
|
||||
@@ -181,16 +181,43 @@
|
||||
if((0 < headacc) && (headacc <= head_accessory_styles_list.len))
|
||||
head_organ.ha_style = head_accessory_styles_list[headacc]
|
||||
|
||||
//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((0 < head_marks) && (head_marks <= number_head_marks))
|
||||
var/list/marking_styles = params2list(H.m_styles)
|
||||
marking_styles["head"] = marking_styles_list[head_marks]
|
||||
H.m_styles = list2params(marking_styles)
|
||||
//Body Markings
|
||||
var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE,marking_styles_list.len)
|
||||
if((0 < body_marks) && (body_marks <= number_body_marks))
|
||||
var/list/marking_styles = params2list(H.m_styles)
|
||||
marking_styles["body"] = marking_styles_list[body_marks]
|
||||
H.m_styles = list2params(marking_styles)
|
||||
//Tail Markings
|
||||
var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE,marking_styles_list.len)
|
||||
if((0 < tail_marks) && (tail_marks <= number_tail_marks))
|
||||
var/list/marking_styles = params2list(H.m_styles)
|
||||
marking_styles["tail"] = marking_styles_list[tail_marks]
|
||||
H.m_styles = list2params(marking_styles)
|
||||
|
||||
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
|
||||
|
||||
@@ -46,63 +46,58 @@
|
||||
|
||||
var/new_eyes = input("Please select eye color.", "Character Generation", rgb(M.r_eyes,M.g_eyes,M.b_eyes)) as null|color
|
||||
if(new_eyes)
|
||||
M.r_eyes = hex2num(copytext(new_eyes, 2, 4))
|
||||
M.g_eyes = hex2num(copytext(new_eyes, 4, 6))
|
||||
M.b_eyes = hex2num(copytext(new_eyes, 6, 8))
|
||||
M.change_eye_color(M.r_eyes, M.g_eyes, M.b_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()
|
||||
var/new_style = input("Please select hair style", "Character Generation", head_organ.h_style) as null|anything in valid_hairstyles
|
||||
|
||||
// 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(hex2num(copytext(new_hair, 2, 4)), hex2num(copytext(new_hair, 4, 6)), hex2num(copytext(new_hair, 6, 8)))
|
||||
|
||||
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
|
||||
M.change_hair_color(hex2num(copytext(new_hair, 2, 4)), hex2num(copytext(new_hair, 4, 6)), hex2num(copytext(new_hair, 6, 8)), 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(hex2num(copytext(new_facial, 2, 4)), hex2num(copytext(new_facial, 4, 6)), hex2num(copytext(new_facial, 6, 8)))
|
||||
|
||||
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
|
||||
M.change_facial_hair_color(hex2num(copytext(new_facial, 2, 4)), hex2num(copytext(new_facial, 4, 6)), hex2num(copytext(new_facial, 6, 8)), 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(hex2num(copytext(new_head_accessory_colour, 2, 4)), hex2num(copytext(new_head_accessory_colour, 4, 6)), hex2num(copytext(new_head_accessory_colour, 6, 8)))
|
||||
|
||||
//Body accessory.
|
||||
if(M.species.tail && M.species.bodyflags & HAS_TAIL)
|
||||
@@ -110,18 +105,60 @@
|
||||
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/marking_styles = params2list(M.m_styles)
|
||||
var/list/valid_head_markings = M.generate_valid_markings("head")
|
||||
var/new_marking = input("Please select head marking style", "Character Generation", marking_styles["head"]) as null|anything in valid_head_markings
|
||||
if(new_marking)
|
||||
M.change_markings(new_marking, "head")
|
||||
|
||||
var/list/marking_colours = params2list(M.m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
var/new_marking_colour = input("Please select head marking colour.", "Character Generation", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) 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/marking_styles = params2list(M.m_styles)
|
||||
var/list/valid_body_markings = M.generate_valid_markings("body")
|
||||
var/new_marking = input("Please select body marking style", "Character Generation", marking_styles["body"]) as null|anything in valid_body_markings
|
||||
if(new_marking)
|
||||
M.change_markings(new_marking, "body")
|
||||
|
||||
var/list/marking_colours = params2list(M.m_colours)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
var/new_marking_colour = input("Please select body marking colour.", "Character Generation", rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))) 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/marking_styles = params2list(M.m_styles)
|
||||
var/list/valid_tail_markings = M.generate_valid_markings("tail")
|
||||
var/new_marking = input("Please select tail marking style", "Character Generation", marking_styles["tail"]) as null|anything in valid_tail_markings
|
||||
if(new_marking)
|
||||
M.change_markings(new_marking, "tail")
|
||||
|
||||
var/list/marking_colours = params2list(M.m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"])
|
||||
var/new_marking_colour = input("Please select tail marking colour.", "Character Generation", rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))) 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 += ", "
|
||||
@@ -130,18 +167,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(hex2num(copytext(new_body_colour, 2, 4)), hex2num(copytext(new_body_colour, 4, 6)), hex2num(copytext(new_body_colour, 6, 8)))
|
||||
|
||||
M.force_update_limbs()
|
||||
M.regenerate_icons()
|
||||
M.update_dna()
|
||||
|
||||
M.visible_message("<span class='notice'>[src] morphs and changes [M.get_visible_gender() == MALE ? "his" : M.get_visible_gender() == FEMALE ? "her" : "their"] appearance!</span>", "<span class='notice'>You change your appearance!</span>", "<span class='warning'>Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!</span>")
|
||||
|
||||
@@ -110,18 +110,26 @@ 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/m_styles = "head=None;\
|
||||
body=None;\
|
||||
tail=None" //Marking styles.
|
||||
var/m_colours = "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
|
||||
@@ -129,6 +137,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
|
||||
|
||||
@@ -286,18 +295,44 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a> "
|
||||
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Color</a> [color_square(r_headacc, g_headacc, b_headacc)]<br>"
|
||||
|
||||
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.
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
dat += "<b>Head Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_head;task=input'>[marking_styles["head"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_head_colour;task=input'>Color</a> [color_square(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))]<br>"
|
||||
if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox")) //Species with body markings/tattoos.
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
dat += "<b>Body Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Color</a> [color_square(r_markings, g_markings, b_markings)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_body;task=input'>[marking_styles["body"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_body_colour;task=input'>Color</a> [color_square(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))]<br>"
|
||||
if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"])
|
||||
dat += "<b>Tail Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_tail;task=input'>[marking_styles["tail"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_tail_colour;task=input'>Color</a> [color_square(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))]<br>"
|
||||
|
||||
dat += "<b>Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(r_hair, g_hair, b_hair)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(r_hair, g_hair, b_hair)]"
|
||||
var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style]
|
||||
if(temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour)
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_hair;task=input'>Color #2</a> [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>Facial Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [color_square(r_facial, g_facial, b_facial)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [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.secondary_theme && !temp_facial_hair_style.no_sec_colour)
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_facial;task=input'>Color #2</a> [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]"
|
||||
dat += "<br>"
|
||||
|
||||
|
||||
if(species != "Machine")
|
||||
dat += "<b>Eyes:</b> "
|
||||
@@ -320,6 +355,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<a href=\"byond://?src=\ref[user];preference=records;record=1\">Character Records</a><br>"
|
||||
|
||||
dat += "<h2>Limbs</h2>"
|
||||
if(species in list("Unathi")) //Species with alt heads.
|
||||
dat += "<b>Alternate Head:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=alt_head;task=input'>[alt_head]</a><br>"
|
||||
dat += "<b>Limbs and Parts:</b> <a href='?_src_=prefs;preference=limbs;task=input'>Adjust</a><br>"
|
||||
if(species != "Slime People" && species != "Machine")
|
||||
dat += "<b>Internal Organs:</b> <a href='?_src_=prefs;preference=organs;task=input'>Adjust</a><br>"
|
||||
@@ -1161,7 +1199,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
|
||||
@@ -1231,9 +1268,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
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))
|
||||
r_hair = 0
|
||||
g_hair = 0
|
||||
b_hair = 0
|
||||
r_hair_sec = 0
|
||||
g_hair_sec = 0
|
||||
b_hair_sec = 0
|
||||
r_facial = 0
|
||||
g_facial = 0
|
||||
b_facial = 0
|
||||
r_facial_sec = 0
|
||||
g_facial_sec = 0
|
||||
b_facial_sec = 0
|
||||
|
||||
s_tone = 0
|
||||
|
||||
@@ -1243,7 +1289,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
b_skin = 0
|
||||
|
||||
ha_style = "None" // No Vulp ears on Unathi
|
||||
m_style = "None" // No Unathi markings on Tajara
|
||||
m_styles = "head=None;\
|
||||
body=None;\
|
||||
tail=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
|
||||
|
||||
@@ -1294,6 +1344,16 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
g_hair = hex2num(copytext(new_hair, 4, 6))
|
||||
b_hair = hex2num(copytext(new_hair, 6, 8))
|
||||
|
||||
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 = hex2num(copytext(new_hair, 2, 4))
|
||||
g_hair_sec = hex2num(copytext(new_hair, 4, 6))
|
||||
b_hair_sec = hex2num(copytext(new_hair, 6, 8))
|
||||
|
||||
if("h_style")
|
||||
var/list/valid_hairstyles = list()
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
@@ -1351,22 +1411,46 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
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("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
|
||||
|
||||
if("m_style")
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
|
||||
valid_alt_heads[alternate_head] = alt_heads_list[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
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
if(marking_styles["head"])
|
||||
var/head_marking = marking_styles["head"]
|
||||
var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
|
||||
if(!head_marking_style.heads_allowed || !(alt_head in head_marking_style.heads_allowed))
|
||||
marking_styles["head"] = "None"
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
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/M = marking_styles_list[markingstyle]
|
||||
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(!(alt_head in M.heads_allowed))
|
||||
continue
|
||||
else
|
||||
if(M.heads_allowed)
|
||||
continue
|
||||
|
||||
if(species == "Machine") //Species that can use prosthetic heads.
|
||||
var/obj/item/organ/external/head/H = new()
|
||||
@@ -1383,9 +1467,86 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
valid_markings[markingstyle] = marking_styles_list[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/list/marking_styles = params2list(m_styles)
|
||||
var/new_marking_style = input(user, "Choose the style of your character's head markings:", "Character Preference", marking_styles["head"]) as null|anything in valid_markings
|
||||
if(new_marking_style)
|
||||
m_style = new_marking_style
|
||||
marking_styles["head"] = new_marking_style
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
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/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) as color|null
|
||||
if(new_markings)
|
||||
marking_colours["head"] = new_markings
|
||||
m_colours = list2params(marking_colours)
|
||||
|
||||
if("m_style_body")
|
||||
if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox")) //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] = marking_styles_list[markingstyle]
|
||||
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference", marking_styles["body"]) as null|anything in valid_markings
|
||||
if(new_marking_style)
|
||||
marking_styles["body"] = new_marking_style
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
if("m_body_colour")
|
||||
if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox")) //Species with body markings/tattoos.
|
||||
var/input = "Choose the colour of your your character's body markings:"
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))) as color|null
|
||||
if(new_markings)
|
||||
marking_colours["body"] = new_markings
|
||||
m_colours = list2params(marking_colours)
|
||||
|
||||
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] = marking_styles_list[markingstyle]
|
||||
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/new_marking_style = input(user, "Choose the style of your character's tail markings:", "Character Preference", marking_styles["tail"]) as null|anything in valid_markings
|
||||
|
||||
if(new_marking_style)
|
||||
marking_styles["tail"] = new_marking_style
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
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/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"])
|
||||
var/new_markings = input(user, input, "Character Preference", rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))) as color|null
|
||||
if(new_markings)
|
||||
marking_colours["tail"] = new_markings
|
||||
m_colours = list2params(marking_colours)
|
||||
|
||||
if("body_accessory")
|
||||
var/list/possible_body_accessories = list()
|
||||
@@ -1402,6 +1563,9 @@ 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)
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
marking_styles["tail"] = "None"
|
||||
m_styles = list2params(marking_styles)
|
||||
body_accessory = (new_body_accessory == "None") ? null : new_body_accessory
|
||||
|
||||
if("facial")
|
||||
@@ -1412,6 +1576,16 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
g_facial = hex2num(copytext(new_facial, 4, 6))
|
||||
b_facial = hex2num(copytext(new_facial, 6, 8))
|
||||
|
||||
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 = hex2num(copytext(new_facial, 2, 4))
|
||||
g_facial_sec = hex2num(copytext(new_facial, 4, 6))
|
||||
b_facial_sec = hex2num(copytext(new_facial, 6, 8))
|
||||
|
||||
if("f_style")
|
||||
var/list/valid_facialhairstyles = list()
|
||||
for(var/facialhairstyle in facial_hair_styles_list)
|
||||
@@ -1593,11 +1767,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
|
||||
if(!new_state) return
|
||||
|
||||
var/list/marking_styles = params2list(m_styles) //Handle resetting of head markings if the head is changed.
|
||||
switch(new_state)
|
||||
if("Normal")
|
||||
if(limb == "head")
|
||||
m_style = "None"
|
||||
h_style = random_hair_style(gender, species)
|
||||
marking_styles["head"] = "None"
|
||||
h_style = hair_styles_list["Bald"]
|
||||
f_style = facial_hair_styles_list["Shaved"]
|
||||
organ_data[limb] = null
|
||||
rlimb_data[limb] = null
|
||||
@@ -1642,11 +1817,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"]
|
||||
marking_styles["head"] = "None"
|
||||
rlimb_data[limb] = choice
|
||||
organ_data[limb] = "cyborg"
|
||||
if(second_limb)
|
||||
@@ -1657,7 +1836,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
else
|
||||
rlimb_data[second_limb] = choice
|
||||
organ_data[second_limb] = "cyborg"
|
||||
|
||||
m_styles = list2params(marking_styles) //Pass the reset head markings back to the preference variable.
|
||||
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
|
||||
@@ -1862,12 +2041,22 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
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
|
||||
@@ -1956,11 +2145,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
H.g_headacc = g_headacc
|
||||
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
|
||||
if((character.species.bodyflags & HAS_HEAD_MARKINGS) || (character.species.bodyflags & HAS_BODY_MARKINGS) || (character.species.bodyflags & HAS_TAIL_MARKINGS))
|
||||
character.m_colours = m_colours
|
||||
character.m_styles = m_styles
|
||||
|
||||
if(body_accessory)
|
||||
character.body_accessory = body_accessory_by_name["[body_accessory]"]
|
||||
|
||||
@@ -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,63 +186,68 @@
|
||||
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 = 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 = 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]
|
||||
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])
|
||||
flavor_text = query.item[53]
|
||||
med_record = query.item[54]
|
||||
sec_record = query.item[55]
|
||||
gen_record = query.item[56]
|
||||
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))
|
||||
@@ -253,23 +263,26 @@
|
||||
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))
|
||||
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))
|
||||
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))
|
||||
@@ -300,6 +313,8 @@
|
||||
if(!player_alt_titles) player_alt_titles = new()
|
||||
if(!organ_data) src.organ_data = list()
|
||||
if(!rlimb_data) src.rlimb_data = list()
|
||||
if(!m_colours) m_colours = initial(m_colours)
|
||||
if(!m_styles) m_styles = initial(m_styles)
|
||||
if(!gear) gear = list()
|
||||
|
||||
return 1
|
||||
@@ -332,23 +347,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='[m_colours]',
|
||||
head_accessory_red='[r_headacc]',
|
||||
head_accessory_green='[g_headacc]',
|
||||
head_accessory_blue='[b_headacc]',
|
||||
hair_style_name='[sql_sanitize_text(h_style)]',
|
||||
facial_style_name='[sql_sanitize_text(f_style)]',
|
||||
marking_style_name='[sql_sanitize_text(m_style)]',
|
||||
marking_styles='[m_styles]',
|
||||
head_accessory_style_name='[sql_sanitize_text(ha_style)]',
|
||||
alt_head_name='[sql_sanitize_text(alt_head)]',
|
||||
eyes_red='[r_eyes]',
|
||||
eyes_green='[g_eyes]',
|
||||
eyes_blue='[b_eyes]',
|
||||
@@ -397,11 +417,13 @@
|
||||
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, head_accessory_style_name,
|
||||
hair_style_name, facial_style_name, marking_styles, head_accessory_style_name, alt_head_name,
|
||||
eyes_red, eyes_green, eyes_blue,
|
||||
underwear, undershirt,
|
||||
backbag, b_type, alternate_option,
|
||||
@@ -418,11 +440,13 @@
|
||||
('[C.ckey]', '[default_slot]', '[sql_sanitize_text(metadata)]', '[sql_sanitize_text(real_name)]', '[be_random_name]','[gender]',
|
||||
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(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]',
|
||||
'[m_colours]',
|
||||
'[r_headacc]', '[g_headacc]', '[b_headacc]',
|
||||
'[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(ha_style)]',
|
||||
'[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[m_styles]', '[sql_sanitize_text(ha_style)]', '[sql_sanitize_text(alt_head)]',
|
||||
'[r_eyes]', '[g_eyes]', '[b_eyes]',
|
||||
'[underwear]', '[undershirt]',
|
||||
'[backbag]', '[b_type]', '[alternate_option]',
|
||||
|
||||
@@ -47,7 +47,8 @@
|
||||
to_chat(user, "<span class= 'notice'>[target] has no skin, how do you expect to tattoo them?</span>")
|
||||
return
|
||||
|
||||
if(target.m_style != "None")
|
||||
var/list/marking_styles = params2list(target.m_styles)
|
||||
if(marking_styles["body"] != "None")
|
||||
to_chat(user, "<span class= 'notice'>[target] already has body markings, any more would look silly!</span>")
|
||||
return
|
||||
|
||||
@@ -61,10 +62,12 @@
|
||||
user.visible_message("<span class='notice'>[user] finishes the [tattoo_name] on [target].</span>", "<span class='notice'>You finish the [tattoo_name].</span>")
|
||||
|
||||
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
|
||||
var/list/marking_colours = params2list(target.m_colours)
|
||||
marking_styles["body"] = tattoo_icon
|
||||
marking_colours["body"] = "#[num2hex(tattoo_r,2)][num2hex(tattoo_g,2)][num2hex(tattoo_b,2)]"
|
||||
|
||||
target.m_styles = list2params(marking_styles)
|
||||
target.m_colours = list2params(marking_colours)
|
||||
|
||||
target.update_markings()
|
||||
|
||||
|
||||
@@ -4,13 +4,7 @@
|
||||
AC.ui_interact(user, state = state)
|
||||
|
||||
/mob/living/carbon/human/proc/change_species(var/new_species)
|
||||
if(!new_species)
|
||||
return
|
||||
|
||||
if(species == new_species)
|
||||
return
|
||||
|
||||
if(!(new_species in all_species))
|
||||
if(!new_species || species == new_species || !(new_species in all_species))
|
||||
return
|
||||
|
||||
set_species(new_species)
|
||||
@@ -40,13 +34,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_style == hair_style || !(hair_style in hair_styles_list))
|
||||
return
|
||||
|
||||
H.h_style = hair_style
|
||||
@@ -56,13 +44,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.f_style == facial_hair_style || !(facial_hair_style in facial_hair_styles_list))
|
||||
return
|
||||
|
||||
H.f_style = facial_hair_style
|
||||
@@ -72,13 +54,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.ha_style == head_accessory_style || !(head_accessory_style in head_accessory_styles_list))
|
||||
return
|
||||
|
||||
H.ha_style = head_accessory_style
|
||||
@@ -86,30 +62,51 @@
|
||||
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")
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
if(!marking_style || marking_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.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 || !(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 )
|
||||
return
|
||||
|
||||
src.m_style = marking_style
|
||||
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
|
||||
|
||||
update_markings()
|
||||
marking_styles[location] = marking_style
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
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 || (src.body_accessory && src.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]
|
||||
@@ -118,17 +115,39 @@
|
||||
if(!found)
|
||||
return
|
||||
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
marking_styles["tail"] = "None"
|
||||
m_styles = list2params(marking_styles)
|
||||
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.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.
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
if(marking_styles["head"])
|
||||
var/head_marking = marking_styles["head"]
|
||||
var/datum/sprite_accessory/body_markings/head/head_marking_style = marking_styles_list[head_marking]
|
||||
if(!head_marking_style.heads_allowed || !(H.alt_head in head_marking_style.heads_allowed))
|
||||
marking_styles["head"] = "None"
|
||||
m_styles = list2params(marking_styles)
|
||||
update_markings()
|
||||
|
||||
update_body(1, 1) //Update the body and force limb icon regeneration to update the head with the new icon.
|
||||
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()
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
if(marking_styles["head"] && marking_styles["head"] != "None") //Resets head markings.
|
||||
reset_markings()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_head_hair()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
@@ -151,14 +170,30 @@
|
||||
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
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
|
||||
if(location)
|
||||
valid_markings = generate_valid_markings(location)
|
||||
if(valid_markings.len)
|
||||
marking_styles[location] = pick(valid_markings)
|
||||
else
|
||||
//this shouldn't happen
|
||||
marking_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)
|
||||
marking_styles[m_location] = pick(valid_markings)
|
||||
else
|
||||
//this shouldn't happen
|
||||
marking_styles[m_location] = "None"
|
||||
|
||||
m_styles = list2params(marking_styles)
|
||||
|
||||
update_markings()
|
||||
stop_tail_wagging()
|
||||
|
||||
/mob/living/carbon/human/proc/reset_head_accessory()
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
@@ -182,26 +217,42 @@
|
||||
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)
|
||||
return
|
||||
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
|
||||
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)
|
||||
return
|
||||
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
|
||||
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
|
||||
@@ -218,15 +269,19 @@
|
||||
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")
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours[location] = sanitize_hexcolor(marking_colours[location])
|
||||
if(colour == marking_colours[location])
|
||||
return
|
||||
|
||||
r_markings = red
|
||||
g_markings = green
|
||||
b_markings = blue
|
||||
marking_colours[location] = colour
|
||||
m_colours = list2params(marking_colours)
|
||||
|
||||
update_markings()
|
||||
if(location == "tail")
|
||||
update_tail_layer()
|
||||
else
|
||||
update_markings()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -262,11 +317,7 @@
|
||||
var/datum/species/current_species = all_species[current_species_name]
|
||||
|
||||
if(check_whitelist && config.usealienwhitelist && !check_rights(R_ADMIN, 0, src)) //If we're using the whitelist, make sure to check it!
|
||||
if(whitelist.len && !(current_species_name in whitelist))
|
||||
continue
|
||||
if(blacklist.len && (current_species_name in blacklist))
|
||||
continue
|
||||
if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name))
|
||||
if((whitelist.len && !(current_species_name in whitelist)) || (blacklist.len && (current_species_name in blacklist)) || ((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name)))
|
||||
continue
|
||||
|
||||
valid_species += current_species_name
|
||||
@@ -279,9 +330,7 @@
|
||||
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)
|
||||
if((gender == MALE && S.gender == FEMALE) || (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]
|
||||
@@ -313,9 +362,7 @@
|
||||
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)
|
||||
if((gender == MALE && S.gender == FEMALE) || (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]
|
||||
@@ -354,18 +401,37 @@
|
||||
|
||||
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]
|
||||
|
||||
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.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.
|
||||
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(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(!(H.alt_head in M.heads_allowed))
|
||||
continue
|
||||
else
|
||||
if(M.heads_allowed)
|
||||
continue
|
||||
valid_markings += marking
|
||||
|
||||
return valid_markings
|
||||
@@ -385,3 +451,15 @@
|
||||
valid_body_accessories += B
|
||||
|
||||
return valid_body_accessories
|
||||
|
||||
/mob/living/carbon/human/proc/generate_valid_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, 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(!(species.name in head.species_allowed))
|
||||
continue
|
||||
|
||||
valid_alt_heads[alternate_head] = alt_heads_list[alternate_head]
|
||||
|
||||
return valid_alt_heads
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -1587,6 +1587,12 @@
|
||||
H.g_headacc = 0
|
||||
H.b_headacc = 0
|
||||
|
||||
m_styles = initial(m_styles) //Wipes out markings, setting them all to "None".
|
||||
m_colours = initial(m_styles) //Defaults colour to #00000 for all markings.
|
||||
H.alt_head = "None"
|
||||
H.ha_style = "None"
|
||||
body_accessory = null
|
||||
|
||||
if(!dna)
|
||||
dna = new /datum/dna(null)
|
||||
dna.species = species.name
|
||||
@@ -1687,14 +1693,15 @@
|
||||
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/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
var/optic_colour = input(src, "Select optic colour", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) as color|null
|
||||
if(incapacitated())
|
||||
to_chat(src, "<span class='warning'>You were interrupted while changing the colour of your optics.</span>")
|
||||
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))
|
||||
marking_colours["head"] = optic_colour
|
||||
m_colours = list2params(marking_colours)
|
||||
|
||||
update_markings()
|
||||
else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
|
||||
|
||||
@@ -4,10 +4,12 @@ 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/m_colours = "head=#000000;\
|
||||
body=#000000;\
|
||||
tail=#000000"
|
||||
var/m_styles = "head=None;\
|
||||
body=None;\
|
||||
tail=None"
|
||||
|
||||
//Eye colour
|
||||
var/r_eyes = 0
|
||||
|
||||
@@ -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_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_TAIL_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"
|
||||
@@ -704,6 +702,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"
|
||||
@@ -852,7 +851,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"
|
||||
|
||||
@@ -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,38 @@ 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")
|
||||
|
||||
//Prep marking styles and colours.
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
|
||||
//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) && marking_styles["body"])
|
||||
var/body_marking = marking_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)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
b_marking_s.Blend(rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8))), 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) && marking_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
|
||||
var/head_marking = marking_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)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
h_marking_s.Blend(rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8))), ICON_ADD)
|
||||
markings_standing.Blend(h_marking_s, ICON_OVERLAY)
|
||||
|
||||
overlays_standing[MARKINGS_LAYER] = image(markings_standing)
|
||||
|
||||
@@ -426,15 +435,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 +463,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 +483,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 +507,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 +558,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 +584,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)
|
||||
@@ -1053,7 +1075,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 +1143,69 @@ 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/list/marking_styles = params2list(m_styles)
|
||||
var/icon/tail_marking_icon
|
||||
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
|
||||
if(marking_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
|
||||
var/tail_marking = marking_styles["tail"]
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["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(rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8))), 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 +1213,70 @@ 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/list/marking_styles = params2list(m_styles)
|
||||
var/icon/tail_marking_icon
|
||||
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
|
||||
if(marking_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
|
||||
var/tail_marking = marking_styles["tail"]
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["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(rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8))), 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 +1302,15 @@ 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)
|
||||
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)
|
||||
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]")
|
||||
|
||||
@@ -221,26 +221,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
|
||||
@@ -265,13 +251,60 @@
|
||||
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/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
var/tail_marking = marking_styles["tail"]
|
||||
var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
|
||||
if(tail_marking_style && tail_marking_style.species_allowed)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"])
|
||||
var/icon/t_marking_s = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
|
||||
t_marking_s.Blend(rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8))), 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)))
|
||||
var/list/marking_styles = params2list(m_styles)
|
||||
var/list/marking_colours = params2list(m_colours)
|
||||
if(current_species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
|
||||
var/body_marking = marking_styles["body"]
|
||||
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
|
||||
if(body_marking_style && body_marking_style.species_allowed)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
|
||||
b_marking_s.Blend(rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8))), ICON_ADD)
|
||||
preview_icon.Blend(b_marking_s, ICON_OVERLAY)
|
||||
if(current_species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
|
||||
var/head_marking = marking_styles["head"]
|
||||
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
|
||||
if(head_marking_style && head_marking_style.species_allowed)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
|
||||
h_marking_s.Blend(rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8))), 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")
|
||||
@@ -288,6 +321,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
|
||||
@@ -305,6 +345,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
|
||||
|
||||
@@ -43,8 +43,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
|
||||
@@ -65,7 +69,7 @@
|
||||
name = "Bald"
|
||||
icon_state = "bald"
|
||||
gender = MALE
|
||||
species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton")
|
||||
species_allowed = list("Human", "Unathi", "Vox", "Diona", "Kidan", "Grey", "Plasmaman", "Skeleton", "Vulpkanin", "Tajaran")
|
||||
|
||||
short
|
||||
name = "Short Hair" // try to capatilize the names please~
|
||||
@@ -200,6 +204,19 @@
|
||||
icon_state = "hair_hbraid"
|
||||
gender = FEMALE
|
||||
|
||||
braid_hip
|
||||
name = "Hippie Braid"
|
||||
icon_state = "hair_hipbraid"
|
||||
species_allowed = list("Human")
|
||||
secondary_theme = "beads"
|
||||
|
||||
|
||||
braid_hip_una
|
||||
name = "Unathi Hippie Braid"
|
||||
icon_state = "hair_ubraid"
|
||||
species_allowed = list("Unathi")
|
||||
secondary_theme = "beads"
|
||||
|
||||
buzz
|
||||
name = "Buzzcut"
|
||||
icon_state = "hair_buzzcut"
|
||||
@@ -241,9 +258,9 @@
|
||||
icon_state = "hair_bigafro"
|
||||
gender = MALE
|
||||
|
||||
sargeant
|
||||
sergeant
|
||||
name = "Flat Top"
|
||||
icon_state = "hair_sargeant"
|
||||
icon_state = "hair_sergeant"
|
||||
gender = MALE
|
||||
|
||||
emo
|
||||
@@ -298,7 +315,7 @@
|
||||
icon_state = "hair_spikey"
|
||||
species_allowed = list("Human", "Unathi")
|
||||
|
||||
kusangi
|
||||
kusanagi
|
||||
name = "Kusanagi Hair"
|
||||
icon_state = "hair_kusanagi"
|
||||
|
||||
@@ -689,95 +706,117 @@
|
||||
|
||||
skr_gold_m
|
||||
name = "Gold plated Skrell Male Tentacles"
|
||||
icon_state = "skrell_goldhair_m"
|
||||
icon_state = "skrell_hair_m"
|
||||
species_allowed = list("Skrell")
|
||||
gender = MALE
|
||||
secondary_theme = "gold"
|
||||
no_sec_colour = 1
|
||||
|
||||
skr_gold_f
|
||||
name = "Gold chained Skrell Female Tentacles"
|
||||
icon_state = "skrell_goldhair_f"
|
||||
icon_state = "skrell_hair_f"
|
||||
species_allowed = list("Skrell")
|
||||
gender = FEMALE
|
||||
secondary_theme = "gold"
|
||||
no_sec_colour = 1
|
||||
|
||||
|
||||
skr_clothtentacle_m
|
||||
name = "Cloth draped Skrell Male Tentacles"
|
||||
icon_state = "skrell_clothhair_m"
|
||||
icon_state = "skrell_hair_m"
|
||||
species_allowed = list("Skrell")
|
||||
gender = MALE
|
||||
secondary_theme = "cloth"
|
||||
|
||||
skr_clothtentacle_f
|
||||
name = "Cloth draped Skrell Female Tentacles"
|
||||
icon_state = "skrell_clothhair_f"
|
||||
icon_state = "skrell_hair_f"
|
||||
species_allowed = list("Skrell")
|
||||
gender = FEMALE
|
||||
secondary_theme = "cloth"
|
||||
|
||||
taj_ears
|
||||
name = "Tajaran Ears"
|
||||
icon_state = "ears_plain"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_clean
|
||||
taj_hair_clean
|
||||
name = "Tajara Clean"
|
||||
icon_state = "hair_clean"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_bangs
|
||||
taj_hair_bangs
|
||||
name = "Tajara Bangs"
|
||||
icon_state = "hair_bangs"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_braid
|
||||
taj_hair_braid
|
||||
name = "Tajara Braid"
|
||||
icon_state = "hair_tbraid"
|
||||
species_allowed = list("Tajaran")
|
||||
secondary_theme = "beads"
|
||||
|
||||
taj_ears_shaggy
|
||||
taj_hair_shaggy
|
||||
name = "Tajara Shaggy"
|
||||
icon_state = "hair_shaggy"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_mohawk
|
||||
taj_hair_mohawk
|
||||
name = "Tajaran Mohawk"
|
||||
icon_state = "hair_mohawk"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_plait
|
||||
taj_hair_plait
|
||||
name = "Tajara Plait"
|
||||
icon_state = "hair_plait"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_straight
|
||||
taj_hair_straight
|
||||
name = "Tajara Straight"
|
||||
icon_state = "hair_straight"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_long
|
||||
taj_hair_long
|
||||
name = "Tajara Long"
|
||||
icon_state = "hair_long"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_rattail
|
||||
taj_hair_rattail
|
||||
name = "Tajara Rat Tail"
|
||||
icon_state = "hair_rattail"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_spiky
|
||||
name = "Tajara Spiky"
|
||||
icon_state = "hair_tajspiky"
|
||||
taj_hair_spiky
|
||||
name = "Tajara Spikey"
|
||||
icon_state = "hair_tajspikey"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_ears_messy
|
||||
taj_hair_messy
|
||||
name = "Tajara Messy"
|
||||
icon_state = "hair_messy"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_hair_curls
|
||||
name = "Tajara Curly"
|
||||
icon_state = "hair_curly"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_hair_wife
|
||||
name = "Tajaran Ladies' Retro"
|
||||
icon_state = "hair_ladies_retro"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_hair_victory
|
||||
name = "Tajara Victory Curls"
|
||||
icon_state = "hair_victory"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_hair_bob
|
||||
name = "Tajara Bob"
|
||||
icon_state = "hair_tbob"
|
||||
species_allowed = list("Tajaran")
|
||||
|
||||
taj_hair_fingercurl
|
||||
name = "Tajara Finger Curls"
|
||||
icon_state = "hair_fingerwave"
|
||||
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"
|
||||
@@ -812,6 +851,7 @@
|
||||
name = "Belle"
|
||||
icon_state = "belle"
|
||||
species_allowed = list("Vulpkanin")
|
||||
secondary_theme = "bands"
|
||||
|
||||
vulp_hair_bun
|
||||
name = "Bun"
|
||||
@@ -848,6 +888,12 @@
|
||||
icon_state = "spike"
|
||||
species_allowed = list("Vulpkanin")
|
||||
|
||||
vulp_hair_braided
|
||||
name = "Braided"
|
||||
icon_state = "braided"
|
||||
species_allowed = list("Vulpkanin")
|
||||
secondary_theme = "beads"
|
||||
|
||||
//Vox
|
||||
|
||||
vox_quills_short
|
||||
@@ -1081,6 +1127,12 @@
|
||||
species_allowed = list("Unathi")
|
||||
gender = NEUTER
|
||||
|
||||
una_frills_aquatic
|
||||
name = "Aquatic Frills"
|
||||
icon_state = "soghun_aquaticfrills"
|
||||
species_allowed = list("Unathi")
|
||||
gender = NEUTER
|
||||
|
||||
una_frills_long
|
||||
name = "Long Frills"
|
||||
icon_state = "soghun_longfrills"
|
||||
@@ -1093,22 +1145,25 @@
|
||||
species_allowed = list("Unathi")
|
||||
gender = NEUTER
|
||||
|
||||
una_frills_webbed_aquatic
|
||||
name = "Aquatic Webbed Frills"
|
||||
icon_state = "soghun_aquaticfrills"
|
||||
species_allowed = list("Unathi")
|
||||
secondary_theme = "webbing"
|
||||
gender = NEUTER
|
||||
|
||||
una_frills_webbed_long
|
||||
name = "Long Webbed Frills"
|
||||
icon_state = "soghun_longfrills_webbed"
|
||||
icon_state = "soghun_longfrills"
|
||||
species_allowed = list("Unathi")
|
||||
secondary_theme = "webbing"
|
||||
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"
|
||||
icon_state = "soghun_shortfrills"
|
||||
species_allowed = list("Unathi")
|
||||
secondary_theme = "webbing"
|
||||
gender = NEUTER
|
||||
|
||||
|
||||
@@ -1793,6 +1848,26 @@
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "horns_ram"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/outears_taj
|
||||
name = "Tajaran Outer Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_outears_taj"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/inears_taj
|
||||
name = "Tajaran Inner Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_inears_taj"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/muzzle_taj
|
||||
name = "Tajaran Muzzle"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_muzzle_taj"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/muzzle_and_inears_taj
|
||||
name = "Tajaran Muzzle and Inner Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_muzzle_and_inears_taj"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/vulp_earfluff
|
||||
icon = 'icons/mob/human_face.dmi'
|
||||
name = "Vulpkanin Earfluff"
|
||||
@@ -1847,6 +1922,12 @@
|
||||
icon_state = "vulp_facial_swift"
|
||||
species_allowed = list("Vulpkanin")
|
||||
|
||||
/datum/sprite_accessory/head_accessory/vulp_nose
|
||||
icon = 'icons/mob/body_accessory.dmi'
|
||||
name = "Vulpkanin Nose"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_nose_vulp"
|
||||
|
||||
/datum/sprite_accessory/head_accessory/taj_ears
|
||||
icon = 'icons/mob/human_face.dmi'
|
||||
name = "Tajaran Ears"
|
||||
@@ -1878,70 +1959,274 @@
|
||||
|
||||
/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/stripe_una
|
||||
name = "Unathi Stripe"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_tigerheadface_una"
|
||||
icon_state = "markings_stripe_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/optics
|
||||
/datum/sprite_accessory/body_markings/belly_narrow_una
|
||||
name = "Unathi Belly"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_belly_narrow_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/banded_una
|
||||
name = "Unathi Banded"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_banded_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/points_una
|
||||
name = "Unathi Points"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_points_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_flat_taj
|
||||
name = "Tajaran Belly"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_belly_flat_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_crest_taj
|
||||
name = "Tajaran Chest Crest"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_belly_crest_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_full_taj
|
||||
name = "Tajaran Belly 2"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_belly_full_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/points_taj
|
||||
name = "Tajaran Points"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_points_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/patchy_taj
|
||||
name = "Tajaran Patches"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_patch_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_fox_vulp
|
||||
name = "Vulpkanin Belly"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_belly_fox_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_full_vulp
|
||||
name = "Vulpkanin Belly 2"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_belly_full_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/belly_crest_vulp
|
||||
name = "Vulpkanin Belly Crest"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_belly_crest_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/points_fade_vulp
|
||||
name = "Vulpkanin Points"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_points_fade_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/points_fade_belly_vulp
|
||||
name = "Vulpkanin Points and Belly"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_points_fade_belly_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/points_sharp_vulp
|
||||
name = "Vulpkanin Points 2"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_points_sharp_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head
|
||||
marking_location = "head"
|
||||
species_allowed = list()
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_head_taj
|
||||
name = "Tajaran Tiger Head"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_head_tiger_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_face_taj
|
||||
name = "Tajaran Tiger Head and Face"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_tiger_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/outears_taj
|
||||
name = "Tajaran Outer Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_outears_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/inears_taj
|
||||
name = "Tajaran Inner Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_inears_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/nose_taj
|
||||
name = "Tajaran Nose"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_nose_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/muzzle_taj
|
||||
name = "Tajaran Muzzle"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_muzzle_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/muzzle_and_inears_taj
|
||||
name = "Tajaran Muzzle and Inner Ears"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_muzzle_and_inears_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/muzzle_alt_taj //Companion marking for Tajaran Belly 2.
|
||||
name = "Tajaran Muzzle 2"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_full_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/points_taj //Companion marking for Tajaran Points.
|
||||
name = "Tajaran Points Head"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_points_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/patchy_taj //Companion marking for Tajaran Patches.
|
||||
name = "Tajaran Patches Head"
|
||||
species_allowed = list("Tajaran")
|
||||
icon_state = "markings_face_patch_taj"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_head_vulp
|
||||
name = "Vulpkanin Tiger Head"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_head_tiger_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_face_vulp
|
||||
name = "Vulpkanin Tiger Head and Face"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_tiger_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/nose_default_vulp
|
||||
name = "Vulpkanin Nose"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_nose_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/muzzle_vulp //Companion marking for Vulpkanin Belly Alt..
|
||||
name = "Vulpkanin Muzzle"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_full_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/muzzle_ears_vulp //Companion marking for Vulpkanin Belly Alt..
|
||||
name = "Vulpkanin Muzzle and Ears"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_full_ears_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/points_fade_vulp //Companion marking for Vulpkanin Points Fade.
|
||||
name = "Vulpkanin Points Head"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_points_fade_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/points_sharp_vulp //Companion marking for Vulpkanin Points Sharp.
|
||||
name = "Vulpkanin Points Head 2"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_face_points_sharp_vulp"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_head_una
|
||||
name = "Unathi Tiger Head"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_head_tiger_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_face_una
|
||||
name = "Unathi Tiger Head and Face"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_tiger_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/tiger_face_una_sharp
|
||||
name = "Unathi Sharp Tiger Head and Face"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_tiger_una_sharp"
|
||||
heads_allowed = list("Unathi Sharp Snout")
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/snout_una_round
|
||||
name = "Unathi Round Snout"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_snout_una_round"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/snout_lower_una_round
|
||||
name = "Unathi Lower Round Snout"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_snout_lower_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/snout_una_sharp
|
||||
name = "Unathi Sharp Snout"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_snout_una_sharp"
|
||||
heads_allowed = list("Unathi Sharp Snout")
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/banded_una //Companion marking for Unathi Banded.
|
||||
name = "Unathi Banded Head"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_banded_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/banded_una_sharp //Companion marking for Unathi Banded.
|
||||
name = "Unathi Sharp Banded Head"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_banded_una"
|
||||
heads_allowed = list("Unathi Sharp Snout")
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/snout_narrow_una //Companion marking for Unathi Narrow Belly.
|
||||
name = "Unathi Snout 2"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_narrow_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/snout_narrow_una_sharp //Companion marking for Unathi Narrow Belly.
|
||||
name = "Unathi Sharp Snout 2"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_narrow_una_sharp"
|
||||
heads_allowed = list("Unathi Sharp Snout")
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/points_una //Companion marking for Unathi Points.
|
||||
name = "Unathi Points Head"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_points_una"
|
||||
|
||||
/datum/sprite_accessory/body_markings/head/points_una_sharp //Companion marking for Unathi Points.
|
||||
name = "Unathi Sharp Points Head"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "markings_face_points_una"
|
||||
heads_allowed = list("Unathi Sharp Snout")
|
||||
|
||||
/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"
|
||||
@@ -1954,4 +2239,115 @@
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/elliot
|
||||
name = "Elliot Circuit Tattoo"
|
||||
icon_state = "campbell_tattoo"
|
||||
icon_state = "campbell_tattoo"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/heart
|
||||
name = "Heart Tattoo"
|
||||
species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
|
||||
icon_state = "markings_tattoo_heart"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/heart_vox
|
||||
name = "Vox Heart Tattoo"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_tattoo_heart_vox"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/hive
|
||||
name = "Hive Tattoo"
|
||||
species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
|
||||
icon_state = "markings_tattoo_hive"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/hive_vox
|
||||
name = "Vox Hive Tattoo"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_tattoo_hive_vox"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/nightling
|
||||
name = "Nightling Tattoo"
|
||||
species_allowed = list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell")
|
||||
icon_state = "markings_tattoo_nightling"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tattoo/nightling_vox
|
||||
name = "Vox Nightling Tattoo"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_tattoo_nightling_vox"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail
|
||||
name = "Tail Markings"
|
||||
species_allowed = list()
|
||||
icon_state = "accessory_none"
|
||||
marking_location = "tail"
|
||||
tails_allowed = null
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vox_band
|
||||
name = "Vox Tail Band"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_voxtail_band"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vox_tip
|
||||
name = "Vox Tail Tip"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_voxtail_tip"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vox_stripe
|
||||
name = "Vox Tail Stripe"
|
||||
species_allowed = list("Vox")
|
||||
icon_state = "markings_voxtail_stripe"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_default_tip
|
||||
name = "Vulpkanin Default Tail Tip"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_vulptail_tip"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_default_fade
|
||||
name = "Vulpkanin Default Tail Fade"
|
||||
species_allowed = list("Vulpkanin")
|
||||
icon_state = "markings_vulptail_fade"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_bushy_fluff
|
||||
name = "Vulpkanin Bushy Tail Fluff"
|
||||
species_allowed = list("Vulpkanin")
|
||||
tails_allowed = list("Vulpkanin Alt 1 (Bushy)")
|
||||
icon_state = "markings_vulptail2_fluff"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_short_tip
|
||||
name = "Vulpkanin Short Tail Tip"
|
||||
species_allowed = list("Vulpkanin")
|
||||
tails_allowed = list("Vulpkanin Alt 4 (Short)")
|
||||
icon_state = "markings_vulptail5_tip"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_hybrid_tip
|
||||
name = "Vulpkanin Bushy Straight Tail Tip"
|
||||
species_allowed = list("Vulpkanin")
|
||||
tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
|
||||
icon_state = "markings_vulptail6_tip"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_hybrid_fade
|
||||
name = "Vulpkanin Bushy Straight Tail Fade"
|
||||
species_allowed = list("Vulpkanin")
|
||||
tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
|
||||
icon_state = "markings_vulptail6_fade"
|
||||
|
||||
/datum/sprite_accessory/body_markings/tail/vulp_hybrid_silverf
|
||||
name = "Vulpkanin Bushy Straight Tail Black Fade White Tip"
|
||||
species_allowed = list("Vulpkanin")
|
||||
tails_allowed = list("Vulpkanin Alt 5 (Straight Bushy)")
|
||||
icon_state = "markings_vulptail6_silverf"
|
||||
|
||||
/* ALT HEADS */
|
||||
|
||||
/datum/sprite_accessory/alt_heads
|
||||
name = "Alternate Head"
|
||||
icon = null
|
||||
icon_state = null
|
||||
species_allowed = null
|
||||
|
||||
/datum/sprite_accessory/alt_heads/none
|
||||
name = "None"
|
||||
icon = null
|
||||
icon_state = null
|
||||
species_allowed = null
|
||||
|
||||
/datum/sprite_accessory/alt_heads/una_sharp_snout
|
||||
name = "Unathi Sharp Snout"
|
||||
species_allowed = list("Unathi")
|
||||
icon_state = "head_sharp"
|
||||
|
||||
@@ -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
|
||||
@@ -46,7 +49,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]]"
|
||||
@@ -85,6 +88,16 @@
|
||||
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 = hex2num(copytext(new_hair, 2, 4))
|
||||
var/g_hair_sec = hex2num(copytext(new_hair, 4, 6))
|
||||
var/b_hair_sec = hex2num(copytext(new_hair, 6, 8))
|
||||
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"]))
|
||||
@@ -100,6 +113,16 @@
|
||||
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 = hex2num(copytext(new_facial, 2, 4))
|
||||
var/g_facial_sec = hex2num(copytext(new_facial, 4, 6))
|
||||
var/b_facial_sec = hex2num(copytext(new_facial, 6, 8))
|
||||
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/new_eyes = input("Please select eye color.", "Eye Color", rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes)) as color|null
|
||||
@@ -125,19 +148,46 @@
|
||||
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/list/marking_colours = params2list(owner.m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
var/new_markings = input("Please select head marking color.", "Marking Color", rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8)))) 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/list/marking_colours = params2list(owner.m_colours)
|
||||
marking_colours["body"] = sanitize_hexcolor(marking_colours["body"])
|
||||
var/new_markings = input("Please select body marking color.", "Marking Color", rgb(hex2num(copytext(marking_colours["body"], 2, 4)), hex2num(copytext(marking_colours["body"], 4, 6)), hex2num(copytext(marking_colours["body"], 6, 8)))) 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/list/marking_colours = params2list(owner.m_colours)
|
||||
marking_colours["tail"] = sanitize_hexcolor(marking_colours["tail"])
|
||||
var/new_markings = input("Please select tail marking color.", "Marking Color", rgb(hex2num(copytext(marking_colours["tail"], 2, 4)), hex2num(copytext(marking_colours["tail"], 4, 6)), hex2num(copytext(marking_colours["tail"], 6, 8)))) 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"])
|
||||
@@ -145,6 +195,11 @@
|
||||
if(owner.change_body_accessory(href_list["body_accessory"]))
|
||||
update_dna()
|
||||
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()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
@@ -189,13 +244,35 @@
|
||||
data["facial_hair_styles"] = facial_hair_styles
|
||||
data["facial_hair_style"] = head_organ.f_style
|
||||
|
||||
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/list/marking_styles = params2list(owner.m_styles)
|
||||
var/m_style = marking_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/list/marking_styles = params2list(owner.m_styles)
|
||||
var/m_style = marking_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/list/marking_styles = params2list(owner.m_styles)
|
||||
var/m_style = marking_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"])
|
||||
@@ -208,10 +285,22 @@
|
||||
BA = owner.body_accessory.name
|
||||
data["body_accessory_style"] = BA
|
||||
|
||||
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)
|
||||
@@ -235,19 +324,36 @@
|
||||
/datum/nano_module/appearance_changer/proc/can_change_head_accessory()
|
||||
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")
|
||||
var/obj/item/organ/external/head/H = owner.get_organ("head")
|
||||
body_flags = H.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()
|
||||
return owner && (flags & APPEARANCE_ALT_HEAD) && (owner.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()
|
||||
@@ -260,7 +366,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()
|
||||
|
||||
@@ -104,9 +104,11 @@
|
||||
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.
|
||||
var/list/marking_styles = params2list(target.m_styles)
|
||||
H.h_style = ""
|
||||
H.f_style = ""
|
||||
target.m_style = ""
|
||||
marking_styles["head"] = "None"
|
||||
target.m_styles = list2params(marking_styles)
|
||||
E.status &= ~ORGAN_DESTROYED
|
||||
if(E.children)
|
||||
for(var/obj/item/organ/external/C in E.children)
|
||||
|
||||
@@ -856,11 +856,11 @@ 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(0, 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(0, 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?
|
||||
|
||||
@@ -73,13 +73,17 @@ 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/list/marking_styles = params2list(owner.m_styles)
|
||||
var/head_marking = marking_styles["head"]
|
||||
if(head_marking != "None")
|
||||
var/list/marking_colours = params2list(owner.m_colours)
|
||||
marking_colours["head"] = sanitize_hexcolor(marking_colours["head"])
|
||||
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(rgb(hex2num(copytext(marking_colours["head"], 2, 4)), hex2num(copytext(marking_colours["head"], 4, 6)), hex2num(copytext(marking_colours["head"], 6, 8))), ICON_ADD)
|
||||
overlays |= h_marking_s
|
||||
|
||||
if(H.ha_style)
|
||||
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[H.ha_style]
|
||||
@@ -135,6 +139,10 @@ var/global/list/limb_icon_cache = list()
|
||||
else if(status & ORGAN_ROBOT)
|
||||
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
if(limb_name == "head")
|
||||
var/obj/item/organ/external/head/head_organ = src
|
||||
head_organ.handle_alt_icon()
|
||||
|
||||
if(status & ORGAN_MUTATED)
|
||||
mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
|
||||
@@ -140,11 +140,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
|
||||
@@ -157,6 +161,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()
|
||||
@@ -193,3 +200,14 @@
|
||||
disfigure("brute")
|
||||
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)
|
||||
|
||||
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -23,7 +23,7 @@
|
||||
</div>
|
||||
{{/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}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Colors:
|
||||
@@ -43,12 +43,24 @@
|
||||
{{/if}}
|
||||
{{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}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -93,14 +105,40 @@
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if data.change_markings}}
|
||||
{{if data.change_head_markings}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Marking styles:
|
||||
Head Marking styles:
|
||||
</div>
|
||||
<div class="itemContentWide">
|
||||
{{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}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if data.change_body_markings}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Body Marking styles:
|
||||
</div>
|
||||
<div class="itemContentWide">
|
||||
{{for data.body_marking_styles}}
|
||||
{{:helper.link(value.bodymarkingstyle, null, { 'body_marking' : value.bodymarkingstyle}, null, data.body_marking_style == value.bodymarkingstyle ? 'selected' : null)}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if data.change_tail_markings}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Tail Marking styles:
|
||||
</div>
|
||||
<div class="itemContentWide">
|
||||
{{for data.tail_marking_styles}}
|
||||
{{:helper.link(value.tailmarkingstyle, null, { 'tail_marking' : value.tailmarkingstyle}, null, data.tail_marking_style == value.tailmarkingstyle ? 'selected' : null)}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -118,3 +156,16 @@
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{if data.change_alt_head}}
|
||||
<div class="item">
|
||||
<div class="itemLabelNarrow">
|
||||
Alternate Heads:
|
||||
</div>
|
||||
<div class="itemContentWide">
|
||||
{{for data.alt_head_styles}}
|
||||
{{:helper.link(value.altheadstyle, null, { 'alt_head' : value.altheadstyle}, null, data.alt_head_style == value.altheadstyle ? 'selected' : null)}}
|
||||
{{/for}}
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||