diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 9719157d4d..0a17f0d1df 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -14,7 +14,6 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) - init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 92cf7050e0..02af6fab79 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -64,8 +64,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) if(!GLOB.legs_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) - if(!GLOB.body_markings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list) if(!GLOB.wings_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) if(!GLOB.deco_wings_list.len) @@ -115,15 +113,6 @@ continue if(!S.ckeys_allowed) snowflake_mam_tails_list[S.name] = mtpath - var/list/snowflake_markings_list = list() - for(var/mmpath in GLOB.mam_body_markings_list) - var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath] - if(istype(instance, /datum/sprite_accessory)) - var/datum/sprite_accessory/S = instance - if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies)) - continue - if(!S.ckeys_allowed) - snowflake_markings_list[S.name] = mmpath var/list/snowflake_ears_list = list() for(var/mepath in GLOB.mam_ears_list) var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath] @@ -177,7 +166,6 @@ "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), - "body_markings" = pick(GLOB.body_markings_list), "legs" = pick("Plantigrade","Digitigrade"), "caps" = pick(GLOB.caps_list), "insect_wings" = pick(GLOB.insect_wings_list), @@ -187,7 +175,7 @@ "arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list), "arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list), "taur" = "None", - "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None", + "mam_body_markings" = list(), "mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None", "mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None", "mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None", diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f0a8a4e2c6..d94c677a42 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name //Socks GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name //Lizard Bits (all datum lists indexed by name) -GLOBAL_LIST_EMPTY(body_markings_list) GLOBAL_LIST_EMPTY(tails_list_lizard) GLOBAL_LIST_EMPTY(animated_tails_list_lizard) GLOBAL_LIST_EMPTY(snouts_list) @@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list( "frills" = GLOB.frills_list, "horns" = GLOB.horns_list, "ears" = GLOB.ears_list, - "body_markings" = GLOB.body_markings_list, "wings" = GLOB.wings_list, "wingsopen" = GLOB.wings_open_list, "deco_wings" = GLOB.deco_wings_list, @@ -299,7 +297,7 @@ GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages()) //locked parts are those that your picked species requires to have //unlocked parts are those that anyone can choose on customisation regardless //parts not in unlocked, but in all, are thus locked -GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) +GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns")) GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff")) //parts in either of the above two lists that require a second option that allows them to be coloured @@ -350,3 +348,8 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow" //list of eye types, corresponding to a respective left and right icon state for the set of eyes GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops")) + +//list linking bodypart bitflags to their actual names +GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm")) +// list linking bodypart names back to the bitflags +GLOBAL_LIST_INIT(bodypart_values, list("Head" = num2text(HEAD), "Chest" = num2text(CHEST), "Left Leg" = num2text(LEG_LEFT), "Right Leg" = num2text(LEG_RIGHT), "Left Arm" = num2text(ARM_LEFT), "Right Arm" = num2text(ARM_RIGHT))) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 0679d9ffac..9a74b63040 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -41,7 +41,6 @@ H.dna.features["horns"] = pick(GLOB.horns_list) H.dna.features["frills"] = pick(GLOB.frills_list) H.dna.features["spines"] = pick(GLOB.spines_list) - H.dna.features["body_markings"] = pick(GLOB.body_markings_list) H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list) H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list) H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 81d267fcf1..251bcc72ad 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races @@ -514,7 +514,76 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" mutant_category = 0 + // rp marking selection + // assume you can only have mam markings or regular markings or none, never both + var/marking_type + if(parent.can_have_part("mam_body_markings")) + marking_type = "mam_body_markings" + if(marking_type) + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

[GLOB.all_mutant_parts[marking_type]]

