From 52130160dbf79634d24e33fc8cafbd1888358644 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 26 Mar 2017 19:36:34 -0400 Subject: [PATCH] Adds Body Markings So you can customize your character with tattoos or fur colors for Taj or whatever. I'll let Anewbe work out what he wants to whitelist other than what I did already. The icons are sliced up with the HumanScissors program I wrote, so they are per-organ. So, lop off a limb, put it on someone else, they have the tattoos and whatnot. It's part of DNA so it comes with when cloning. They are defined in the normal sprite_accessories file and the icons are all in markings.dm in the format of "markingname-organtag" so if you have a marking that spans both arms and torso you need "thatone-torso", "thatone-l_arm", "thatone-r_arm" icon states. --- code/_helpers/global_lists.dm | 7 + code/game/dna/dna2.dm | 7 + code/game/dna/dna2_helpers.dm | 7 + .../preference_setup/general/01_basic.dm | 6 +- .../preference_setup/general/03_body.dm | 53 ++++- .../preference_setup/preference_setup.dm | 15 +- code/modules/client/preferences.dm | 2 + .../mob/living/carbon/human/update_icons.dm | 2 + .../mob/new_player/sprite_accessories.dm | 191 ++++++++++++++++++ code/modules/organs/organ_external.dm | 1 + code/modules/organs/organ_icon.dm | 18 ++ icons/mob/human_races/markings.dmi | Bin 0 -> 27872 bytes 12 files changed, 300 insertions(+), 9 deletions(-) create mode 100644 icons/mob/human_races/markings.dmi diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index fcc2d0c91b..72937092c4 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -51,6 +51,7 @@ var/global/list/facial_hair_styles_list = list() //stores /datum/sprite_accessor var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused +var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name //Underwear var/datum/category_collection/underwear/global_underwear = new() @@ -141,6 +142,12 @@ var/global/list/string_slot_flags = list( facial_hair_styles_male_list += H.name facial_hair_styles_female_list += H.name + //Body markings - Initialise all /datum/sprite_accessory/marking into an list indexed by marking name + paths = typesof(/datum/sprite_accessory/marking) - /datum/sprite_accessory/marking + for(var/path in paths) + var/datum/sprite_accessory/marking/M = new path() + body_marking_styles_list[M.name] = M + //Surgery Steps - Initialize all /datum/surgery_step into a list paths = typesof(/datum/surgery_step)-/datum/surgery_step for(var/T in paths) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index e30de18f4e..e80dcb7227 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -84,6 +84,7 @@ var/global/list/datum/dna/gene/dna_genes[0] // New stuff var/species = "Human" + var/list/body_markings = list() // Make a copy of this strand. // USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION! @@ -93,6 +94,7 @@ var/global/list/datum/dna/gene/dna_genes[0] new_dna.b_type=b_type new_dna.real_name=real_name new_dna.species=species + new_dna.body_markings=body_markings.Copy() for(var/b=1;b<=DNA_SE_LENGTH;b++) new_dna.SE[b]=SE[b] if(b<=DNA_UI_LENGTH) @@ -152,6 +154,11 @@ var/global/list/datum/dna/gene/dna_genes[0] SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1) SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len,1) + body_markings.Cut() + for(var/obj/item/organ/external/E in character.organs) + if(E.markings.len) + body_markings[E.organ_tag] = E.markings.Copy() + UpdateUI() // Set a DNA UI block's raw value. diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 98acc1d335..2287d3477c 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -156,6 +156,13 @@ else H.gender = MALE + //Body markings + for(var/tag in dna.body_markings) + var/obj/item/organ/external/E = H.organs_by_name[tag] + if(E) + var/list/marklist = dna.body_markings[tag] + E.markings = marklist.Copy() + //Hair var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len) if((0 < hair) && (hair <= hair_styles_list.len)) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 050ec31638..23b4245750 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -130,7 +130,11 @@ datum/preferences/proc/set_biological_gender(var/gender) return ..() /datum/category_item/player_setup_item/general/basic/proc/get_genders() - var/datum/species/S = all_species[pref.species] + var/datum/species/S + if(pref.species) + S = all_species[pref.species] + else + S = all_species["Human"] var/list/possible_genders = S.genders if(!pref.organ_data || pref.organ_data[BP_TORSO] != "cyborg") return possible_genders diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 079713c7ea..3e239badc7 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -28,6 +28,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["disabilities"] >> pref.disabilities S["organ_data"] >> pref.organ_data S["rlimb_data"] >> pref.rlimb_data + S["body_markings"] >> pref.body_markings pref.preview_icon = null /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) @@ -51,6 +52,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["disabilities"] << pref.disabilities S["organ_data"] << pref.organ_data S["rlimb_data"] << pref.rlimb_data + S["body_markings"] << pref.body_markings /datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S) if(!pref.species || !(pref.species in playable_species)) @@ -75,6 +77,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities)) if(!pref.organ_data) pref.organ_data = list() if(!pref.rlimb_data) pref.rlimb_data = list() + if(!pref.body_markings) pref.body_markings = list() + else pref.body_markings &= body_marking_styles_list // Moved from /datum/preferences/proc/copy_to() /datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character) @@ -123,6 +127,20 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O I.robotize() else if(status == "digital") I.digitize() + + for(var/N in character.organs_by_name) + var/obj/item/organ/external/O = character.organs_by_name[N] + O.markings.Cut() + + for(var/M in pref.body_markings) + var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M] + var/mark_color = "[pref.body_markings[M]]" + + for(var/BP in mark_datum.body_parts) + var/obj/item/organ/external/O = character.organs_by_name[BP] + if(O) + O.markings[M] = list("color" = mark_color, "datum" = mark_datum) + return /datum/category_item/player_setup_item/general/body/content(var/mob/user) @@ -251,6 +269,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(has_flag(mob_species, HAS_SKIN_COLOR)) . += "
Body Color
" . += "Change Color
__

