Darkens Unathi Horns/Spines/Frills, Adds Secondary Facial Hair Colours/Support, Further Adjustment to Tigerhead/TigerheadFace Sprites

You can now colour the webbing of webbed Unathi frills independently.
Morph and CMA support has been included.
Splits tigerhead sprites into 3 versions in order to better fit the
different ears of the three species that can use it.
This commit is contained in:
KasparoVy
2016-07-19 05:58:50 -04:00
parent b38e8ea190
commit b497aafb90
19 changed files with 228 additions and 108 deletions

View File

@@ -36,6 +36,9 @@ CREATE TABLE `characters` (
`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,

View File

@@ -36,6 +36,9 @@ CREATE TABLE `SS13_characters` (
`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,

View File

@@ -218,10 +218,10 @@
#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 HAIR_LAYER 18 //TODO: make part of head layer?
#define HEAD_ACCESSORY_LAYER 19
#define FHAIR_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

View File

@@ -74,8 +74,9 @@
#define APPEARANCE_HAIR_COLOR 32
#define APPEARANCE_FACIAL_HAIR 64
#define APPEARANCE_FACIAL_HAIR_COLOR 128
#define APPEARANCE_SECONDARY_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_ALL_HAIR APPEARANCE_HAIR|APPEARANCE_HAIR_COLOR|APPEARANCE_FACIAL_HAIR|APPEARANCE_FACIAL_HAIR_COLOR|APPEARANCE_SECONDARY_FACIAL_HAIR_COLOR
#define APPEARANCE_HEAD_ACCESSORY 512
#define APPEARANCE_MARKINGS 1024
#define APPEARANCE_BODY_ACCESSORY 2048

View File

@@ -204,6 +204,12 @@ 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_colour)
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_colour]_s")
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

View File

@@ -78,6 +78,11 @@
if(new_facial)
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_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_secondary_facial_hair_color(hex2num(copytext(new_facial, 2, 4)), hex2num(copytext(new_facial, 4, 6)), hex2num(copytext(new_facial, 6, 8)))
//Head accessory.
if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()

View File

@@ -120,10 +120,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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/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
@@ -318,6 +321,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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>"
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
if(facial_hair_style.secondary_colour)
dat += "<a href='?_src_=prefs;preference=secondary_facial;task=input'>Secondary Color</a> [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]<br>"
if(species != "Machine")
dat += "<b>Eyes:</b> "
@@ -1256,6 +1263,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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_facial = 0
g_facial = 0
b_facial = 0
r_facial_sec = 0
g_facial_sec = 0
b_facial_sec = 0
s_tone = 0
@@ -1269,7 +1282,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
body=None;\
tail=None" // No Unathi markings on Tajara
alt_head = null //No alt heads on species that don't have them.
alt_head = "None" //No alt heads on species that don't have them.
body_accessory = null //no vulptail on humans damnit
@@ -1542,6 +1555,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_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)
@@ -2001,6 +2024,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
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

View File

