From a9cbd9e0ac61c2dba522112dfaa0a268b33fe934 Mon Sep 17 00:00:00 2001 From: Burrito-Justice Date: Fri, 21 Aug 2020 05:41:32 -0700 Subject: [PATCH] Colorable IPC body markings, new G2 sprite (#9681) --- .../preference_setup/general/03_body.dm | 22 +- .../abstract/new_player/sprite_accessories.dm | 259 ++++++++++++------ .../mob/living/carbon/human/appearance.dm | 4 +- .../mob/living/carbon/human/human_powers.dm | 4 +- .../mob/living/carbon/human/update_icons.dm | 4 +- html/changelogs/colorable_ipc_panels.yml | 8 + .../ipc/ind_hephaestus_preview.dmi | Bin 863 -> 906 bytes .../mob/human_races/ipc/r_ind_hephaestus.dmi | Bin 2357 -> 2250 bytes .../human_races/ipc/r_ind_hephaestus_old.dmi | Bin 0 -> 2357 bytes icons/mob/human_races/markings_bishop.dmi | Bin 566 -> 1430 bytes icons/mob/human_races/markings_hephaestus.dmi | Bin 0 -> 1497 bytes icons/mob/human_races/markings_industrial.dmi | Bin 0 -> 1383 bytes icons/mob/human_races/markings_xion.dmi | Bin 0 -> 1249 bytes icons/mob/human_races/markings_zenghu.dmi | Bin 1020 -> 1541 bytes 14 files changed, 198 insertions(+), 103 deletions(-) create mode 100644 html/changelogs/colorable_ipc_panels.yml create mode 100644 icons/mob/human_races/ipc/r_ind_hephaestus_old.dmi create mode 100644 icons/mob/human_races/markings_hephaestus.dmi create mode 100644 icons/mob/human_races/markings_industrial.dmi create mode 100644 icons/mob/human_races/markings_xion.dmi diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 841d54d61c1..f534646e182 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -281,7 +281,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "\[...\]

" else out += "

" - + out += "Hair
" if(has_flag(mob_species, HAS_HAIR_COLOR)) out += "Change Color [HTML_RECT(rgb(pref.r_hair, pref.g_hair, pref.b_hair))] " @@ -304,7 +304,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "
Body Color
" out += "Change Color [HTML_RECT(rgb(pref.r_skin, pref.g_skin, pref.b_skin))]
" - + out += "
Body Markings +
" for(var/M in pref.body_markings) @@ -351,7 +351,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O mob_species = all_species[pref.species] pref.gender = sanitize_gender(pref.gender, pref.species) - var/bodytype = mob_species.get_bodytype() + //var/bodytype = mob_species.get_bodytype() //grab one of the valid hair styles for the newly chosen species var/list/valid_hairstyles = list() @@ -363,7 +363,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(bodytype in S.species_allowed)) + if(!(mob_species.type in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -380,7 +380,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(bodytype in S.species_allowed)) + if(!(mob_species.type in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -416,11 +416,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["hair_style"]) if(mob_species.bald) return - var/bodytype = mob_species.get_bodytype() + //var/bodytype = mob_species.get_bodytype() var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) var/datum/sprite_accessory/S = hair_styles_list[hairstyle] - if(!(bodytype in S.species_allowed)) + if(!(mob_species.type in S.species_allowed)) continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -481,14 +481,14 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(mob_species.bald) return var/list/valid_facialhairstyles = list() - var/bodytype = mob_species.get_bodytype() + //var/bodytype = mob_species.get_bodytype() for(var/facialhairstyle in facial_hair_styles_list) var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] if(pref.gender == MALE && S.gender == FEMALE) continue if(pref.gender == FEMALE && S.gender == MALE) continue - if(!(bodytype in S.species_allowed)) + if(!(mob_species.type in S.species_allowed)) continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] @@ -501,12 +501,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["marking_style"]) var/list/usable_markings = pref.body_markings ^ body_marking_styles_list var/datum/species/species = global.all_species[pref.species] - var/btype = species.get_bodytype() + //var/btype = species.get_bodytype() for(var/M in usable_markings) var/datum/sprite_accessory/S = usable_markings[M] if(!S.species_allowed.len) continue - else if(!(btype in S.species_allowed)) + else if(!(species.type in S.species_allowed)) usable_markings -= M if (!usable_markings.len) diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm index 3cf425b4615..a7024f9a2e4 100644 --- a/code/modules/mob/abstract/new_player/sprite_accessories.dm +++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm @@ -27,8 +27,8 @@ // Determines if the accessory will be skipped or included in random hair generations var/gender = NEUTER - // Restrict some styles to specific species - var/list/species_allowed = list("Human") + // Restrict some styles to specific species. This requires the type path of the datum of the species in question, as well as all children of that datum if applicable. + var/list/species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) // Whether or not the accessory can be affected by colouration var/do_colouration = 1 @@ -69,7 +69,7 @@ Follow by example and make good judgement based on length which list to include name = "Bald" // try to capitalize the names please~ icon_state = "bald" // you do not need to define _s or _l sub-states, game automatically does this for you gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) length = 0 chatname = "bald head" //aim to keep these lowercase so they fit into the hair tugging message @@ -231,7 +231,7 @@ Follow by example and make good judgement based on length which list to include name = "Bob" icon_state = "hair_bob" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) chatname = "short hair" bob_chin @@ -255,7 +255,7 @@ Follow by example and make good judgement based on length which list to include name = "Bobcurl" icon_state = "hair_bobcurl" gender = FEMALE - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) chatname = "curls" bobcurl2 @@ -409,14 +409,14 @@ Follow by example and make good judgement based on length which list to include name = "Buzzcut" icon_state = "hair_buzzcut" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) chatname = "unbuzzed hair" //grabbing the grabbable hair buzzcut2 name = "Buzzcut 2" icon_state = "hair_buzzcut2" gender = MALE - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) chatname = "unbuzzed hair" chrono @@ -1297,7 +1297,7 @@ Follow by example and make good judgement based on length which list to include spiky name = "Spiky" icon_state = "hair_spiky" - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) chatname = "mighty spikes" straightlong @@ -1729,7 +1729,8 @@ Follow by example and make good judgement based on length which list to include name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajara","Skrell","Vox") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi, + /datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/skrell,/datum/species/zombie/skrell,/datum/species/vox) threeOclock name = "3 O'clock Shadow" @@ -1790,7 +1791,7 @@ Follow by example and make good judgement based on length which list to include elvis name = "Elvis Sideburns" icon_state = "facial_elvis" - species_allowed = list("Human","Unathi") + species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie,/datum/species/unathi,/datum/species/zombie/unathi) fullbeard name = "Full Beard" @@ -1923,7 +1924,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/unathi_hair.dmi' name = "Unathi Aquatic Frills" icon_state = "unathi_aquaticfrills" - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) length = 0 chatname = "frills" @@ -2137,7 +2138,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/skrell_hair.dmi' name = "Skrell Short Tentacles" icon_state = "skrell_hair_m" - species_allowed = list("Skrell") + species_allowed = list(/datum/species/skrell,/datum/species/zombie/skrell) length = 6 chatname = "Short Tentacles" @@ -2166,7 +2167,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/tajara_hair.dmi' name = "Tajaran Ears" icon_state = "ears_plain" - species_allowed = list("Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_ears_bangs name = "Tajara Bangs" @@ -2259,7 +2260,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/vox_hair.dmi' name = "Kingly Vox Quills" icon_state = "vox_kingly" - species_allowed = list("Vox") + species_allowed = list(/datum/species/vox) chatname = "quills" vox_braid_long @@ -2293,7 +2294,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/vaurca_hair.dmi' name = "Classic Antennae" icon_state = "vaurca_classic" - species_allowed = list("Vaurca") + species_allowed = list(/datum/species/bug,/datum/species/bug/type_b) gender = NEUTER chatname = "antennae" @@ -2374,7 +2375,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/tajara_facial_hair.dmi' name = "Tajara Goatee" icon_state = "facial_goatee" - species_allowed = list("Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_goatee_faded name = "Tajara Goatee Faded" @@ -2406,7 +2407,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/unathi_hair.dmi' name = "Unathi Aquatic Frills" icon_state = "facial_aquaticfrills" - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) gender = NEUTER una_bighorns @@ -2567,7 +2568,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/ipc_screens.dmi' name = "blank IPC screen" icon_state = "ipc_blank" - species_allowed = list("Machine") + species_allowed = list(/datum/species/machine) gender = NEUTER ipc_screen_blue @@ -2698,7 +2699,7 @@ Follow by example and make good judgement based on length which list to include icon = 'icons/mob/human_face/dionae_hair.dmi' name = "Mono Eye" icon_state = "monoeye" - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) gender = NEUTER do_colouration = FALSE @@ -2739,264 +2740,350 @@ Follow by example and make good judgement based on length which list to include name = "Tiger Stripes (Tajara)" icon_state = "tiger" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi,/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_paw_socks name = "Socks Coloration (Tajara)" icon_state = "taj_pawsocks" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) una_paw_socks name = "Socks Coloration (Unathi)" icon_state = "una_pawsocks" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) belly_hands_feet name = "Hands,Feet,Belly Color (Minor)" icon_state = "bellyhandsfeetsmall" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_CHEST) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) patches name = "Color Patches" icon_state = "patches" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) patchesface name = "Color Patches (Face)" icon_state = "patchesface" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) bands name = "Color Bands" icon_state = "bands" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_CHEST,BP_GROIN) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) bandsface name = "Color Bands (Face)" icon_state = "bandsface" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) tigerhead name = "Tiger Stripes (Head, Minor)" icon_state = "tigerhead" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) tigerface name = "Tiger Stripes (Head, Major)" icon_state = "tigerface" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) backstripe name = "Back Stripe" icon_state = "backstripe" body_parts = list(BP_CHEST) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara,/datum/species/unathi,/datum/species/zombie/unathi) taj_nose name = "Nose Color" icon_state = "taj_nose" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_muzzle name = "Muzzle Color" icon_state = "taj_muzzle" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_face name = "Cheeks Color" icon_state = "taj_face" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) taj_all name = "All Tajara Head" icon_state = "taj_all" body_parts = list(BP_HEAD) - species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + species_allowed = list(/datum/species/tajaran,/datum/species/tajaran/zhan_khazan,/datum/species/tajaran/m_sai,/datum/species/zombie/tajara) una_face name = "Face Color" icon_state = "una_face" body_parts = list(BP_HEAD) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) una_facelow name = "Face Color Low" icon_state = "una_facelow" body_parts = list(BP_HEAD) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) una_scutes name = "Scutes" icon_state = "una_scutes" body_parts = list(BP_CHEST) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) una_maswaist name = "Masculine Waist (For Females)" icon_state = "una_maswaist" body_parts = list(BP_CHEST) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) una_clawshand name = "Claws (Hands)" icon_state = "una_claws" body_parts = list(BP_L_HAND,BP_R_HAND) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) una_clawsfoot name = "Claws (Feet)" icon_state = "una_claws" body_parts = list(BP_L_FOOT,BP_R_FOOT) - species_allowed = list("Unathi") + species_allowed = list(/datum/species/unathi,/datum/species/zombie/unathi) spelunker name = "Spelunker" icon_state = "spelunker" body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN,BP_HEAD) - species_allowed = list("Vaurca") + species_allowed = list(/datum/species/bug,/datum/species/bug/type_b) delver name = "Delver" icon_state = "delver" body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN,BP_HEAD) - species_allowed = list("Vaurca") + species_allowed = list(/datum/species/bug,/datum/species/bug/type_b) skr_tears name = "Tear Stains" icon_state = "skr_tears" body_parts = list(BP_HEAD) - species_allowed = list("Skrell") + species_allowed = list(/datum/species/skrell,/datum/species/zombie/skrell) do_colouration = FALSE skr_arms name = "Skrell Arms" icon_state = "skrell_arms" body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list("Skrell") + species_allowed = list(/datum/species/skrell,/datum/species/zombie/skrell) diona_leaves name = "Diona Leaves" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_leaves" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_GROIN,BP_HEAD) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_thorns_head name = "Diona Thorns (Head)" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_thorns" body_parts = list(BP_HEAD) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_thorns_torso name = "Diona Thorns (Torso)" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_thorns" body_parts = list(BP_CHEST) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_flowers_head name = "Diona Flowers (Head)" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_flowers" body_parts = list(BP_HEAD) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_flowers_torso name = "Diona Flowers (Torso)" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_flowers" body_parts = list(BP_CHEST) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_moss name = "Diona Moss" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_moss" body_parts = list(BP_CHEST) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_mushroom name = "Diona Mushroom" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_mushroom" body_parts = list(BP_HEAD) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) diona_antennae name = "Diona Antennae" icon = 'icons/mob/human_races/markings_diona.dmi' icon_state = "diona_antennae" body_parts = list(BP_HEAD) - species_allowed = list("Diona") + species_allowed = list(/datum/species/diona) +//bishop bishop_lights - name = "Lights Colour" + name = "Bishop - Lights Colour" icon = 'icons/mob/human_races/markings_bishop.dmi' icon_state = "bishop_lights" icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) - species_allowed = list("Bishop Accessory Frame") + species_allowed = list(/datum/species/machine/bishop) bishop_mask - name = "Face Mask" + name = "Bishop - Face Mask" icon_state = "bishop_mask" do_colouration = FALSE body_parts = list(BP_HEAD) bishop_triangular_mask - name = "Triangular Face Mask" + name = "Bishop - Triangular Face Mask" icon_state = "bishop_triangular_mask" -/* - zenghu - icon = 'icons/mob/human_races/markings_zenghu.dmi' - icon_state = "outer" + bishop_panels + name = "Bishop - Full Body Panel Colors" + icon_state = "bishop_panels" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) + + bishop_head + name = "Bishop - Head Panel Colors" + body_parts = list(BP_HEAD) + + bishop_legs + name = "Bishop - Leg Panel Colors" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + + bishop_arms + name = "Bishop - Arm Panel Colors" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + +//hephaestus g1 + g1_panels + name = "G1 - Full Panel Colors" + icon = 'icons/mob/human_races/markings_industrial.dmi' + icon_state = "g1_primary" icon_blend_mode = ICON_MULTIPLY - name = "Outer Finish" - body_parts = list(BP_HEAD) - species_allowed = list("Zeng-Hu Mobility Frame") is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + species_allowed = list(/datum/species/machine/industrial) - inner - name = "Inner Finish" - icon_state = "inner" - body_parts = list(BP_L_FOOT, BP_R_FOOT, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) + g1_head + name = "G1 - Head Panel Colors" + body_parts = list(BP_HEAD) - l_foot - name = "Inner Finish (Left Leg)" - body_parts = list(BP_L_FOOT, BP_L_LEG) + g1_legs + name = "G1 - Leg Panel Colors" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - r_foot - name = "Inner Finish (Right Leg)" - body_parts = list(BP_R_FOOT, BP_R_LEG) + g1_arms + name = "G1 - Arm Panel Colors" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) - l_hand - name = "Inner Finish (Left Arm)" - body_parts = list(BP_L_HAND, BP_L_ARM) + g1_lights + name = "G1 - Lights Color" + icon_state = "g1_lights" + body_parts = list(BP_CHEST,BP_HEAD) - r_hand - name = "Inner Finish (Right Arm)" - body_parts = list(BP_R_HAND, BP_R_ARM) +//hephaestus g2 + g2_panels + name = "G2 - Full Panel Colors" + icon = 'icons/mob/human_races/markings_hephaestus.dmi' + icon_state = "g2_primary" + icon_blend_mode = ICON_MULTIPLY + is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + species_allowed = list(/datum/species/machine/industrial/hephaestus) - crest_leser - name = "Head Coloration (Lesser)" - icon_state = "lesser" + g2_head + name = "G2 - Head Panel Colors" + body_parts = list(BP_HEAD) - crest_greater - name = "Head Coloration (Greater)" - icon_state = "greater" -*/ + g2_legs + name = "G2 - Leg Panel Colors" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + + g2_arms + name = "G2 - Arm Panel Colors" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + + g2_lights + name = "G2 - Lights Color" + icon_state = "g2_lights" + body_parts = list(BP_L_ARM,BP_R_ARM,BP_L_LEG,BP_R_LEG,BP_GROIN,BP_CHEST,BP_HEAD) + +//zeng-hu mobility frame + zeng_panels + name = "Zeng-Hu - Full Panel Colors" + icon = 'icons/mob/human_races/markings_zenghu.dmi' + icon_state = "zeng_primary" + icon_blend_mode = ICON_MULTIPLY + is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + species_allowed = list(/datum/species/machine/zenghu) + + zeng_head + name = "Zeng-Hu - Head Panel Colors" + body_parts = list(BP_HEAD) + + zeng_legs + name = "Zeng-Hu - Leg Panel Colors" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + + zeng_arms + name = "Zeng-Hu - Arm Panel Colors" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + + zeng_lights + name = "Zeng-Hu - Lights Color" + icon_state = "zeng_lights" + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) + +//xion + xion_panels + name = "Xion - Full Panel Colors" + icon = 'icons/mob/human_races/markings_xion.dmi' + icon_state = "xion_primary" + icon_blend_mode = ICON_MULTIPLY + is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + species_allowed = list(/datum/species/machine/industrial/xion) + + xion_head + name = "Xion - Head Panel Colors" + body_parts = list(BP_HEAD) + + xion_legs + name = "Xion - Leg Panel Colors" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + + xion_arms + name = "Xion - Arm Panel Colors" + body_parts = list(BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM) + + xion_lights + name = "Xion - Lights Color" + icon_state = "xion_lights" + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 66bcd8bfa05..803f0605b21 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -168,7 +168,7 @@ continue if(check_gender && gender == FEMALE && S.gender == MALE) continue - if(!(species.get_bodytype() in S.species_allowed)) + if(!(species.type in S.species_allowed)) continue valid_hairstyles += hairstyle @@ -185,7 +185,7 @@ continue if(gender == FEMALE && S.gender == MALE) continue - if(!(species.get_bodytype() in S.species_allowed)) + if(!(species.type in S.species_allowed)) continue valid_facial_hairstyles += facialhairstyle diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index bb044418a8a..b3d887a3a52 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -20,7 +20,7 @@ var/list/datum/sprite_accessory/hair/valid_hairstyles = list() for(var/hair_string in hair_styles_list) var/datum/sprite_accessory/hair/test = hair_styles_list[hair_string] - if(test.length >= 2 && (species.bodytype in test.species_allowed)) + if(test.length >= 2 && (species.type in test.species_allowed)) valid_hairstyles.Add(hair_string) selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles if(selected_string && h_style != selected_string) @@ -41,7 +41,7 @@ mob/living/carbon/human/proc/change_monitor() var/list/datum/sprite_accessory/facial_hair/valid_screenstyles = list() for(var/screen_string in facial_hair_styles_list) var/datum/sprite_accessory/facial_hair/test = facial_hair_styles_list[screen_string] - if(species.bodytype in test.species_allowed) + if(species.type in test.species_allowed) valid_screenstyles.Add(screen_string) selected_string = input("Select a new screen", "Your monitor display", screen_style) as null|anything in valid_screenstyles if(selected_string && f_style != selected_string) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7e0dc709234..7c37c37f895 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -354,7 +354,7 @@ There are several things that need to be remembered: // Beard. if(f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (GET_BODY_TYPE in facial_hair_style.species_allowed)) + if(facial_hair_style && facial_hair_style.species_allowed && (species.type in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = facial_hair_style.icon_state) if(facial_hair_style.do_colouration) facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.icon_blend_mode) @@ -364,7 +364,7 @@ There are several things that need to be remembered: // Hair. if(hair_is_visible) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] - if(hair_style && (GET_BODY_TYPE in hair_style.species_allowed)) + if(hair_style && (species.type in hair_style.species_allowed)) var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = hair_style.icon_state) if(hair_style.do_colouration) hair_s.Blend(rgb(r_hair, g_hair, b_hair), hair_style.icon_blend_mode) diff --git a/html/changelogs/colorable_ipc_panels.yml b/html/changelogs/colorable_ipc_panels.yml new file mode 100644 index 00000000000..fc8945f2cdb --- /dev/null +++ b/html/changelogs/colorable_ipc_panels.yml @@ -0,0 +1,8 @@ +author: Burrito Justice and Nienna + +delete-after: True + +changes: + - rscadd: "Added body markings for the G1, G2, Bishop, Zeng-Hu, and Xion IPC frames to be colored and customized." + - tweak: "The G2 sprite has been updated to give it a fresher look, courtesy of Nienna." + - tweak: "Changed how species are checked in the code. It now requires the full type path of the species datum, instead of the bodytype." \ No newline at end of file diff --git a/icons/mob/human_races/ipc/ind_hephaestus_preview.dmi b/icons/mob/human_races/ipc/ind_hephaestus_preview.dmi index 43bb0753c64840216481280f95d365595e98f4d8..cb8ee803d9f4f6c036b81372ec0ad1768842280a 100644 GIT binary patch delta 814 zcmV+}1JV5728sueBt$AuOjJd{z`#suJ7|MhC?XpF003Q4Lq9VnI7u#mfPj~%jXys> zEiEl*XlN%hAgEFv5dZ)H0d!JMQvg8b*k%9#0Bn(8NPnrID77pzwOomdGbOXA7^IDh zGp#5wHxYCm3;=z^8xXed?ot2%0+vZcK~zYIz16>K6JZz!@b?muvo%BW zUURWZq3@d?M-}1Xac>|bgB=vaAx+w#r9+bI1r>zk4tj$G>Yx_tU;~O{mUhvhIyi_! zpw^-2Ab){&(f`E=()W1+X6(Ct-uvcxF8AX(Le6c`naNf-n`n|srxuVoHc4!_sAf{+ zaSv@)LmSj>;=m@=+tB_>6`6#ohV44|q*sN#44u>CIn>gsRd0Z%)XQ)WSh?3r(6_RL zvPLufGANnY;c0&D+1XDL?>cVd$(}5+@`z{n)qjn$v{~i4!eQBbkW*UsuHTEBqscf=aDh2wY z^htN~^vr}*L(FOLa9P@a?0C|n^Y&_$fB@eSh1!hrhg;L9oW%fa^- zFn^%T4}QdBoeEYlJuux;AVA+DQ(%KsVC z{{|=scz)aWJZUXx2R;a#&+713kW)N~kE>R05xS>Ypm&=|+=2+lgER!54}U}%uGXQWt0mlGZr&9fm+ea!a&nF zM6+4#87&`88+LmIX$ se4N1XFj}0AJ+vwu52Ixm`F~gT4;x0Ah2Y=J2LJ#707*qoM6N<$f_cS@)c^nh delta 771 zcmV+e1N{7o2j2#eBs(EcOjJd{z`#suJ7|MhCMG8T003Q4Lq9VnXlQ7FfPgqjE;u+i z$S^Ya00001bW%=J06^y0W&i*HWszt|e@TgpGbOXA7^I$yGp#5wHxYE6 z2mqS@7!En1VMG7`0((hBK~zYIy_CUk+AtJ{?I57suw77d!-j0*7MjMCBb%mOffTkQ zh}9~$bfaC4Oo(;dN|8{xZvW`Q2IRdQcC3XIedf#0PmhNQd9lTd|7WTsX3nr6e`;0q zieLgqlrDUys{kL7;R3VvaM6A3cOiGn3^L)~AUFq^oWD}A z6EsqedUFdn7S0kTrMar9>Y|u1Gb52Ox%!(h?Hu@XWNysOba+gx26ovN!J*q!j<1)C z@#xrn>g4srG_#42*Uy_KJqlT$f80tL#*cq1S0;DMMHoN!%c>XkcH`P=&jq^}C%Cqq z)KD2oIjkNctyU$jVOT#uCOCE5Ol;?nVEJ`#GHy9Xfdp3k>#0m9;osW(mGEwW20b`J z^u6}mfQh9#Jq6i!{c|W3p2KJh`62waL`Kf3nxEe+@Vn z*Px-0GvU2~9EH(66ts5Z58zz_U`v%<&66svax8cp2wXg_d9q;%R%8MQFS8i0K(u7) z?@zr3Y&B8BOZ_*Qs6l?)U@j6YNR)ZMo)fGA>b4BiQ_)Vg_^+x|3f-q8o&f9TXq== zqtzPS)>M8qk5DL>CKiH^E1Y28p}RSw>Shfh3N7=bU}G{;PT*xt8yn71=ak&6q0pLe zG#?~4QMgF886qLuPK_8l?O*{<+-~Nukbl@>VH<^rPcG95^I0k(JzYa8fuQRlUV{L0 z{)fRE<|dVZu7|j_<1tAIxN}OT1S&Y5YT4L#{trv}c#?W6y=DLa002ovPDHLkV1nVl BUjYCB diff --git a/icons/mob/human_races/ipc/r_ind_hephaestus.dmi b/icons/mob/human_races/ipc/r_ind_hephaestus.dmi index eb095f62fff2f1abf6bcedcc7709f369410381db..4c7e77672c0880be5eafd3d921469720569b09e6 100644 GIT binary patch delta 2238 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 Qp8x;=07*qoM6N<$g2!L5M*si- diff --git a/icons/mob/human_races/ipc/r_ind_hephaestus_old.dmi b/icons/mob/human_races/ipc/r_ind_hephaestus_old.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eb095f62fff2f1abf6bcedcc7709f369410381db GIT binary patch literal 2357 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 bgSCGFDJQM&+XQ-_00000NkvXXu0mjfMkA`d literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/markings_bishop.dmi b/icons/mob/human_races/markings_bishop.dmi index 0be93603624f48c1ca9f8684a127c7842cf50700..c8862dc0ba54a4f7bf9901b1dd6207beed55cba2 100644 GIT binary patch literal 1430 zcmV;H1!?+;P)#>U3M!NI(|ynuj!`T6-@Uthq$z)Ld=OaK4?0d!JMQvg8b*k%9#0M~j{ zSad{Xb7OL8aCB*JZU6vyoSl@-4uUWcgwOOT8aQkGyLvGa!$DqwtWs!WX-Ql4^`%NU zm~a?wyV?1&nRc=nKjoLAsWYCJ z=kI~~0BD(WCXCeOcK`qcKuJVFRCt{2oK140Fc5{Yl#0mCM^M>|Wa)Ai_R^cl33320 zasbM{05!h&Kq^yKw*-;{`f>8UET9DnT_8YuJh`d>0H6pKykMCl3jn|%iv_(+7oOYJ z+8P@n1c_z$$IxW|xar&-OR}(I=OtY_R|ob8Y7+eT000000HG{(*Wcsa6WXWHw8M%H zApijUGN3;K5EI9JLjSME1S1N?hF6`00000 z0N{S<{eyNPiL~$Qr{zB!1O7t*=I7yPMvn)!*{k10uHO~CnbF6QZuRSTaqHg$OrJaO ztv>xOZvBqO4>Ni@vdv!o&Qt&3t$!Sj0000000000004eC)AhT!{099lE;HzNk%4}9 z-!#F6nP`Ix^Po1a(p~B_M$o~9z=buJ+EbpK`o{9)4A}!_vkfS3xzuwV>s$ESkjVSc z9XkB!y84_ZlOgm?#Q*>R00000aCZz1ZHwVll3M8EqH|~9Vega>3j)(SCQ|%OT$g?m zg92d9IB}bCJ%v~qRWX&0myCV*I}* z=9{I+C#gBMFY*!-bnXNk$boeL00000@B>h6u&t^mx`SpTNtL!!Ern8~LnlokDU(b#j52 zn`9dY!pCV1e>?33A41(z7_5THs*Z&tlUjJVJdHsI@l;{7WWcL3B z0RJB-9>d^QTfaP!+5h*Mf?@Ep{ebZQfywZBYcFinwPq%bJ!^$i>-&(bKPcI_RPcFi zl4dlu{>=#Xa&~;18g&Frt?xx%RwQ=V7)Bo>Q|o(?6UTj1>pT9T8jY>~n4Y)3AAg%A zx1rVHo?1ULO|SnoBz_`|OxgNh(pTZ7*Z*2Gu1H*+&RqZ7rId%%w%7l5X55-_m+^}0 zf2*WdS@(LM9*(;g2iO1jt0gi%{ZH8XpH7h07yY^E^*_`5)imt&kyHPxzw|%DKlrKt zUHjO|rT?YNk^2VwWq$^*7u7X?`5XSh@4|hDwhz(u`-2Jnhun8)`w(4CE}?+-|M1*@ zNPd6N(jQa$4|U(#gyBDAaZmpF$K3x{-27wi|0{0(G57zKJ^xr2IRBXY|1kd;B;->Y kWcp!o^M|>9IM@8)f3Bi?ha{9Nd;kCd07*qoM6N<$f`Qt+=Kufz literal 566 zcmV-60?GY}P)#>U3M!NI(|yuiS~t%lS100001bW%=J06^y0W&i*Ht9n#ebVOxyV{&P5 zbZKvH004NLos!K8!Y~ko&&gAS_N@4K^&&0OgMEdvlC%jnjqI-a`ZjtK6xQ1eJ0HWq zmgZ0&o7PmPM&BJ$NR!!{-EyVXBUtvc*>1G*E)1UEh8Wn*vN#9w>DrC?M1@v1AZ1vq z9wEA{*I&{L>;R*X8UJ87AtfQ>9a!<4J|!0Kkw6jXBFTzoFb0^0+XyJ?`M`cwmZom2 z*PlHBP#VEbd^K7_0003MNklXU69$lh z4q&C<$3maJ7mX4pzeAP*zm$(3s9*6e_}B70JPq^6X*qdztD-1^`lCNanxH@R1y5E7 zH`99dBdlldKIusQ3IKS$y6M-u@y~y_1~lOU{B8>(0IbTJ`&yAV|AKK|T-gl(06*+6 za)y2P2Ulo@g}*}qV0Yj9lK=n!yosgjNoP#1M_uB2RCe&$MjFa)SXJZpjq_P~zefhD z+pv0s!E)X^KqT)00Kk#H0O$J^Q@g;ckpKVy07*qoM6N<$ Ef|>XR`v3p{ diff --git a/icons/mob/human_races/markings_hephaestus.dmi b/icons/mob/human_races/markings_hephaestus.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4f51de06a1553f96e0b11d42de823007626dccbe GIT binary patch literal 1497 zcmV;~1t$85P)LCP9!q5dH)if=#b5HHHw(aV>TU&@!H z5q+f3ET_pUBR!y&ZA0($b~=+_klctVxW*(9AS+?Mfi}#*B*Q8$l)ctREEv`y3AjXU zaT1isYOwmUov)zs$XA~Am1lhcjBlq;nuB7aB@gr2;@<+a@p!L8=p_s;M2E6wIJ&oZ z1q5q$T&ZJm5Cg!3R*z}JQI>{r0o#oz0)6mZ^`1*ou^(4|nlsar000DtNklk005teh#eD$LXmiMj$=|=g>PRAMdIe_Kzel4MFR2h zv~C?9ON8-psos73`2I=^Wg_vYKEOElx2RnGMDkzbI{b3|W~t{Rd8=^1qSvm&`ue$0 z1O1H1oZ&3(JOMskUw5I$a~h@` zH%nFZpm5wQJ(dr{ulgPY0001hWWw{>qt&?r@v-xbu6!i({a3a~e1zjw;Oq@DetPjD z1S!d-|I;77bRX5}Y=QVxAK;Dj)&bm`jUOdNZE;<^i9Bx|K}7XESUM$qv$m>qoJ;LJ z2%npDK5(b^?cJ8wDLEO#kDZMjpfXccPlf;h0002$r%N~ZKHkqW9#E6g^yEA#r}y!G zp7DS^DRrI68H~&Oct6j0z@C&QHXf|C(_^lYMC|k%0{c6fl}UO`nppMnBgaXCF+T3< z+-Hl#gZ5zb^bN+|+v%}*4>|^|W=0Z>LdQ;jET6Qmy$1netOO&OtyBv;!6^0FY!?Ys zia(&|<00000YBJWoJj(H?%+@i$CxiSS@_)2F|*kw7ax&EJiORwo``8EHi zuV?&0`->A+70>^L+ZRK7(&WJYu-@`|s(;J>@#X#O?L{K(&-;%U@^7xW{@)ysYL@E{ z()~|@?Tb0DZl55J>&_pJ&v&Of{u(xu(;K;BoaHUD_m?=SVw z*8JuDrT!1Pf62kv0h0QEVrWEfmrcul>;=6&QuH~@<*LEvAGd7(k#PMunYJ5;nwImA zXvH}vecsB~KP)`|xcVN1 zd-uA2;bQ)9X#K*%;}_@k3;F!v@cM<<@r%C!t}(u>(DT(k00000NkvXXu0mjf{08|6 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/markings_industrial.dmi b/icons/mob/human_races/markings_industrial.dmi new file mode 100644 index 0000000000000000000000000000000000000000..11ffc8db0c1fb7f79c4cf5fdd803172e29c6d3ef GIT binary patch literal 1383 zcmV-t1(^DYP)l^Zbt8(nu)h$3ohE@kWD+d?y?wY)5X{}pz#Q(K zo5w;OPUlOZj@OHP5C`A2YOi*ywG_QCqZ^v-MhZvXx;Qr>nn**L*<9b*H-?`})`pu* ziqdl!c_}J34UKjF6R1&uwKHvrNuUJlnk*&(0<5d9iTy=m2ky0<^~j zV76uivgOD?cVwK$Oicvj>CW`<)Tbcz_%1_wxS#WBYkUz&YrKinWIx6sN9nn~fj_Y> z)Tua5AK?o@e~17?&VhIU00a+7L_t(|obBB~Qrkcf1yD(2$dp@BYGhFko~_rbga;|yh~7D$JTW(kH=T&SllTl-;6E9wogPv zL_|bHL_}w5Q2tk{ufx`!Ml)okarxial(1hlWTlvVGidG4$>GGzv<4k>(>Znosb$fw z@U%^qlyV=f?Fu49?#JNxd+`sisSptn5fKp)eS|}k=(MIybU&i%`2Jn&UV9!gD@l?O z=6B>S|6|a&7k}?w8{OI*((^8AN%DVQSCqX!g{A+-)sp1IjIId1KP4g}A|fKnTD9Hv zj=k$`b?hG(*K&9>aXrp@ndx0mMA?f=PrzX2cS|$#J0cT2gs@(>cS(48VJ>!28RP~- z-Lxlc*29`zBlp0qoKRip3CimaTJ<<}d!bg>AWZg$+P+l}+r-`tHc1OWlv6h9VO6DO zpt6^!F9%u4DO>fhn`SF+F{r=kRdpkNUR_7=qQ|O-RgH?*c5>Vla>2_XCT3vOyXSvZ zvEH=Do2`7EYj58<|BGq8Jm}2rn?8O17v*sN{zD=nqVs0GFuzsL9>T5LRE~Sv%dw6& z%Aa!lZRWR!Ts-`dyu@`JGh{L-RYU9){+3Ry_>O@638!_W56w!_mJ#T2Dkobmq|f&buDY z@4V~L{LZ`Hgywf>J(}OS*Teapdp(@rdDkzV|2g*$qWt>@QQrN7DF6OJOnJy3+aD(T znm=arj+Xim=e0lo_%(mb>s*s}{~*e}e-Ki>=Z~$=KRM)&*&Kx7J%4O{{>dSK%;$a_ z-}1)THO>LvKX~4%BE522UJ0XqEY@QpZ@C|X`QMAnEj+m p&Atbh&i~B*K_Vg|A|fI>;vYdnftgGZUh@C|002ovPDHLkV1gsU%vb;b literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/markings_xion.dmi b/icons/mob/human_races/markings_xion.dmi new file mode 100644 index 0000000000000000000000000000000000000000..01208bc80a611388c0d5017db9b60cecb2519a39 GIT binary patch literal 1249 zcmV<71Rnc|P)fFDZ*Bkp zc$}q`%MOAt5JlJYD;nLZ@wIhhAclqh0%>HRP0AzFM)dCmB!o?|qq{cgncmyElP>u= zy2LjgUSswEG^#53i61vx7BnigvfUi^ERdjbX+Ildg@tyxc(#X=8dV|iwZ=qXv0y=} z&~z18kfA7`Tko8R6lF?fG~`qyt13%lG~JE}LSqu1pcno(u>fFH?djjFgsv`4W~Tk8WZAQ@jD_gzP{aW_=|900V7FL_t(| zobBBWcH$rq!0`eefYl4&+Y6+7g53X9)os->{c$gxuUPTqm9KHQ3B2>JH-`6}8L;3E`g#v8i) zX0M-pcCMYQ0ykui(&ccF;%U+(pxIx#BX%Od#gNw_- zh#i&jy03te$-T@eyskBnFpI@Ag=q-@0I*%r1^VR!C9m#KB)UMqe5e}2!&G;SB$1jN3#o}3bN;_6N zhN!6iDQ7Y>XRNOFmC0o8G4yD~dat(z(r35)nJr}hKy7~h@$r74_zSK1`S$#N^bw@H zg~t3m`F#KY003_*^uGU~mA?BAT6MqwpjGqz2d%l^-to=(`MP+2eYuoP{1Mk@r(5&$ zRq@hY@^2*=N?g97~l99x379DP!;bcuRl|#_~}PneE-($ zaPRo`{Cw~D-k;$8*FbH4{t5Au8fH!Zz;b@RDc=0AAB|6ZD$9WB0@U{pl=Aa!@!|TC zFP}F|)29qOuj~GS{pk}mW->nUd0{7I{rwBprsE%2StFus`~&CG@eiD=5z#jO!4Q)1 z58@We0|&-G0PtjTN7knmGtT29%kc}A$46%T0ssI206%v5*<-QBgIY1pSGxICB>(`h z3F94V0002Iik(cvjA@NW#sdHV002;7tg6i^DF6U?VdUol09DGng>kWZYy6{S-f(Y&eWKT2LJ$XZY&-eh+lI`4BW{VAW$+`{NS~f00000 LNkvXXu0mjfr1@X7 literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/markings_zenghu.dmi b/icons/mob/human_races/markings_zenghu.dmi index 7d90ce44603eb6ef657f9baccdfd34473917ff37..e509a29af64cad7dda99d1d41a9d71f9349ecf9b 100644 GIT binary patch literal 1541 zcmV+g2KxDlP)V=-0C=38 z)x8daFcbygnLb6Mv&O&G#Yl{Uz5;3FLYovYw+%#}Uik@OG4`;v!`GZkd%{wl;>-0e z&$p|niJhrRd6b9sMnsKCz5Z_YI}vFzx%U0WdFAQ5T)e5wlP8-(@oUA2;$k79)Uaz$ z5K+depmx3eNwg|c)L6<6bOg=T zBQRXfl__TsG+d9sa8IV%P!oo1+g^usbQIx_dL+SbdJsU_MghkHsy2x5)=WU?-A_s2 z%?|{q%v6BEpu!C1&y!rr_y0O&0Z^|nJRLnH^Ow~a$1LnPD8 zwk(Yd*qq#6rGAxIBR|-DyuA$GhaY{uMFV7qYP{}I1Mc5Uk{znik2+ozo9`b$u{U1R z8`kCpX}&&Ee6xe7x1u$my?uE2&X?RiNXRoade(#gzS!J24yR+iP5*Y9ZDur7)guNU9qhbtnTt8?w@)__&H12(|x|8eO-6i#$9F*Jz9}1Ta)DR^<&DpGkMDcq^WEe7-uQg? z_`Wwj-#xzXjnDUw?|b9(#P^rg_bCUvb6MxZ`9j|K{9^gmH8b)SFW z)qnnh*PG8jxC|E9^$Qy7BgdLQa2Y<(>lcVL)<=#te_*03E>G1`* zjxXG|q`C2hIGrGWk1rJK7hFyy)cVLX;|p;bkiN$k?D_?2edKz4Ayfm@-)#O~pEOd9 zFFe%%Z+w2S{Qupa7w|V39i{-x;Hm%kl(CZtQ=Wpk>ng8D#pLdl{ zU%SJx+LhG$#-djXw&Mfd_`I+DaK1h{|FYiKAGquyld5q(>OL?&J3ioz&o7t1HlRpL zYkA*bj|Y1H2G~w1t@VkcU6M)te52*{iJ8O%MDlfrvCk)3T>l{0LFntzMAh?&mexPu z`9uH!0Kdm)JIiVNS^&Tg$6=a}00000NkvXXu0mjfrE(Kf literal 1020 zcmVXoD9w(Hu{lZB`|dhwFti16G@~4>8FEIaU>C z%3{p%%-M``fjxhKM#u>d2BiAp<~Mc_Bh`i{xz>80shcD&M2kgs4k3}3D8M*5(B$G0 zYow>14gca=bYuJeoEM$es3;kXVnP4_0?|oCK~#90?VQ1Gn?MkT7gI0vX2c7m@e2ey zFHoh5)LSmTbBHkM$tTkzCya9Hp^D@e=yR5kI?T>4ERJpJME?hhGUT86y|EQBWOs!C z!{A&->Vn*P$Y ze4F8(>y~6XYhE8=T@wcx`(ETa2<^yo%j2Gj(>ZraBWhln~7|QUj zKE@w-go7I{YPZE;h5!Hn-YM#>yl^9SXT6NO<0R>hIZnj;J@wvQW@|++t3!>KD;j%i z!CnzJ)cd_oLme-pQMPK+y&7Jq7e>rbsw2`-1#xUOM`q%{EG{IUJbI6B_ohWWsTG9B0u00000008h`iC@3lv)_rWif6QE zMY4I=YscR`{nO7GN!}XOlySTKMNl@5ep*@#3q@hl(|VPnEck?sbkj_|^U@*~ zon&h|0xwg?^Gs6GiEgr7W?TUP0000001)E$JqhIZUl#e(mPViMHU0M1QlX#%`IuYe z4?n1dyw&uNwtx1k-G#NAl4^To>!uDj^ba>YX}<^n0002+9*7UhZdpG_rj_zZyV7Ln z_g;?4 z*6;J5r(q3!`;G#~Hq1Y`ApigX0Kl;^uOB?&zB%UggS^M%8>StA=bLJ={lVlB_t9x7 q#e2Tv8Jhb){vP&PnF;^^=fGcr=ymb_U;_aF0000