" + + . += "
Body Markings +
" + for(var/M in pref.body_markings) + . += "[M] - Color" + . += "
__
" + . += "
" + . = jointext(.,null) /datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag) @@ -289,7 +314,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!(pref.biological_gender in mob_species.genders)) pref.set_biological_gender(mob_species.genders[1]) - //grab one of the valid hair styles for the newly chosen species var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) @@ -334,6 +358,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.s_tone = 0 reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case. + pref.body_markings.Cut() // Basically same as above. var/min_age = get_min_age() var/max_age = get_max_age() @@ -421,6 +446,32 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.f_style = new_f_style return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["marking_style"]) + var/list/usable_markings = pref.body_markings.Copy() ^ body_marking_styles_list.Copy() + for(var/M in usable_markings) + var/datum/sprite_accessory/S = usable_markings[M] + if(!S.species_allowed.len) + continue + else if(!(pref.species in S.species_allowed)) + usable_markings -= M + + var/new_marking = input(user, "Choose a body marking:", "Character Preference") as null|anything in usable_markings + if(new_marking && CanUseTopic(user)) + pref.body_markings[new_marking] = "#000000" //New markings start black + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["marking_remove"]) + var/M = href_list["marking_remove"] + pref.body_markings -= M + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["marking_color"]) + var/M = href_list["marking_color"] + var/mark_color = input(user, "Choose the [M] color: ", "Character Preference", pref.body_markings[M]) as color|null + if(mark_color && CanUseTopic(user)) + pref.body_markings[M] = "[mark_color]" + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["reset_limbs"]) reset_limbs() return TOPIC_REFRESH_UPDATE_PREVIEW diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index f72ff0645c..b3c253647e 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -263,13 +263,14 @@ /datum/category_item/player_setup_item/proc/get_FBP_type() if(!is_FBP()) return 0 // Not a robot. - switch(pref.organ_data["brain"]) - if("assisted") - return PREF_FBP_CYBORG - if("mechanical") - return PREF_FBP_POSI - if("digital") - return PREF_FBP_SOFTWARE + if(O_BRAIN in pref.organ_data) + switch(pref.organ_data[O_BRAIN]) + if("assisted") + return PREF_FBP_CYBORG + if("mechanical") + return PREF_FBP_POSI + if("digital") + return PREF_FBP_SOFTWARE return 0 //Something went wrong! /datum/category_item/player_setup_item/proc/get_min_age() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 710c072e94..d1d51c52db 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -88,6 +88,8 @@ datum/preferences var/list/rlimb_data = list() var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" + var/list/body_markings = list() // "name" = "#rgbcolor" + var/list/flavor_texts = list() var/list/flavour_texts_robot = list() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 2a29d2d1d9..aaff51c0b7 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -276,6 +276,8 @@ var/global/list/damage_icon_parts = list() icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" else icon_key += "#000000" + for(var/M in part.markings) + icon_key += "[M][part.markings[M]["color"]]" icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 9e2cdf02e0..2b40db75aa 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -973,6 +973,197 @@ species_allowed = list("Teshari") gender = NEUTER +/* +//////////////////////////// +/ =--------------------= / +/ == Body Markings == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/marking + icon = 'icons/mob/human_races/markings.dmi' + do_colouration = 1 //Almost all of them have it, COLOR_ADD + + //Empty list is unrestricted. Should only restrict the ones that make NO SENSE on other species, + //like Tajara inner-ear coloring overlay stuff. + species_allowed = list() + + var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines + //Reminder: 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_TORSO,BP_GROIN,BP_HEAD + + tat_heart + name = "Tattoo (Heart, Torso)" + icon_state = "tat_heart" + body_parts = list(BP_TORSO) + + tat_hive + name = "Tattoo (Hive, Back)" + icon_state = "tat_hive" + body_parts = list(BP_TORSO) + + tat_nightling + name = "Tattoo (Nightling, Back)" + icon_state = "tat_nightling" + body_parts = list(BP_TORSO) + + tat_campbell + name = "Tattoo (Campbell, R.Arm)" + icon_state = "tat_campbell" + body_parts = list(BP_R_ARM) + + tat_tiger + name = "Tattoo (Tiger Stripes, Body)" + icon_state = "tat_campbell" + 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_TORSO,BP_GROIN) + + taj_paw_socks + name = "Socks Coloration (Taj)" + 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") + + una_paw_socks + name = "Socks Coloration (Una)" + 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") + + paw_socks + name = "Socks Coloration (Generic)" + icon_state = "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) + + paw_socks_belly + name = "Socks+Belly Coloration (Generic)" + icon_state = "pawsocksbelly" + 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_TORSO) + + 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_TORSO) + + hands_feet_belly_full + name = "Hands/Feet/Belly Color (Major)" + icon_state = "bellyhandsfeet" + 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_TORSO) + + 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_TORSO,BP_GROIN) + + patchesface + name = "Color Patches (Face)" + icon_state = "patchesface" + body_parts = list(BP_HEAD) + + 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_TORSO,BP_GROIN) + + bandsface + name = "Color Bands (Face)" + icon_state = "bandsface" + body_parts = list(BP_HEAD) + + tiger_stripes + name = "Tiger Stripes" + 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_TORSO,BP_GROIN) + species_allowed = list("Tajara") //There's a tattoo for non-cats + + tigerhead + name = "Tiger Stripes (Head, Minor)" + icon_state = "tigerhead" + body_parts = list(BP_HEAD) + + tigerface + name = "Tiger Stripes (Head, Major)" + icon_state = "tigerface" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") //There's a tattoo for non-cats + + backstripe + name = "Back Stripe" + icon_state = "backstripe" + body_parts = list(BP_TORSO) + + //Taj specific stuff + taj_belly + name = "Belly Fur (Taj)" + icon_state = "taj_belly" + body_parts = list(BP_TORSO) + species_allowed = list("Tajara") + + taj_bellyfull + name = "Belly Fur Wide (Taj)" + icon_state = "taj_bellyfull" + body_parts = list(BP_TORSO) + species_allowed = list("Tajara") + + taj_earsout + name = "Outer Ear (Taj)" + icon_state = "taj_earsout" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + taj_earsin + name = "Inner Ear (Taj)" + icon_state = "taj_earsin" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + taj_nose + name = "Nose Color (Taj)" + icon_state = "taj_nose" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + taj_crest + name = "Chest Fur Crest (Taj)" + icon_state = "taj_crest" + body_parts = list(BP_TORSO) + species_allowed = list("Tajara") + + taj_muzzle + name = "Muzzle Color (Taj)" + icon_state = "taj_muzzle" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + taj_face + name = "Cheeks Color (Taj)" + icon_state = "taj_face" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + taj_all + name = "All Taj Head (Taj)" + icon_state = "taj_all" + body_parts = list(BP_HEAD) + species_allowed = list("Tajara") + + //Una specific stuff + una_face + name = "Face Color (Una)" + icon_state = "una_face" + body_parts = list(BP_HEAD) + species_allowed = list("Unathi") + + una_facelow + name = "Face Color Low (Una)" + icon_state = "una_facelow" + body_parts = list(BP_HEAD) + species_allowed = list("Unathi") + + una_scutes + name = "Scutes (Una)" + icon_state = "una_scutes" + body_parts = list(BP_TORSO) + species_allowed = list("Unathi") + //skin styles - WIP //going to have to re-integrate this with surgery //let the icon_state hold an icon preview for now diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index b746f1be6f..2d6be580c4 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -39,6 +39,7 @@ var/list/h_col // hair colour var/body_hair // Icon blend for body hair if any. var/mob/living/applied_pressure + var/list/markings = list() // Markings (body_markings) to apply to the icon // Wound and structural data. var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 0fd12ad9ef..9a8958e6a5 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -65,6 +65,15 @@ var/global/list/limb_icon_cache = list() overlays |= lip_icon mob_icon.Blend(lip_icon, ICON_OVERLAY) + //Head markings, duplicated (sadly) below. + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], ICON_ADD) + overlays |= mark_s //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + if(owner.f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) @@ -114,6 +123,15 @@ var/global/list/limb_icon_cache = list() mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]") apply_colouration(mob_icon) + //Body markings, does not include head, duplicated (sadly) above. + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], ICON_ADD) + overlays |= mark_s //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + if(body_hair && islist(h_col) && h_col.len >= 3) var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" if(!limb_icon_cache[cache_key]) diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e1f77c077e465170277a259d4dff0e5fc4db617e GIT binary patch literal 27872 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