@@ -113,6 +113,9 @@
facial_red,
facial_green,
facial_blue,
secondary_facial_red,
secondary_facial_green,
secondary_facial_blue,
skin_tone,
skin_red,
skin_green,
@@ -183,59 +186,62 @@
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])
m_colours = query.item[18]
r_headacc = text2num(query.item[19])
g_headacc = text2num(query.item[20])
b_headacc = text2num(query.item[21])
h_style = query.item[22]
f_style = query.item[23]
m_styles = query.item[24]
ha_style = query.item[25]
alt_head = query.item[26]
r_eyes = text2num(query.item[27])
g_eyes = text2num(query.item[28])
b_eyes = text2num(query.item[29])
underwear = query.item[30]
undershirt = query.item[31]
backbag = text2num(query.item[32])
b_type = query.item[33]
r_facial_sec = text2num(query.item[14])
g_facial_sec = text2num(query.item[15])
b_facial_sec = text2num(query.item[16])
s_tone = text2num(query.item[17])
r_skin = text2num(query.item[18])
g_skin = text2num(query.item[19])
b_skin = text2num(query.item[20])
m_colours = query.item[21]
r_headacc = text2num(query.item[22])
g_headacc = text2num(query.item[23])
b_headacc = text2num(query.item[24])
h_style = query.item[25]
f_style = query.item[26]
m_styles = query.item[27]
ha_style = query.item[28]
alt_head = query.item[29]
r_eyes = text2num(query.item[30])
g_eyes = text2num(query.item[31])
b_eyes = text2num(query.item[32])
underwear = query.item[33]
undershirt = query.item[34]
backbag = text2num(query.item[35])
b_type = query.item[36]
//Jobs
alternate_option = text2num(query.item[34])
job_support_high = text2num(query.item[35])
job_support_med = text2num(query.item[36])
job_support_low = text2num(query.item[37])
job_medsci_high = text2num(query.item[38])
job_medsci_med = text2num(query.item[39])
job_medsci_low = text2num(query.item[40])
job_engsec_high = text2num(query.item[41])
job_engsec_med = text2num(query.item[42])
job_engsec_low = text2num(query.item[43])
job_karma_high = text2num(query.item[44])
job_karma_med = text2num(query.item[45])
job_karma_low = text2num(query.item[46])
alternate_option = text2num(query.item[37])
job_support_high = text2num(query.item[38])
job_support_med = text2num(query.item[39])
job_support_low = text2num(query.item[40])
job_medsci_high = text2num(query.item[41])
job_medsci_med = text2num(query.item[42])
job_medsci_low = text2num(query.item[43])
job_engsec_high = text2num(query.item[44])
job_engsec_med = text2num(query.item[45])
job_engsec_low = text2num(query.item[46])
job_karma_high = text2num(query.item[47])
job_karma_med = text2num(query.item[48])
job_karma_low = text2num(query.item[49])
//Miscellaneous
flavor_text = query.item[47]
med_record = query.item[48]
sec_record = query.item[49]
gen_record = query.item[50]
disabilities = text2num(query.item[51])
player_alt_titles = params2list(query.item[52])
organ_data = params2list(query.item[53])
rlimb_data = params2list(query.item[54])
nanotrasen_relation = query.item[55]
speciesprefs = text2num(query.item[56])
flavor_text = query.item[50]
med_record = query.item[51]
sec_record = query.item[52]
gen_record = query.item[53]
disabilities = text2num(query.item[54])
player_alt_titles = params2list(query.item[55])
organ_data = params2list(query.item[56])
rlimb_data = params2list(query.item[57])
nanotrasen_relation = query.item[58]
speciesprefs = text2num(query.item[59])
//socks
socks = query.item[57]
body_accessory = query.item[58]
gear = params2list(query.item[59])
socks = query.item[60]
body_accessory = query.item[61]
gear = params2list(query.item[62])
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -254,6 +260,9 @@
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))
@@ -332,6 +341,9 @@
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]',
@@ -394,6 +406,7 @@
age, species, language,
hair_red, hair_green, hair_blue,
facial_red, facial_green, facial_blue,
secondary_facial_blue, secondary_facial_green, secondary_facial_blue,
skin_tone, skin_red, skin_green, skin_blue,
marking_colours,
head_accessory_red, head_accessory_green, head_accessory_blue,
@@ -415,6 +428,7 @@
'[age]', '[sql_sanitize_text(species)]', '[sql_sanitize_text(language)]',
'[r_hair]', '[g_hair]', '[b_hair]',
'[r_facial]', '[g_facial]', '[b_facial]',
'[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]',
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
'[m_colours]',
'[r_headacc]', '[g_headacc]', '[b_headacc]',

View File

@@ -234,6 +234,18 @@
update_fhair()
return 1
/mob/living/carbon/human/proc/change_secondary_facial_hair_color(var/red, var/green, var/blue)
var/obj/item/organ/external/head/H = get_organ("head")
if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec)
return
H.r_facial_sec = red
H.g_facial_sec = green
H.b_facial_sec = blue
update_fhair()
return 1
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
var/obj/item/organ/external/head/H = get_organ("head")
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
@@ -271,6 +283,7 @@
b_skin = blue
force_update_limbs()
update_body()
return 1
/mob/living/carbon/human/proc/change_skin_tone(var/tone)

