From 431b48d34424dc970c7e08fdb49ccef26912afd2 Mon Sep 17 00:00:00 2001 From: sarcoph <83266791+sarcoph@users.noreply.github.com> Date: Fri, 13 May 2022 04:10:34 -0800 Subject: [PATCH] cosmetic part ids and jointed ipc components --- code/__HELPERS/_hyper_helpers.dm | 2 +- code/__HELPERS/mobs.dm | 17 +++---- code/modules/client/preferences.dm | 20 ++++----- .../modules/client/hyper_pref_savefile.dm | 12 ++--- .../mob/dead/new_player/cosmetic_parts.dm | 42 ++++++++++++++++++ hyperstation/icons/mob/char_parts.dmi | Bin 1791 -> 2342 bytes modular_citadel/icons/mob/ipc_antennas.dmi | Bin 8263 -> 8261 bytes 7 files changed, 65 insertions(+), 28 deletions(-) diff --git a/code/__HELPERS/_hyper_helpers.dm b/code/__HELPERS/_hyper_helpers.dm index f5d0e8b90..5e23e5857 100644 --- a/code/__HELPERS/_hyper_helpers.dm +++ b/code/__HELPERS/_hyper_helpers.dm @@ -6,5 +6,5 @@ GLOBAL_LIST_EMPTY(cosmetic_legs) /proc/init_cosmetic_parts(datum/cosmetic_part/type, list/global_list) for(var/subtype in subtypesof(type)) var/datum/cosmetic_part/part = new subtype() - global_list[part.name] = part + global_list[part.id] = part return global_list \ No newline at end of file diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5cf43e8fd..9ab5a52fa 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -149,11 +149,6 @@ var/color2 = random_short_color() var/color3 = random_short_color() - var/cosmetic_head = pick(GLOB.cosmetic_heads) - var/cosmetic_chest = pick(GLOB.cosmetic_chests) - var/cosmetic_arms = pick(GLOB.cosmetic_arms) - var/cosmetic_legs = pick(GLOB.cosmetic_legs) - //CIT CHANGE - changes this entire return to support cit's snowflake parts return(list( "mcolor" = color1, @@ -243,12 +238,12 @@ "flavor_text" = "", "silicon_flavor_text" = "", "ooc_text" = "", - "cosmetic_head" = GLOB.cosmetic_heads[cosmetic_head], - "cosmetic_chest" = GLOB.cosmetic_chests[cosmetic_chest], - "cosmetic_l_arm" = GLOB.cosmetic_arms[cosmetic_arms], - "cosmetic_r_arm" = GLOB.cosmetic_arms[cosmetic_arms], - "cosmetic_l_leg" = GLOB.cosmetic_legs[cosmetic_legs], - "cosmetic_r_leg" = GLOB.cosmetic_legs[cosmetic_legs])) + "cosmetic_head" = GLOB.cosmetic_heads["default"], + "cosmetic_chest" = GLOB.cosmetic_chests["default"], + "cosmetic_l_arm" = GLOB.cosmetic_arms["default"], + "cosmetic_r_arm" = GLOB.cosmetic_arms["default"], + "cosmetic_l_leg" = GLOB.cosmetic_legs["default"], + "cosmetic_r_leg" = GLOB.cosmetic_legs["default"])) /proc/random_hair_style(gender) switch(gender) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bef78febb..59bc2d63e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -2349,14 +2349,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/supported_species = possible_part.supported_species if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) continue - selectable_parts[path] = possible_part + selectable_parts[possible_part.name] = path if(!selectable_parts.len) to_chat(user, "There are no valid alt heads for this species!") var/new_cosmetic_part var/question = "Choose your character's alt head style:" new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts if(new_cosmetic_part) - features["cosmetic_head"] = GLOB.cosmetic_heads[new_cosmetic_part] + features["cosmetic_head"] = GLOB.cosmetic_heads[selectable_parts[new_cosmetic_part]] update_preview_icon() if("cosmetic_chest") @@ -2366,14 +2366,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/supported_species = possible_part.supported_species if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) continue - selectable_parts[path] = possible_part + selectable_parts[possible_part.name] = path if(!selectable_parts.len) to_chat(user, "There are no valid alt chests for this species!") var/new_cosmetic_part var/question = "Choose your character's alt chest style:" new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts if(new_cosmetic_part) - features["cosmetic_chest"] = GLOB.cosmetic_chests[new_cosmetic_part] + features["cosmetic_chest"] = GLOB.cosmetic_chests[selectable_parts[new_cosmetic_part]] update_preview_icon() // currently symmetrical @@ -2384,15 +2384,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/supported_species = possible_part.supported_species if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) continue - selectable_parts[path] = possible_part + selectable_parts[possible_part.name] = path if(!selectable_parts.len) to_chat(user, "There are no valid alt arms for this species!") var/new_cosmetic_part var/question = "Choose your character's alt arms style:" new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts if(new_cosmetic_part) - features["cosmetic_l_arm"] = GLOB.cosmetic_arms[new_cosmetic_part] - features["cosmetic_r_arm"] = GLOB.cosmetic_arms[new_cosmetic_part] + features["cosmetic_l_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] + features["cosmetic_r_arm"] = GLOB.cosmetic_arms[selectable_parts[new_cosmetic_part]] update_preview_icon() if("cosmetic_legs") @@ -2402,15 +2402,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/supported_species = possible_part.supported_species if(!show_mismatched_markings && supported_species && !supported_species.Find(pref_species.id)) continue - selectable_parts[path] = possible_part + selectable_parts[possible_part.name] = path if(!selectable_parts.len) to_chat(user, "There are no valid alt legs for this species!") var/new_cosmetic_part var/question = "Choose your character's alt legs style:" new_cosmetic_part = input(user, question, "Character Preference") as null|anything in selectable_parts if(new_cosmetic_part) - features["cosmetic_l_leg"] = GLOB.cosmetic_legs[new_cosmetic_part] - features["cosmetic_r_leg"] = GLOB.cosmetic_legs[new_cosmetic_part] + features["cosmetic_l_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] + features["cosmetic_r_leg"] = GLOB.cosmetic_legs[selectable_parts[new_cosmetic_part]] update_preview_icon() // End hyper edit diff --git a/hyperstation/code/modules/client/hyper_pref_savefile.dm b/hyperstation/code/modules/client/hyper_pref_savefile.dm index c9aedbf31..3eb2a661c 100644 --- a/hyperstation/code/modules/client/hyper_pref_savefile.dm +++ b/hyperstation/code/modules/client/hyper_pref_savefile.dm @@ -26,9 +26,9 @@ var/datum/cosmetic_part/r_arm = features["cosmetic_r_arm"] var/datum/cosmetic_part/l_leg = features["cosmetic_l_leg"] var/datum/cosmetic_part/r_leg = features["cosmetic_r_leg"] - WRITE_FILE(S["feature_cosmetic_head"], head.name) - WRITE_FILE(S["feature_cosmetic_chest"], chest.name) - WRITE_FILE(S["feature_cosmetic_l_arm"], l_arm.name) - WRITE_FILE(S["feature_cosmetic_r_arm"], r_arm.name) - WRITE_FILE(S["feature_cosmetic_l_leg"], l_leg.name) - WRITE_FILE(S["feature_cosmetic_r_leg"], r_leg.name) \ No newline at end of file + WRITE_FILE(S["feature_cosmetic_head"], head.id) + WRITE_FILE(S["feature_cosmetic_chest"], chest.id) + WRITE_FILE(S["feature_cosmetic_l_arm"], l_arm.id) + WRITE_FILE(S["feature_cosmetic_r_arm"], r_arm.id) + WRITE_FILE(S["feature_cosmetic_l_leg"], l_leg.id) + WRITE_FILE(S["feature_cosmetic_r_leg"], r_leg.id) \ No newline at end of file diff --git a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm b/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm index 51a415e81..a08db8726 100644 --- a/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm +++ b/hyperstation/code/modules/mob/dead/new_player/cosmetic_parts.dm @@ -13,6 +13,8 @@ safely. */ /datum/cosmetic_part + /** A unique string that is used to identify this part for save files. Allows name changes without breaking saves */ + var/id /** The name of the cosmetic part. This shows up in the preferences dropdown. */ var/name var/icon = 'hyperstation/icons/mob/char_parts.dmi' @@ -33,57 +35,86 @@ safely. // ========================================= /datum/cosmetic_part/head/default + id = "default" name = "default" icon = null +/datum/cosmetic_part/head/ipc_round + id = "ipc_round" + name = "round ipc head" + icon_state = "ipc_round" + supported_species = list("ipc") + // CHESTS // ========================================= /datum/cosmetic_part/chest/default + id = "default" name = "default" icon = null /datum/cosmetic_part/chest/ipc_sleek + id = "ipc_sleek" name = "sleek ipc chest" icon_state = "ipc_sleek" supported_species = list("ipc") color_src = MATRIXED +/datum/cosmetic_part/chest/ipc_jointed + id = "ipc_jointed" + name = "jointed ipc chest" + icon_state = "ipc_jointed" + supported_species = list("ipc") + color_src = MATRIXED + // ARMS // ========================================= /datum/cosmetic_part/arms/default + id = "default" name = "default" icon = null /datum/cosmetic_part/arms/avian_alt + id = "avian_alt" name = "avian claws" icon_state = "avian_alt" supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") /datum/cosmetic_part/arms/insect + id = "insect" name = "insect arms" icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' icon_state = "insect" supported_species = list("mammal", "avian", "aquatic", "insect", "xeno", "synthliz") /datum/cosmetic_part/arms/ipc_sleek + id = "ipc_sleek" name = "sleek ipc arms" icon_state = "ipc_sleek" supported_species = list("ipc") color_src = MATRIXED +/datum/cosmetic_part/arms/ipc_jointed + id = "ipc_jointed" + name = "jointed ipc arms" + icon_state = "ipc_jointed" + supported_species = list("ipc") + color_src = MATRIXED + // LEGS // ========================================= /datum/cosmetic_part/legs/default + id = "default" name = "default" icon = null /datum/cosmetic_part/legs/avian + id = "avian" name = "avian legs" icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' icon_state = "avian" @@ -91,6 +122,7 @@ safely. support_digitigrade = FALSE /datum/cosmetic_part/legs/mammal + id = "mammal" name = "mammal legs" icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' icon_state = "mammal" @@ -98,6 +130,7 @@ safely. support_digitigrade = TRUE /datum/cosmetic_part/legs/insect + id = "insect" name = "insect legs" icon = 'modular_citadel/icons/mob/mutant_bodyparts.dmi' icon_state = "insect" @@ -105,8 +138,17 @@ safely. support_digitigrade = TRUE /datum/cosmetic_part/legs/ipc_sleek + id = "ipc_sleek" name = "sleek ipc legs" icon_state = "ipc_sleek" supported_species = list("ipc") color_src = MATRIXED + support_digitigrade = FALSE + +/datum/cosmetic_part/legs/ipc_jointed + id = "ipc_jointed" + name = "jointed ipc legs" + icon_state = "ipc_jointed" + supported_species = list("ipc") + color_src = MATRIXED support_digitigrade = FALSE \ No newline at end of file diff --git a/hyperstation/icons/mob/char_parts.dmi b/hyperstation/icons/mob/char_parts.dmi index 216df9afee73a4f50deee43c5f8be496fd2aa9de..9a6d12c50a720105f880a0d43d363c8bfb1018b1 100644 GIT binary patch literal 2342 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 delta 6847 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 Bsqp{+