diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 433877a9409..cd2b0bae284 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -37,6 +37,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/r_wing3 = 30 // Wing tertiary color var/g_wing3 = 30 // Wing tertiary color var/b_wing3 = 30 // Wing tertiary color + var/datum/browser/markings_subwindow = null // Sanitize ear/wing/tail styles /datum/preferences/proc/sanitize_body_styles() @@ -75,6 +76,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue .[instance.name] = instance +/datum/preferences/proc/mass_edit_marking_list(var/marking, var/change_on = TRUE, var/change_color = TRUE, var/marking_value = null, var/on = TRUE, var/color = "#000000") + var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[marking] + var/list/new_marking = marking_value||mark_datum.body_parts + for (var/NM in new_marking) + if (marking_value && !islist(new_marking[NM])) continue + new_marking[NM] = list("on" = (!change_on && marking_value) ? marking_value[NM]["on"] : on, "color" = (!change_color && marking_value) ? marking_value[NM]["color"] : color) + if (change_color) + new_marking["color"] = color + return new_marking + /datum/category_item/player_setup_item/general/body name = "Body" sort_order = 3 @@ -236,6 +247,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!pref.rlimb_data) pref.rlimb_data = list() if(!pref.body_markings) pref.body_markings = list() else pref.body_markings &= body_marking_styles_list + for (var/M in pref.body_markings) //VOREStation Edit + if (!islist(pref.body_markings[M])) + var/col = istext(pref.body_markings[M]) ? pref.body_markings[M] : "#000000" + pref.body_markings[M] = pref.mass_edit_marking_list(M,color=col) if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options)) pref.bgstate = "000" @@ -387,12 +402,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O for(var/M in pref.body_markings) priority += 1 var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M] - var/mark_color = "[pref.body_markings[M]]" + //var/mark_color = "[pref.body_markings[M]]" //VOREStation Edit 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, "priority" = priority) + O.markings[M] = list("color" = pref.body_markings[M][BP]["color"], "datum" = mark_datum, "priority" = priority, "on" = pref.body_markings[M][BP]["on"]) character.markings_len = priority var/list/last_descriptors = list() @@ -609,7 +624,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
Body Markings +
" . += "" for(var/M in pref.body_markings) - . += "" + . += "" . += "
[M][pref.body_markings.len > 1 ? "˄ ˅ mv " : ""]- Color[color_square(hex = pref.body_markings[M])]
[M][pref.body_markings.len > 1 ? "˄ ˅ mv " : ""]- Color[color_square(hex = pref.body_markings[M]["color"] ? pref.body_markings[M]["color"] : "#000000")] - Customize
" . += "
" @@ -850,7 +865,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O */ //VOREStation Removal End var/new_marking = tgui_input_list(user, "Choose a body marking:", "Character Preference", usable_markings) if(new_marking && CanUseTopic(user)) - pref.body_markings[new_marking] = "#000000" //New markings start black + pref.body_markings[new_marking] = pref.mass_edit_marking_list(new_marking) //New markings start black return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["marking_up"]) @@ -886,16 +901,69 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["marking_remove"]) var/M = href_list["marking_remove"] + winshow(user, "prefs_markings_subwindow", FALSE) 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 (isnull(pref.body_markings[M]["color"])) + if (tgui_alert(user, "You currently have customized marking colors. This will reset each bodypart's color. Are you sure you want to continue?","Reset Bodypart Colors",list("Yes","No")) == "No") + return TOPIC_NOACTION + var/mark_color = input(user, "Choose the [M] color: ", "Character Preference", pref.body_markings[M]["color"]) as color|null if(mark_color && CanUseTopic(user)) - pref.body_markings[M] = "[mark_color]" + pref.body_markings[M] = pref.mass_edit_marking_list(M,FALSE,TRUE,pref.body_markings[M],color="[mark_color]") return TOPIC_REFRESH_UPDATE_PREVIEW + else if (href_list["marking_submenu"]) + var/M = href_list["marking_submenu"] + markings_subwindow(user, M) + return TOPIC_NOACTION + + else if (href_list["toggle_all_marking_selection"]) + var/toggle = text2num(href_list["toggle"]) + var/marking = href_list["toggle_all_marking_selection"] + if (pref.body_markings.Find(marking) == 0) + winshow(user, "prefs_markings_subwindow", FALSE) + return TOPIC_NOACTION + pref.body_markings[marking] = pref.mass_edit_marking_list(marking,TRUE,FALSE,pref.body_markings[marking],on=toggle) + markings_subwindow(user, marking) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if (href_list["color_all_marking_selection"]) + var/marking = href_list["color_all_marking_selection"] + if (pref.body_markings.Find(marking) == 0) + winshow(user, "prefs_markings_subwindow", FALSE) + return TOPIC_NOACTION + var/mark_color = input(user, "Choose the [marking] color: ", "Character Preference", pref.body_markings[marking]["color"]) as color|null + if(mark_color && CanUseTopic(user)) + pref.body_markings[marking] = pref.mass_edit_marking_list(marking,FALSE,TRUE,pref.body_markings[marking],color="[mark_color]") + markings_subwindow(user, marking) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if (href_list["zone_marking_color"]) + var/marking = href_list["zone_marking_color"] + if (pref.body_markings.Find(marking) == 0) + winshow(user, "prefs_markings_subwindow", FALSE) + return TOPIC_NOACTION + var/zone = href_list["zone"] + pref.body_markings[marking]["color"] = null //turn off the color button outside the submenu + var/mark_color = input(user, "Choose the [marking] color: ", "Character Preference", pref.body_markings[marking]["color"]) as color|null + if(mark_color && CanUseTopic(user)) + pref.body_markings[marking][zone]["color"] = "[mark_color]" + markings_subwindow(user, marking) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if (href_list["zone_marking_toggle"]) + var/marking = href_list["zone_marking_toggle"] + if (pref.body_markings.Find(marking) == 0) + winshow(user, "prefs_markings_subwindow", FALSE) + return TOPIC_NOACTION + var/zone = href_list["zone"] + pref.body_markings[marking][zone]["on"] = text2num(href_list["toggle"]) + markings_subwindow(user, marking) + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["reset_limbs"]) reset_limbs() return TOPIC_REFRESH_UPDATE_PREVIEW @@ -1319,3 +1387,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O dat += "" user << browse(dat, "window=species;size=700x400") + +/datum/category_item/player_setup_item/general/body/proc/markings_subwindow(mob/user, marking) + var/static/list/part_to_string = list(BP_HEAD = "Head", BP_TORSO = "Upper Body", BP_GROIN = "Lower Body", BP_R_ARM = "Right Arm", BP_L_ARM = "Left Arm", BP_R_HAND = "Right Hand", BP_L_HAND = "Left Hand", BP_R_LEG = "Right Leg", BP_L_LEG = "Left Leg", BP_R_FOOT = "Right Foot", BP_L_FOOT = "Left Foot") + var/dat = "