View File

@@ -1586,6 +1586,9 @@
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)

View File

@@ -172,7 +172,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_TAIL_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"

View File

@@ -470,12 +470,12 @@ var/global/list/damage_icon_parts = list()
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
@@ -491,6 +491,12 @@ 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_colour)
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_colour]_s")
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]")
@@ -1118,9 +1124,9 @@ 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
@@ -1143,20 +1149,20 @@ var/global/list/damage_icon_parts = list()
if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
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)
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)
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(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/over = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon state" = "accessory_none_s")
over.Insert(new/icon(accessory_s,dir=NORTH),dir=NORTH)
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)
overlays_standing[TAIL_LAYER] = image(over, "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))
@@ -1172,15 +1178,15 @@ var/global/list/damage_icon_parts = list()
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(under)
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/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(over)
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()
@@ -1188,9 +1194,9 @@ 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
@@ -1211,24 +1217,24 @@ var/global/list/damage_icon_parts = list()
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "vulpkanin_tail_delay")
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(accessory_s, dir=SOUTH)
under.Insert(accessory_s, dir=EAST)
under.Insert(accessory_s, dir=WEST)
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)
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(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/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "vulpkanin_tail_delay")
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(accessory_s, dir=NORTH)
over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over, "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")
@@ -1239,19 +1245,19 @@ var/global/list/damage_icon_parts = list()
if(species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs...
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
under.Insert(tailw_s, dir=SOUTH)
under.Insert(tailw_s, dir=EAST)
under.Insert(tailw_s, dir=WEST)
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(under)
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/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
over.Insert(tailw_s, dir=NORTH)
over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over)
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()

View File

@@ -338,6 +338,12 @@
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_colour)
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_colour]_s")
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

View File

@@ -47,6 +47,7 @@
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_colour = null //If exists, there's a secondary colour to that hair style and the secondary colour's icon state's suffix is equal to this.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -1107,6 +1108,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"
@@ -1119,22 +1126,25 @@
species_allowed = list("Unathi")
gender = NEUTER
una_frills_webbed_aquatic
name = "Aquatic Webbed Frills"
icon_state = "soghun_aquaticfrills"
species_allowed = list("Unathi")
secondary_colour = "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_colour = "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_colour = "webbing"
gender = NEUTER
@@ -1968,10 +1978,20 @@
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/tigerhead_taj
name = "Tajaran Tiger Body and Head"
species_allowed = list("Tajaran")
icon_state = "markings_tigerhead_taj"
/datum/sprite_accessory/body_markings/tigerhead_vulp
name = "Vulpkanin Tiger Body and Head"
species_allowed = list("Vulpkanin")
icon_state = "markings_tigerhead_vulp"
/datum/sprite_accessory/body_markings/tigerhead_una
name = "Unathi Tiger Body and Head"
species_allowed = list("Unathi")
icon_state = "markings_tigerhead_una"
/datum/sprite_accessory/body_markings/tigerheadface_taj
name = "Tajaran Tiger Body, Head and Face"

View File

@@ -103,6 +103,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_secondary_facial_hair_color(r_facial_sec, g_facial_sec, b_facial_sec))
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
@@ -276,6 +286,7 @@
data["change_head_accessory_color"] = can_change_head_accessory()
data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR)
data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR)
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")
@@ -314,16 +325,12 @@
if(location == "tail")
marking_flag = HAS_TAIL_MARKINGS
return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
/datum/nano_module/appearance_changer/proc/can_change_alt_head()
if(owner.species.bodyflags & HAS_ALT_HEADS)
to_chat(world, "has alt heads")
return owner && (flags & APPEARANCE_ALT_HEAD) && (owner.species.bodyflags & HAS_ALT_HEADS)
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()

View File

@@ -158,6 +158,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()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -46,6 +46,9 @@
{{/if}}
{{if data.change_facial_hair_color}}
{{:helper.link('Change facial hair color', null, { 'facial_hair_color' : 1})}}
{{/if}}
{{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})}}