From e89b05cfdd282094b0f530225032e93c2483fb14 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Fri, 23 Apr 2021 21:13:32 +0100
Subject: [PATCH 01/63] oh dear
---
code/modules/client/preferences.dm | 21 +++--
code/modules/surgery/bodyparts/_bodyparts.dm | 99 ++++++++++----------
2 files changed, 64 insertions(+), 56 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 3e4b962bc4..60be3dac5c 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", "body_markings" = list(), "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
@@ -1725,12 +1725,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
//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"
+ features["body_markings"] = list()
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")
@@ -1963,9 +1963,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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
+ var/marking_list = list()
+ for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
+ marking_list += list(part, new_body_markings)
+ features["body_markings"] = marking_list
if(new_body_markings != "None")
- features["mam_body_markings"] = "None"
+ features["mam_body_markings"] = list()
if("legs")
var/new_legs
@@ -2101,10 +2104,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_mam_body_markings)
features["mam_body_markings"] = new_mam_body_markings
if(new_mam_body_markings != "None")
- features["body_markings"] = "None"
+ features["body_markings"] = list()
else if(new_mam_body_markings == "None")
- features["mam_body_markings"] = "Plain"
- features["body_markings"] = "None"
+ features["mam_body_markings"] = list()
+ features["body_markings"] = list()
//Xeno Bodyparts
if("xenohead")//Head or caste type
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 38f53c93a5..1790809d14 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)
@@ -632,8 +633,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 +649,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 +684,26 @@
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"
+ body_markings_list += list(body_markings_icon, marking_value)
+
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 +729,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.
@@ -755,7 +755,7 @@
var/image_dir = 0
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
-
+/*
if(dropped)
image_dir = SOUTH
if(dmg_overlay_type)
@@ -772,7 +772,7 @@
. += 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)
-
+*/
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/list/aux = list()
var/image/marking
@@ -808,21 +808,22 @@
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)
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)
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[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
// Citadel End
@@ -830,11 +831,12 @@
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(!isnull(marking_value))
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)
+ for(var/marking_list in body_markings_list)
+ auxmarking += image(body_markings_list[1], "[body_markings_list[2]]_[I]", -aux_layer, image_dir)
. += aux
. += auxmarking
@@ -849,11 +851,12 @@
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(!isnull(marking_value))
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)
+ for(var/marking_list in body_markings_list)
+ auxmarking += image(body_markings_list[1], "[body_markings_list[2]]_[I]", -aux_layer, image_dir)
. += auxmarking
. += aux
@@ -863,14 +866,16 @@
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)
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[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
@@ -891,7 +896,7 @@
if(grayscale)
I.icon_state += "_g"
I.color = draw_color
- if(!isnull(aux_marking))
+ if(!isnull(marking_value))
for(var/a in auxmarking)
var/image/I = a
if(species_id == "husk")
From 869124bb5035837e9401447ceed406c4848f5f4a Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 24 Apr 2021 15:56:57 +0100
Subject: [PATCH 02/63] markings
---
code/modules/client/preferences.dm | 17 +++++++++--------
.../carbon/human/species_types/anthromorph.dm | 2 +-
.../carbon/human/species_types/lizardpeople.dm | 2 +-
.../living/carbon/human/species_types/xeno.dm | 2 +-
4 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 60be3dac5c..af38521b4a 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1967,7 +1967,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
marking_list += list(part, new_body_markings)
features["body_markings"] = marking_list
- if(new_body_markings != "None")
+ if(new_body_markings != list())
features["mam_body_markings"] = list()
if("legs")
@@ -2101,13 +2101,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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"] = list()
- else if(new_mam_body_markings == "None")
- features["mam_body_markings"] = list()
- features["body_markings"] = list()
+ if(new_mam_body_markings != "None")
+ var/marking_list = list()
+ for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
+ marking_list += list(part, new_mam_body_markings)
+ features["mam_body_markings"] = marking_list
+ else if(new_mam_body_markings == "None")
+ features["mam_body_markings"] = list()
+ features["body_markings"] = list()
//Xeno Bodyparts
if("xenohead")//Head or caste type
diff --git a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/anthromorph.dm
index d718db818c..1c0936af37 100644
--- a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm
+++ b/code/modules/mob/living/carbon/human/species_types/anthromorph.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 40645b13d4..a6cc8e8b8c 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", "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/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'
From ec41b301c792f110ad66ddbb15f5ceaa98d99c4b Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 24 Apr 2021 18:55:07 +0100
Subject: [PATCH 03/63] a
---
code/modules/client/preferences.dm | 4 ++--
code/modules/surgery/bodyparts/_bodyparts.dm | 16 +++++++---------
2 files changed, 9 insertions(+), 11 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index af38521b4a..ccb79ce255 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1965,7 +1965,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_body_markings)
var/marking_list = list()
for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
- marking_list += list(part, new_body_markings)
+ marking_list += list(list(part, new_body_markings))
features["body_markings"] = marking_list
if(new_body_markings != list())
features["mam_body_markings"] = list()
@@ -2104,7 +2104,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_mam_body_markings != "None")
var/marking_list = list()
for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
- marking_list += list(part, new_mam_body_markings)
+ marking_list += list(list(part, new_mam_body_markings))
features["mam_body_markings"] = marking_list
else if(new_mam_body_markings == "None")
features["mam_body_markings"] = list()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 1790809d14..f8c1b525c6 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -810,10 +810,9 @@
// 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)
-
+ . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else
for(var/list/marking_list in body_markings_list)
// marking stores icon and value for the specific bodypart
@@ -862,10 +861,9 @@
if(!isnull(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)
-
+ . += = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else
for(var/list/marking_list in body_markings_list)
// marking stores icon and value for the specific bodypart
@@ -877,8 +875,8 @@
else
. += image(marking[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)
@@ -909,7 +907,7 @@
marking.color = "#141414"
else
marking.color = list(markings_color)
-
+*/
/obj/item/bodypart/deconstruct(disassembled = TRUE)
drop_organs()
From fce471cabbc2b53f23ab3d590c1be20648d532d9 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 24 Apr 2021 23:40:55 +0100
Subject: [PATCH 04/63] debug messages
---
code/modules/surgery/bodyparts/_bodyparts.dm | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index f8c1b525c6..88834d4e0d 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -615,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
@@ -689,6 +690,7 @@
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)
+ message_admins("MATCH FOUND FOR [marking[1]] ON PART [body_part] ON USER [C]")
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[marking[2]]
var/body_markings_icon = default_body_markings_icon
@@ -699,7 +701,7 @@
marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
else
marking_value = "plain"
- body_markings_list += list(body_markings_icon, marking_value)
+ body_markings_list += list(list(body_markings_icon, marking_value))
markings_color = list(colorlist)
else
@@ -808,7 +810,8 @@
limb.icon_state = "[species_id]_[body_zone]"
// Body markings
- if(!length(body_markings_list))
+ if(length(body_markings_list))
+ message_admins("ADDING FUNNY IMAGES AT [owner] FOR [src]")
if(species_id == "husk")
. += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
@@ -822,7 +825,7 @@
else
. += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image(marking[1], "[marking_list[2]]_[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)
// Citadel End
@@ -859,11 +862,11 @@
. += auxmarking
. += aux
- if(!isnull(body_markings))
+ if(length(body_markings))
if(species_id == "husk")
. += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- . += = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[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
for(var/list/marking_list in body_markings_list)
// marking stores icon and value for the specific bodypart
From 97e18833d5c168e6a5d9e8f22794ea0e5714721a Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 25 Apr 2021 00:07:59 +0100
Subject: [PATCH 05/63] better debug info
---
code/modules/surgery/bodyparts/_bodyparts.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 88834d4e0d..e843be9212 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -690,7 +690,6 @@
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)
- message_admins("MATCH FOUND FOR [marking[1]] ON PART [body_part] ON USER [C]")
var/datum/sprite_accessory/Smark
Smark = GLOB.mam_body_markings_list[marking[2]]
var/body_markings_icon = default_body_markings_icon
@@ -701,6 +700,7 @@
marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
else
marking_value = "plain"
+ message_admins("MATCH FOUND FOR [marking[1]] ON PART [body_part] ON USER [C], VALUE IS [body_markings_icon] AND [marking_value]")
body_markings_list += list(list(body_markings_icon, marking_value))
markings_color = list(colorlist)
From f243c6b7c4b98ca7ed2ea0725a94e72e26c05eb2 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 25 Apr 2021 13:23:16 +0100
Subject: [PATCH 06/63] makes them apply properly
---
code/modules/mob/living/carbon/human/update_icons.dm | 7 ++-----
code/modules/surgery/bodyparts/_bodyparts.dm | 3 ++-
2 files changed, 4 insertions(+), 6 deletions(-)
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 e843be9212..6091b9e5d1 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -798,6 +798,7 @@
should_draw_gender = FALSE
if(is_organic_limb())
+ message_admins("UPDATING ORGANIC LIMB FOR [owner] AT [src]")
limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi'
if(should_draw_gender)
limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
@@ -876,7 +877,7 @@
else
. += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image(marking[1], "[marking_list[2]]_[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)
return
/*
if(color_src) //TODO - add color matrix support for base species limbs (or dont because color matrixes suck)
From 371b25062322f5d5be6701286df11484fc29971b Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 25 Apr 2021 13:24:04 +0100
Subject: [PATCH 07/63] unused var
---
code/modules/surgery/bodyparts/_bodyparts.dm | 1 -
1 file changed, 1 deletion(-)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 6091b9e5d1..e5e65773be 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -777,7 +777,6 @@
*/
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/list/aux = list()
- var/image/marking
var/list/auxmarking = list()
. += limb
From a6a3f995398dd306c574469b359bbabe4d8b75dd Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 25 Apr 2021 20:57:02 +0100
Subject: [PATCH 08/63] rp marking ui
---
code/_globalvars/lists/flavor_misc.dm | 3 +++
code/modules/client/preferences.dm | 24 ++++++++++++++++++++++--
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index f0a8a4e2c6..518b61f4d2 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -350,3 +350,6 @@ 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"))
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ccb79ce255..1a9a9a6cbf 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -512,7 +512,29 @@ 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("body_markings"))
+ marking_type = "body_markings"
+ else 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
+ // list out the current markings you have
+ if(length(features[marking_type]))
+ dat += ""
+ for(var/list/marking_list in features[marking_type])
+ var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ |
"
+ dat += "
"
+
for(var/mutant_part in GLOB.all_mutant_parts)
+ // these are sorted out separately due to the rp marking system being funky
+ // NOTE TO SELF: UNCOMMENT THIS ONCE YOU'RE DONE DEBUGGING
+ //if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
+ // continue
if(parent.can_have_part(mutant_part))
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -531,8 +553,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"
From ca3ef3b0f304c53fab77cd89556f27a046598b8f Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 26 Apr 2021 18:02:47 +0100
Subject: [PATCH 09/63] X button
---
code/modules/client/preferences.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1a9a9a6cbf..6a5dd3b8d5 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -522,12 +522,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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 += ""
for(var/list/marking_list in features[marking_type])
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ |
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
dat += "
"
for(var/mutant_part in GLOB.all_mutant_parts)
From 06e003f49b14d450fb57dafa08537dc78b665ba6 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 26 Apr 2021 21:58:12 +0100
Subject: [PATCH 10/63] functionality
---
code/modules/client/preferences.dm | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6a5dd3b8d5..451c3c73dc 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -526,9 +526,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// list out the current markings you have
if(length(features[marking_type]))
dat += ""
- for(var/list/marking_list in features[marking_type])
+ var/list/markings = features[marking_type]
+ for(var/list/marking_list in markings)
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
dat += "
"
for(var/mutant_part in GLOB.all_mutant_parts)
@@ -2413,6 +2414,29 @@ 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 = href_list["marking_index"]
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type])
+ // placeholder
+ var/a
+
+ if("marking_up")
+ // move the specified marking up
+ var/index = href_list["marking_index"]
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type])
+ // placeholder
+ var/a
+
+ if("marking_remove")
+ // remove the specified marking
+ var/marking_list = href_list["marking_list"]
+ var/marking_type = href_list["marking_type"]
+ if(marking_list && marking_type && features[marking_type])
+ features[marking_type] -= marking_list
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
From 79b73a53a063979d875188b4e1240a01024410ea Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 28 Apr 2021 16:53:12 +0100
Subject: [PATCH 11/63] working buttons probably
---
code/modules/client/preferences.dm | 34 ++++++++++++++++++------------
1 file changed, 21 insertions(+), 13 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 451c3c73dc..6eef427b27 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -529,7 +529,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/markings = features[marking_type]
for(var/list/marking_list in markings)
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
dat += ""
for(var/mutant_part in GLOB.all_mutant_parts)
@@ -2417,26 +2417,34 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("marking_down")
// move the specified marking down
- var/index = href_list["marking_index"]
+ var/index = text2num(href_list["marking_index"])
var/marking_type = href_list["marking_type"]
- if(index && marking_type && features[marking_type])
- // placeholder
- var/a
+ 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 = href_list["marking_index"]
+ var/index = text2num(href_list["marking_index"])
var/marking_type = href_list["marking_type"]
- if(index && marking_type && features[marking_type])
- // placeholder
- var/a
+ 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")
- // remove the specified marking
- var/marking_list = href_list["marking_list"]
+ // move the specified marking up
+ var/index = text2num(href_list["marking_index"])
var/marking_type = href_list["marking_type"]
- if(marking_list && marking_type && features[marking_type])
- features[marking_type] -= marking_list
+ if(index && marking_type && features[marking_type])
+ features[marking_type].Cut(index, index + 1)
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
From 2f5cb6399420bdcde7fce7e8aaf6209c9ceb8e75 Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 28 Apr 2021 17:37:09 +0100
Subject: [PATCH 12/63] who deleted this
---
code/modules/mob/dead/new_player/preferences_setup.dm | 2 ++
1 file changed, 2 insertions(+)
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)
From 72a009dc7c7df96bce7ace0e188cd456118b03f7 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 28 Apr 2021 19:31:20 +0100
Subject: [PATCH 13/63] based?
---
code/modules/surgery/bodyparts/_bodyparts.dm | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index e5e65773be..5664319a38 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -810,22 +810,23 @@
limb.icon_state = "[species_id]_[body_zone]"
// Body markings
+ var/list/marking_list
if(length(body_markings_list))
- message_admins("ADDING FUNNY IMAGES AT [owner] FOR [src]")
if(species_id == "husk")
- . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ marking_list += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ marking_list += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else
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)
+ marking_list += 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)
+ marking_list += 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)
+ marking_list += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += marking_list
// Citadel End
@@ -878,7 +879,7 @@
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 (or dont because color matrixes suck)
var/draw_color = mutation_color || species_color
var/grayscale = FALSE
@@ -907,10 +908,10 @@
if(!isnull(body_markings))
if(species_id == "husk")
+
marking.color = "#141414"
else
marking.color = list(markings_color)
-*/
/obj/item/bodypart/deconstruct(disassembled = TRUE)
drop_organs()
From cb98cbd19f2c8e05c34567624639e8610135aabd Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 28 Apr 2021 22:33:05 +0100
Subject: [PATCH 14/63] colour backend
---
code/modules/client/preferences.dm | 15 ++++++++-
code/modules/surgery/bodyparts/_bodyparts.dm | 35 ++++++++++++--------
2 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6eef427b27..0e9618067b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -528,8 +528,21 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
var/list/markings = features[marking_type]
for(var/list/marking_list in markings)
+ var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X |
"
+ var/color_marking_dat = ""
+ var/datum/sprite_accessory/S = (actual_name == "mam_body_markings") ? GLOB.mam_body_markings_list[marking_list[2]] : GLOB.body_markings_list[marking_list[2]]
+ if(S && S.matrixed_sections && S.matrixed_sections != MATRIX_NONE)
+ // we know it has one matrixed section at minimum
+ color_marking_dat += " "
+ // if it has a second section, add it
+ if(S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_RED_GREEN)
+ color_marking_dat += " "
+ // if it has a third section, add it
+ if(S.matrixed_sections == MATRIX_ALL)
+ color_marking_dat += " "
+ color_marking_dat += " Change
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
dat += "
"
for(var/mutant_part in GLOB.all_mutant_parts)
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 5664319a38..f970e04726 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -700,8 +700,12 @@
marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
else
marking_value = "plain"
- message_admins("MATCH FOUND FOR [marking[1]] ON PART [body_part] ON USER [C], VALUE IS [body_markings_icon] AND [marking_value]")
- body_markings_list += list(list(body_markings_icon, marking_value))
+ 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
@@ -796,8 +800,8 @@
if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST))
should_draw_gender = FALSE
+ var/list/markings_list = list()
if(is_organic_limb())
- message_admins("UPDATING ORGANIC LIMB FOR [owner] AT [src]")
limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi'
if(should_draw_gender)
limb.icon_state = "[species_id]_[body_zone]_[icon_gender]"
@@ -810,23 +814,28 @@
limb.icon_state = "[species_id]_[body_zone]"
// Body markings
- var/list/marking_list
if(length(body_markings_list))
if(species_id == "husk")
- marking_list += 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_list += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[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
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)
- marking_list += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir))
+ message_admins("length is now [length(markings_list)]")
else
- marking_list += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir))
+ message_admins("length is now [length(markings_list)]")
else
- marking_list += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
- . += marking_list
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir))
+ message_admins("length is now [length(markings_list)]")
+ if(color_src && length(marking_list) == 3)
+ message_admins("trying to color list of length [length(marking_list)] and also trying to access index [length(markings_list)] on a list of the same length")
+ markings_list[length(markings_list)].color = marking_list[3]
+ . += markings_list
// Citadel End
@@ -908,10 +917,8 @@
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()
From ddc3e3b3b23a095e3473b35fc5344cd664081077 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 15 May 2021 21:24:20 +0100
Subject: [PATCH 15/63] Update preferences.dm
---
code/modules/client/preferences.dm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 0e9618067b..b351ba9478 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -531,8 +531,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
var/color_marking_dat = ""
- var/datum/sprite_accessory/S = (actual_name == "mam_body_markings") ? GLOB.mam_body_markings_list[marking_list[2]] : GLOB.body_markings_list[marking_list[2]]
+ var/datum/sprite_accessory/S = (marking_type == "mam_body_markings") ? GLOB.mam_body_markings_list[marking_list[2]] : GLOB.body_markings_list[marking_list[2]]
if(S && S.matrixed_sections && S.matrixed_sections != MATRIX_NONE)
+ // if it has nothing initialize it to white
+ if(length(marking_list) == 2)
+ marking_list += list(list("#FFFFFF","#FFFFFF","#FFFFFF")) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
// we know it has one matrixed section at minimum
color_marking_dat += " "
// if it has a second section, add it
From 8aed1b4236ce134ca9dd7d1da73fd3d93cf58624 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 1 May 2021 20:37:22 +0100
Subject: [PATCH 16/63] more color code
---
code/modules/client/preferences.dm | 33 ++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index b351ba9478..8df69b2f03 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -537,15 +537,15 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(length(marking_list) == 2)
marking_list += list(list("#FFFFFF","#FFFFFF","#FFFFFF")) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
// we know it has one matrixed section at minimum
- color_marking_dat += " "
+ color_marking_dat += " "
// if it has a second section, add it
if(S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_RED_GREEN)
- color_marking_dat += " "
+ color_marking_dat += " "
// if it has a third section, add it
if(S.matrixed_sections == MATRIX_ALL)
- color_marking_dat += " "
+ color_marking_dat += " "
color_marking_dat += " Change
"
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
dat += ""
for(var/mutant_part in GLOB.all_mutant_parts)
@@ -2461,6 +2461,31 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/marking_type = href_list["marking_type"]
if(index && marking_type && features[marking_type])
features[marking_type].Cut(index, index + 1)
+
+ 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/matrixed_sections = href_list["matrixed_sections"]
+ var/color_number = 1 // 1-3 which color are we editing
+ if(matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE)
+ options += "Secondary"
+ else if(matrixed_sections == MATRIX_ALL)
+ options += list("Secondary", "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
+ 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
From 7efadade151c58c73d2818355f98178c755dbc2f Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sat, 1 May 2021 20:55:13 +0100
Subject: [PATCH 17/63] href fix
---
code/modules/client/preferences.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 8df69b2f03..f616d80005 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -544,7 +544,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// if it has a third section, add it
if(S.matrixed_sections == MATRIX_ALL)
color_marking_dat += " "
- color_marking_dat += " Change
"
+ color_marking_dat += " Change
"
dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
dat += ""
From 2daed9250f4aa9fb6200b623eb876c08416a0ee6 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 2 May 2021 18:30:35 +0100
Subject: [PATCH 18/63] some bugfixes
---
code/modules/client/preferences.dm | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f616d80005..6e92a910c9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -531,6 +531,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
var/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // 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/S = (marking_type == "mam_body_markings") ? GLOB.mam_body_markings_list[marking_list[2]] : GLOB.body_markings_list[marking_list[2]]
if(S && S.matrixed_sections && S.matrixed_sections != MATRIX_NONE)
// if it has nothing initialize it to white
@@ -541,11 +542,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// if it has a second section, add it
if(S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_RED_GREEN)
color_marking_dat += " "
+ number_colors = 2
// if it has a third section, add it
if(S.matrixed_sections == MATRIX_ALL)
color_marking_dat += " "
- color_marking_dat += " Change
"
- dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
+ number_colors = 3
+ color_marking_dat += " Change
"
+ dat += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
dat += ""
for(var/mutant_part in GLOB.all_mutant_parts)
@@ -2468,12 +2471,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(index && marking_type && features[marking_type])
// work out the input options to show the user
var/list/options = list("Primary")
- var/matrixed_sections = href_list["matrixed_sections"]
+ var/number_colors = href_list["number_colors"]
var/color_number = 1 // 1-3 which color are we editing
- if(matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE)
+ if(number_colors >= 2)
options += "Secondary"
- else if(matrixed_sections == MATRIX_ALL)
- options += list("Secondary", "Tertiary")
+ 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
@@ -2483,7 +2486,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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)
+ color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]"
else
to_chat(user, "Invalid color. Your color is not bright enough.")
else
From d32770a0fafab36ff4651f6b0491ffa8538915b8 Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Sun, 2 May 2021 22:19:41 +0100
Subject: [PATCH 19/63] test
---
code/modules/client/preferences.dm | 2 +-
code/modules/client/preferences_savefile.dm | 30 +++++++++++++++----
code/modules/surgery/bodyparts/_bodyparts.dm | 22 +++++++-------
.../modules/client/preferences_savefile.dm | 2 +-
4 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6e92a910c9..65809383c4 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -2471,7 +2471,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(index && marking_type && features[marking_type])
// work out the input options to show the user
var/list/options = list("Primary")
- var/number_colors = href_list["number_colors"]
+ 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"
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index b8959d93aa..0367fc9471 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 50
+#define SAVEFILE_VERSION_MAX 51
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -295,6 +295,27 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
L -= ROLE_SYNDICATE
S["be_special"] << L
+ if(current_version < 51) // rp markings means markings are now stored as a list
+ var/marking_type
+ var/species_id = S["species"]
+ var/datum/species/actual_species = GLOB.species_datums[species_id]
+ if(actual_species.mutant_bodyparts["body_markings"] && S["feature_lizard_body_markings"]) marking_type = "feature_lizard_body_markings"
+ 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/marking_list = list()
+ for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
+ marking_list += list(list(part, old_marking_value, color_list.Copy()))
+
+ S[marking_type] = safe_json_encode(marking_list)
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -638,7 +659,7 @@ 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"]
+ features["body_markings"] = safe_json_decode(S["feature_lizard_body_markings"])
S["feature_lizard_legs"] >> features["legs"]
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
@@ -707,7 +728,7 @@ 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"]
+ 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"]
@@ -837,7 +858,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)
@@ -1006,7 +1026,7 @@ 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_body_markings"] , safe_json_encode(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/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index f970e04726..712f0a33a0 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -761,7 +761,7 @@
var/image_dir = 0
var/icon_gender = (body_gender == FEMALE) ? "f" : "m" //gender of the icon, if applicable
-/*
+
if(dropped)
image_dir = SOUTH
if(dmg_overlay_type)
@@ -771,14 +771,16 @@
. += 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/list/auxmarking = list()
@@ -825,13 +827,11 @@
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))
- message_admins("length is now [length(markings_list)]")
else
markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir))
- message_admins("length is now [length(markings_list)]")
else
markings_list.Add(image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir))
- message_admins("length is now [length(markings_list)]")
+
if(color_src && length(marking_list) == 3)
message_admins("trying to color list of length [length(marking_list)] and also trying to access index [length(markings_list)] on a list of the same length")
markings_list[length(markings_list)].color = marking_list[3]
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"])
From 7ac50b7ba2044603aa8ec1c23f1855b3191886e5 Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Mon, 3 May 2021 22:43:22 +0100
Subject: [PATCH 20/63] big changes
---
code/modules/client/preferences.dm | 63 ++++++++++++++----------------
tgstation.dme | 4 --
2 files changed, 30 insertions(+), 37 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f5c1e5f254..a06e2c4b22 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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"
+ dat += "
Date: Mon, 3 May 2021 22:43:32 +0100
Subject: [PATCH 21/63] Revert "big changes"
This reverts commit 7ac50b7ba2044603aa8ec1c23f1855b3191886e5.
---
code/modules/client/preferences.dm | 63 ++++++++++++++++--------------
tgstation.dme | 4 ++
2 files changed, 37 insertions(+), 30 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a06e2c4b22..f5c1e5f254 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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 += "
Date: Mon, 3 May 2021 22:43:45 +0100
Subject: [PATCH 22/63] big changes 2
---
code/modules/client/preferences.dm | 63 ++++++++++++++----------------
1 file changed, 30 insertions(+), 33 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f5c1e5f254..a06e2c4b22 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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"
+ dat += "
Date: Mon, 3 May 2021 22:47:22 +0100
Subject: [PATCH 23/63] new limb covering var for markings
---
.../mob/dead/new_player/sprite_accessories/body_markings.dm | 2 ++
1 file changed, 2 insertions(+)
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..533e406d57 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
@@ -6,6 +6,7 @@
icon = 'icons/mob/mutant_bodyparts.dmi'
relevant_layers = list(BODY_ADJ_LAYER)
mutant_part_string = "body_markings"
+ var/list/covered_limbs = list(HEAD, CHEST, LEG_LEFT, LEG_RIGHT, ARM_LEFT, ARM_RIGHT)
/datum/sprite_accessory/body_markings/none
name = "None"
@@ -50,6 +51,7 @@
icon = 'modular_citadel/icons/mob/mam_markings.dmi'
recommended_species = list("mammal", "xeno", "slimeperson", "podweak")
matrixed_sections = MATRIX_ALL
+ var/list/covered_limbs = list(HEAD, CHEST, LEG_LEFT, LEG_RIGHT, ARM_LEFT, ARM_RIGHT)
/datum/sprite_accessory/mam_body_markings/none
name = "None"
From f816bba62a34b3858d02510e61d978e1cea94cd2 Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 5 May 2021 00:51:52 +0100
Subject: [PATCH 24/63] bugfixes
---
code/modules/client/preferences.dm | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a06e2c4b22..7e06868c6b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -524,7 +524,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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 += ""
@@ -554,10 +554,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "
"
for(var/mutant_part in GLOB.all_mutant_parts)
- // these are sorted out separately due to the rp marking system being funky
- // NOTE TO SELF: UNCOMMENT THIS ONCE YOU'RE DONE DEBUGGING
- //if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
- // continue
+ if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
+ continue
if(parent.can_have_part(mutant_part))
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -2450,11 +2448,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// gross copypasta here because mam markings arent a subtype of regular markings despite one containing the other ???
if(istype(S, /datum/sprite_accessory/body_markings))
var/datum/sprite_accessory/body_markings/marking = S
- if(!(GLOB.bodypart_names[selected_limb] in marking.covered_limbs))
+ if(!(text2num(GLOB.bodypart_names[selected_limb]) in marking.covered_limbs))
continue
if(istype(S, /datum/sprite_accessory/mam_body_markings))
var/datum/sprite_accessory/mam_body_markings/marking = S
- if(!(GLOB.bodypart_names[selected_limb] in marking.covered_limbs))
+ if(!(text2num(GLOB.bodypart_names[selected_limb]) in marking.covered_limbs))
continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
From b2d8c980e43f4a65904068df0e83275ce0e8b6ba Mon Sep 17 00:00:00 2001
From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 5 May 2021 00:54:44 +0100
Subject: [PATCH 25/63] task failed sucessfully
---
code/modules/client/preferences.dm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 7e06868c6b..f6660fa54d 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -2448,11 +2448,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// gross copypasta here because mam markings arent a subtype of regular markings despite one containing the other ???
if(istype(S, /datum/sprite_accessory/body_markings))
var/datum/sprite_accessory/body_markings/marking = S
- if(!(text2num(GLOB.bodypart_names[selected_limb]) in marking.covered_limbs))
+ if(!(GLOB.bodypart_names[num2text(selected_limb)] in marking.covered_limbs))
continue
if(istype(S, /datum/sprite_accessory/mam_body_markings))
var/datum/sprite_accessory/mam_body_markings/marking = S
- if(!(text2num(GLOB.bodypart_names[selected_limb]) in marking.covered_limbs))
+ if(!(GLOB.bodypart_names[num2text(selected_limb)] in marking.covered_limbs))
continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
From 1664459b148095114d1c9855ec92bda1dcb1a4df Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 5 May 2021 15:26:56 +0100
Subject: [PATCH 26/63] squash bugs
---
code/_globalvars/lists/flavor_misc.dm | 4 +++-
code/modules/client/preferences.dm | 11 ++++++-----
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 518b61f4d2..7eb1ab0957 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -352,4 +352,6 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow"
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"))
\ No newline at end of file
+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/client/preferences.dm b/code/modules/client/preferences.dm
index f6660fa54d..ea0ba2c802 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -542,7 +542,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// we know it has one matrixed section at minimum
color_marking_dat += " "
// if it has a second section, add it
- if(S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_RED_GREEN)
+ if(S.matrixed_sections == MATRIX_RED_BLUE || S.matrixed_sections == MATRIX_GREEN_BLUE || S.matrixed_sections == MATRIX_RED_GREEN || S.matrixed_sections == MATRIX_ALL)
color_marking_dat += " "
number_colors = 2
// if it has a third section, add it
@@ -554,7 +554,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
for(var/mutant_part in GLOB.all_mutant_parts)
- if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
+ if(mutant_part == "body_markings" || mutant_part == "mam_body_markings")
continue
if(parent.can_have_part(mutant_part))
if(!mutant_category)
@@ -2439,6 +2439,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
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")
if(selected_limb)
+ var/limb_value = text2num(GLOB.bodypart_values[selected_limb])
var/list/marking_list = GLOB.mam_body_markings_list
if(marking_type == "body_markings") marking_list = GLOB.body_markings_list
var/list/snowflake_markings_list = list()
@@ -2448,11 +2449,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
// gross copypasta here because mam markings arent a subtype of regular markings despite one containing the other ???
if(istype(S, /datum/sprite_accessory/body_markings))
var/datum/sprite_accessory/body_markings/marking = S
- if(!(GLOB.bodypart_names[num2text(selected_limb)] in marking.covered_limbs))
+ if(!(limb_value in marking.covered_limbs))
continue
if(istype(S, /datum/sprite_accessory/mam_body_markings))
var/datum/sprite_accessory/mam_body_markings/marking = S
- if(!(GLOB.bodypart_names[num2text(selected_limb)] in marking.covered_limbs))
+ if(!(limb_value in marking.covered_limbs))
continue
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
@@ -2460,7 +2461,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/selected_marking = input(user, "Select the marking to apply to the limb.") as null|anything in snowflake_markings_list
if(selected_marking)
- features[marking_type] += list(list(selected_limb, selected_marking))
+ features[marking_type] += list(list(limb_value, selected_marking))
if("marking_color")
var/index = text2num(href_list["marking_index"])
From ba71bb944a06d123acd72250698b25fb6e23357d Mon Sep 17 00:00:00 2001
From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com>
Date: Wed, 5 May 2021 18:11:05 +0100
Subject: [PATCH 27/63] im not crazy but this commit breaks 90% of the game
---
code/__HELPERS/global_lists.dm | 1 -
code/__HELPERS/mobs.dm | 2 -
code/_globalvars/lists/flavor_misc.dm | 1 -
code/modules/client/preferences.dm | 8 +--
code/modules/client/preferences_savefile.dm | 11 ++--
.../sprite_accessories/body_markings.dm | 56 ++++++------------
.../human/species_types/lizardpeople.dm | 2 +-
icons/mob/mutant_bodyparts.dmi | Bin 35941 -> 34139 bytes
modular_citadel/icons/mob/mam_markings.dmi | Bin 114275 -> 115508 bytes
9 files changed, 29 insertions(+), 52 deletions(-)
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..46c75e702b 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)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index 7eb1ab0957..0affa50a72 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -55,7 +55,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,
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ea0ba2c802..0194301134 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -529,7 +529,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(length(features[marking_type]))
dat += ""
var/list/markings = features[marking_type]
- for(var/list/marking_list in markings)
+ 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/actual_name = GLOB.bodypart_names[num2text(marking_list[1])] // get the actual name from the bitflag representing the part the marking is applied to
var/color_marking_dat = ""
@@ -2446,11 +2447,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
for(var/path in marking_list)
var/datum/sprite_accessory/S = marking_list[path]
if(istype(S))
- // gross copypasta here because mam markings arent a subtype of regular markings despite one containing the other ???
- if(istype(S, /datum/sprite_accessory/body_markings))
- var/datum/sprite_accessory/body_markings/marking = S
- if(!(limb_value in marking.covered_limbs))
- continue
if(istype(S, /datum/sprite_accessory/mam_body_markings))
var/datum/sprite_accessory/mam_body_markings/marking = S
if(!(limb_value in marking.covered_limbs))
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 7c93bec600..f430854575 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -295,11 +295,16 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
L -= ROLE_SYNDICATE
S["be_special"] << L
- if(current_version < 51) // rp markings means markings are now stored as a list
+ if(current_version < 51) // 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]
- if(actual_species.mutant_bodyparts["body_markings"] && S["feature_lizard_body_markings"]) marking_type = "feature_lizard_body_markings"
+
+ // convert lizard markings to lizard markings
+ if(species_id == SPECIES_LIZARD && S["feature_lizard_body_markings"])
+ S["feature_mam_body_markings"] = S["feature_lizard_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)
@@ -670,7 +675,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"]
- features["body_markings"] = safe_json_decode(S["feature_lizard_body_markings"])
S["feature_lizard_legs"] >> features["legs"]
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
@@ -1037,7 +1041,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"] , safe_json_encode(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/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index 533e406d57..a6137eb908 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,40 +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"
- var/list/covered_limbs = list(HEAD, CHEST, LEG_LEFT, LEG_RIGHT, ARM_LEFT, ARM_RIGHT)
-
-/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 ***************
*******************************************/
@@ -227,6 +190,25 @@
icon_state = "xeno"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+// sticking old lizard markings here for now
+/datum/sprite_accessory/mam_body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+
+/datum/sprite_accessory/mam_body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ matrixed_sections = MATRIX_ALL
+
+/datum/sprite_accessory/mam_body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+
+/datum/sprite_accessory/mam_body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+
/******************************************
************* Insect Markings *************
*******************************************/
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 a6cc8e8b8c..41d9ed4fef 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" = list(),
+ "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/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index ca047a93bdb32559cae9198f326c8817d86006b0..7b93a3ff732b69c32166f69ee8e197747782f312 100644
GIT binary patch
literal 34139
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
X;p`8&=ZjZoZ<$j<%j4T(?ED_
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
literal 35941
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