" // give it the appropriate title for the type of marking + dat += "Add marking" + // list out the current markings you have + if(length(features[marking_type])) + dat += "" + var/list/markings = features[marking_type] + if(!islist(markings)) + // something went terribly wrong + markings = list() + var/list/reverse_markings = reverseList(markings) + for(var/list/marking_list in reverse_markings) + var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here + var/limb_value = marking_list[1] + var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to + var/color_marking_dat = "" + var/number_colors = 1 + var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]] + var/matrixed_sections = S.covered_limbs[actual_name] + if(S && matrixed_sections) + // if it has nothing initialize it to white + if(length(marking_list) == 2) + var/first = "#FFFFFF" + var/second = "#FFFFFF" + var/third = "#FFFFFF" + if(features["mcolor"]) + first = "#[features["mcolor"]]" + if(features["mcolor2"]) + second = "#[features["mcolor2"]]" + if(features["mcolor3"]) + third = "#[features["mcolor3"]]" + marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values + // index magic + var/primary_index = 1 + var/secondary_index = 2 + var/tertiary_index = 3 + switch(matrixed_sections) + if(MATRIX_GREEN) + primary_index = 2 + if(MATRIX_BLUE) + primary_index = 3 + if(MATRIX_RED_BLUE) + secondary_index = 2 + if(MATRIX_GREEN_BLUE) + primary_index = 2 + secondary_index = 3 + + // we know it has one matrixed section at minimum + color_marking_dat += "   " + // if it has a second section, add it + if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL) + color_marking_dat += "   " + number_colors = 2 + // if it has a third section, add it + if(matrixed_sections == MATRIX_ALL) + color_marking_dat += "   " + number_colors = 3 + color_marking_dat += " Change
" + dat += "" + dat += "
[marking_list[2]] - [actual_name] ˄ ˅ X [color_marking_dat]
" + for(var/mutant_part in GLOB.all_mutant_parts) + if(mutant_part == "mam_body_markings") + continue if(parent.can_have_part(mutant_part)) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -533,8 +602,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(accessory) if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future var/mutant_string = accessory.mutant_part_string - if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings)) - continue var/primary_feature = "[mutant_string]_primary" var/secondary_feature = "[mutant_string]_secondary" var/tertiary_feature = "[mutant_string]_tertiary" @@ -1726,13 +1793,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) pref_species = new newtype() //let's ensure that no weird shit happens on species swapping. custom_species = null - if(!parent.can_have_part("body_markings")) - features["body_markings"] = "None" if(!parent.can_have_part("mam_body_markings")) - features["mam_body_markings"] = "None" + features["mam_body_markings"] = list() if(parent.can_have_part("mam_body_markings")) if(features["mam_body_markings"] == "None") - features["mam_body_markings"] = "Plain" + features["mam_body_markings"] = list() if(parent.can_have_part("tail_lizard")) features["tail_lizard"] = "Smooth" if(pref_species.id == "felinid") @@ -1961,14 +2026,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_spines) features["spines"] = new_spines - if("body_markings") - var/new_body_markings - new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list - if(new_body_markings) - features["body_markings"] = new_body_markings - if(new_body_markings != "None") - features["mam_body_markings"] = "None" - if("legs") var/new_legs new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list @@ -2088,26 +2145,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_ears) features["mam_ears"] = new_ears - if("mam_body_markings") - var/list/snowflake_markings_list = list() - for(var/path in GLOB.mam_body_markings_list) - var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path] - if(istype(instance, /datum/sprite_accessory)) - var/datum/sprite_accessory/S = instance - if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id)) - continue - if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey))) - snowflake_markings_list[S.name] = path - var/new_mam_body_markings - new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list - if(new_mam_body_markings) - features["mam_body_markings"] = new_mam_body_markings - if(new_mam_body_markings != "None") - features["body_markings"] = "None" - else if(new_mam_body_markings == "None") - features["mam_body_markings"] = "Plain" - features["body_markings"] = "None" - //Xeno Bodyparts if("xenohead")//Head or caste type var/new_head @@ -2133,7 +2170,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["xenodorsal"] = new_dors //every single primary/secondary/tertiary colouring done at once - if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") + if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary") var/the_feature = features[href_list["preference"]] if(!the_feature) features[href_list["preference"]] = "FFFFFF" @@ -2390,6 +2427,111 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids if(selected_body_sprite) chosen_limb_id = selected_body_sprite //this gets sanitized before loading + + if("marking_down") + // move the specified marking down + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type] && index != length(features[marking_type])) + var/index_down = index + 1 + var/markings = features[marking_type] + var/first_marking = markings[index] + var/second_marking = markings[index_down] + markings[index] = second_marking + markings[index_down] = first_marking + + if("marking_up") + // move the specified marking up + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type] && index != 1) + var/index_up = index - 1 + var/markings = features[marking_type] + var/first_marking = markings[index] + var/second_marking = markings[index_up] + markings[index] = second_marking + markings[index_up] = first_marking + + if("marking_remove") + // move the specified marking up + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type]) + // because linters are just absolutely awful: + var/list/L = features[marking_type] + L.Cut(index, index + 1) + + if("marking_add") + // add a marking + var/marking_type = href_list["marking_type"] + if(marking_type && features[marking_type]) + var/selected_limb = input(user, "Choose the limb to apply to.", "Character Preference") as null|anything in list("Head", "Chest", "Left Arm", "Right Arm", "Left Leg", "Right Leg", "All") + if(selected_limb) + var/list/marking_list = GLOB.mam_body_markings_list + var/list/snowflake_markings_list = list() + for(var/path in marking_list) + var/datum/sprite_accessory/S = marking_list[path] + if(istype(S)) + if(istype(S, /datum/sprite_accessory/mam_body_markings)) + var/datum/sprite_accessory/mam_body_markings/marking = S + if(!(selected_limb in marking.covered_limbs) && selected_limb != "All") + continue + + if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey))) + snowflake_markings_list[S.name] = path + + var/selected_marking = input(user, "Select the marking to apply to the limb.") as null|anything in snowflake_markings_list + if(selected_marking) + if(selected_limb != "All") + var/limb_value = text2num(GLOB.bodypart_values[selected_limb]) + features[marking_type] += list(list(limb_value, selected_marking)) + else + var/datum/sprite_accessory/mam_body_markings/S = marking_list[selected_marking] + for(var/limb in S.covered_limbs) + var/limb_value = text2num(GLOB.bodypart_values[limb]) + features[marking_type] += list(list(limb_value, selected_marking)) + + if("marking_color") + var/index = text2num(href_list["marking_index"]) + var/marking_type = href_list["marking_type"] + if(index && marking_type && features[marking_type]) + // work out the input options to show the user + var/list/options = list("Primary") + var/number_colors = text2num(href_list["number_colors"]) + var/color_number = 1 // 1-3 which color are we editing + if(number_colors >= 2) + options += "Secondary" + if(number_colors == 3) + options += "Tertiary" + var/color_option = input(user, "Select the colour you wish to edit") as null|anything in options + if(color_option) + if(color_option == "Secondary") color_number = 2 + if(color_option == "Tertiary") color_number = 3 + // perform some magic on the color number + var/list/marking_list = features[marking_type][index] + var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]] + var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]] + if(color_number == 1) + switch(matrixed_sections) + if(MATRIX_GREEN) + color_number = 2 + if(MATRIX_BLUE) + color_number = 3 + else if(color_number == 2) + switch(matrixed_sections) + if(MATRIX_RED_BLUE) + color_number = 3 + if(MATRIX_GREEN_BLUE) + color_number = 3 + + var/color_list = features[marking_type][index][3] + var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null + if(new_marking_color) + var/temp_hsv = RGBtoHSV(new_marking_color) + if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin + color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]" + else + to_chat(user, "Invalid color. Your color is not bright enough.") else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9cd16592ce..45c5357c4d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -5,7 +5,7 @@ // You do not need to raise this if you are adding new values that have sane defaults. // Only raise this value when changing the meaning/format/name/layout of an existing value // where you would want the updater procs below to run -#define SAVEFILE_VERSION_MAX 51 +#define SAVEFILE_VERSION_MAX 52 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -283,7 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car qdel(temporary_gear_item) //it's double packed into a list because += will union the two lists contents - S["loadout"] = safe_json_encode(loadout_data) + S["loadout"] = loadout_data if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake S["unlockable_loadout"] = list() @@ -299,6 +299,47 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(S["species"] == SPECIES_HUMAN) features["legs"] = "Plantigrade" + if(current_version < 52) // rp markings means markings are now stored as a list, lizard markings now mam like the rest + var/marking_type + var/species_id = S["species"] + var/datum/species/actual_species = GLOB.species_datums[species_id] + + // convert lizard markings to lizard markings + if(species_id == SPECIES_LIZARD && S["feature_lizard_body_markings"]) + features["mam_body_markings"] = features["body_markings"] + + // convert mam body marking data to the new rp marking data + if(actual_species.mutant_bodyparts["mam_body_markings"] && S["feature_mam_body_markings"]) marking_type = "feature_mam_body_markings" + + if(marking_type) + var/old_marking_value = S[marking_type] + var/list/color_list = list("#FFFFFF","#FFFFFF","#FFFFFF") + + if(S["feature_mcolor"]) color_list[1] = "#" + S["feature_mcolor"] + if(S["feature_mcolor2"]) color_list[2] = "#" + S["feature_mcolor2"] + if(S["feature_mcolor3"]) color_list[3] = "#" + S["feature_mcolor3"] + + var/list/marking_list = list() + for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD)) + var/list/copied_color_list = color_list.Copy() + var/datum/sprite_accessory/mam_body_markings/mam_marking = GLOB.mam_body_markings_list[old_marking_value] + var/part_name = GLOB.bodypart_names[num2text(part)] + if(length(mam_marking.covered_limbs) && mam_marking.covered_limbs[part_name]) + var/matrixed_sections = mam_marking.covered_limbs[part_name] + // just trust me this is fine + switch(matrixed_sections) + if(MATRIX_GREEN) + copied_color_list[1] = copied_color_list[2] + if(MATRIX_BLUE) + copied_color_list[1] = copied_color_list[3] + if(MATRIX_RED_BLUE) + copied_color_list[2] = copied_color_list[3] + if(MATRIX_GREEN_BLUE) + copied_color_list[1] = copied_color_list[2] + copied_color_list[2] = copied_color_list[3] + marking_list += list(list(part, old_marking_value, copied_color_list)) + features["mam_body_markings"] = marking_list + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") if(!ckey) return @@ -583,7 +624,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE - features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) S.cd = "/" if(!slot) @@ -653,7 +694,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_lizard_horns"] >> features["horns"] S["feature_lizard_frills"] >> features["frills"] S["feature_lizard_spines"] >> features["spines"] - S["feature_lizard_body_markings"] >> features["body_markings"] S["feature_lizard_legs"] >> features["legs"] S["feature_human_tail"] >> features["tail_human"] S["feature_human_ears"] >> features["ears"] @@ -722,7 +762,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"] S["feature_mcolor2"] >> features["mcolor2"] S["feature_mcolor3"] >> features["mcolor3"] - S["feature_mam_body_markings"] >> features["mam_body_markings"] + // note safe json decode will runtime the first time it migrates but this is fine and it solves itself don't worry about it if you see it error + features["mam_body_markings"] = safe_json_decode(S["feature_mam_body_markings"]) S["feature_mam_tail"] >> features["mam_tail"] S["feature_mam_ears"] >> features["mam_ears"] S["feature_mam_tail_animated"] >> features["mam_tail_animated"] @@ -852,7 +893,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list) features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list) features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list) - features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list) features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade") features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None") features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list) @@ -1021,7 +1061,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_human_ears"] , features["ears"]) WRITE_FILE(S["feature_lizard_frills"] , features["frills"]) WRITE_FILE(S["feature_lizard_spines"] , features["spines"]) - WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"]) WRITE_FILE(S["feature_lizard_legs"] , features["legs"]) WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"]) WRITE_FILE(S["feature_horns_color"] , features["horns_color"]) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 48e8a4c338..acceb331ab 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -994,7 +994,6 @@ H.dna.features["wings"] = "None" H.dna.features["frills"] = "None" H.dna.features["spines"] = "Long" - H.dna.features["body_markings"] = "Dark Tiger Body" H.dna.features["legs"] = "Digitigrade" H.dna.features["taur_body"] = "None" H.left_eye_color = "fee5a3" diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index d198140c5f..a9233938ab 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -54,6 +54,8 @@ mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE, preference_source = parent) + mannequin.regenerate_icons() + COMPILE_OVERLAYS(mannequin) parent.show_character_previews(new /mutable_appearance(mannequin)) unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm index f58788d9af..016b12d8ec 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm @@ -12,6 +12,7 @@ name = "DataShark" icon_state = "datashark" ckeys_allowed = list("rubyflamewing") + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) //Sabresune /datum/sprite_accessory/ears/mam_ears/sabresune @@ -39,6 +40,7 @@ name = "Sabresune" icon_state = "sabresune" ckeys_allowed = list("poojawa") + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) //Lunasune /datum/sprite_accessory/ears/mam_ears/lunasune diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm index bc6c4899dd..148af35247 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm @@ -1,39 +1,3 @@ -/****************************************** -************* Lizard Markings ************* -*******************************************/ - -/datum/sprite_accessory/body_markings - icon = 'icons/mob/mutant_bodyparts.dmi' - relevant_layers = list(BODY_ADJ_LAYER) - mutant_part_string = "body_markings" - -/datum/sprite_accessory/body_markings/none - name = "None" - icon_state = "none" - relevant_layers = null - -/datum/sprite_accessory/body_markings/dtiger - name = "Dark Tiger Body" - icon_state = "dtiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/guilmon - name = "Guilmon" - icon_state = "guilmon" - color_src = MATRIXED - icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' - matrixed_sections = MATRIX_ALL - -/datum/sprite_accessory/body_markings/ltiger - name = "Light Tiger Body" - icon_state = "ltiger" - gender_specific = 1 - -/datum/sprite_accessory/body_markings/lbelly - name = "Light Belly" - icon_state = "lbelly" - gender_specific = 1 - /****************************************** ************ Furry Markings *************** *******************************************/ @@ -49,7 +13,8 @@ gender_specific = 0 icon = 'modular_citadel/icons/mob/mam_markings.dmi' recommended_species = list("mammal", "xeno", "slimeperson", "podweak") - matrixed_sections = MATRIX_ALL + matrixed_sections = MATRIX_ALL // this value is used if there is no value in covered_limbs, don't rely on it, it's a backup value + var/list/covered_limbs = list("Head", "Chest", "Left Leg", "Right Leg", "Left Arm", "Right Arm") /datum/sprite_accessory/mam_body_markings/none name = "None" @@ -62,87 +27,107 @@ /datum/sprite_accessory/mam_body_markings/redpanda name = "Redpanda" icon_state = "redpanda" + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/bat name = "Bat" icon_state = "bat" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/bee name = "Bee" icon_state = "bee" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/belly name = "Belly" icon_state = "belly" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/bellyslim name = "Bellyslim" icon_state = "bellyslim" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/cow name = "Bovine" icon_state = "bovine" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/corgi name = "Corgi" icon_state = "corgi" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/corvid name = "Corvid" icon_state = "corvid" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/dalmation name = "Dalmation" icon_state = "dalmation" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/deer name = "Deer" icon_state = "deer" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/dog name = "Dog" icon_state = "dog" + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL) /datum/sprite_accessory/mam_body_markings/eevee name = "Eevee" icon_state = "eevee" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/fennec name = "Fennec" icon_state = "Fennec" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/fox name = "Fox" icon_state = "fox" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/frog name = "Frog" icon_state = "frog" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/goat name = "Goat" icon_state = "goat" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/handsfeet name = "Handsfeet" icon_state = "handsfeet" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/hawk name = "Hawk" icon_state = "hawk" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/husky name = "Husky" icon_state = "husky" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/hyena name = "Hyena" icon_state = "hyena" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/insect name = "Insect" @@ -152,78 +137,118 @@ /datum/sprite_accessory/mam_body_markings/lab name = "Lab" icon_state = "lab" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/orca name = "Orca" icon_state = "orca" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/otie name = "Otie" icon_state = "otie" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL) /datum/sprite_accessory/mam_body_markings/otter name = "Otter" icon_state = "otter" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/panther name = "Panther" icon_state = "panther" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/plain name = "Plain" icon_state = "plain" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/possum name = "Possum" icon_state = "possum" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/raccoon name = "Raccoon" icon_state = "raccoon" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/sergal name = "Sergal" icon_state = "sergal" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/pede name = "Scolipede" icon_state = "scolipede" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_GREEN, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/shark name = "Shark" icon_state = "shark" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN) /datum/sprite_accessory/mam_body_markings/shepherd name = "Shepherd" icon_state = "shepherd" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/skunk name = "Skunk" icon_state = "skunk" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/tajaran name = "Tajaran" icon_state = "tajaran" + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/tiger name = "Tiger" icon_state = "tiger" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/turian name = "Turian" icon_state = "turian" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /datum/sprite_accessory/mam_body_markings/wolf name = "Wolf" icon_state = "wolf" + covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE) /datum/sprite_accessory/mam_body_markings/xeno name = "Xeno" icon_state = "xeno" icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_BLUE, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN) + +// sticking old lizard markings here for now +/datum/sprite_accessory/mam_body_markings/dtiger + name = "Dark Tiger Body" + icon_state = "dtiger" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) + +/datum/sprite_accessory/mam_body_markings/guilmon + name = "Guilmon" + icon_state = "guilmon" + icon = 'modular_citadel/icons/mob/markings_notmammals.dmi' + covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_BLUE, "Right Leg" = MATRIX_BLUE, "Left Arm" = MATRIX_GREEN_BLUE, "Right Arm" = MATRIX_GREEN_BLUE) + +/datum/sprite_accessory/mam_body_markings/ltiger + name = "Light Tiger Body" + icon_state = "ltiger" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) + +/datum/sprite_accessory/mam_body_markings/lbelly + name = "Light Belly" + icon_state = "lbelly" + covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED) /****************************************** ************* Insect Markings ************* diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm index bc4d4dd00d..c7cd699ec9 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm @@ -32,20 +32,20 @@ icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs" icon_state = "synthlizpecs" - matrixed_sections = MATRIX_GREEN + covered_limbs = list("Chest" = MATRIX_GREEN) /datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Pecs Light" icon_state = "synthlizpecslight" - matrixed_sections = MATRIX_GREEN_BLUE + covered_limbs = list("Chest" = MATRIX_GREEN_BLUE) /datum/sprite_accessory/mam_body_markings/synthliz recommended_species = list("synthliz") icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi' name = "Synthetic Lizard - Plates" icon_state = "synthlizscutes" - matrixed_sections = MATRIX_GREEN + covered_limbs = list("Chest" = MATRIX_GREEN) //Synth tails /datum/sprite_accessory/tails/mam_tails/synthliz diff --git a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm index 328a557931..95cb9cca59 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -5,7 +5,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None", - "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") + "mam_body_markings" = list(), "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian") attack_verb = "claw" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index cfbb8c31c0..07fa78a88a 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -11,7 +11,7 @@ coldmod = 1.5 heatmod = 0.67 mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round", - "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", + "horns" = "None", "frills" = "None", "spines" = "None", "mam_body_markings" = list(), "legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 0fcafaa208..ed0fa9ae87 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -74,7 +74,7 @@ name = "Anthropomorphic Plant" id = SPECIES_POD_WEAK species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") + mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = list(), "taur" = "None", "legs" = "Normal Legs") limbs_id = SPECIES_POD light_nutrition_gain_factor = 3 light_bruteheal = -0.2 diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm index 9d5a700417..e9d9aa2d5b 100644 --- a/code/modules/mob/living/carbon/human/species_types/xeno.dm +++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm @@ -5,7 +5,7 @@ say_mod = "hisses" default_color = "00FF00" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") + mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = list(),"mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None") attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5f77d25eae..f18d768df3 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -729,11 +729,8 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if . += "-[BP.digitigrade_type]" if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" - if(BP.body_markings) - . += "-[BP.body_markings]" - if(length(BP.markings_color) && length(BP.markings_color[1])) - for(var/color in BP.markings_color[1]) - . += "-[color]" + if(BP.body_markings_list) + . += "-[safe_json_encode(BP.body_markings_list)]" if(BP.icon) . += "-[BP.icon]" else diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 38f53c93a5..168a12a2ef 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -47,10 +47,11 @@ var/species_color = "" var/mutation_color = "" var/no_update = 0 - var/body_markings = "" //for bodypart markings - var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi' + var/body_markings = "" //for bodypart markings, deprecated + var/list/body_markings_list // stores body markings as lists, with the first value being the name of the bodypart, the second value being the name of the marking, and the third being the colour + var/marking_value // combination of old aux_marking and body_marking variables as they were always set together to the same value + var/static/default_body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi' var/list/markings_color = list() - var/aux_marking var/digitigrade_type var/animal_origin = null //for nonhuman bodypart (e.g. monkey) @@ -614,6 +615,7 @@ //we inform the bodypart of the changes that happened to the owner, or give it the informations from a source mob. /obj/item/bodypart/proc/update_limb(dropping_limb, mob/living/carbon/source) + body_markings_list = list() var/mob/living/carbon/C if(source) C = source @@ -632,8 +634,7 @@ color_src = FALSE base_bp_icon = DEFAULT_BODYPART_ICON no_update = TRUE - body_markings = "husk" // reeee - aux_marking = "husk" + marking_value = "husk" if(no_update) return @@ -649,11 +650,7 @@ //body marking memes var/list/colorlist = list() - //var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING) colorlist.Cut() - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00") - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00") - //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00") colorlist += ReadRGB("[H.dna.features["mcolor"]]00") colorlist += ReadRGB("[H.dna.features["mcolor2"]]00") colorlist += ReadRGB("[H.dna.features["mcolor3"]]00") @@ -688,21 +685,31 @@ else digitigrade_type = null - if(S.mutant_bodyparts["mam_body_markings"]) - var/datum/sprite_accessory/Smark - Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]] - if(Smark) - body_markings_icon = Smark.icon - if(H.dna.features["mam_body_markings"] != "None") - body_markings = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) - aux_marking = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) - else - body_markings = "plain" - aux_marking = "plain" + if(S.mutant_bodyparts["mam_body_markings"]) // checks if the species can actually have body markings + // get all markings for this bodypart type + for(var/list/marking in H.dna.features["mam_body_markings"]) + // marking is a list containing bodypart type, bodymarking name, and then the colour (colour won't be used in v1) + if(marking[1] == body_part) + var/datum/sprite_accessory/Smark + Smark = GLOB.mam_body_markings_list[marking[2]] + var/body_markings_icon = default_body_markings_icon + if(Smark) + body_markings_icon = Smark.icon + var/marking_value = "" // combination of body and aux markings from old system + if(H.dna.features["mam_body_markings"] != "None") + marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"]) + else + marking_value = "plain" + var/list/color_values + if(length(marking) == 3) + color_values = marking[3] + else + color_values = list("#FFFFFF", "#FFFFFF", "#FFFFFF") + body_markings_list += list(list(body_markings_icon, marking_value, color_values)) + markings_color = list(colorlist) else - body_markings = null - aux_marking = null + marking_value = null if(S.override_bp_icon) base_bp_icon = S.override_bp_icon @@ -728,8 +735,7 @@ if(is_robotic_limb()) dmg_overlay_type = "robotic" if(is_robotic_limb(FALSE)) - body_markings = null - aux_marking = null + marking_value = null if(dropping_limb) no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner. @@ -765,17 +771,18 @@ . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) if(!isnull(body_markings) && is_organic_limb(FALSE)) - if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - . += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir) else - . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) - else - . += image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) var/list/aux = list() - var/image/marking var/list/auxmarking = list() . += limb @@ -795,6 +802,7 @@ if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST)) should_draw_gender = FALSE + var/list/markings_list = list() if(is_organic_limb()) limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi' if(should_draw_gender) @@ -808,21 +816,26 @@ limb.icon_state = "[species_id]_[body_zone]" // Body markings - if(!isnull(body_markings)) + if(length(body_markings_list)) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - - else if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) - else - marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)) + else + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)) + else + markings_list.Add(image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)) - . += marking + if(color_src && length(marking_list) == 3) + var/image/I = markings_list[length(markings_list)] + I.color = marking_list[3] + . += markings_list // Citadel End @@ -830,11 +843,14 @@ for(var/I in aux_icons) var/aux_layer = aux_icons[I] aux += image(limb.icon, "[species_id]_[I]", -aux_layer, image_dir) - if(!isnull(aux_marking)) - if(species_id == "husk") - auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) - else - auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir) + if(species_id == "husk") + auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) + else + for(var/marking_list in body_markings_list) + var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir) + if(length(marking_list) == 3) + aux_marking_image.color = marking_list[3] + auxmarking += aux_marking_image . += aux . += auxmarking @@ -849,31 +865,35 @@ for(var/I in aux_icons) var/aux_layer = aux_icons[I] aux += image(limb.icon, "[I]", -aux_layer, image_dir) - if(!isnull(aux_marking)) - if(species_id == "husk") - auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) - else - auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir) + if(species_id == "husk") + auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir) + else + for(var/marking_list in body_markings_list) + var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir) + if(length(marking_list) == 3) + aux_marking_image.color = marking_list[3] + auxmarking += aux_marking_image . += auxmarking . += aux - if(!isnull(body_markings)) + if(length(body_markings)) if(species_id == "husk") - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir) else if(species_id == "husk" && use_digitigrade) - marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - - else if(!use_digitigrade) - if(body_zone == BODY_ZONE_CHEST) - marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) - else - marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir) + . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) else - marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) - . += marking + for(var/list/marking_list in body_markings_list) + // marking stores icon and value for the specific bodypart + if(!use_digitigrade) + if(body_zone == BODY_ZONE_CHEST) + . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir) + else + . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) return - if(color_src) //TODO - add color matrix support for base species limbs + if(color_src) //TODO - add color matrix support for base species limbs (or dont because color matrixes suck) var/draw_color = mutation_color || species_color var/grayscale = FALSE if(!draw_color) @@ -891,20 +911,15 @@ if(grayscale) I.icon_state += "_g" I.color = draw_color - if(!isnull(aux_marking)) - for(var/a in auxmarking) - var/image/I = a - if(species_id == "husk") - I.color = "#141414" - else - I.color = list(markings_color) + for(var/a in auxmarking) + var/image/I = a + if(species_id == "husk") + I.color = "#141414" if(!isnull(body_markings)) if(species_id == "husk") - marking.color = "#141414" - else - marking.color = list(markings_color) - + for(var/image/marking in markings_list) + marking.color = "#141414" /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index ca047a93bd..7b93a3ff73 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm index bbd71d22e3..102ae41921 100644 --- a/modular_citadel/code/modules/client/preferences_savefile.dm +++ b/modular_citadel/code/modules/client/preferences_savefile.dm @@ -23,7 +23,7 @@ WRITE_FILE(S["feature_genitals_use_skintone"], features["genitals_use_skintone"]) WRITE_FILE(S["feature_mcolor2"], features["mcolor2"]) WRITE_FILE(S["feature_mcolor3"], features["mcolor3"]) - WRITE_FILE(S["feature_mam_body_markings"], features["mam_body_markings"]) + WRITE_FILE(S["feature_mam_body_markings"], safe_json_encode(features["mam_body_markings"])) WRITE_FILE(S["feature_mam_tail"], features["mam_tail"]) WRITE_FILE(S["feature_mam_ears"], features["mam_ears"]) WRITE_FILE(S["feature_mam_tail_animated"], features["mam_tail_animated"]) diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi index 3fe7f0060e..05cc1731fd 100644 Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