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...
This commit is contained in:
Fox McCloud
2016-08-08 21:58:45 -04:00
committed by GitHub
38 changed files with 1682 additions and 596 deletions
@@ -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")
+11 -4
View File
@@ -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
+468 -72
View File
@@ -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"