From 97bda936f23f244c0cbf7eefd5793dbda3ef9a8c Mon Sep 17 00:00:00 2001 From: Matt Atlas Date: Sat, 6 Apr 2024 00:19:58 +0200 Subject: [PATCH] New baseline IPC sprites and different IPC heads. (#18800) New IPC heads can be selected by changing the head's prosthetic type, as you would with a robot limb. All sprites by Noble Row. Relevant to everyone else, this PR adds functionality to whitelist sprite_accessories to certain prosthetic types, so you could theoretically add Bishop-only markings for humans. To-do: - [x] Facial hair sanitization so that selecting a new head properly removes the screens. - [x] Marking sanitization so that selecting an invalid head for the markings resets them. --------- Co-authored-by: Matt Atlas --- aurorastation.dme | 2 +- code/__DEFINES/mobs.dm | 3 + code/__DEFINES/prefs.dm | 18 +++ code/__HELPERS/mobs.dm | 34 +++++- .../client/preference_setup/_defines.dm | 3 - .../preference_setup/general/03_body.dm | 92 +++++++++----- .../abstract/new_player/sprite_accessories.dm | 114 ++++++++++++++---- .../mob/living/carbon/human/appearance.dm | 1 + .../mob/living/carbon/human/human_helpers.dm | 14 +-- code/modules/organs/robolimbs.dm | 83 +++++++++++-- html/changelogs/mattatlas-baselinerework.yml | 43 +++++++ icons/mob/human_face/ipc_screens.dmi | Bin 39928 -> 39771 bytes icons/mob/human_races/ipc/hoplan.dmi | Bin 0 -> 449 bytes icons/mob/human_races/ipc/indricus.dmi | Bin 0 -> 441 bytes icons/mob/human_races/ipc/r_machine.dmi | Bin 2347 -> 2173 bytes icons/mob/human_races/ipc/raxus.dmi | Bin 0 -> 452 bytes icons/mob/human_races/markings_baseline.dmi | Bin 0 -> 1751 bytes 17 files changed, 323 insertions(+), 84 deletions(-) create mode 100644 code/__DEFINES/prefs.dm delete mode 100644 code/modules/client/preference_setup/_defines.dm create mode 100644 html/changelogs/mattatlas-baselinerework.yml create mode 100644 icons/mob/human_races/ipc/hoplan.dmi create mode 100644 icons/mob/human_races/ipc/indricus.dmi create mode 100644 icons/mob/human_races/ipc/raxus.dmi create mode 100644 icons/mob/human_races/markings_baseline.dmi diff --git a/aurorastation.dme b/aurorastation.dme index 19bcf0280a1..fdf596a520d 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -93,6 +93,7 @@ #include "code\__DEFINES\overmap.dm" #include "code\__DEFINES\path.dm" #include "code\__DEFINES\pipes.dm" +#include "code\__DEFINES\prefs.dm" #include "code\__DEFINES\procpath.dm" #include "code\__DEFINES\profiler_tracy.dm" #include "code\__DEFINES\projectiles.dm" @@ -1735,7 +1736,6 @@ #include "code\modules\client\preferences_spawnpoints.dm" #include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\ui_style.dm" -#include "code\modules\client\preference_setup\_defines.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\preferences_sql.dm" #include "code\modules\client\preference_setup\antagonism\01_candidacy.dm" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 58cf86bccdb..b1fe0de45d1 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -420,6 +420,9 @@ #define PROSTHETIC_TESLA "Tesla Powered Prosthetics" #define PROSTHETIC_TESLA_BODY "Industrial Tesla Powered Prosthetics" #define PROSTHETIC_VAURCA "Vaurca Robotic Limb" +#define PROSTHETIC_HOPLAN "Hoplan Head" +#define PROSTHETIC_RAXUS "Raxus Head" +#define PROSTHETIC_INDRICUS "Indricus Head" //Brain Damage defines #define BRAIN_DAMAGE_MILD 10 diff --git a/code/__DEFINES/prefs.dm b/code/__DEFINES/prefs.dm new file mode 100644 index 00000000000..4d058b8ac1e --- /dev/null +++ b/code/__DEFINES/prefs.dm @@ -0,0 +1,18 @@ +#define EQUIP_PREVIEW_LOADOUT 1 +#define EQUIP_PREVIEW_JOB 2 +#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) + +/// External organ. Is a prosthesis with a robo-limb manufacturer. +#define ORGAN_PREF_CYBORG "cyborg" +/// External organ. Amputated. +#define ORGAN_PREF_AMPUTATED "amputated" +/// External organ. Nymph-limb. +#define ORGAN_PREF_NYMPH "nymph" + +/// Internal organ. Assisted, so halfway through mechanical. +#define ORGAN_PREF_ASSISTED "assisted" +/// Internal organ. Mechanical, so has a robo-limb manufacturer. +#define ORGAN_PREF_MECHANICAL "mechanical" +/// Internal organ. Removed, used for appendixes. +#define ORGAN_PREF_REMOVED "removed" +/// Note that a "normal" limb or organ has no pref, so there's no define for it. diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 110c94eb3a7..cdf93e8baa5 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -32,6 +32,7 @@ continue if(!(species in S.species_allowed)) continue + valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -39,8 +40,8 @@ return h_style -/// Species must be a datum. -/proc/random_facial_hair_style(gender, species = /datum/species/human) +/// Species must be a datum type. +/proc/random_facial_hair_style(gender, species = /datum/species/human, organ_status, robolimb_manufacturer) var/f_style = "Shaved" var/list/valid_facialhairstyles = list() @@ -52,6 +53,8 @@ continue if(!(species in S.species_allowed)) continue + if(!check_robolimb_appropriate(S, organ_status, robolimb_manufacturer)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -60,6 +63,33 @@ return f_style +/** + * This proc checks if a sprite_accessory appropriate for a given organ and robolimb. The second argument must be an ORGAN_PREF define. + * This can easily be made into a more general helper if needed by just turning organ_status into a boolean and feeding an instance into robolimb_manufacturer, maybe. +*/ +/proc/check_robolimb_appropriate(datum/sprite_accessory/S, organ_status, robolimb_manufacturer) + if(S.robotize_type_required) + if(S.required_organ) + // Null robotize_type_required means it doesn't matter what prosthetic type we use. + if(isnull(S.robotize_type_required)) + return TRUE + if(organ_status == ORGAN_PREF_CYBORG) + if(length(S.robotize_type_required)) + var/datum/robolimb/R + if(GLOB.all_robolimbs[robolimb_manufacturer]) + R = GLOB.all_robolimbs[robolimb_manufacturer] + else + R = GLOB.basic_robolimb + if(!(R.company in S.robotize_type_required)) + return FALSE + else + // Empty list means we can't have a prosthetic type to use this marking. + return FALSE + else if(length(S.robotize_type_required)) + // There's a robotize type required and our limb is not a prosthetic. + return FALSE + return TRUE + /proc/sanitize_name(name, species = SPECIES_HUMAN) var/datum/species/current_species if(species) diff --git a/code/modules/client/preference_setup/_defines.dm b/code/modules/client/preference_setup/_defines.dm deleted file mode 100644 index 0c4dbb60042..00000000000 --- a/code/modules/client/preference_setup/_defines.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define EQUIP_PREVIEW_LOADOUT 1 -#define EQUIP_PREVIEW_JOB 2 -#define EQUIP_PREVIEW_ALL (EQUIP_PREVIEW_LOADOUT|EQUIP_PREVIEW_JOB) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 6edf6a3ecff..16d9e4cb92d 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -244,25 +244,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/status = pref.organ_data[name] var/organ_name = name - if(status == "cyborg") + if(status == ORGAN_PREF_CYBORG) var/datum/robolimb/R if(pref.rlimb_data[name] && GLOB.all_robolimbs[pref.rlimb_data[name]]) R = GLOB.all_robolimbs[pref.rlimb_data[name]] else R = GLOB.basic_robolimb out += "
  • - [R.company] [capitalize_first_letters(parse_zone(organ_name))] Prosthesis
  • " - else if(status == "amputated") + else if(status == ORGAN_PREF_AMPUTATED) out += "
  • - Amputated [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "mechanical") + else if(status == ORGAN_PREF_MECHANICAL) var/datum/robolimb/R if(pref.rlimb_data[name] && GLOB.all_robolimbs[pref.rlimb_data[name]]) R = GLOB.all_robolimbs[pref.rlimb_data[name]] else R = GLOB.basic_robolimb out += "
  • - [R.company] Mechanical [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "nymph") + else if(status == ORGAN_PREF_NYMPH) out += "
  • - Diona Nymph [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "assisted") + else if(status == ORGAN_PREF_ASSISTED) switch(organ_name) if(BP_HEART) out += "
  • - Pacemaker-Assisted [capitalize_first_letters(parse_zone(organ_name))]
  • " @@ -272,7 +272,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O out += "
  • - Retinal Overlayed [capitalize_first_letters(parse_zone(organ_name))]
  • " else out += "
  • - Mechanically Assisted [capitalize_first_letters(parse_zone(organ_name))]
  • " - else if(status == "removed") + else if(status == ORGAN_PREF_REMOVED) out += "
  • - Removed [capitalize_first_letters(parse_zone(organ_name))]
  • " if(length(pref.organ_data)) @@ -395,6 +395,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue + valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] if(valid_hairstyles.len) @@ -417,6 +420,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -435,6 +440,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_hair_gradients[hair_gradient] = valid_hair_gradients[hair_gradient] @@ -520,6 +527,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] @@ -625,6 +634,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(!(mob_species.type in S.species_allowed)) continue + if(!verify_robolimb_appropriate(S)) + continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] @@ -661,10 +672,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/species/species = GLOB.all_species[pref.species] for(var/M in usable_markings) var/datum/sprite_accessory/S = usable_markings[M] - if(!S.species_allowed.len) + if(!length(S.species_allowed)) continue else if(!(species.type in S.species_allowed)) usable_markings -= M + if(!verify_robolimb_appropriate(S)) + usable_markings -= M if (!usable_markings.len) alert(user, "This species does not have any body markings available.") @@ -707,7 +720,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["limbs"]) - var/list/acceptable_organ_input = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + var/list/acceptable_organ_input = list("Head", "Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") var/limb_name = tgui_input_list(user, "Which limb do you want to change?", "Limbs", acceptable_organ_input) if(!limb_name && !CanUseTopic(user)) return TOPIC_NOACTION @@ -746,7 +759,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if("Upper Body") limb = BP_CHEST carries_organs = 1 - if(BP_HEAD) + if("Head") limb = BP_HEAD carries_organs = 1 else @@ -769,10 +782,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.rlimb_data -= third_limb if("Amputated") - pref.organ_data[limb] = "amputated" + pref.organ_data[limb] = ORGAN_PREF_AMPUTATED pref.rlimb_data[limb] = null if(second_limb) - pref.organ_data[second_limb] = "amputated" + pref.organ_data[second_limb] = ORGAN_PREF_AMPUTATED pref.rlimb_data[second_limb] = null if("Prosthesis") @@ -782,6 +795,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/robolimb/M = GLOB.chargen_robolimbs[company] if(!(tmp_species in M.species_can_use)) continue + if(!(limb in M.allowed_external_organs)) + continue usable_manufacturers[company] = M if(!usable_manufacturers.len) return @@ -789,20 +804,22 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!choice) return pref.rlimb_data[limb] = choice - pref.organ_data[limb] = "cyborg" + pref.organ_data[limb] = ORGAN_PREF_CYBORG if(second_limb) pref.rlimb_data[second_limb] = choice - pref.organ_data[second_limb] = "cyborg" - if(third_limb && pref.organ_data[third_limb] == "amputated") + pref.organ_data[second_limb] = ORGAN_PREF_CYBORG + if(third_limb && pref.organ_data[third_limb] == ORGAN_PREF_AMPUTATED) pref.organ_data[third_limb] = null if("Diona Nymph") - pref.organ_data[limb] = "nymph" + pref.organ_data[limb] = ORGAN_PREF_NYMPH pref.rlimb_data[limb] = null if(second_limb) - pref.organ_data[second_limb] = "nymph" + pref.organ_data[second_limb] = ORGAN_PREF_NYMPH pref.rlimb_data[second_limb] = null + // Recheck markings in case we changed prosthetics. + recheck_markings_and_facial_hair() return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["organs"]) @@ -828,7 +845,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if("Normal") pref.organ_data[organ_name] = null if("Assisted") - pref.organ_data[organ_name] = "assisted" + pref.organ_data[organ_name] = ORGAN_PREF_ASSISTED if("Mechanical") var/tmp_species = pref.species ? pref.species : SPECIES_HUMAN @@ -837,6 +854,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/datum/robolimb/M = GLOB.chargen_robolimbs[company] if(!(tmp_species in M.species_can_use)) continue + if(!(organ_name in M.allowed_internal_organs)) + continue usable_manufacturers[company] = M if(!usable_manufacturers.len) return @@ -844,22 +863,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!choice) return - - var/datum/robolimb/R = GLOB.all_robolimbs[choice] - if(!(organ_name in R.allowed_internal_organs)) - alert(user, "You can not select this manufacturer for this organ.") - return pref.rlimb_data[organ_name] = choice - pref.organ_data[organ_name] = "mechanical" + pref.organ_data[organ_name] = ORGAN_PREF_MECHANICAL if("Removed") - pref.organ_data[organ_name] = "removed" + pref.organ_data[organ_name] = ORGAN_PREF_REMOVED return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["reset_organs"]) pref.organ_data.Cut() pref.rlimb_data.Cut() + recheck_markings_and_facial_hair() return TOPIC_REFRESH_UPDATE_PREVIEW @@ -958,14 +973,25 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O user << browse(dat.Join(), "window=species;size=700x400") -/*/datum/category_item/player_setup_item/general/body/proc/reset_limbs() +/// This proc verifies if a sprite accessory can be put on a robolimb, checking its manufacturer. +/datum/category_item/player_setup_item/general/body/proc/verify_robolimb_appropriate(datum/sprite_accessory/S) + var/organ_status = pref.organ_data[S.required_organ] + var/robolimb_manufacturer = pref.rlimb_data[S.required_organ] + . = check_robolimb_appropriate(S, organ_status, robolimb_manufacturer) - for(var/organ in pref.organ_data) - pref.organ_data[organ] = null - while(null in pref.organ_data) - pref.organ_data -= null +/// This proc is used to check markings and facial hair after changing prosthesis. +/datum/category_item/player_setup_item/general/body/proc/recheck_markings_and_facial_hair() + if(length(pref.body_markings)) + for(var/marking in pref.body_markings) + var/datum/sprite_accessory/S = GLOB.body_marking_styles_list[marking] + if(!verify_robolimb_appropriate(S)) + pref.body_markings -= marking + to_chat(pref.client, SPAN_WARNING("Removed the [marking] marking as it is not appropriate for your current robo-limb!")) - for(var/organ in pref.rlimb_data) - pref.rlimb_data[organ] = null - while(null in pref.rlimb_data) - pref.rlimb_data -= null*/ + if(pref.f_style) + var/datum/sprite_accessory/F = GLOB.facial_hair_styles_list[pref.f_style] + if(!verify_robolimb_appropriate(F)) + var/datum/species/user_species = GLOB.all_species[pref.species] + var/organ_status = pref.organ_data[F.required_organ] + var/robolimb_manufacturer = pref.rlimb_data[F.required_organ] + pref.f_style = random_facial_hair_style(pref.gender, user_species.type, organ_status, robolimb_manufacturer) diff --git a/code/modules/mob/abstract/new_player/sprite_accessories.dm b/code/modules/mob/abstract/new_player/sprite_accessories.dm index 70ad8dc23f7..090ca5f9889 100644 --- a/code/modules/mob/abstract/new_player/sprite_accessories.dm +++ b/code/modules/mob/abstract/new_player/sprite_accessories.dm @@ -17,27 +17,34 @@ */ /datum/sprite_accessory - - var/icon // the icon file the accessory is located in - var/icon_state // the icon_state of the accessory - var/preview_state // a custom preview state for whatever reason - - var/name // the preview name of the accessory - - // Determines if the accessory will be skipped or included in random hair generations + /// The icon file the accessory is located in. + var/icon + /// The icon_state of the accessory. + var/icon_state + /// A custom preview state if wanted. + var/preview_state + /// The name of the accessory. + var/name + /// Determines if the accessory will be skipped or included in random hair generation. var/gender = NEUTER - - // Restrict some styles to specific species. This requires the type path of the datum of the species in question, as well as all children of that datum if applicable. - var/list/species_allowed = list(/datum/species/human,/datum/species/human/offworlder,/datum/species/machine/shell,/datum/species/machine/shell/rogue,/datum/species/zombie) - - // Whether or not the accessory can be affected by colouration - var/do_colouration = 1 - - // The blend mode to use when blending this icon with its color. May not apply to all sprite_accessory types, and must be a ICON_* blend mode, not BLEND_*! + /// Restrict some styles to specific species. This requires the type path of the datum of the species in question, as well as all children if applicable. + var/list/species_allowed = list( + /datum/species/human, + /datum/species/human/offworlder, + /datum/species/machine/shell, + /datum/species/machine/shell/rogue, + /datum/species/zombie + ) + /// Whether or not the accessory can be affected by colouration. + var/do_colouration = TRUE + /// The blend mode to use when blending this icon with its color. May not apply to all sprite_accessory types, and must be a ICON_* blend mode, not BLEND_*! var/icon_blend_mode = ICON_ADD - - //This is to provide safe names to use for hair/sprite to text. See Skrell tentacles for example - var/chatname = null + /// This is to provide safe names to use for hair/sprite to text. See Skrell tentacles for an example. + var/chatname + /// The organ the markings go over. Used to check if a marking can go over a certain organ. Must be an organ tag. + var/required_organ + /// Required prosthetic types to use this marking, if any. List is "any of". Null means no robotize type required. Empty list means there must be NO robotize type. + var/list/robotize_type_required /* @@ -4141,8 +4148,15 @@ Follow by example and make good judgement based on length which list to include name = "blank IPC screen" icon_state = "ipc_blank" species_allowed = list(/datum/species/machine) + robotize_type_required = list() + required_organ = BP_HEAD gender = NEUTER +/datum/sprite_accessory/facial_hair/ipc_screen_blank/none + name = "no IPC screen" + icon_state = "none" + robotize_type_required = list(PROSTHETIC_HOPLAN, PROSTHETIC_RAXUS, PROSTHETIC_INDRICUS) + /datum/sprite_accessory/facial_hair/ipc_screen_blank/ipc_screen_blue name = "blue IPC screen" icon_state = "ipc_blue" @@ -4545,8 +4559,6 @@ Follow by example and make good judgement based on length which list to include var/is_genetic = TRUE // If TRUE, the marking is considered genetic and is embedded into DNA. var/is_painted = FALSE // If TRUE, the marking can be put on prosthetics/robolimbs. - var/robotize_type_required // if set, this marking will only apply when put on a valid robolimb type - /datum/sprite_accessory/marking/bandage_head name = "Bandage, head 1" icon_state = "bandage1" @@ -6172,6 +6184,56 @@ Follow by example and make good judgement based on length which list to include body_parts = list(BP_GROIN) do_colouration = FALSE +// Baseline markings. +/datum/sprite_accessory/marking/baseline_head + name = "Baseline - Raxus Primary Colors" + icon = 'icons/mob/human_races/markings_baseline.dmi' + icon_state = "raxus_primary" + is_painted = TRUE + body_parts = list(BP_HEAD) + robotize_type_required = list(PROSTHETIC_RAXUS) + +/datum/sprite_accessory/marking/baseline_head/lights + name = "Baseline - Raxus Head Lights" + icon_state = "raxus_lights" + +/datum/sprite_accessory/marking/baseline_head/indricus + name = "Baseline - Indricus Primary Colors" + icon_state = "indricus_primary" + robotize_type_required = list(PROSTHETIC_INDRICUS) + +/datum/sprite_accessory/marking/baseline_head/indricus/lights + name = "Baseline - Indricus Lights" + icon_state = "indricus_lights" + +/datum/sprite_accessory/marking/baseline_head/hoplan + name = "Baseline - Hoplan Primary Colors" + icon_state = "indricus_primary" + robotize_type_required = list(PROSTHETIC_HOPLAN) + +/datum/sprite_accessory/marking/baseline_head/hoplan/lights + name = "Baseline - Hoplan Lights" + icon_state = "hoplan_lights" + +/datum/sprite_accessory/marking/baseline_color + name = "Baseline - Primary Colors" + icon = 'icons/mob/human_races/markings_baseline.dmi' + icon_state = "machine_primary" + is_painted = TRUE + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) + +/datum/sprite_accessory/marking/baseline_color/arm + name = "Baseline - Primary Arm Colors" + body_parts = list(BP_R_ARM, BP_L_ARM, BP_R_HAND, BP_L_HAND) + +/datum/sprite_accessory/marking/baseline_color/arm + name = "Baseline - Primary Leg Colors" + body_parts = list(BP_R_LEG, BP_L_LEG, BP_R_LEG, BP_L_LEG) + +/datum/sprite_accessory/marking/baseline_color/chest + name = "Baseline - Primary Head Colors" + body_parts = list(BP_HEAD) + //bishop /datum/sprite_accessory/marking/bishop_lights name = "Bishop - Lights Colour" @@ -6180,7 +6242,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_ARM,BP_R_ARM,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_BC + robotize_type_required = list(PROSTHETIC_BC) /datum/sprite_accessory/marking/bishop_lights/bishop_mask name = "Bishop - Face Mask" @@ -6217,7 +6279,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_IND + robotize_type_required = list(PROSTHETIC_IND) /datum/sprite_accessory/marking/g1_panels/g1_head name = "G1 - Head Panel Colors" @@ -6244,7 +6306,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_HI + robotize_type_required = list(PROSTHETIC_HI) /datum/sprite_accessory/marking/g2_panels/g2_head name = "G2 - Head Panel Colors" @@ -6271,7 +6333,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_ZH + robotize_type_required = list(PROSTHETIC_ZH) /datum/sprite_accessory/marking/zeng_panels/zeng_head name = "Zeng-Hu - Head Panel Colors" @@ -6298,7 +6360,7 @@ Follow by example and make good judgement based on length which list to include icon_blend_mode = ICON_MULTIPLY is_painted = TRUE body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_CHEST,BP_HEAD) - robotize_type_required = PROSTHETIC_XMG + robotize_type_required = list(PROSTHETIC_XMG) /datum/sprite_accessory/marking/xion_panels/xion_head name = "Xion - Head Panel Colors" diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 3a9d7fbd978..96f32dabeb8 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -175,6 +175,7 @@ continue if(!(species.type in S.species_allowed)) continue + valid_hairstyles += hairstyle return valid_hairstyles diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b91a79cbde7..c1fd25a65c2 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -104,7 +104,7 @@ O.status = 0 switch(status) - if ("amputated") + if (ORGAN_PREF_AMPUTATED) organs_by_name[O.limb_name] = null organs -= O if(O.children) // This might need to become recursive. @@ -112,14 +112,14 @@ organs_by_name[child.limb_name] = null organs -= child - if ("nymph") + if (ORGAN_PREF_NYMPH) if (organ_data[name]) O.AddComponent(/datum/component/nymph_limb) var/datum/component/nymph_limb/D = O.GetComponent(/datum/component/nymph_limb) if(D) D.nymphize(src, O.limb_name, TRUE) - if ("cyborg") + if (ORGAN_PREF_CYBORG) if (rlimb_data[name]) O.force_skintone = FALSE for(var/thing in O.children) @@ -132,14 +132,14 @@ var/obj/item/organ/I = internal_organs_by_name[name] if(I) switch (status) - if ("assisted") + if (ORGAN_PREF_ASSISTED) I.mechassist() - if ("mechanical") + if (ORGAN_PREF_MECHANICAL) if (rlimb_data[name]) I.robotize(rlimb_data[name]) else I.robotize() - if ("removed") + if (ORGAN_PREF_REMOVED) qdel(I) if (apply_markings) @@ -162,7 +162,7 @@ for(var/BP in mark_datum.body_parts) var/obj/item/organ/external/O = organs_by_name[BP] if(O) - if(mark_datum.robotize_type_required && O.robotize_type != mark_datum.robotize_type_required) + if(length(mark_datum.robotize_type_required) && !(O.robotize_type in mark_datum.robotize_type_required)) continue var/list/attr = list("color" = mark_color, "datum" = mark_datum) if (mark_datum.is_genetic) diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index db126f5fc46..5fefce39009 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -17,11 +17,17 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) GLOB.internal_robolimbs[R.company] = R /datum/robolimb - var/company = "Unbranded" // Shown when selecting the limb. - var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb. - var/icon = 'icons/mob/human_races/ipc/robotic.dmi' // Icon base to draw from. - var/unavailable_at_chargen // If set, not available at chargen. - var/lifelike = FALSE // If set, appears organic. + /// Shown when selecting the limb. + var/company = "Unbranded" + /// Seen when examining a limb. + var/desc = "A generic unbranded robotic prosthesis." + /// Icon base to draw from. + var/icon = 'icons/mob/human_races/ipc/robotic.dmi' + /// If set, not available in character setup. + var/unavailable_at_chargen + /// If set, it appears as organic on examine, like synthskin. + var/lifelike = FALSE + /// Which species can use this prosthetic type. var/list/species_can_use = list( SPECIES_HUMAN, SPECIES_SKRELL, @@ -37,14 +43,40 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) SPECIES_IPC_BISHOP, SPECIES_HUMAN_OFFWORLD ) - var/paintable = 0 //tired of istype exceptions. bullshit to find, and by god do i know it after this project. - var/linked_frame = SPECIES_IPC_UNBRANDED //which machine species this limb will create - var/brute_mod = 0.9 //how resistant is this mode to brute damage - var/burn_mod = 1.1 //how resistant is this mode to burn damage - var/fabricator_available = FALSE //if you can print this limb in the robotics fabricator - var/internal_organ_suffix = "prosthetic" //this is used to define the icon - var/list/allowed_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH)//what organs can be augmented by this brand + /// If this prosthetic type is paintable. + var/paintable = 0 + /// Which IPC species this prosthetic type will create. + var/linked_frame = SPECIES_IPC_UNBRANDED + /// How resistant this prosthetic type is to brute damage. + var/brute_mod = 0.9 + /// How resistant this prosthetic type is to burn damage. + var/burn_mod = 1.1 + /// If you can print this prosthetic type in the robotics fabricator. + var/fabricator_available = FALSE + /// Suffix used for the icon. + var/internal_organ_suffix = "prosthetic" + /// If this prosthetic type can be used for internal organs. var/allows_internal = TRUE + /// What internal organs you can pick this prosthetic type for. + var/list/allowed_internal_organs = list( + BP_HEART, + BP_EYES, + BP_LUNGS, + BP_LIVER, + BP_KIDNEYS, + BP_STOMACH + ) + /// What external organs you can pick this prosthetic type for. + var/list/allowed_external_organs = list( + BP_L_ARM, + BP_R_ARM, + BP_L_HAND, + BP_R_HAND, + BP_L_LEG, + BP_R_LEG, + BP_L_FOOT, + BP_R_FOOT + ) /datum/robolimb/proc/malfunctioning_check() return FALSE @@ -154,3 +186,30 @@ GLOBAL_DATUM(basic_robolimb, /datum/robolimb) icon = 'icons/mob/human_races/vaurca/r_vaurcalimbs.dmi' species_can_use = list(SPECIES_VAURCA_WORKER, SPECIES_VAURCA_WARRIOR) allows_internal = FALSE + +/datum/robolimb/hoplan + company = PROSTHETIC_HOPLAN + desc = "A refined helmet with an industrial lean. Extra plating seems to be applied to the top surface while the rest of the head features \ + small breaks in the armor and running lights. A polished screen hides four optic sensors behind a display." + species_can_use = list(SPECIES_IPC) + icon = 'icons/mob/human_races/ipc/hoplan.dmi' + allowed_external_organs = list(BP_HEAD) + +/datum/robolimb/indricus + company = PROSTHETIC_INDRICUS + desc = "One lens-like eye dominates this style of head, with a camera like adjustable segment, this head is entirely encased with no seams or \ + crevices bar service hatches." + species_can_use = list(SPECIES_IPC) + linked_frame = SPECIES_IPC + icon = 'icons/mob/human_races/ipc/indricus.dmi' + allowed_external_organs = list(BP_HEAD) + +/datum/robolimb/raxus + company = PROSTHETIC_RAXUS + desc = "Imposing and bold, this angled helmet features a collection of small pin-prick optic sensors to make up for its lack of inherent eyes. \ + The top of the head extends outward, where the thinner point meets halfway down the face before extending in to a similarly wide jaw, \ + giving the head a shape almost like an cubic hourglass." + species_can_use = list(SPECIES_IPC) + linked_frame = SPECIES_IPC + icon = 'icons/mob/human_races/ipc/raxus.dmi' + allowed_external_organs = list(BP_HEAD) diff --git a/html/changelogs/mattatlas-baselinerework.yml b/html/changelogs/mattatlas-baselinerework.yml new file mode 100644 index 00000000000..4a0442692f7 --- /dev/null +++ b/html/changelogs/mattatlas-baselinerework.yml @@ -0,0 +1,43 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: MattAtlas + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added new Baseline sprites made by Noble Row." + - rscadd: "Added new Baseline head types, sprites made by Noble Row. To select them, change the head prosthesis type as you would with a normal limb." + - rscadd: "Added a system to allow markings and hair to be restricted to certain prosthesis types." diff --git a/icons/mob/human_face/ipc_screens.dmi b/icons/mob/human_face/ipc_screens.dmi index 3cd1606d4edcde41445a69838b389cfe2bb7b9f5..b8c55d018ce511f4c2710a42aac4f5016b6de299 100644 GIT binary patch literal 39771 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 literal 39928 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 WlPL>)+}+Rz|7@L~Pw|?ahyD#sj%`-} diff --git a/icons/mob/human_races/ipc/hoplan.dmi b/icons/mob/human_races/ipc/hoplan.dmi new file mode 100644 index 0000000000000000000000000000000000000000..02a2803872cecf5b7d1e85bccf6402388b3fbd7b GIT binary patch literal 449 zcmV;y0Y3hTP){0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DI+y8MK>eAASW?TiHkEOv#1!Pm5Vd2C^0t`#5TmLHa?dm)oHj? zD=WDAxquxG0GtIkq$P7G$^ZZW&q+iVmWqgo r=qv6A+z*I|h?=+`a6cd-qF;FfOD|FV#943>00000NkvXXu0mjfYCp6| literal 0 HcmV?d00001 diff --git a/icons/mob/human_races/ipc/indricus.dmi b/icons/mob/human_races/ipc/indricus.dmi new file mode 100644 index 0000000000000000000000000000000000000000..592dabeee05d4294c0d7d59aa96b431db4dfbad9 GIT binary patch literal 441 zcmV;q0Y?6bP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DI+y8MK?1qr6@DGv{;FYGbOXA7^IntGp#5wHxfJ=@Ebc0D2fg;Ht}>)EH)RBmFu()!4Mcs0Lao|{t< zYa(4#tQ$>K@dLYaz2|N0&F~j%DvR!&vdL-9=Q1;wj5n#}fgiXl+Vbv64ZMZ5wu^NV zw6yl>U64GS-_CF0+{iO+TM--><8EnCfE-E0KVV}9e$Tm2nvgo!E!4wn} zFc=I9g^G%bvazx8zVCW&yIKJ6?C1hAV~quE2kmjL?s&^fQP{}ftN37CI0zI&&KT;2 zq$r7kru5DTe&Wr?L0#J{hepz+j%b;HsZ<)HuZj;fW6} zasEvPbGGaO9nUGX!BZFgy*mSM4<<+<1yzV=I`Wp52W#v62SfcNpRhUyRZk?3w`JiE zG2(D=+FRZNw9m~$mQLN=qXeB^xuni41A&Az>@3Y)W5`PdV%O;=!neV;(X`149zcjE zk;BN<8zqMvWz=g#5PDP`9ZqFUh|KeEi*27= z6E%jHk=@<>=#E{PGJ*Q-j~1P3TmVJj#so`en0EB65n6ZeF8M!5ZXaj2QWp=%eo+&V zp6QU%^f(=}Rj~O8IVO9Y7h!S378!`F;FGY73`%2iLZ97t7+okS(pNz&#J_9&*8q{y zc#~%YzuhB=Kdh6hy!m;nya7$%hQ;~!#3A#%-@*T3+V!+QI&pjVYs(PUcyj5KSb@%O zINzj_P5F6ysqbz-x|6^seJyxpvabjwU<=#%KYc8he)&p=74zAC?SFi%Ph8ikC>co7 zdGjRsi!SqWntIC9f_BYOD5o5vVDx^YR1Q0%9r-kQ`se`a@3IU-MYF;OC#%!;rV>(G zu1latbb9lG=UHswT-`Q%FYXq9!B_C;JGoH0gbhOjx*D{T&wL-F>0P*{t>}fBZk=}!Y*&1ta_k`E zbusJvYVC!};9$QDe z)me@(I7`FCmwf4}oRN%Z-(`8*XXnlPy=+6yUT;DJ7(is2{Z~F`kp4Pnr0~sf&?(_) zb?t5l12-i6V;G?3_Ie8eF{04JeV3wKEIN->n6M@g_} zE}v~<9w}K8HYEv?z(e$x{S~q8Mr_e6{;1)yz7Bu6NoGLXhK*f%)xyd2?@8S&?B-Jx)kdwJ$cFHxYS)gStkx$>;>wMS z)^8tr?L+3==-;@|Uh|Bb*dHzE_DaT-%GZ9CvOf9(5HvaY!TIWIUVxgLP_I1tk`{i| zK;wj+aYZqCapIkLJwmk98QyssZ1VuNKgMv5iWs z2ln2rI!rlor!Z4o#IguMZo8rISgXZbs|@^U?THks?8_nYXs{ z4g}L}p@tLl2x?9ea|i^#Q*u9I6&T|bjhNFW2pVte!U-+uYv)YynQ=_u6&pcc1!6eF zYwrwx}$7Dfo zYTUP?hufw7GV;Ik0V)kx)B}ihfV&^pB^0Rr4LbqiQa;z;=mD@Rhzo>8O&RIDLxXaj zel?CdTe%c($dyP<{qJ5S*{)SCK6LARf&2-Vxmc2vJj~?59ByAJH%cMl15!4$Tm89r z<@14O0u?h(Obua&yDCSLqAms`sPc6`9c+Y5Z9N9ZTD+AWJkVvO-WFo+`8&NZ*f&C| zGT}}`xGR6?P|BXzQnGEltg^S~fNJV&x4{N2H*V;burvki^(RZ1T%9ea#Gm9w5B>RtsbfoTuwFlC8hbi>@K)$7<~TN-{n(aY zd2ga;^jK@i_GtRvY+$pA4H2hTnkU~%t>Bg46+ArQzI zRPc-vh{NHKNMz@xf98y%qa%?>w70ic*aKp**m9@<0y>=u-7X5P7J+6eC@83?s2CU+ zpin4rad9XVia;RHXtch*zPY)176qcHsEEN}Hu)2)N8RXiO27&P!dFsSNlYAdbDPuE zMReeB?Ww8lKk!lUoBg+i*jm{^j3)bWn?ZBZWobaY!u^`F=7TuSuG@`B?|}23X*J-6 z-edZ7!FhvS%4CK)8>RG!iPqZ|5f@vPH#CE4nwz~u9lxGbe=88*FCvM#DTlF;m=#eB zFpqYZH8Xh`r`55yr|6)6;N3Kv_$HS#I=@m9GVs^-WX0`uIlCKSR%Hy2{~IMrKDBtz z>u5FbptIo?>0;0Q!;zO!wQ?s2l^PfEhP)$9$KH)!GH_d&vb|u>Sy79gY#N(OE^#A3 zAUp1yGc~pkPoJkh3>(sh-x1KX%?+Mi{32gQDSH)IQ5MPHfjF)(<3NEZqq7j-2$t8a zEVfBuT*^ZPwD)Xo{l`#3SAQe3hVt&}0X{KsSc)eSE!LMwxob+J0{r}Yg0s*$1AF=^ooB2SLi^pQ7#Wa9HYu-**DL`Fmc;BKPdhcs&7{0kyZAH;y|ToAU^;s01zSKzqE4k!slf$ft;OFDI*hEu#+ z2)bo=SV4!6c0(`jDBbJq^S%^qi<3T48{s=^|7B%|9v z_Z|tD_52W<#E~d#P`yeUgiUC)gaBTzi;Bg(YaollR#@xr+BaLFep!)$B$~!?7sx!@ zsTwZss&X^FNXpoGSwTxq-6jwLet&A*nivp7b@GZPEcxyBz8|qp+Q$}-J=PI9Ha#?? zpJg7U!Y<0z@cr~{zM!jNJz3`JhkhVq-H)(6IHBj;@RO+sWx+@jg4!Di z?OA=HF08mZ?{#PP%!#F6TbiNjN3UJzkjRX-2tvcs*d6Ptyzae#cfplTI%}>ic}UKC zC#Q=%CuN9?rw9J0sP16#lHnmQr@;z=CBu_VT*+z&hFqs&H@|=H%RB(r#Xro^n6PAk z|EyuaM7&HBf-700We(cq@Vn?n|2vw|k(}ak&w1WJ*n|LWw#IH|;&h}$wGxcEnN#~m>fsD`IK@YuV2)zr# zx935o=mn{s6+-`e?y&@+)^prvl2EFmg=ya>@Nl0NpC4+ z7V>S~Sl6oQ1d96iUQTayi2j|xdOVHMJ7}nFS6}y;_duHIHR)b#D<3hqemZ-|^>Sp) zHTKGpxL$4NybynW6IlX=ahQ8~`seB*CFo}Zo#|kn6r=%OsF zey(L=na#H$l1D!aT@T+WgzgP??+4T{W06McMzu_;<1e1aTO#$*GZ$Xl2#hjh&LL$Q zb-7Yk4Pg#lAtgCgHa`cEaW$p>#%_oCA2qc<|u_(_hw*=w~MkQ&o}g1OCwY2)6FZ(~V`Y2%?TtDSx;>5E+|Lva<0w zXydh$T3L@W%XhaJBab<7HeuV=ss5l7H=|%|u#*XJ7WHy}4xAci3MO-(wwo-lBmv&C zRxW?w6lM%Q$Tgw*Kd!yO=gkvjkCO^E6KQYqpGjM?fJ3WMUB_kKDVyNUyNTHD?9fWr zyBoiGu4}RfpZl)5jv$6P}V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DI+y8MYkxiqO@3vi!&v&s2HS^i!-e#F*g;&HpHehK9>~5X}AA5dGEetdqVsRQY9<&R3$rfPpK`suar~oMOsVnS*TQm z1qUf5B={eVoq&B)r|982#K474WrzWZjC6?;2Wwy0kjGI09t_o{!HL~7yFW0%Sev7t z^!|tq=WKKX#;O<2f$gs7x3PCTXljGr79Bo7h-G0WU08!(5_N0cdtolFH>K)A8EJXyHPeFfmGnH0PSw!}h<=$|ZVv0$r+xyS zurnI_AB1B700oChL_t(|ob8=WbD~TT$3Zfj9nqYX)w>jH&WR6um$>dZRa^10V8F|KsTOq#p4y5>{6rYWy z4nk^J-ic?tUQ6)+0000000000003OZQyvrI(-*J!-a81>Z(i|#+MtH5-}&l)p78(x z000000000009?dZ9`mg~5{1z4{185 z_9#u6zt&tEF>R#_=KoOWolAZXFIpGG4!0?`wb<^d{WD!sJNS8c zrR@jB>hQxU!PCo~QhWQnWew_Sv84$vix*9Ht6935QG1hbHZ(rhGkOX}X{mFU1jBU@ zWNgDTJAlzT{EtU`A4g=qYn<)NC%QY)d^+vE&Dz*uv}on*e|l5tmf8fFLnb&>%w(5OBYmi- zHlI5EeKLg?nr?I0>ijRY_h|;7AOHXW00000004kV*BV{tEUr1s@EMY!Cm0PqL2&QT zQv3^7BiS6a5k+^_KR%S_0pUv`K9S|~HWK|`A8}Bi6(t$AxNvyLcxTxr!N2~kG=CB0 zbROKi0RR91000000002!6H%;EzucO5_m;mRR=X?~GQaA#i@_h8m`WMzmF3~Z0FU7C zp%YkKMcO+5t4@fq2_4JrU2CdqpchsA<`x^*Twz_$*ilrckHvukev_&ik)KUD>Y%z@ z(K$`>HK^FUy13?oc($T00000xIPEt`-%L>n(MOHyxK3E z8xQ@7j2Xy_E6?xDQr_ceo^prCTqfb#32M!k;ussh3KP1BXtj)J2R{Q{uo7AuM<_HB zN(Od~0+ES$%GhlzKG>^sLN^awfdByT<>6m0>dK@`Zg#zfjX=bgbuViKJ1!GP8J0K! z_l>#U;8Xr&t~bc$*&TB0*$MsjKMw-7-r%bE!5+uE*{09belVUd;)&RQHAjXm?>C#y zn7x`7>`QJ~yu5ZemLc_TJ3Q(~Bfv_q>@z{5{~$h{aJK$na{SE(1K%?wgJNP>A23MGka1lgLj&tA3EyAGV0^oSjrZDAXTX@%K*k zBi^h(bU8u3@f~2kr@7W2dQ#O7n)Qb+Ul@JkMbyl$KWwfawCWFqcu(SuU4PhIKWNn- z3i0<&_3hWJ|7+F{ZT(S*_oLj{^?!}}p{+j(@c`VKzV$zEde;BE>0AHvrf>bvpPuzU ze|pycI-qC$@BR_=yPG5Eceh8-?{1Hz-wgoN@BIVZxPDKfNxvHcjr!dnaMbU>*WMu*w(j7-Ay@za002ovPDHLkV1hsKRh$3- literal 0 HcmV?d00001