Editing '[marking]'


" + dat += "Enable All " + dat += "Disable All " + dat += "Change Color of All
" + dat += "
" + for (var/bodypart in pref.body_markings[marking]) + if (!islist(pref.body_markings[marking][bodypart])) continue + dat += "[part_to_string[bodypart]]: [color_square(hex = pref.body_markings[marking][bodypart]["color"])] " + dat += "Change " + dat += "[pref.body_markings[marking][bodypart]["on"] ? "Toggle Off" : "Toggle On"]
" + + dat += "" + winshow(user, "prefs_markings_subwindow", TRUE) + pref.markings_subwindow = new(user, "prefs_markings_browser", "Marking Editor", 400, 400) + pref.markings_subwindow.set_content(dat) + pref.markings_subwindow.open(FALSE) + onclose(user, "prefs_markings_subwindow", src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 570cdcf144f..0be0bf2c7bb 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -126,7 +126,7 @@ var/list/preferences_datums = list() 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/body_markings = list() // "name" = "#rgbcolor" //VOREStation Edit: "name" = list(BP_HEAD = list("on" = , "color" = "#rgbcolor"), BP_TORSO = ...) var/list/flavor_texts = list() var/list/flavour_texts_robot = list() diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index cb2b3cf0b34..89effc1f193 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -107,7 +107,7 @@ default_slot = slot nif_path = nif_durability = nif_savedata = null //VOREStation Add - Don't copy NIF S["default_slot"] << slot - + else S["default_slot"] << default_slot diff --git a/code/modules/mob/living/carbon/human/human_helpers_vr.dm b/code/modules/mob/living/carbon/human/human_helpers_vr.dm index 14ed52bd8c6..7d02ca95a05 100644 --- a/code/modules/mob/living/carbon/human/human_helpers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_helpers_vr.dm @@ -31,7 +31,7 @@ var/static/icon/ingame_hud_med_vr = icon('icons/mob/hud_med_vr.dmi') var/obj/item/organ/external/O = organs_by_name[BP] if(O) success = TRUE - O.markings[mark_datum.name] = list("color" = mark_color, "datum" = mark_datum, "priority" = markings_len + 1) + O.markings[mark_datum.name] = list("color" = mark_color, "datum" = mark_datum, "priority" = markings_len + 1, "on" = TRUE) if (success) markings_len += 1 update_dna() @@ -93,18 +93,32 @@ var/static/icon/ingame_hud_med_vr = icon('icons/mob/hud_med_vr.dmi') for (var/marking in O.markings) var/priority = num2text(O.markings[marking]["priority"]) if (markings[priority]) - markings[priority] |= list("[marking]" = O.markings[marking]["color"]) //yes I know technically you could have a limb that was attached that has the same marking as another limb with a different color but I'm too tired + if (markings[priority][marking]) + markings[priority][marking] |= list(O.organ_tag = list("on" = O.markings[marking]["on"], "color" = O.markings[marking]["color"])) + else + markings[priority] |= list("[marking]" = list(O.organ_tag = list("on" = O.markings[marking]["on"], "color" = O.markings[marking]["color"]))) //yes I know technically you could have a limb that was attached that has the same marking as another limb with a different color but I'm too tired else priorities |= O.markings[marking]["priority"] - markings[priority] = list("[marking]" = O.markings[marking]["color"]) + markings[priority] = list("[marking]" = list(O.organ_tag = list("on" = O.markings[marking]["on"], "color" = O.markings[marking]["color"]))) var/list/sorted = list() while (priorities.len > 0) var/priority = min(priorities) priorities.Remove(priority) priority = num2text(priority) for (var/marking in markings[priority]) - if (!(marking in sorted)) + if (isnull(sorted[marking])) sorted[marking] = markings[priority][marking] + else + sorted[marking] |= markings[priority][marking] + for (var/marking in sorted) + var/should_add_color = TRUE + var/last_color = null + for (var/bp in sorted[marking]) + if (!isnull(last_color) && sorted[marking][bp]["color"] != last_color) + should_add_color = FALSE + last_color = sorted[marking][bp]["color"] + if (should_add_color) + sorted[marking]["color"] = last_color||"#000000" del(markings) del(priorities) markings_len = sorted.len diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 1553a16bfaf..944b8ecb301 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -287,7 +287,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "#000000" for(var/M in part.markings) - icon_key += "[M][part.markings[M]["color"]]" + if (part.markings[M]["on"]) + icon_key += "[M][part.markings[M]["color"]]" // VOREStation Edit Start if(part.nail_polish) diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index f008b6f0f92..1c6be2a3e3f 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -82,6 +82,8 @@ var/global/list/limb_icon_cache = list() /obj/item/organ/external/proc/get_icon(var/skeletal, var/can_apply_transparency = TRUE) for(var/M in markings) + if (!markings[M]["on"]) + continue var/datum/sprite_accessory/marking/mark = markings[M]["datum"] if(mark.organ_override) var/icon/mark_s = new/icon("icon" = mark.icon, "icon_state" = "[mark.icon_state]-[organ_tag]") @@ -90,6 +92,8 @@ var/global/list/limb_icon_cache = list() mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons icon_cache_key = "[M][markings[M]["color"]]" for(var/MM in markings) + if (!markings[MM]["on"]) + continue var/datum/sprite_accessory/marking/mark_style = markings[MM]["datum"] if(mark_style.organ_override) continue @@ -143,6 +147,8 @@ var/global/list/limb_icon_cache = list() //Body markings, actually does not include head this time. Done separately above. if(!istype(src,/obj/item/organ/external/head)) for(var/M in markings) + if (!markings[M]["on"]) + continue 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"], mark_style.color_blend_mode) // VOREStation edit @@ -173,6 +179,8 @@ var/global/list/limb_icon_cache = list() apply_colouration(mob_icon) if(owner && owner.synth_markings) for(var/M in markings) + if (!markings[M]["on"]) + continue 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"], mark_style.color_blend_mode) // VOREStation edit diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index c819920610c..35ea47e98c2 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -386,6 +386,8 @@ //Head markings for(var/M in markings) + if (!markings[M]["on"]) + continue 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"], mark_style.color_blend_mode) diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 169cd5a3da8..659e77c3014 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -408,7 +408,7 @@ var/list/markings_data[0] markings = target.get_prioritised_markings() for (var/marking in markings) - markings_data[++markings_data.len] = list("marking_name" = marking, "marking_color" = markings[marking]) + markings_data[++markings_data.len] = list("marking_name" = marking, "marking_color" = markings[marking]["color"] ? markings[marking]["color"] : "#000000") //too tired to add in another submenu for bodyparts here data["markings"] = markings_data // VOREStation Add End diff --git a/interface/skin.dmf b/interface/skin.dmf index ee01d95107c..fb4e0d438b3 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1291,6 +1291,30 @@ window "outputwindow" enable-http-images = true max-lines = 0 +window "prefs_markings_subwindow" + elem "prefs_markings_subwindow" + type = MAIN + pos = 281,0 + size = 400x400 + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none + is-visible = false + saved-params = "pos;size;is-minimized;is-maximized" + title = "Marking Selection Editing" + statusbar = false + can-minimize = false + outer-size = 416x439 + inner-size = 400x400 + elem "prefs_markings_browser" + type = BROWSER + pos = 0,0 + size = 400x400 + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none + saved-params = "" + window "rpane" elem "rpane" type = MAIN