From 17354e5109847bc05d320c0966a060d1b9c1ba04 Mon Sep 17 00:00:00 2001 From: Alberyk Date: Mon, 5 Jun 2017 18:43:45 -0300 Subject: [PATCH] Ports body markings from polaris (#2607) Ports the body marking system from polaris. And I think I got all the SQL related procs. --- SQL/migrate/V005__Body_markings.sql | 7 + code/_helpers/global_lists.dm | 7 + code/game/dna/dna2.dm | 7 + code/game/dna/dna2_helpers.dm | 7 + .../preference_setup/general/03_body.dm | 44 +++++- code/modules/client/preferences.dm | 15 ++ .../mob/new_player/sprite_accessories.dm | 129 ++++++++++++++++++ code/modules/organs/organ_external.dm | 1 + code/modules/organs/organ_icon.dm | 21 ++- html/changelogs/alberky-PR-2607.yml | 6 + icons/mob/human_races/markings.dmi | Bin 0 -> 31124 bytes 11 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 SQL/migrate/V005__Body_markings.sql create mode 100644 html/changelogs/alberky-PR-2607.yml create mode 100644 icons/mob/human_races/markings.dmi diff --git a/SQL/migrate/V005__Body_markings.sql b/SQL/migrate/V005__Body_markings.sql new file mode 100644 index 00000000000..36a2a2ebb77 --- /dev/null +++ b/SQL/migrate/V005__Body_markings.sql @@ -0,0 +1,7 @@ +-- +-- Implemented in PR #2607. +-- Character body marking migration file +-- + +ALTER TABLE `ss13_characters` + ADD `body_markings` TEXT NULL DEFAULT NULL AFTER `organs_robotic`; diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index ad552101331..d1cfe21357e 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -46,6 +46,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() //Underwear var/global/list/underwear_m = list("White" = "m1", "Grey" = "m2", "Green" = "m3", "Blue" = "m4", "Black" = "m5", "Mankini" = "m6", "None") //Curse whoever made male/female underwear diffrent colours var/global/list/underwear_f = list("Red" = "f1", "White" = "f2", "Yellow" = "f3", "Blue" = "f4", "Black" = "f5", "Thong" = "f6", "Black Sports" = "f7","White Sports" = "f8","None") @@ -117,6 +118,12 @@ var/global/list/cloaking_devices = list() else facial_hair_styles_male_list += H.name facial_hair_styles_female_list += H.name + + //Body markings + paths = subtypesof(/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 = subtypesof(/datum/surgery_step) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index e30de18f4e2..421da3b6b60 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.limb_name] = 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 19b32fef2ea..cee13661d66 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -163,6 +163,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/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 33ad44ecfa1..caa084cf61e 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -25,6 +25,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/save_character(var/savefile/S) S["species"] << pref.species @@ -47,6 +48,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/gather_load_query() return list("ss13_characters" = list("vars" = list("species", @@ -60,7 +62,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "b_type", "disabilities", "organs_data" = "organ_data", - "organs_robotic" = "rlimb_data"), + "organs_robotic" = "rlimb_data", + "body_markings"), "args" = list("id"))) /datum/category_item/player_setup_item/general/body/gather_load_parameters() @@ -79,6 +82,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "disabilities", "organs_data", "organs_robotic", + "body_markings", "id" = 1, "ckey" = 1)) @@ -95,6 +99,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O "disabilities" = pref.disabilities, "organs_data" = list2params(pref.organ_data), "organs_robotic"= list2params(pref.rlimb_data), + "body_markings" = json_encode(pref.body_markings), "id" = pref.current_character, "ckey" = pref.client.ckey) @@ -131,6 +136,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data = params2list(pref.organ_data) if (pref.rlimb_data) pref.rlimb_data = params2list(pref.rlimb_data) + if (pref.body_markings) + pref.body_markings = json_decode(pref.body_markings) pref.r_hair = sanitize_integer(pref.r_hair, 0, 255, initial(pref.r_hair)) pref.g_hair = sanitize_integer(pref.g_hair, 0, 255, initial(pref.g_hair)) @@ -154,6 +161,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data = list() if (!pref.rlimb_data || !islist(pref.rlimb_data)) pref.rlimb_data = list() + if (!pref.body_markings || !islist(pref.body_markings)) + pref.body_markings = list() /datum/category_item/player_setup_item/general/body/content(var/mob/user) pref.update_preview_icon() @@ -269,6 +278,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
Body Color
" . += "Change Color
__

" + . += "
Body Markings +
" + for(var/M in pref.body_markings) + . += "[M] - Color" + . += "
__
" + . += "
" + /datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag) return mob_species && (mob_species.appearance_flags & flag) @@ -350,6 +365,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.organ_data.Cut() pref.rlimb_data.Cut() + pref.body_markings.Cut() return TOPIC_REFRESH @@ -437,6 +453,32 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.f_style = new_f_style return TOPIC_REFRESH + 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 + + else if(href_list["marking_remove"]) + var/M = href_list["marking_remove"] + pref.body_markings -= M + return TOPIC_REFRESH + + 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 + else if(href_list["limbs"]) var/list/acceptable_organ_input = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") var/limb_name = input(user, "Which limb do you want to change?") as null|anything in acceptable_organ_input diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1e3369e1149..5592e4b343c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -104,6 +104,7 @@ datum/preferences // will probably not be able to do this for head and torso ;) var/list/organ_data = list() var/list/rlimb_data = list() + var/list/body_markings = list() // "name" = "#rgbcolor" var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/list/flavor_texts = list() @@ -388,6 +389,19 @@ datum/preferences else if(status == "mechanical") I.robotize() + 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 body_markings) + var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M] + var/mark_color = "[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) + character.underwear = underwear character.undershirt = undershirt @@ -545,6 +559,7 @@ datum/preferences organ_data = list() rlimb_data = list() + body_markings = list() player_alt_titles = new() flavor_texts = list() diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 27ca3bd7874..1744f5f453f 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -972,3 +972,132 @@ icon_state = "default" icon = 'icons/mob/human_races/r_skrell.dmi' species_allowed = list("Skrell") + +/* +//////////////////////////// +/ =--------------------= / +/ == Body Markings == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/marking + icon = 'icons/mob/human_races/markings.dmi' + do_colouration = 1 //Almost all of them have it, COLOR_ADD + + species_allowed = list() + + var/body_parts = list() //A list of bodyparts this covers, TODO: port defines for organs someday + + tiger_stripes + name = "Tiger Stripes (Tajara)" + icon_state = "tiger" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","chest","groin") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + taj_paw_socks + name = "Socks Coloration (Tajara)" + icon_state = "taj_pawsocks" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + una_paw_socks + name = "Socks Coloration (Unathi)" + icon_state = "una_pawsocks" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand") + species_allowed = list("Unathi") + + paw_socks + name = "Socks Coloration (Generic)" + icon_state = "pawsocks" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + + paw_socks_belly + name = "Socks,Belly Coloration (Generic)" + icon_state = "pawsocksbelly" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand","groin","chest") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + + belly_hands_feet + name = "Hands,Feet,Belly Color (Minor)" + icon_state = "bellyhandsfeetsmall" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand","groin","chest") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + + hands_feet_belly_full + name = "Hands,Feet,Belly Color (Major)" + icon_state = "bellyhandsfeet" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand","groin","chest") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + + patches + name = "Color Patches" + icon_state = "patches" + body_parts = list("l_foot","r_foot","l_leg","r_leg","l_arm","r_arm","l_hand","r_hand","chest","groin") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + patchesface + name = "Color Patches (Face)" + icon_state = "patchesface" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + tigerhead + name = "Tiger Stripes (Head, Minor)" + icon_state = "tigerhead" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + tigerface + name = "Tiger Stripes (Head, Major)" + icon_state = "tigerface" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + backstripe + name = "Back Stripe" + icon_state = "backstripe" + body_parts = list("chest") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara", "Unathi") + + taj_nose + name = "Nose Color" + icon_state = "taj_nose" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + taj_muzzle + name = "Muzzle Color" + icon_state = "taj_muzzle" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + taj_face + name = "Cheeks Color" + icon_state = "taj_face" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + taj_all + name = "All Tajara Head" + icon_state = "taj_all" + body_parts = list("head") + species_allowed = list("Tajara", "Zhan-Khazan Tajara", "M'sai Tajara") + + una_face + name = "Face Color" + icon_state = "una_face" + body_parts = list("head") + species_allowed = list("Unathi") + + una_facelow + name = "Face Color Low" + icon_state = "una_facelow" + body_parts = list("head") + species_allowed = list("Unathi") + + una_scutes + name = "Scutes" + icon_state = "una_scutes" + body_parts = list("chest") + species_allowed = list("Unathi") diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 2fc97926547..de404b15d6f 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -58,6 +58,7 @@ var/can_stand var/body_hair var/painted = 0 + var/list/markings = list() // Markings (body_markings) to apply to the icon /obj/item/organ/external/Destroy() if(parent && parent.children) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 8812db6fb9d..d9d64244a27 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -8,7 +8,7 @@ if(organ.children && organ.children.len) for(var/obj/item/organ/external/child in organ.children) add_overlay(child.mob_icon) - + overlays |= organ.mob_icon /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) @@ -39,13 +39,13 @@ /obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human) ..() - var/obj/item/organ/eyes/eyes + var/obj/item/organ/eyes/eyes if (species.vision_organ) eyes = owner.internal_organs_by_name[species.vision_organ] else eyes = owner.internal_organs_by_name["eyes"] - if(eyes) + if(eyes) eyes.update_colour() /obj/item/organ/external/head/removed() @@ -73,6 +73,13 @@ overlays |= lip_icon mob_icon.Blend(lip_icon, ICON_OVERLAY) + 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]-[limb_name]") + 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 + 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() in facial_hair_style.species_allowed)) @@ -137,6 +144,14 @@ else if(s_col && s_col.len >= 3) mob_icon.Blend(rgb(s_col[1], s_col[2], s_col[3]), ICON_ADD) + //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]-[limb_name]") + 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 + if(body_hair && islist(h_col) && h_col.len >= 3) var/list/limb_icon_cache = SSicon_cache.limb_icon_cache var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" diff --git a/html/changelogs/alberky-PR-2607.yml b/html/changelogs/alberky-PR-2607.yml new file mode 100644 index 00000000000..12991ab8ef7 --- /dev/null +++ b/html/changelogs/alberky-PR-2607.yml @@ -0,0 +1,6 @@ +author: Alberyk + +delete-after: True + +changes: + - rscadd: "Added a body marking system, ported from Polaris." diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi new file mode 100644 index 0000000000000000000000000000000000000000..677b63d85c36b566a76a5c4fbfee84ec739a60e2 GIT binary patch literal 31124 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 UpBkUf*2+^;zO3}_yqV8`0rhxAJOBUy literal 0 HcmV?d00001