From 13834c4bef5b95c19aa504b5f89832cbebf72e12 Mon Sep 17 00:00:00 2001 From: SandPoot <43283559+SandPoot@users.noreply.github.com> Date: Thu, 24 Sep 2020 20:14:53 -0300 Subject: [PATCH] Morrowinventory Port (#75) --- code/__DEFINES/combat/block.dm | 5 +- code/__DEFINES/inventory.dm | 39 +- code/__DEFINES/loadout.dm | 10 +- code/__DEFINES/misc.dm | 43 +- code/__DEFINES/mobs.dm | 6 + code/__HELPERS/_cit_helpers.dm | 2 +- code/__HELPERS/global_lists.dm | 2 + code/__HELPERS/type2type.dm | 20 +- code/_globalvars/lists/loadout_categories.dm | 3 +- code/_onclick/hud/_defines.dm | 13 +- code/_onclick/hud/hud.dm | 48 ++- code/_onclick/hud/human.dm | 126 +++++- code/_onclick/hud/screen_objects.dm | 1 - code/controllers/subsystem/dcs.dm | 4 + code/controllers/subsystem/job.dm | 5 + code/datums/components/caltrop.dm | 5 + code/datums/components/explodable.dm | 2 +- code/datums/components/tackle.dm | 5 +- code/datums/elements/cleaning.dm | 18 + code/datums/elements/earhealing.dm | 2 +- code/datums/outfit.dm | 36 +- code/game/atoms.dm | 14 + code/game/gamemodes/changeling/changeling.dm | 6 +- .../game/gamemodes/clown_ops/bananium_bomb.dm | 7 + code/game/objects/items.dm | 17 +- .../objects/items/devices/radio/headset.dm | 8 +- code/game/objects/items/holy_weapons.dm | 3 + code/game/objects/structures/dresser.dm | 2 + code/game/objects/structures/watercloset.dm | 13 +- .../antagonists/highlander/highlander.dm | 2 +- .../antagonists/traitor/syndicate_contract.dm | 10 +- code/modules/antagonists/wizard/wizard.dm | 2 +- code/modules/arousal/genitals.dm | 2 + code/modules/awaymissions/capture_the_flag.dm | 2 +- code/modules/client/preferences.dm | 57 ++- code/modules/client/preferences_savefile.dm | 7 + code/modules/clothing/ears/_ears.dm | 2 +- code/modules/clothing/outfits/vv_outfit.dm | 18 +- code/modules/clothing/suits/_suits.dm | 11 +- code/modules/clothing/under/_under.dm | 54 ++- code/modules/clothing/under/accessories.dm | 65 ++- .../jobs/job_types/security_officer.dm | 2 +- code/modules/mob/inventory.dm | 13 +- code/modules/mob/living/carbon/carbon.dm | 3 +- .../mob/living/carbon/human/examine.dm | 46 ++- code/modules/mob/living/carbon/human/human.dm | 45 ++- .../mob/living/carbon/human/human_block.dm | 14 + .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/human_defines.dm | 8 + .../mob/living/carbon/human/inventory.dm | 76 +++- code/modules/mob/living/carbon/human/life.dm | 14 + code/modules/mob/living/carbon/human/say.dm | 13 + .../mob/living/carbon/human/species.dm | 122 +++++- .../mob/living/carbon/human/update_icons.dm | 215 +++++++++- code/modules/mob/update_icons.dm | 21 +- .../suit/n_suit_verbs/energy_net_nets.dm | 2 +- .../boxes_magazines/external/rechargable.dm | 4 +- .../projectiles/projectile/bullets/smg.dm | 18 + .../reagents/reagent_containers/glass.dm | 5 +- code/modules/surgery/bodyparts/helpers.dm | 10 +- code/modules/surgery/helpers.dm | 2 +- icons/mob/inhands/__inhand_template.dmi | Bin 780 -> 886 bytes .../code/modules/client/loadout/_loadout.dm | 5 + .../mob/living/carbon/reindex_screams.dm | 14 +- .../game/objects/items/devices/radio/radio.dm | 2 + sandcode/code/game/objects/items/items.dm | 2 + .../code/modules/client/loadout/boxers.dm | 138 +++++++ .../code/modules/client/loadout/shirts.dm | 378 ++++++++++++++++++ sandcode/code/modules/client/loadout/socks.dm | 188 +++++++++ .../code/modules/clothing/under/_under.dm | 2 + .../modules/clothing/underwear/_underwear.dm | 24 ++ .../code/modules/clothing/underwear/boxers.dm | 125 ++++++ .../code/modules/clothing/underwear/shirts.dm | 333 +++++++++++++++ .../code/modules/clothing/underwear/socks.dm | 177 ++++++++ .../code/modules/clothing/wrists/_wrists.dm | 14 + sandcode/code/modules/vending/clothesmate.dm | 12 + sandcode/icons/mob/clothing/ears.dmi | Bin 0 -> 1669 bytes sandcode/icons/mob/clothing/ears_extra.dmi | Bin 0 -> 2001 bytes sandcode/icons/mob/clothing/underwear.dmi | Bin 0 -> 56894 bytes .../icons/mob/clothing/underwear_digi.dmi | Bin 0 -> 15887 bytes sandcode/icons/mob/clothing/wrists.dmi | Bin 0 -> 243 bytes sandcode/icons/mob/screen_clockwork.dmi | Bin 0 -> 2748 bytes sandcode/icons/mob/screen_liteweb.dmi | Bin 23230 -> 27576 bytes sandcode/icons/mob/screen_midnight.dmi | Bin 0 -> 4212 bytes sandcode/icons/mob/screen_operative.dmi | Bin 0 -> 4280 bytes sandcode/icons/mob/screen_plasmafire.dmi | Bin 0 -> 4337 bytes sandcode/icons/mob/screen_retro.dmi | Bin 0 -> 2627 bytes sandcode/icons/mob/screen_slimecore.dmi | Bin 0 -> 4097 bytes sandcode/icons/obj/clothing/wrist.dmi | Bin 0 -> 243 bytes tgstation.dme | 12 + 90 files changed, 2610 insertions(+), 148 deletions(-) create mode 100644 sandcode/code/game/objects/items/devices/radio/radio.dm create mode 100644 sandcode/code/game/objects/items/items.dm create mode 100644 sandcode/code/modules/client/loadout/boxers.dm create mode 100644 sandcode/code/modules/client/loadout/shirts.dm create mode 100644 sandcode/code/modules/client/loadout/socks.dm create mode 100644 sandcode/code/modules/clothing/under/_under.dm create mode 100644 sandcode/code/modules/clothing/underwear/_underwear.dm create mode 100644 sandcode/code/modules/clothing/underwear/boxers.dm create mode 100644 sandcode/code/modules/clothing/underwear/shirts.dm create mode 100644 sandcode/code/modules/clothing/underwear/socks.dm create mode 100644 sandcode/code/modules/clothing/wrists/_wrists.dm create mode 100644 sandcode/code/modules/vending/clothesmate.dm create mode 100644 sandcode/icons/mob/clothing/ears.dmi create mode 100644 sandcode/icons/mob/clothing/ears_extra.dmi create mode 100644 sandcode/icons/mob/clothing/underwear.dmi create mode 100644 sandcode/icons/mob/clothing/underwear_digi.dmi create mode 100644 sandcode/icons/mob/clothing/wrists.dmi create mode 100644 sandcode/icons/mob/screen_clockwork.dmi create mode 100644 sandcode/icons/mob/screen_midnight.dmi create mode 100644 sandcode/icons/mob/screen_operative.dmi create mode 100644 sandcode/icons/mob/screen_plasmafire.dmi create mode 100644 sandcode/icons/mob/screen_retro.dmi create mode 100644 sandcode/icons/mob/screen_slimecore.dmi create mode 100644 sandcode/icons/obj/clothing/wrist.dmi diff --git a/code/__DEFINES/combat/block.dm b/code/__DEFINES/combat/block.dm index bc85947d71..b8d9f9f7e0 100644 --- a/code/__DEFINES/combat/block.dm +++ b/code/__DEFINES/combat/block.dm @@ -73,8 +73,11 @@ // THESE MUST NEVER BE 0! Block code uses ! instead of isnull for the speed boost. #define BLOCK_PRIORITY_ACTIVE_BLOCK 200 #define BLOCK_PRIORITY_HELD_ITEM 100 -#define BLOCK_PRIORITY_CLOTHING 50 #define BLOCK_PRIORITY_WEAR_SUIT 75 +//SKYRAT EDIT +#define BLOCK_PRIORITY_CLOTHING 50 #define BLOCK_PRIORITY_UNIFORM 25 +#define BLOCK_PRIORITY_UNDERWEAR 20 +//SKYRAT EDIT END #define BLOCK_PRIORITY_DEFAULT BLOCK_PRIORITY_HELD_ITEM diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 649e0a029b..3f8a85d8c0 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -23,6 +23,12 @@ #define ITEM_SLOT_HANDS (1<<14) #define ITEM_SLOT_BACKPACK (1<<15) #define ITEM_SLOT_SUITSTORE (1<<16) +//skyrat edit +#define ITEM_SLOT_UNDERWEAR (1<<17) +#define ITEM_SLOT_SOCKS (1<<18) +#define ITEM_SLOT_SHIRT (1<<19) +#define ITEM_SLOT_WRISTS (1<<20) +// //SLOTS #define SLOT_BACK 1 @@ -32,7 +38,7 @@ //SLOT_HANDS as a slot will pick ANY available hand #define SLOT_BELT 5 #define SLOT_WEAR_ID 6 -#define SLOT_EARS 7 +#define SLOT_EARS_LEFT 7 //skyrat edit #define SLOT_GLASSES 8 #define SLOT_GLOVES 9 #define SLOT_NECK 10 @@ -46,9 +52,16 @@ #define SLOT_IN_BACKPACK 18 #define SLOT_LEGCUFFED 19 #define SLOT_GENERC_DEXTROUS_STORAGE 20 +//skyrat edit +#define SLOT_W_UNDERWEAR 21 +#define SLOT_W_SOCKS 22 +#define SLOT_W_SHIRT 23 +#define SLOT_EARS_RIGHT 24 +#define SLOT_WRISTS 25 +// -#define SLOTS_AMT 20 // Keep this up to date! +#define SLOTS_AMT 25 // Keep this up to date! //skyrat edit - extra slots //I hate that this has to exist /proc/slotdefine2slotbit(slotdefine) //Keep this up to date with the value of SLOT BITMASKS and SLOTS (the two define sections above) @@ -64,12 +77,20 @@ . = ITEM_SLOT_BELT if(SLOT_WEAR_ID) . = ITEM_SLOT_ID - if(SLOT_EARS) + //skyrat edit + if(SLOT_EARS_RIGHT) . = ITEM_SLOT_EARS + if(SLOT_EARS_LEFT) + . = ITEM_SLOT_EARS + // if(SLOT_GLASSES) . = ITEM_SLOT_EYES if(SLOT_GLOVES) . = ITEM_SLOT_GLOVES + //skyrat edit + if(SLOT_WRISTS) + . = ITEM_SLOT_WRISTS + // if(SLOT_HEAD) . = ITEM_SLOT_HEAD if(SLOT_SHOES) @@ -86,6 +107,14 @@ . = ITEM_SLOT_BACKPACK if(SLOT_S_STORE) . = ITEM_SLOT_SUITSTORE + //skyrat edit + if(SLOT_W_UNDERWEAR) + . = ITEM_SLOT_UNDERWEAR + if(SLOT_W_SOCKS) + . = ITEM_SLOT_SOCKS + if(SLOT_W_SHIRT) + . = ITEM_SLOT_SHIRT + // //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. @@ -103,6 +132,10 @@ #define HIDETAUR (1<<11) //gotta hide that snowflake #define HIDESNOUT (1<<12) //or do we actually hide our snoots #define HIDEACCESSORY (1<<13) //hides the jumpsuit accessory. +//skyrat edit +#define HIDEUNDERWEAR (1<<14) //hides underwear, socks and shirt +#define HIDEWRISTS (1<<15) //hides wrists +// //bitflags for clothing coverage - also used for limbs #define HEAD (1<<0) diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 767894050d..655f800b15 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -66,4 +66,12 @@ #define LOADOUT_LIMB_PROSTHETIC "Prosthetic" #define LOADOUT_LIMB_AMPUTATED "Amputated" -#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though \ No newline at end of file +#define LOADOUT_LIMBS list(LOADOUT_LIMB_NORMAL,LOADOUT_LIMB_PROSTHETIC,LOADOUT_LIMB_AMPUTATED) //you can amputate your legs/arms though + +//Special thing that i had to make it myself because skyrat uses old loadout +//Underwear Sandcode changes +#define LOADOUT_CATEGORY_GENERAL_UNDER "General Underwear" +#define LOADOUT_SUBCATEGORY_UNDERWEAR "Underwear" +#define LOADOUT_SUBCATEGORY_SHIRT "Shirt" +#define LOADOUT_SUBCATEGORY_SOCKS "Socks" +// diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ec343b4893..b6024f72aa 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -30,23 +30,30 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s //Human Overlays Indexes///////// //LOTS OF CIT CHANGES HERE. BE CAREFUL WHEN UPSTREAM ADDS MORE LAYERS -#define MUTATIONS_LAYER 33 //mutations. Tk headglows, cold resistance glow, etc -#define GENITALS_BEHIND_LAYER 32 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer -#define BODY_BEHIND_LAYER 31 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define BODYPARTS_LAYER 30 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define MARKING_LAYER 29 //Matrixed body markings because clashing with snouts? -#define BODY_ADJ_LAYER 28 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_FRONT_LAYER 27 //Draws some genitalia above clothes and the TAUR body if need be. -#define BODY_LAYER 26 //underwear, undershirts, socks, eyes, lips(makeup) -#define BODY_ADJ_UPPER_LAYER 25 -#define FRONT_MUTATIONS_LAYER 24 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) -#define DAMAGE_LAYER 23 //damage indicators (cuts and burns) -#define UNIFORM_LAYER 22 -#define ID_LAYER 21 -#define HANDS_PART_LAYER 20 -#define SHOES_LAYER 19 -#define GLOVES_LAYER 18 -#define EARS_LAYER 17 +#define MUTATIONS_LAYER 40 //mutations. Tk headglows, cold resistance glow, etc +#define GENITALS_BEHIND_LAYER 39 //Some genitalia needs to be behind everything, such as with taurs (Taurs use body_behind_layer +#define BODY_BEHIND_LAYER 38 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define BODYPARTS_LAYER 37 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define MARKING_LAYER 36 //Matrixed body markings because clashing with snouts? +#define BODY_ADJ_LAYER 35 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_FRONT_LAYER 34 //Draws some genitalia above clothes and the TAUR body if need be. +#define BODY_LAYER 33 //underwear, undershirts, socks, eyes, lips(makeup) +#define BODY_ADJ_UPPER_LAYER 32 +#define FRONT_MUTATIONS_LAYER 31 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) +#define UNDERWEAR_LAYER 30 +#define SOCKS_LAYER 29 +#define SHIRT_LAYER 28 +#define UNIFORM_LAYER 27 +#define ID_LAYER 26 +#define HANDS_PART_LAYER 25 +#define DAMAGE_LAYER 24 //damage indicators (cuts and burns) +#define LOWER_MEDICINE_LAYER 23 //Medicine, like gauze and tourniquets +#define MEDICINE_LAYER 22 //Medicine, like gauze and tourniquets +#define SHOES_LAYER 21 +#define GLOVES_LAYER 20 +#define WRISTS_LAYER 19 +#define EAR_RIGHT_LAYER 18 +#define EAR_LEFT_LAYER 17 #define SUIT_LAYER 16 #define GENITALS_EXPOSED_LAYER 15 #define GLASSES_LAYER 14 @@ -63,7 +70,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 33 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 40 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 9c39446a67..3f291c3de5 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -280,6 +280,12 @@ #define OFFSET_HAIR "hair" #define OFFSET_FHAIR "fhair" #define OFFSET_MUTPARTS "mutantparts" +//skyrat edit +#define OFFSET_UNDERWEAR "underwear" +#define OFFSET_SOCKS "socks" +#define OFFSET_SHIRT "shirt" +#define OFFSET_WRISTS "wrist" +// //MINOR TWEAKS/MISC #define AGE_MIN 18 //youngest a character can be //CITADEL EDIT - 17 --> 18 diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index 453650108c..dfca7c5f42 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -131,7 +131,7 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) L = get_equipped_items() for(var/A in L) var/obj/item/I = A - if(I.body_parts_covered & GROIN) + if(istype(I) && (I.body_parts_covered & GROIN)) return FALSE return TRUE diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 1119ef44ed..bf9e415699 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -7,12 +7,14 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/hair, GLOB.hair_styles_list, GLOB.hair_styles_male_list, GLOB.hair_styles_female_list) //facial hair init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_hair, GLOB.facial_hair_styles_list, GLOB.facial_hair_styles_male_list, GLOB.facial_hair_styles_female_list) + /* skyrat edit - actual underwear items now //underwear init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/bottom, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f) //undershirt init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/top, GLOB.undershirt_list, GLOB.undershirt_m, GLOB.undershirt_f) //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) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index bbbf99c9de..24ee84595f 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -413,10 +413,10 @@ if(SLOT_BACK, SLOT_WEAR_SUIT, SLOT_W_UNIFORM, SLOT_BELT, SLOT_WEAR_ID) return BODY_ZONE_CHEST - if(SLOT_GLOVES, SLOT_HANDS, SLOT_HANDCUFFED) + if(SLOT_GLOVES, SLOT_HANDS, SLOT_HANDCUFFED, SLOT_WRISTS) //SKYRAT EDIT return pick(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) - if(SLOT_HEAD, SLOT_NECK, SLOT_NECK, SLOT_EARS) + if(SLOT_HEAD, SLOT_NECK, SLOT_NECK, SLOT_EARS_LEFT, SLOT_EARS_RIGHT) //skyrat edit return BODY_ZONE_HEAD if(SLOT_WEAR_MASK) @@ -658,8 +658,20 @@ return "Hands" if(SLOT_BELT) return "Belt" - if(SLOT_EARS) - return "Ears" + //skyrat edit + if(SLOT_EARS_LEFT) + return "Left ear" + if(SLOT_EARS_RIGHT) + return "Right ear" + if(SLOT_W_UNDERWEAR) + return "Underwear" + if(SLOT_W_SOCKS) + return "Socks" + if(SLOT_W_SHIRT) + return "Shirt" + if(SLOT_WRISTS) + return "Wrist" + // if(SLOT_GLASSES) return "Glasses" if(SLOT_GLOVES) diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 0f0ac52214..ef744ea2f1 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -9,5 +9,6 @@ GLOBAL_LIST_INIT(loadout_categories, list( LOADOUT_CATEGORY_SHOES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLOVES = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_GLASSES = LOADOUT_SUBCATEGORIES_NONE, - LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE + LOADOUT_CATEGORY_DONATOR = LOADOUT_SUBCATEGORIES_NONE, + LOADOUT_CATEGORY_GENERAL_UNDER = list(LOADOUT_SUBCATEGORY_UNDERWEAR, LOADOUT_SUBCATEGORY_SHIRT, LOADOUT_SUBCATEGORY_SOCKS) //DIDN'T NOTICE THIS )) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 467c67e0c3..fdaad20084 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -150,12 +150,21 @@ #define ui_oclothing "WEST+1:8,SOUTH+1:7" #define ui_gloves "WEST+2:10,SOUTH+1:7" -#define ui_glasses "WEST:6,SOUTH+3:11" +#define ui_glasses "WEST+2:10,SOUTH+2:9" //skyrat edit #define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+3:11" //skyrat edit #define ui_neck "WEST:6,SOUTH+2:9" #define ui_head "WEST+1:8,SOUTH+3:11" +//skyrat slots +#define ui_inventory_extra "WEST:6,SOUTH+3:11" +#define ui_boxers "WEST:6,SOUTH+4:13" +#define ui_socks "WEST:6,SOUTH+5:15" +#define ui_shirt "WEST:6,SOUTH+6:17" +#define ui_ears_extra "WEST+2:10,SOUTH+4:13" +#define ui_wrists "WEST+1:8,SOUTH+4:13" +// + //Ghosts #define ui_ghost_jumptomob "SOUTH:6,CENTER-2:24" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 91bed044b7..7a3277a5a0 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -15,6 +15,26 @@ GLOBAL_LIST_INIT(available_ui_styles, list( "Liteweb" = 'sandcode/icons/mob/screen_liteweb.dmi' )) +//skyrat edit +GLOBAL_LIST_INIT(modular_ui_styles, list( + 'icons/mob/screen_midnight.dmi' = 'sandcode/icons/mob/screen_midnight.dmi', + 'icons/mob/screen_retro.dmi' = 'sandcode/icons/mob/screen_retro.dmi', + 'icons/mob/screen_plasmafire.dmi' = 'sandcode/icons/mob/screen_plasmafire.dmi', + 'icons/mob/screen_slimecore.dmi' = 'sandcode/icons/mob/screen_slimecore.dmi', + 'icons/mob/screen_operative.dmi' = 'sandcode/icons/mob/screen_operative.dmi', + 'icons/mob/screen_clockwork.dmi' = 'sandcode/icons/mob/screen_clockwork.dmi', + 'sandcode/icons/mob/screen_liteweb.dmi' = 'sandcode/icons/mob/screen_liteweb.dmi' +)) +// + +//skyrat edit +/proc/ui_style_modular(ui_style) + if(isfile(ui_style)) + return GLOB.modular_ui_styles[ui_style] || GLOB.modular_ui_styles[GLOB.modular_ui_styles[1]] + else + return GLOB.modular_ui_styles[ui_style] || GLOB.modular_ui_styles[GLOB.modular_ui_styles[1]] +// + /proc/ui_style2icon(ui_style) return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] @@ -24,6 +44,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/hud_shown = TRUE //Used for the HUD toggle (F12) var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD var/inventory_shown = FALSE //Equipped item inventory + //skyrat edit + var/extra_shown = FALSE + // var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) var/obj/screen/ling/chems/lingchemdisplay @@ -45,6 +68,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden + //skyrat edit + var/list/extra_inventory = list() //equipped item screens that don't show up even if using the initial toggle + // var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) @@ -95,6 +121,9 @@ GLOBAL_LIST_INIT(available_ui_styles, list( pull_icon = null QDEL_LIST(toggleable_inventory) + //skyrat edit + QDEL_LIST(extra_inventory) + // QDEL_LIST(hotkeybuttons) throw_icon = null QDEL_LIST(infodisplay) @@ -147,6 +176,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( screenmob.client.screen += static_inventory if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown) screenmob.client.screen += toggleable_inventory + //skyrat edit + if(extra_inventory.len && screenmob.hud_used && screenmob.hud_used.extra_shown) + screenmob.client.screen += extra_inventory + // if(hotkeybuttons.len && !hotkey_ui_hidden) screenmob.client.screen += hotkeybuttons if(infodisplay.len) @@ -163,6 +196,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( screenmob.client.screen -= static_inventory if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory + //skyrat edit + if(extra_inventory.len) + screenmob.client.screen -= extra_inventory + // if(hotkeybuttons.len) screenmob.client.screen -= hotkeybuttons if(infodisplay.len) @@ -183,6 +220,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( screenmob.client.screen -= static_inventory if(toggleable_inventory.len) screenmob.client.screen -= toggleable_inventory + //skyrat edit + if(extra_inventory.len) + screenmob.client.screen -= extra_inventory + // if(hotkeybuttons.len) screenmob.client.screen -= hotkeybuttons if(infodisplay.len) @@ -228,6 +269,11 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/hidden_inventory_update() return +//skyrat edit +/datum/hud/proc/extra_inventory_update() + return +// + /datum/hud/proc/persistent_inventory_update(mob/viewer) if(!mymob) return @@ -237,7 +283,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if (initial(ui_style) || ui_style == new_ui_style) return - for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) + for(var/atom/item in static_inventory + toggleable_inventory + extra_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) //skyrat edit if (item.icon == ui_style) item.icon = new_ui_style diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 04141becf2..fd72dc9efa 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -17,11 +17,45 @@ if(usr.hud_used.inventory_shown && targetmob.hud_used) usr.hud_used.inventory_shown = FALSE usr.client.screen -= targetmob.hud_used.toggleable_inventory + //SKYRAT EDIT + usr.client.screen -= targetmob.hud_used.extra_inventory + //SKYRAT EDIT END else usr.hud_used.inventory_shown = TRUE usr.client.screen += targetmob.hud_used.toggleable_inventory + //SKYRAT EDIT + if(usr.hud_used.extra_shown) + usr.client.screen += targetmob.hud_used.extra_inventory + //SKYRAT EDIT END targetmob.hud_used.hidden_inventory_update(usr) + //SKYRAT EDIT + targetmob.hud_used.extra_inventory_update(usr) + //SKYRAT EDIT END + +//skyrat edit +/obj/screen/human/toggle/extra + name = "toggle extra" + icon_state = "toggle_extra" + +/obj/screen/human/toggle/extra/Click() + + var/mob/targetmob = usr + + if(isobserver(usr)) + if(ishuman(usr.client.eye) && (usr.client.eye != usr)) + var/mob/M = usr.client.eye + targetmob = M + + if(usr.hud_used.extra_shown && targetmob.hud_used) + usr.hud_used.extra_shown = FALSE + usr.client.screen -= targetmob.hud_used.extra_inventory + else + usr.hud_used.extra_shown = TRUE + usr.client.screen += targetmob.hud_used.extra_inventory + + targetmob.hud_used.extra_inventory_update(usr) +// /obj/screen/human/equip name = "equip" @@ -288,11 +322,11 @@ toggleable_inventory += inv_box inv_box = new /obj/screen/inventory() - inv_box.name = "ears" + inv_box.name = "left ear" //skyrat edit inv_box.icon = ui_style inv_box.icon_state = "ears" inv_box.screen_loc = ui_ears - inv_box.slot_id = SLOT_EARS + inv_box.slot_id = SLOT_EARS_LEFT //skyrat edit toggleable_inventory += inv_box inv_box = new /obj/screen/inventory() @@ -311,6 +345,54 @@ inv_box.slot_id = SLOT_SHOES toggleable_inventory += inv_box + //skyrat edit + using = new /obj/screen/human/toggle/extra() + using.icon = ui_style_modular(ui_style) + using.screen_loc = ui_inventory_extra + using.hud = src + toggleable_inventory += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "underwear" + inv_box.icon = ui_style_modular(ui_style) + inv_box.icon_state = "underwear" + inv_box.screen_loc = ui_boxers + inv_box.slot_id = SLOT_W_UNDERWEAR //skyrat edit + extra_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "socks" + inv_box.icon = ui_style_modular(ui_style) + inv_box.icon_state = "socks" + inv_box.screen_loc = ui_socks + inv_box.slot_id = SLOT_W_SOCKS //skyrat edit + extra_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "shirt" + inv_box.icon = ui_style_modular(ui_style) + inv_box.icon_state = "shirt" + inv_box.screen_loc = ui_shirt + inv_box.slot_id = SLOT_W_SHIRT //skyrat edit + extra_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "right ear" + inv_box.icon = ui_style_modular(ui_style) + inv_box.icon_state = "ears_extra" + inv_box.screen_loc = ui_ears_extra + inv_box.slot_id = SLOT_EARS_RIGHT //skyrat edit + extra_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "wrists" + inv_box.icon = ui_style_modular(ui_style) + inv_box.icon_state = "wrists" + inv_box.screen_loc = ui_wrists + inv_box.slot_id = SLOT_WRISTS + extra_inventory += inv_box + // + inv_box = new /obj/screen/inventory() inv_box.name = "belt" inv_box.icon = ui_style @@ -385,7 +467,7 @@ zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) //skyrat edit if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv @@ -400,7 +482,7 @@ if(!istype(H) || !H.dna.species) return var/datum/species/S = H.dna.species - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory + extra_inventory)) //skyrat edit if(inv.slot_id) if(inv.slot_id in S.no_equip) inv.alpha = 128 @@ -454,6 +536,42 @@ if(H.head) screenmob.client.screen -= H.head +//skyrat edit +/datum/hud/human/extra_inventory_update(mob/viewer) + if(!mymob) + return + var/mob/living/carbon/human/H = mymob + + var/mob/screenmob = viewer || H + + if(screenmob.hud_used.extra_shown && screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown) + if(H.ears_extra) + H.ears_extra.screen_loc = ui_ears_extra + screenmob.client.screen += H.ears_extra + if(H.w_underwear) + H.w_underwear.screen_loc = ui_boxers + screenmob.client.screen += H.w_underwear + if(H.w_socks) + H.w_socks.screen_loc = ui_socks + screenmob.client.screen += H.w_socks + if(H.w_shirt) + H.w_shirt.screen_loc = ui_shirt + screenmob.client.screen += H.w_shirt + if(H.wrists) + H.wrists.screen_loc = ui_wrists + screenmob.client.screen += H.wrists + else + if(H.ears_extra) + screenmob.client.screen -= H.ears_extra + if(H.w_underwear) + screenmob.client.screen -= H.w_underwear + if(H.w_socks) + screenmob.client.screen -= H.w_socks + if(H.w_shirt) + screenmob.client.screen -= H.w_shirt + if(H.wrists) + screenmob.client.screen -= H.wrists +// /datum/hud/human/persistent_inventory_update(mob/viewer) if(!mymob) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 126cc18907..80f93de4f1 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -187,7 +187,6 @@ user.swap_hand(held_index) return TRUE - /obj/screen/drop name = "drop" icon = 'icons/mob/screen_midnight.dmi' diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 3243a8d8c8..b42c6ed79d 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -8,6 +8,10 @@ PROCESSING_SUBSYSTEM_DEF(dcs) comp_lookup = SSdcs.comp_lookup /datum/controller/subsystem/processing/dcs/proc/GetElement(list/arguments) + //skyrat edit + if(!istype(arguments) || !arguments.len) + return + // var/datum/element/eletype = arguments[1] var/element_id = eletype diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 4f59992ace..7eaec101a3 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -689,6 +689,11 @@ SUBSYSTEM_DEF(job) if(!permitted) continue var/obj/item/I = new G.path + //skyrat edit + if(G.has_colors) + if(the_mob.client.prefs.color_gear[G.name]) + I.color = the_mob.client.prefs.color_gear[G.name] + // if(!M.equip_to_slot_if_possible(I, G.slot, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first if(iscarbon(M)) var/mob/living/carbon/C = M diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index d138cf1971..f832d748f6 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -48,6 +48,11 @@ var/damage = rand(min_damage, max_damage) if(HAS_TRAIT(H, TRAIT_LIGHT_STEP)) damage *= 0.75 + //skyrat edit + if(H.w_socks) + if(H.w_socks.body_parts_covered & FEET) + damage *= 0.75 + // H.apply_damage(damage, BRUTE, picked_def_zone, wound_bonus = CANT_WOUND) if(cooldown < world.time - 10) //cooldown to avoid message spam. diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index 2e5834c025..f5c8bf1642 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -77,7 +77,7 @@ equipment_items += list(C.head, C.wear_mask, C.back, C.gloves, C.shoes, C.glasses, C.ears) if(ishuman(C)) var/mob/living/carbon/human/H = C - equipment_items += list(H.wear_suit, H.w_uniform, H.belt, H.s_store, H.wear_id) + equipment_items += list(H.wear_suit, H.w_uniform, H.belt, H.s_store, H.wear_id, H.w_socks, H.w_underwear, H.w_shirt, H.ears_extra) //skyrat edit for(var/bp in equipment_items) if(!bp) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index a5f9271f4b..bd6c25c436 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -254,13 +254,16 @@ if(isnull(T.wear_suit) && isnull(T.w_uniform)) // who honestly puts all of their effort into tackling a naked guy? defense_mod += 2 + //skyrat edit + if(isnull(T.w_underwear) && isnull(T.w_socks) && isnull(T.w_shirt)) + defense_mod += 1 + // if(suit_slot && (istype(suit_slot,/obj/item/clothing/suit/space/hardsuit))) defense_mod += 1 if(T.is_shove_knockdown_blocked()) // riot armor and such defense_mod += 5 if(T.is_holding_item_of_type(/obj/item/shield)) defense_mod += 2 - if(islizard(T)) if(!T.getorganslot(ORGAN_SLOT_TAIL)) // lizards without tails are off-balance defense_mod -= 1 diff --git a/code/datums/elements/cleaning.dm b/code/datums/elements/cleaning.dm index d86fe22632..d7d8e66179 100644 --- a/code/datums/elements/cleaning.dm +++ b/code/datums/elements/cleaning.dm @@ -37,6 +37,24 @@ SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) cleaned_human.w_uniform.clean_blood() cleaned_human.update_inv_w_uniform() + //skyrat edit + else if(cleaned_human.w_underwear) + SEND_SIGNAL(cleaned_human.w_underwear, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_underwear.clean_blood() + cleaned_human.update_inv_w_underwear() + else if(cleaned_human.w_socks) + SEND_SIGNAL(cleaned_human.w_socks, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_socks.clean_blood() + cleaned_human.update_inv_w_socks() + else if(cleaned_human.w_shirt) + SEND_SIGNAL(cleaned_human.w_shirt, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_shirt.clean_blood() + cleaned_human.update_inv_w_shirt() + else if(cleaned_human.wrists) + SEND_SIGNAL(cleaned_human.wrists, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_shirt.clean_blood() + cleaned_human.update_inv_wrists() + // if(cleaned_human.shoes) SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) cleaned_human.shoes.clean_blood() diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 91c2120fc2..b414dd2eef 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -19,7 +19,7 @@ user_by_item -= target /datum/element/earhealing/proc/equippedChanged(datum/source, mob/living/carbon/user, slot) - if(slot == SLOT_EARS && istype(user)) + if(((slot == SLOT_EARS_LEFT) || (slot == SLOT_EARS_RIGHT)) && istype(user)) //skyrat edit user_by_item[source] = user else user_by_item -= source diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index da379b9851..98bd0afcf4 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -28,6 +28,14 @@ var/can_be_admin_equipped = TRUE // Set to FALSE if your outfit requires runtime parameters var/list/chameleon_extras //extra types for chameleon outfit changes, mostly guns + //skyrat edit + var/underwear = null + var/socks = null + var/shirt = null + var/ears_extra = null + var/wrists = null + // + /datum/outfit/proc/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) //to be overridden for customization depending on client prefs,species etc return @@ -59,13 +67,25 @@ if(neck) H.equip_to_slot_or_del(new neck(H),SLOT_NECK) if(ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + H.equip_to_slot_or_del(new ears(H),SLOT_EARS_LEFT) //skyrat edit if(glasses) H.equip_to_slot_or_del(new glasses(H),SLOT_GLASSES) if(id) H.equip_to_slot_or_del(new id(H),SLOT_WEAR_ID) if(suit_store) H.equip_to_slot_or_del(new suit_store(H),SLOT_S_STORE) + //skyrat edit + if(ears_extra) + H.equip_to_slot_or_del(new ears(H),SLOT_EARS_RIGHT) + if(underwear) + H.equip_to_slot_or_del(new underwear(H),SLOT_W_UNDERWEAR) + if(socks) + H.equip_to_slot_or_del(new socks(H),SLOT_W_SOCKS) + if(shirt) + H.equip_to_slot_or_del(new shirt(H),SLOT_W_SHIRT) + if(wrists) + H.equip_to_slot_or_del(new wrists(H),SLOT_WRISTS) + // if(accessory) var/obj/item/clothing/under/U = H.w_uniform @@ -141,6 +161,18 @@ H.shoes.add_fingerprint(H,1) if(H.gloves) H.gloves.add_fingerprint(H,1) + //skyrat edit + if(H.wrists) + H.wrists.add_fingerprint(H,1) + if(H.w_socks) + H.w_socks.add_fingerprint(H,1) + if(H.w_underwear) + H.w_underwear.add_fingerprint(H,1) + if(H.w_shirt) + H.w_shirt.add_fingerprint(H,1) + if(H.ears_extra) + H.ears_extra.add_fingerprint(H,1) + // if(H.ears) H.ears.add_fingerprint(H,1) if(H.glasses) @@ -160,7 +192,7 @@ return 1 /datum/outfit/proc/get_chameleon_disguise_info() - var/list/types = list(uniform, suit, back, belt, gloves, shoes, head, mask, neck, ears, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand) + var/list/types = list(uniform, underwear, socks, shirt, ears_extra, suit, back, belt, gloves, wrists, shoes, head, mask, neck, ears, glasses, id, l_pocket, r_pocket, suit_store, r_hand, l_hand) //skyrat edit types += chameleon_extras listclearnulls(types) return types diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 62d7512e29..2b08ad6c18 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -576,6 +576,20 @@ else if(w_uniform) w_uniform.add_blood_DNA(blood_dna, diseases) update_inv_w_uniform() + //skyrat edit + else if(w_underwear) + w_underwear.add_blood_DNA(blood_dna, diseases) + update_inv_w_underwear() + else if(w_socks) + w_socks.add_blood_DNA(blood_dna, diseases) + update_inv_w_socks() + else if(w_shirt) + w_shirt.add_blood_DNA(blood_dna, diseases) + update_inv_w_shirt() + else if(wrists) + wrists.add_blood_DNA(blood_dna, diseases) + update_inv_wrists() + // if(gloves) var/obj/item/clothing/gloves/G = gloves G.add_blood_DNA(blood_dna, diseases) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 8029685bf7..2f4cb84944 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_INIT(possible_changeling_IDs, list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")) -GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store")) -GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE)) -GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling)) +GLOBAL_LIST_INIT(slots, list("head", "wear_mask", "back", "wear_suit", "w_uniform", "w_underwear", "w_socks", "w_shirt", "shoes", "belt", "gloves", "glasses", "ears", "ears_extra", "wear_id", "s_store")) //skyrat edit +GLOBAL_LIST_INIT(slot2slot, list("head" = SLOT_HEAD, "wear_mask" = SLOT_WEAR_MASK, "neck" = SLOT_NECK, "back" = SLOT_BACK, "wear_suit" = SLOT_WEAR_SUIT, "w_uniform" = SLOT_W_UNIFORM, "w_underwear" = SLOT_W_UNDERWEAR, "w_socks" = SLOT_W_SOCKS, "w_shirt" = SLOT_W_SHIRT, "ears_extra" = SLOT_EARS_RIGHT, "shoes" = SLOT_SHOES, "belt" = SLOT_BELT, "gloves" = SLOT_GLOVES, "glasses" = SLOT_GLASSES, "ears" = SLOT_EARS_LEFT, "wear_id" = SLOT_WEAR_ID, "s_store" = SLOT_S_STORE, "wrists" = SLOT_WRISTS)) //skyrat edit +GLOBAL_LIST_INIT(slot2type, list("head" = /obj/item/clothing/head/changeling, "wear_mask" = /obj/item/clothing/mask/changeling, "back" = /obj/item/changeling, "wear_suit" = /obj/item/clothing/suit/changeling, "w_uniform" = /obj/item/clothing/under/changeling, "shoes" = /obj/item/clothing/shoes/changeling, "belt" = /obj/item/changeling, "gloves" = /obj/item/clothing/gloves/changeling, "glasses" = /obj/item/clothing/glasses/changeling, "ears" = /obj/item/changeling, "wear_id" = /obj/item/changeling, "s_store" = /obj/item/changeling, "w_underwear" = /obj/item/changeling, "w_socks" = /obj/item/changeling, "w_shirt" = /obj/item/changeling, "ears_extra" = /obj/item/changeling, "wrists" = /obj/item/changeling)) //skyrat edit GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our this objective to all lings diff --git a/code/game/gamemodes/clown_ops/bananium_bomb.dm b/code/game/gamemodes/clown_ops/bananium_bomb.dm index 695fc79169..9ce9bff6ac 100644 --- a/code/game/gamemodes/clown_ops/bananium_bomb.dm +++ b/code/game/gamemodes/clown_ops/bananium_bomb.dm @@ -39,6 +39,13 @@ ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) H.equip_to_slot_or_del(C, SLOT_W_UNIFORM) + //skyrat edit + if(!H.w_shirt || H.dropItemToGround(H.w_shirt)) + C = new /obj/item/clothing/underwear/shirt/clown(H) + ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) + H.equip_to_slot_or_del(C, SLOT_W_SHIRT) + // + if(!H.shoes || H.dropItemToGround(H.shoes)) C = new /obj/item/clothing/shoes/clown_shoes(H) ADD_TRAIT(C, TRAIT_NODROP, CLOWN_NUKE_TRAIT) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index b4c114eb6a..743c88728a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -155,6 +155,9 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/canMouseDown = FALSE + //SKYRAT CHANGE + var/hide_underwear_examine = FALSE + //and no, i'm not taking self-equip delays, period. /obj/item/Initialize() @@ -365,7 +368,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) + if(!user.temporarilyRemoveItemFromInventory(I = src)) return pickup(user) @@ -699,6 +702,18 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb owner.update_inv_wear_suit() if(flags & ITEM_SLOT_ICLOTHING) owner.update_inv_w_uniform() + //skyrat edit + if(flags & ITEM_SLOT_UNDERWEAR) + owner.update_inv_w_underwear() + if(flags & ITEM_SLOT_SOCKS) + owner.update_inv_w_socks() + if(flags & ITEM_SLOT_SHIRT) + owner.update_inv_w_shirt() + if(flags & ITEM_SLOT_EARS) + owner.update_inv_ears_extra() + if(flags & ITEM_SLOT_WRISTS) + owner.update_inv_wrists() + // if(flags & ITEM_SLOT_GLOVES) owner.update_inv_gloves() if(flags & ITEM_SLOT_EYES) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 6ac2d310a1..fd636fddfd 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(channel_tokens, list( /obj/item/radio/headset/ComponentInitialize() . = ..() if (bowman) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit /obj/item/radio/headset/Initialize() . = ..() @@ -76,6 +76,10 @@ GLOBAL_LIST_INIT(channel_tokens, list( var/mob/living/carbon/human/H = src.loc if(H.ears == src) return ..(freq, level) + //skyrat edit + else if(H.ears_extra == src) + return ..(freq, level) + // else if(AIuser) return ..(freq, level) return FALSE @@ -364,4 +368,4 @@ GLOBAL_LIST_INIT(channel_tokens, list( name = replacetext(name,"headset", "bowman headset") desc = "[desc] Protects ears from flashbangs." bowman = TRUE - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 58146be20f..9e7bb5a0db 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -803,6 +803,9 @@ force = 4 throwforce = 0 attack_verb = list("whipped", "repented", "lashed", "flagellated") + //skyrat edit - wowie the first wrist slot item + slot_flags = ITEM_SLOT_WRISTS + // var/praying = FALSE var/deity_name = "Coderbus" //This is the default, hopefully won't actually appear if the religion subsystem is running properly diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 7fdec9b3d9..5eea3eff60 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -19,6 +19,7 @@ new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) qdel(src) +/* skyrat edit - the dresser is useless with our inventory system /obj/structure/dresser/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) . = ..() if(. || !ishuman(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) @@ -80,3 +81,4 @@ if(!n_color || !H.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return default_color return sanitize_hexcolor(n_color, 3, FALSE, default_color) +*/ diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index c52249686a..bbcdbbfd9d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -412,6 +412,14 @@ H.update_inv_wear_suit() else if(H.w_uniform && wash_obj(H.w_uniform)) H.update_inv_w_uniform() + //skyrat edit + else if(H.w_underwear && wash_obj(H.w_underwear)) + H.update_inv_w_underwear() + else if(H.w_socks && wash_obj(H.w_socks)) + H.update_inv_w_socks() + else if(H.w_underwear && wash_obj(H.w_shirt)) + H.update_inv_w_shirt() + // if(washgloves) H.clean_blood() SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) @@ -424,8 +432,11 @@ H.update_body() if(H.glasses && washglasses && wash_obj(H.glasses)) H.update_inv_glasses() - if(H.ears && washears && wash_obj(H.ears)) + if(H.ears && washears && wash_obj(H.ears) && wash_obj(H.ears_extra)) //skyrat edit H.update_inv_ears() + //skyrat edit + H.update_inv_ears_extra() + // if(H.belt && wash_obj(H.belt)) H.update_inv_belt() else diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index ffca67b882..70d7fdd3fe 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -46,7 +46,7 @@ for(var/obj/item/I in H.held_items) qdel(I) H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/kilt/highlander(H), SLOT_W_UNIFORM) - H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS) + H.equip_to_slot_or_del(new /obj/item/radio/headset/heads/captain(H), SLOT_EARS_LEFT) //skyrat edit H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), SLOT_HEAD) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), SLOT_SHOES) H.equip_to_slot_or_del(new /obj/item/pinpointer/nuke(H), SLOT_L_STORE) diff --git a/code/modules/antagonists/traitor/syndicate_contract.dm b/code/modules/antagonists/traitor/syndicate_contract.dm index 0f67616a32..8742ab5ac3 100644 --- a/code/modules/antagonists/traitor/syndicate_contract.dm +++ b/code/modules/antagonists/traitor/syndicate_contract.dm @@ -99,12 +99,8 @@ for(var/obj/item/W in M) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(W == H.w_uniform) + if(W == H.w_uniform || W == H.shoes || W == H.w_underwear || W == H.w_socks || W == H.w_shirt) //skyrat edit continue //So all they're left with are shoes and uniform. - if(W == H.shoes) - continue - - M.transferItemToLoc(W) victim_belongings.Add(W) @@ -190,10 +186,8 @@ for(var/obj/item/W in M) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(W == H.w_uniform) + if(W == H.w_uniform || W == H.shoes || W == H.w_underwear || W == H.w_socks || W == H.w_shirt) //skyrat edit continue //So all they're left with are shoes and uniform. - if(W == H.shoes) - continue M.dropItemToGround(W) for(var/obj/item/W in victim_belongings) W.forceMove(return_pod) diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 42954c3542..f217e623cc 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -207,7 +207,7 @@ if(!istype(master_mob) || !istype(H)) return if(master_mob.ears) - H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS) + H.equip_to_slot_or_del(new master_mob.ears.type, SLOT_EARS_LEFT) //skyrat edit if(master_mob.w_uniform) H.equip_to_slot_or_del(new master_mob.w_uniform.type, SLOT_W_UNIFORM) if(master_mob.shoes) diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 65eeca75fe..09359f9662 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -52,6 +52,7 @@ /obj/item/organ/genital/proc/is_exposed() if(!owner || genital_flags & (GENITAL_INTERNAL|GENITAL_HIDDEN)) return FALSE + /* skyrat edit if(genital_flags & GENITAL_UNDIES_HIDDEN && ishuman(owner)) var/mob/living/carbon/human/H = owner if(!(NO_UNDERWEAR in H.dna.species.species_traits)) @@ -59,6 +60,7 @@ var/datum/sprite_accessory/underwear/bottom/B = H.hidden_underwear ? null : GLOB.underwear_list[H.underwear] if(zone == BODY_ZONE_CHEST ? (T?.covers_chest || B?.covers_chest) : (T?.covers_groin || B?.covers_groin)) return FALSE + */ if(genital_flags & GENITAL_THROUGH_CLOTHES) return TRUE diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 3426208fae..b686fbdea1 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -511,7 +511,7 @@ no_drops += H.get_item_by_slot(SLOT_GLOVES) no_drops += H.get_item_by_slot(SLOT_SHOES) no_drops += H.get_item_by_slot(SLOT_W_UNIFORM) - no_drops += H.get_item_by_slot(SLOT_EARS) + no_drops += H.get_item_by_slot(SLOT_EARS_LEFT) //skyrat edit for(var/i in no_drops) var/obj/item/I = i ADD_TRAIT(I, TRAIT_NODROP, CAPTURE_THE_FLAG_TRAIT) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5d5370eaba..9e6dc8708c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -93,6 +93,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/see_chat_emotes = TRUE var/enable_personal_chat_color = FALSE var/personal_chat_color = "#ffffff" + var/list/color_gear = list() //SKYRAT CHANGES END var/underwear = "Nude" //underwear type var/undie_color = "FFFFFF" @@ -581,6 +582,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += "" + //skyrat edit + if(gear.has_colors && (gear.name in color_gear)) + var/colore = "Color   " + dat += "" + else + dat += "" + // dat += "" - if(SLOT_EARS in obscured) - dat += "" + //skyrat edit + if(SLOT_EARS_LEFT in obscured) + dat += "" else - dat += "" + dat += "" + + if(SLOT_EARS_RIGHT in obscured) + dat += "" + else + dat += "" + // dat += "" @@ -179,6 +186,13 @@ else dat += "" + //skyrat edit + if(SLOT_WRISTS in obscured) + dat += "" + else + dat += "" + // + if(SLOT_W_UNIFORM in obscured) dat += "" else @@ -197,6 +211,23 @@ dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]" dat += "" + //skyrat edit + dat += "" + var/undies_hidden = underwear_hidden() + if((SLOT_W_UNDERWEAR in obscured) || undies_hidden) + dat += "" + else + dat += "" + if((SLOT_W_SOCKS in obscured) || undies_hidden) + dat += "" + else + dat += "" + if((SLOT_W_SHIRT in obscured) || undies_hidden) + dat += "" + else + dat += "" + // + if(handcuffed) dat += "" if(legcuffed) @@ -552,10 +583,18 @@ if(wear_suit) if(wear_suit.flags_inv & HIDEGLOVES) LAZYOR(., SLOT_GLOVES) + LAZYOR(., SLOT_WRISTS) if(wear_suit.flags_inv & HIDEJUMPSUIT) LAZYOR(., SLOT_W_UNIFORM) + LAZYOR(., SLOT_W_SHIRT) + LAZYOR(., SLOT_W_UNDERWEAR) if(wear_suit.flags_inv & HIDESHOES) LAZYOR(., SLOT_SHOES) + LAZYOR(., SLOT_W_SOCKS) + if(w_uniform) + if(underwear_hidden()) + LAZYOR(., SLOT_W_SHIRT) + LAZYOR(., SLOT_W_UNDERWEAR) /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) if(judgement_criteria & JUDGE_EMAGGED) diff --git a/code/modules/mob/living/carbon/human/human_block.dm b/code/modules/mob/living/carbon/human/human_block.dm index 4ba7e95564..defd549624 100644 --- a/code/modules/mob/living/carbon/human/human_block.dm +++ b/code/modules/mob/living/carbon/human/human_block.dm @@ -6,6 +6,20 @@ if(w_uniform) if(!.[w_uniform]) .[w_uniform] = w_uniform.block_priority + //skyrat edit + if(w_underwear) + if(!.[w_underwear]) + .[w_underwear] = w_underwear.block_priority + if(w_socks) + if(!.[w_socks]) + .[w_socks] = w_socks.block_priority + if(w_shirt) + if(!.[w_shirt]) + .[w_shirt] = w_shirt.block_priority + if(wrists) + if(!.[wrists]) + .[wrists] = wrists.block_priority + // if(wear_neck) if(!.[wear_neck]) .[wear_neck] = wear_neck.block_priority diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 18501b4ca2..c01f3eed13 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -23,7 +23,7 @@ if(!d_type || !def_zone) return 0 var/protection = 0 - var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) + var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, w_underwear, w_socks, w_shirt, back, gloves, wrists, shoes, belt, s_store, glasses, ears, ears_extra, wear_id, wear_neck) //Everything but pockets. Pockets are l_store and r_store. (if pockets were allowed, putting something armored, gloves or hats for example, would double up on the armor) //skyrat edit for(var/bp in body_parts) if(!bp) continue diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 13456ed61c..7ad2c18557 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -49,6 +49,14 @@ var/obj/item/l_store = null var/obj/item/s_store = null + //skyrat slots + var/obj/item/w_underwear = null + var/obj/item/w_socks = null + var/obj/item/w_shirt = null + var/obj/item/ears_extra = null + var/obj/item/wrists = null + // + var/special_voice = "" // For changing our voice. Used by a symptom. var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 523369d10a..7dcb1a6820 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -31,12 +31,20 @@ return belt if(SLOT_WEAR_ID) return wear_id - if(SLOT_EARS) + if(SLOT_EARS_LEFT) //skyrat edit return ears + //skyrat edit + if(SLOT_EARS_RIGHT) + return ears_extra + // if(SLOT_GLASSES) return glasses if(SLOT_GLOVES) return gloves + //skyrat edit + if(SLOT_WRISTS) + return wrists + // if(SLOT_HEAD) return head if(SLOT_SHOES) @@ -45,6 +53,14 @@ return wear_suit if(SLOT_W_UNIFORM) return w_uniform + //skyrat edit + if(SLOT_W_UNDERWEAR) + return w_underwear + if(SLOT_W_SOCKS) + return w_socks + if(SLOT_W_SHIRT) + return w_shirt + // if(SLOT_L_STORE) return l_store if(SLOT_R_STORE) @@ -64,13 +80,17 @@ legcuffed, wear_suit, gloves, + wrists, shoes, belt, wear_id, l_store, r_store, - w_uniform - ) + w_uniform, + w_underwear, + w_socks, + w_shirt, + ) //skyrat edit /mob/living/carbon/human/proc/get_head_slots() return list( @@ -79,7 +99,8 @@ wear_neck, glasses, ears, - ) + ears_extra, + ) //skyrat edit /mob/living/carbon/human/proc/get_storage_slots() return list( @@ -105,9 +126,14 @@ wear_id = I sec_hud_set_ID() update_inv_wear_id() - if(SLOT_EARS) + //skyrat edit + if(SLOT_EARS_LEFT) ears = I update_inv_ears() + if(SLOT_EARS_RIGHT) + ears_extra = I + update_inv_ears_extra() + // if(SLOT_GLASSES) glasses = I var/obj/item/clothing/glasses/G = I @@ -124,6 +150,11 @@ if(SLOT_GLOVES) gloves = I update_inv_gloves() + //skyrat edit + if(SLOT_WRISTS) + wrists = I + update_inv_wrists() + // if(SLOT_SHOES) shoes = I update_inv_shoes() @@ -139,6 +170,17 @@ w_uniform = I update_suit_sensors() update_inv_w_uniform() + //skyrat edit + if(SLOT_W_UNDERWEAR) + w_underwear = I + update_inv_w_underwear() + if(SLOT_W_SOCKS) + w_socks = I + update_inv_w_socks() + if(SLOT_W_SHIRT) + w_shirt = I + update_inv_w_shirt() + // if(SLOT_L_STORE) l_store = I update_inv_pockets() @@ -196,6 +238,24 @@ update_suit_sensors() if(!QDELETED(src)) update_inv_w_uniform() + //skyrat edit + else if(I == w_underwear) + w_underwear = null + if(!QDELETED(src)) + update_inv_w_underwear() + else if(I == w_socks) + w_socks = null + if(!QDELETED(src)) + update_inv_w_socks() + else if(I == w_shirt) + w_shirt = null + if(!QDELETED(src)) + update_inv_w_shirt() + else if(I == wrists) + wrists = null + if(!QDELETED(src)) + update_inv_wrists() + // else if(I == gloves) gloves = null if(!QDELETED(src)) @@ -218,6 +278,12 @@ ears = null if(!QDELETED(src)) update_inv_ears() + //skyrat edit + else if(I == ears_extra) + ears_extra = null + if(!QDELETED(src)) + update_inv_ears_extra() + // else if(I == shoes) shoes = null if(!QDELETED(src)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 56ab1f1b10..f5c7fbe2e2 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -163,6 +163,20 @@ if(w_uniform) if(w_uniform.max_heat_protection_temperature && w_uniform.max_heat_protection_temperature >= temperature) thermal_protection_flags |= w_uniform.heat_protection + //skyrat edit + if(w_underwear) + if(w_underwear.max_heat_protection_temperature && w_underwear.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= w_underwear.heat_protection + if(w_socks) + if(w_socks.max_heat_protection_temperature && w_socks.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= w_socks.heat_protection + if(w_shirt) + if(w_shirt.max_heat_protection_temperature && w_shirt.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= w_shirt.heat_protection + if(wrists) + if(wrists.max_heat_protection_temperature && wrists.max_heat_protection_temperature >= temperature) + thermal_protection_flags |= wrists.heat_protection + // if(shoes) if(shoes.max_heat_protection_temperature && shoes.max_heat_protection_temperature >= temperature) thermal_protection_flags |= shoes.heat_protection diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 22cb10026b..10590b5f70 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -72,17 +72,30 @@ if(MODE_HEADSET) if (ears) ears.talk_into(src, message, , spans, language) + //skyrat edit + else if (ears_extra) + ears_extra.talk_into(src, message, , spans, language) + // return ITALICS | REDUCE_RANGE if(MODE_DEPARTMENT) if (ears) ears.talk_into(src, message, message_mode, spans, language) + //skyrat edit + else if (ears_extra) + ears_extra.talk_into(src, message, message_mode, spans, language) + // return ITALICS | REDUCE_RANGE if(message_mode in GLOB.radiochannels) if(ears) ears.talk_into(src, message, message_mode, spans, language) return ITALICS | REDUCE_RANGE + //skyrat edit + else if (ears_extra) + ears_extra.talk_into(src, message, , spans, language) + return ITALICS | REDUCE_RANGE + // return 0 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e62b8c1619..8df6444854 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -13,10 +13,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/has_field_of_vision = TRUE //Species Icon Drawing Offsets - Pixel X, Pixel Y, Aka X = Horizontal and Y = Vertical, from bottom left corner - var/list/offset_features = list( + var/list/offset_features = list( //skyrat edit OFFSET_UNIFORM = list(0,0), + OFFSET_UNDERWEAR = list(0,0), + OFFSET_SOCKS = list(0,0), + OFFSET_SHIRT = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), + OFFSET_WRISTS = list(0,0), OFFSET_GLASSES = list(0,0), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), @@ -611,6 +615,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) standing += eye_overlay + /* skyrat edit //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) var/datum/sprite_accessory/taur/TA @@ -655,6 +660,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(T.has_color) MA.color = "#[H.shirt_color]" standing += MA + */ if(standing.len) H.overlays_standing[BODY_LAYER] = standing @@ -705,6 +711,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(H.w_uniform && !H.wear_suit) if(!(H.w_uniform.mutantrace_variation & STYLE_DIGITIGRADE)) should_be_squished = TRUE + //skyrat edit + if(H.w_underwear && !H.wear_suit && !H.w_uniform) + if(!(H.w_underwear.mutantrace_variation & STYLE_DIGITIGRADE)) + should_be_squished = TRUE + if(H.w_socks && !H.wear_suit && !H.w_uniform) + if(!(H.w_socks.mutantrace_variation & STYLE_DIGITIGRADE)) + should_be_squished = TRUE + if(H.w_shirt && !H.wear_suit && !H.w_uniform) + if(!(H.w_shirt.mutantrace_variation & STYLE_DIGITIGRADE)) + should_be_squished = TRUE + // if(O.use_digitigrade == FULL_DIGITIGRADE && should_be_squished) O.use_digitigrade = SQUISHED_DIGITIGRADE update_needed = TRUE @@ -1022,6 +1039,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(num_arms < 2) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) + //skyrat edit + if(SLOT_WRISTS) + if(H.wrists) + return FALSE + if( !(I.slot_flags & ITEM_SLOT_WRISTS) ) + return FALSE + if(num_arms < 2) + return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + // if(SLOT_SHOES) if(H.shoes) return FALSE @@ -1063,7 +1090,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) - if(SLOT_EARS) + if(SLOT_EARS_LEFT) //skyrat edit if(H.ears) return FALSE if(!(I.slot_flags & ITEM_SLOT_EARS)) @@ -1071,6 +1098,34 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) + //skyrat edit + if(SLOT_EARS_RIGHT) + if(H.ears_extra) + return FALSE + if(!(I.slot_flags & ITEM_SLOT_EARS)) + return FALSE + if(!H.get_bodypart(BODY_ZONE_HEAD)) + return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(SLOT_W_UNDERWEAR) + if(H.w_underwear) + return FALSE + if( !(I.slot_flags & ITEM_SLOT_UNDERWEAR) ) + return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(SLOT_W_SOCKS) + if(H.w_socks) + return FALSE + if( !(I.slot_flags & ITEM_SLOT_SOCKS) ) + return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(SLOT_W_SHIRT) + if(H.w_shirt) + return FALSE + if( !(I.slot_flags & ITEM_SLOT_SHIRT) ) + return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + // if(SLOT_W_UNIFORM) if(H.w_uniform) return FALSE @@ -1202,6 +1257,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) REMOVE_TRAIT(H, TRAIT_FAT, OBESITY) H.remove_movespeed_modifier(/datum/movespeed_modifier/obesity) H.update_inv_w_uniform() + //skyrat edit + H.update_inv_w_underwear() + H.update_inv_w_socks() + H.update_inv_w_shirt() + // H.update_inv_wear_suit() else if(H.overeatduration >= 100) @@ -1209,6 +1269,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) ADD_TRAIT(H, TRAIT_FAT, OBESITY) H.add_movespeed_modifier(/datum/movespeed_modifier/obesity) H.update_inv_w_uniform() + //skyrat edit + H.update_inv_w_underwear() + H.update_inv_w_socks() + H.update_inv_w_shirt() + // H.update_inv_wear_suit() // nutrition decrease and satiety @@ -1548,6 +1613,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(target.w_uniform) target.w_uniform.add_fingerprint(user) + //skyrat edit + else if(target.w_underwear) + target.w_underwear.add_fingerprint(user) + else if(target.w_socks) + target.w_socks.add_fingerprint(user) + else if(target.w_shirt) + target.w_shirt.add_fingerprint(user) + // //var/randomized_zone = ran_zone(user.zone_selected) CIT CHANGE - comments out to prevent compiling errors SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) if(target.pulling == user) @@ -1720,6 +1793,17 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.visible_message("[H] has been knocked down!", \ "[H] has been knocked down!") H.apply_effect(60, EFFECT_KNOCKDOWN, armor_block) + //skyrat edit + if(H.w_underwear) + H.w_underwear.add_mob_blood(H) + H.update_inv_w_underwear() + if(H.w_socks) + H.w_socks.add_mob_blood(H) + H.update_inv_w_socks() + if(H.w_shirt) + H.w_underwear.add_mob_blood(H) + H.update_inv_w_shirt() + // if(bloody) if(H.wear_suit) @@ -1804,6 +1888,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(target.w_uniform) target.w_uniform.add_fingerprint(user) + //skyrat edit + else if(target.w_shirt) + target.w_shirt.add_fingerprint(user) + else if(target.w_socks) + target.w_socks.add_fingerprint(user) + else if(target.w_underwear) + target.w_underwear.add_fingerprint(user) + // SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, user, user.zone_selected) if(CHECK_MOBILITY(target, MOBILITY_STAND)) @@ -2107,6 +2199,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //CHEST// var/obj/item/clothing/chest_clothes = null + //skyrat edit + if(H.w_underwear && (H.w_underwear.body_parts_covered & CHEST)) + chest_clothes = H.w_underwear + if(H.w_socks && (H.w_socks.body_parts_covered & CHEST)) + chest_clothes = H.w_socks + if(H.w_shirt && (H.w_shirt.body_parts_covered & CHEST)) + chest_clothes = H.w_shirt + // if(H.w_uniform) chest_clothes = H.w_uniform if(H.wear_suit) @@ -2117,6 +2217,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //ARMS & HANDS// var/obj/item/clothing/arm_clothes = null + //skyrat edit + if(H.wrists) + arm_clothes = H.wrists + if(H.w_underwear && (H.w_underwear.body_parts_covered & ARMS)) + arm_clothes = H.w_underwear + if(H.w_socks && (H.w_socks.body_parts_covered & ARMS)) + arm_clothes = H.w_socks + if(H.w_shirt && (H.w_shirt.body_parts_covered & ARMS)) + arm_clothes = H.w_shirt + // if(H.gloves) arm_clothes = H.gloves if(H.w_uniform && ((H.w_uniform.body_parts_covered & HANDS) || (H.w_uniform.body_parts_covered & ARMS))) @@ -2128,6 +2238,14 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //LEGS & FEET// var/obj/item/clothing/leg_clothes = null + //skyrat edit + if(H.w_underwear && (H.w_underwear.body_parts_covered & LEGS)) + leg_clothes = H.w_underwear + if(H.w_socks && (H.w_socks.body_parts_covered & LEGS)) + leg_clothes = H.w_socks + if(H.w_shirt && (H.w_shirt.body_parts_covered & LEGS)) + leg_clothes = H.w_shirt + // if(H.shoes) leg_clothes = H.shoes if(H.w_uniform && ((H.w_uniform.body_parts_covered & FEET) || (H.w_uniform.body_parts_covered & LEGS))) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 9b39438563..9bd7c44aab 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -77,6 +77,13 @@ There are several things that need to be remembered: update_body(TRUE) update_hair() update_inv_w_uniform() + //skyrat edit + update_inv_w_underwear() + update_inv_w_socks() + update_inv_w_shirt() + update_inv_ears_extra() + update_inv_wrists() + // update_inv_wear_id() update_inv_gloves() update_inv_glasses() @@ -150,6 +157,145 @@ There are several things that need to be remembered: apply_overlay(UNIFORM_LAYER) update_mutant_bodyparts() +//skyrat edit +/mob/living/carbon/human/update_inv_w_underwear() + remove_overlay(UNDERWEAR_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNDERWEAR] + inv.update_icon() + + if(istype(w_underwear, /obj/item/clothing/underwear)) + var/obj/item/clothing/underwear/U = w_underwear + U.screen_loc = ui_boxers + if(client && hud_used && hud_used.hud_shown && hud_used.extra_shown) + if(hud_used.inventory_shown) + client.screen += w_underwear + update_observer_view(w_underwear,1) + + if(w_uniform && (w_uniform.flags_inv & HIDEUNDERWEAR)) + return + + var/alt_worn = U.mob_overlay_icon || 'sandcode/icons/mob/clothing/underwear.dmi' + var/variant_flag = NONE + + if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_worn = U.anthro_mob_worn_overlay || 'sandcode/icons/mob/clothing/underwear_digi.dmi' + variant_flag |= STYLE_DIGITIGRADE + + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state + + var/mutable_appearance/underwear_overlay + + var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM + underwear_overlay = U.build_worn_icon(UNDERWEAR_LAYER, alt_worn, FALSE, gendered, null, variant_flag, FALSE, mask) + + if(OFFSET_UNDERWEAR in dna.species.offset_features) + underwear_overlay.pixel_x += dna.species.offset_features[OFFSET_UNDERWEAR][1] + underwear_overlay.pixel_y += dna.species.offset_features[OFFSET_UNDERWEAR][2] + overlays_standing[UNDERWEAR_LAYER] = underwear_overlay + + apply_overlay(UNDERWEAR_LAYER) + update_mutant_bodyparts() + +/mob/living/carbon/human/update_inv_w_socks() + remove_overlay(SOCKS_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_SOCKS] + inv.update_icon() + + if(istype(w_socks, /obj/item/clothing/underwear)) + var/obj/item/clothing/underwear/U = w_socks + U.screen_loc = ui_socks + if(client && hud_used && hud_used.hud_shown && hud_used.extra_shown) + if(hud_used.inventory_shown) + client.screen += w_socks + update_observer_view(w_socks,1) + + if(w_uniform && (w_uniform.flags_inv & HIDEUNDERWEAR)) + return + + var/alt_worn = U.mob_overlay_icon || 'sandcode/icons/mob/clothing/underwear.dmi' + var/variant_flag = NONE + + if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_worn = U.anthro_mob_worn_overlay || 'sandcode/icons/mob/clothing/underwear_digi.dmi' + variant_flag |= STYLE_DIGITIGRADE + + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state + + var/mutable_appearance/underwear_overlay + + var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM + underwear_overlay = U.build_worn_icon(SOCKS_LAYER, alt_worn, FALSE, gendered, null, variant_flag, FALSE, mask) + + if(OFFSET_SOCKS in dna.species.offset_features) + underwear_overlay.pixel_x += dna.species.offset_features[OFFSET_SOCKS][1] + underwear_overlay.pixel_y += dna.species.offset_features[OFFSET_SOCKS][2] + overlays_standing[SOCKS_LAYER] = underwear_overlay + + apply_overlay(SOCKS_LAYER) + update_mutant_bodyparts() + +/mob/living/carbon/human/update_inv_w_shirt() + remove_overlay(SHIRT_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_SHIRT] + inv.update_icon() + + if(istype(w_shirt, /obj/item/clothing/underwear)) + var/obj/item/clothing/underwear/U = w_shirt + U.screen_loc = ui_shirt + if(client && hud_used && hud_used.hud_shown && hud_used.extra_shown) + if(hud_used.inventory_shown) + client.screen += w_shirt + update_observer_view(w_shirt,1) + + if(w_uniform && (w_uniform.flags_inv & HIDEUNDERWEAR)) + return + + var/alt_worn = U.mob_overlay_icon || 'sandcode/icons/mob/clothing/underwear.dmi' + var/variant_flag = NONE + + if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_worn = U.anthro_mob_worn_overlay || 'sandcode/icons/mob/clothing/underwear_digi.dmi' + variant_flag |= STYLE_DIGITIGRADE + + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state + + var/mutable_appearance/underwear_overlay + + var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM + underwear_overlay = U.build_worn_icon(SHIRT_LAYER, alt_worn, FALSE, gendered, null, variant_flag, FALSE, mask) + + if(OFFSET_UNDERWEAR in dna.species.offset_features) + underwear_overlay.pixel_x += dna.species.offset_features[OFFSET_SHIRT][1] + underwear_overlay.pixel_y += dna.species.offset_features[OFFSET_SHIRT][2] + overlays_standing[SHIRT_LAYER] = underwear_overlay + + apply_overlay(SHIRT_LAYER) + update_mutant_bodyparts() +// /mob/living/carbon/human/update_inv_wear_id() remove_overlay(ID_LAYER) @@ -207,6 +353,39 @@ There are several things that need to be remembered: overlays_standing[GLOVES_LAYER] = gloves_overlay apply_overlay(GLOVES_LAYER) +//skyrat edit +/mob/living/carbon/human/update_inv_wrists() + remove_overlay(WRISTS_LAYER) + + if(client && hud_used && hud_used.inv_slots[SLOT_WRISTS]) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WRISTS] + inv.update_icon() + + if(!wrists && bloody_hands) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -WRISTS_LAYER, color = blood_DNA_to_color()) + if(get_num_arms(FALSE) < 2) + if(has_left_hand(FALSE)) + bloody_overlay.icon_state = "bloodyhands_left" + else if(has_right_hand(FALSE)) + bloody_overlay.icon_state = "bloodyhands_right" + + overlays_standing[WRISTS_LAYER] = bloody_overlay + + var/mutable_appearance/wrists_overlay = overlays_standing[WRISTS_LAYER] + if(wrists) + wrists.screen_loc = ui_wrists + if(client && hud_used && hud_used.hud_shown && hud_used.extra_shown) + if(hud_used.inventory_shown) + client.screen += wrists + update_observer_view(wrists,1) + overlays_standing[WRISTS_LAYER] = gloves.build_worn_icon(default_layer = WRISTS_LAYER, default_icon_file = 'sandcode/icons/mob/clothing/wrists.dmi') + wrists_overlay = overlays_standing[WRISTS_LAYER] + if(OFFSET_WRISTS in dna.species.offset_features) + wrists_overlay.pixel_x += dna.species.offset_features[OFFSET_WRISTS][1] + wrists_overlay.pixel_y += dna.species.offset_features[OFFSET_WRISTS][2] + overlays_standing[WRISTS_LAYER] = wrists_overlay + apply_overlay(WRISTS_LAYER) +// /mob/living/carbon/human/update_inv_glasses() remove_overlay(GLASSES_LAYER) @@ -236,13 +415,13 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_ears() - remove_overlay(EARS_LAYER) + remove_overlay(EAR_LEFT_LAYER) if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_LEFT] inv.update_icon() if(ears) @@ -252,14 +431,38 @@ There are several things that need to be remembered: client.screen += ears //add it to the client's screen update_observer_view(ears,1) - overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') - var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER] + overlays_standing[EAR_LEFT_LAYER] = ears.build_worn_icon(default_layer = EAR_LEFT_LAYER, default_icon_file = 'sandcode/icons/mob/clothing/ears.dmi', use_mob_overlay_icon = FALSE) + var/mutable_appearance/ears_overlay = overlays_standing[EAR_LEFT_LAYER] if(OFFSET_EARS in dna.species.offset_features) ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2] - overlays_standing[EARS_LAYER] = ears_overlay - apply_overlay(EARS_LAYER) + overlays_standing[EAR_LEFT_LAYER] = ears_overlay + apply_overlay(EAR_LEFT_LAYER) +/mob/living/carbon/human/update_inv_ears_extra() + remove_overlay(EAR_RIGHT_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS_RIGHT] + inv.update_icon() + + if(ears_extra) + ears_extra.screen_loc = ui_ears_extra //move the item to the appropriate screen loc + if(client && hud_used && hud_used.hud_shown && hud_used.extra_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += ears_extra //add it to the client's screen + update_observer_view(ears_extra,1) + + overlays_standing[EAR_RIGHT_LAYER] = ears_extra.build_worn_icon(default_layer = EAR_RIGHT_LAYER, default_icon_file = 'sandcode/icons/mob/clothing/ears_extra.dmi', use_mob_overlay_icon = FALSE) + var/mutable_appearance/ears_overlay = overlays_standing[EAR_RIGHT_LAYER] + if(OFFSET_EARS in dna.species.offset_features) + ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] + ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2] + overlays_standing[EAR_RIGHT_LAYER] = ears_overlay + apply_overlay(EAR_RIGHT_LAYER) /mob/living/carbon/human/update_inv_shoes() remove_overlay(SHOES_LAYER) diff --git a/code/modules/mob/update_icons.dm b/code/modules/mob/update_icons.dm index 581584912d..231f972fb3 100644 --- a/code/modules/mob/update_icons.dm +++ b/code/modules/mob/update_icons.dm @@ -34,6 +34,20 @@ /mob/proc/update_inv_w_uniform() return +//skyrat edit +/mob/proc/update_inv_w_underwear() + return + +/mob/proc/update_inv_w_socks() + return + +/mob/proc/update_inv_w_shirt() + return + +/mob/proc/update_inv_wrists() + return +// + /mob/proc/update_inv_belt() return @@ -67,5 +81,10 @@ /mob/proc/update_inv_pockets() return +//skyrat edit /mob/proc/update_inv_ears() - return \ No newline at end of file + return + +/mob/proc/update_inv_ears_extra() + return +// diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index c0ee68cdee..fb069c1a57 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -53,7 +53,7 @@ It is possible to destroy the net by the occupant or someone else. if(ishuman(affecting)) var/mob/living/carbon/human/H = affecting for(var/obj/item/W in H) - if(W == H.w_uniform || W == H.shoes) + if(W == H.w_uniform || W == H.shoes || W == H.w_underwear) //skyrat edit continue//So all they're left with are shoes and uniform. H.dropItemToGround(W) H.dna.species.give_important_for_life(H) // After we remove items, at least give them what they need to live. diff --git a/code/modules/projectiles/boxes_magazines/external/rechargable.dm b/code/modules/projectiles/boxes_magazines/external/rechargable.dm index 7a3c82489c..64918907a3 100644 --- a/code/modules/projectiles/boxes_magazines/external/rechargable.dm +++ b/code/modules/projectiles/boxes_magazines/external/rechargable.dm @@ -54,7 +54,7 @@ desc = "A miniature battery for an energy weapon." icon = 'icons/obj/ammo.dmi' icon_state = "mws_batt" - slot_flags = SLOT_BELT | SLOT_EARS + slot_flags = SLOT_BELT | SLOT_EARS_LEFT | SLOT_EARS_RIGHT //skyrat edit throwforce = 1 caliber = "mws" @@ -113,4 +113,4 @@ name = "'MWS' microbattery - ION" type_color = "#d084d6" type_name = "ION" - projectile_type = /obj/item/projectile/ion \ No newline at end of file + projectile_type = /obj/item/projectile/ion diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 5c9d5b92a3..691aa7c801 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -39,6 +39,24 @@ SEND_SIGNAL(cleaned_human.w_uniform, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) cleaned_human.w_uniform.clean_blood() cleaned_human.update_inv_w_uniform() + //skyrat edit + else if(cleaned_human.w_underwear) + SEND_SIGNAL(cleaned_human.w_underwear, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_underwear.clean_blood() + cleaned_human.update_inv_w_underwear() + else if(cleaned_human.w_socks) + SEND_SIGNAL(cleaned_human.w_socks, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_socks.clean_blood() + cleaned_human.update_inv_w_socks() + else if(cleaned_human.w_shirt) + SEND_SIGNAL(cleaned_human.w_shirt, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.w_shirt.clean_blood() + cleaned_human.update_inv_w_shirt() + else if(cleaned_human.wrists) + SEND_SIGNAL(cleaned_human.wrists, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) + cleaned_human.wrists.clean_blood() + cleaned_human.update_inv_wrists() + // if(cleaned_human.shoes) SEND_SIGNAL(cleaned_human.shoes, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) cleaned_human.shoes.clean_blood() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index ec26182813..4679d5bd72 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -304,11 +304,12 @@ SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ + SLOT_EARS_LEFT, SLOT_EARS_RIGHT,\ + SLOT_GLASSES,\ SLOT_BELT, SLOT_S_STORE,\ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE - ) + ) //skyrat edit container_flags = APTFT_ALTCLICK|APTFT_VERB container_HP = 1 diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 3161419449..73fdcc2a64 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -269,6 +269,14 @@ if(ishuman(src)) var/mob/living/carbon/human/H = src + //skyrat edit + if(H.w_shirt) + H.update_inv_w_shirt() + if(H.w_socks) + H.update_inv_w_socks() + if(H.w_underwear) + H.update_inv_w_underwear() + // if(H.w_uniform) H.update_inv_w_uniform() if(H.shoes) @@ -290,4 +298,4 @@ . |= HAND_LEFT if(ARM_RIGHT) . |= HAND_RIGHT - . |= L.body_part \ No newline at end of file + . |= L.body_part diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm index 7a92b39692..80ace47dd6 100644 --- a/code/modules/surgery/helpers.dm +++ b/code/modules/surgery/helpers.dm @@ -131,7 +131,7 @@ eyesmouth_covered |= I.flags_cover if(ishuman(C)) var/mob/living/carbon/human/H = C - for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears)) + for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.w_underwear, H.w_socks, H.w_shirt, H.shoes, H.belt, H.gloves, H.wrists, H.glasses, H.ears, H.ears_extra)) //skyrat edit covered_locations |= I.body_parts_covered face_covered |= I.flags_inv eyesmouth_covered |= I.flags_cover diff --git a/icons/mob/inhands/__inhand_template.dmi b/icons/mob/inhands/__inhand_template.dmi index 283428495c14a44c88361e88a4c32868aed48cf2..88f794b7423e4be93a4f94cc79e6ebf1bdd811e6 100644 GIT binary patch delta 828 zcmV-C1H=4`2KEMDiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udH?_bAy75hb%w4TRx`l> z00LJ@L_t(oh3%F-a)U4sg_Q(ja20OAaD`mJh24K=CZ>0haqXEDv@TLm(n3XxP8lJH z(LQV~4vgdRSl!dlC+!OKR*1W4!7J5K2s*OsrywBu873$l+O!A)dV~ljC>`0fIsiGs zGq>PRfY35NI)oufL;%^~$<3mm$^OatPhb~RvU zOo)GDdZN`Tj*SiD25{`zHGu7ufDHoH24L0#eq(T3z-~A|-@>c|=v#2F3E)C->Lhk4 z5pJEt98mdsML=zx~aUzaGGPfvbNH z(9Y5BS$iK1xQ~`+RLc^^bG!DTV<9DuXEv>Xv_ndI1T~)9v=1HX0Q3lx0J8J*$A>T^ zi3q@?+C$)OA%__2^(2O>4=C^e#u4-Z%p)vhKLm4wW_`Cuv)-7YhzO7u0xAR)#&8?K zaY`G35d#a*2)_ep#NwI&E(E_$BK=g9rOa*!Ale*s*VyF12(qZ~ODw94X#RKZ{XD3- zpGlC`17-jyAAm~%c?}>hQb}JV2HNklvvcJ}@J-Pz}}_zgKB($T0z>$Cx0&`e?3?Np((b$OsP6!;yjIBKu8c5J19s}Ix;QpVU(H1${+}XS| zh4rNnEPxVeiV{MQ1OZY2B%}aJ@c+;WTolr^=l z&;lrdK^h`khfB^OXQ~~hfa(Zzw0GF5082& z+h*Sg;FfG(2e4w`_izOTuL-m#J@}N0CXluHFGVvX{>lju4Dc_=K*2!v*8oo?jin(( z+eO>}$O^vctZ1zbE;cU4rbP2icUJ2^&<7aY1bPBr^#|2nD2#yR00000NkvXXu0mjf DU=TC* diff --git a/modular_citadel/code/modules/client/loadout/_loadout.dm b/modular_citadel/code/modules/client/loadout/_loadout.dm index 0ebfa060f2..a76ae96778 100644 --- a/modular_citadel/code/modules/client/loadout/_loadout.dm +++ b/modular_citadel/code/modules/client/loadout/_loadout.dm @@ -67,6 +67,11 @@ GLOBAL_LIST_EMPTY(loadout_whitelist_ids) var/restricted_desc + //skyrat edit + var/has_colors = FALSE + var/color = "#FFFFFF" + // + /datum/gear/New() if(isnull(donoritem)) if(donator_group_id || ckeywhitelist) diff --git a/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm b/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm index 7f5d625f62..ff7a83e33a 100644 --- a/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm +++ b/modular_citadel/code/modules/mob/living/carbon/reindex_screams.dm @@ -15,10 +15,22 @@ //More slots in humans. if(ears) add_screams(ears.alternate_screams) + //skyrat edit + if(ears_extra) + add_screams(ears_extra.alternate_screams) + // if(wear_suit) add_screams(wear_suit.alternate_screams) if(w_uniform) add_screams(w_uniform.alternate_screams) + //skyrat edit + if(w_underwear) + add_screams(w_underwear.alternate_screams) + if(w_socks) + add_screams(w_socks.alternate_screams) + if(w_shirt) + add_screams(w_shirt.alternate_screams) + // if(glasses) add_screams(glasses.alternate_screams) if(gloves) @@ -42,4 +54,4 @@ /mob/living/proc/clear_screams() LAZYINITLIST(alternate_screams) - LAZYCLEARLIST(alternate_screams) \ No newline at end of file + LAZYCLEARLIST(alternate_screams) diff --git a/sandcode/code/game/objects/items/devices/radio/radio.dm b/sandcode/code/game/objects/items/devices/radio/radio.dm new file mode 100644 index 0000000000..c9d96d786b --- /dev/null +++ b/sandcode/code/game/objects/items/devices/radio/radio.dm @@ -0,0 +1,2 @@ +/obj/item/radio/headset + slot_flags = ITEM_SLOT_EARS diff --git a/sandcode/code/game/objects/items/items.dm b/sandcode/code/game/objects/items/items.dm new file mode 100644 index 0000000000..b61a8a9ed3 --- /dev/null +++ b/sandcode/code/game/objects/items/items.dm @@ -0,0 +1,2 @@ +/obj/item + hide_underwear_examine = TRUE diff --git a/sandcode/code/modules/client/loadout/boxers.dm b/sandcode/code/modules/client/loadout/boxers.dm new file mode 100644 index 0000000000..1ba7ea6053 --- /dev/null +++ b/sandcode/code/modules/client/loadout/boxers.dm @@ -0,0 +1,138 @@ +/datum/gear/underwear + name = "Briefs" + category = LOADOUT_CATEGORY_GENERAL_UNDER + subcategory = LOADOUT_SUBCATEGORY_UNDERWEAR + slot = SLOT_W_UNDERWEAR + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs + cost = 0 + +/datum/gear/underwear/jockstrap + name = "Jockstrap" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/jockstrap + +/datum/gear/underwear/mankini + name = "Mankini" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/mankini + +/datum/gear/underwear/boxers + name = "Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers + +/datum/gear/underwear/boxers/heart + name = "Heart Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/heart + +/datum/gear/underwear/boxers/uk + name = "UK Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/uk + +/datum/gear/underwear/boxers/usa + name = "USA Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/usa + +/datum/gear/underwear/boxers/commie + name = "Heart Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/commie + +/datum/gear/underwear/boxers/striped + name = "Striped Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/striped + +/datum/gear/underwear/boxers/bee_shorts + name = "Bee Shorts" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/bee_shorts + +/datum/gear/underwear/boxers/boxer_briefs + name = "Boxer Briefs" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxer_briefs + +/datum/gear/underwear/boxers/panties + name = "Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties + +/datum/gear/underwear/boxers/panties/alt + name = "Panties (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/alt + +/datum/gear/underwear/boxers/panties/slim + name = "Slim Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/slim + +/datum/gear/underwear/boxers/panties/thin + name = "Thin Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/thin + +/datum/gear/underwear/boxers/panties/neko + name = "Neko Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/neko + +/datum/gear/underwear/boxers/panties/thong + name = "Thong" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/thong + +/datum/gear/underwear/boxers/panties/thong/babydoll + name = "Babydoll Thong" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/thong/babydoll + +/datum/gear/underwear/boxers/panties/swimming + name = "Swimming Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/swimming + +/datum/gear/underwear/boxers/panties/kinky + name = "Kinky Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/kinky + +/datum/gear/underwear/boxers/panties/beekini + name = "Bee-kini Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/beekini + +/datum/gear/underwear/boxers/panties/usa + name = "USA Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/usa + +/datum/gear/underwear/boxers/panties/commie + name = "Commie Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/commie + +/datum/gear/underwear/boxers/panties/uk + name = "UK Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/uk + +/datum/gear/underwear/boxers/panties/striped + name = "Striped Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/striped + +/datum/gear/underwear/boxers/panties/fishnet + name = "Fishnet Panties" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/panties/fishnet + +/datum/gear/underwear/boxers/long + name = "Long Boxers" + has_colors = TRUE + path = /obj/item/clothing/underwear/briefs/boxers/long diff --git a/sandcode/code/modules/client/loadout/shirts.dm b/sandcode/code/modules/client/loadout/shirts.dm new file mode 100644 index 0000000000..116d2dede4 --- /dev/null +++ b/sandcode/code/modules/client/loadout/shirts.dm @@ -0,0 +1,378 @@ +/datum/gear/shirt + name = "Shirt" + category = LOADOUT_CATEGORY_GENERAL_UNDER + subcategory = LOADOUT_SUBCATEGORY_SHIRT + slot = SLOT_W_SHIRT + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt + cost = 0 + +/datum/gear/shirt/bra + name = "Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra + +/datum/gear/shirt/bra/alt + name = "Bra (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/alt + +/datum/gear/shirt/bra/thin + name = "Thin Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/thin + +/datum/gear/shirt/bra/sports + name = "Sports Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/sports + +/datum/gear/shirt/bra/sports/alt + name = "Sports Bra (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/sports/alt + +/datum/gear/shirt/bra/strapless + name = "Strapless Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/strapless + +/datum/gear/shirt/bra/strapless/alt + name = "Strapless Bra (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/strapless/alt + +/datum/gear/shirt/bra/halterneck + name = "Halterneck Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/halterneck + +/datum/gear/shirt/bra/neko + name = "Neko Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/neko + +/datum/gear/shirt/bra/swimming + name = "Swimming Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/swimming + +/datum/gear/shirt/bra/swimming/alt + name = "Swimming Bra (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/swimming/alt + +/datum/gear/shirt/bra/tubetop + name = "Tubetop Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/tubetop + +/datum/gear/shirt/bra/babydoll + name = "Babydoll Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/babydoll + +/datum/gear/shirt/bra/kinky + name = "Kinky Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/kinky + +/datum/gear/shirt/bra/beekini + name = "Beekini Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/beekini + +/datum/gear/shirt/bra/usa + name = "USA Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/usa + +/datum/gear/shirt/bra/commie + name = "Commie Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/commie + +/datum/gear/shirt/bra/uk + name = "UK Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/uk + +/datum/gear/shirt/bra/striped + name = "Striped Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/striped + +/datum/gear/shirt/bra/bikini + name = "Bikini Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/bikini + +/datum/gear/shirt/bra/bikini/blue + name = "Bikini Bra (Blue)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/bikini/blue + +/datum/gear/shirt/bra/bikini/black + name = "Bikini Bra (Black)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/bikini/black + +/datum/gear/shirt/bra/fishnet + name = "Fishnet Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/fishnet + +/datum/gear/shirt/bra/fishnet/sleeves + name = "Sleeved Fishnet Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/fishnet/sleeves + +/datum/gear/shirt/bra/fishnet/sleeves/gloves + name = "Sleeved & Gloved Fishnet Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/fishnet/sleeves/gloves + +/datum/gear/shirt/bra/bikini + name = "Bikini Bra" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bra/bikini + +/datum/gear/shirt/shortsleeve + name = "Shortsleeved Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/shortsleeve + +/datum/gear/shirt/polo + name = "Polo Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/polo + +/datum/gear/shirt/tanktop + name = "Tanktop Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop + +/datum/gear/shirt/tanktop/alt + name = "Tanktop Shirt (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/alt + +/datum/gear/shirt/tanktop/striped + name = "Striped Tanktop Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/striped + +/datum/gear/shirt/tanktop/rainbow + name = "Rainbow Tanktop Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/rainbow + +/datum/gear/shirt/tanktop/sun + name = "Sun Tanktop Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/sun + +/datum/gear/shirt/tanktop/midriff + name = "Midriff Tanktop Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/midriff + +/datum/gear/shirt/tanktop/midriff/alt + name = "Midriff Tanktop Shirt (alt)" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tanktop/midriff/alt + +/datum/gear/shirt/lover + name = "Lover Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/lover + +/datum/gear/shirt/ian + name = "Ian Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/ian + +/datum/gear/shirt/uk + name = "UK Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/uk + +/datum/gear/shirt/ilovent + name = "I Love NT Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/ilovent + +/datum/gear/shirt/peace + name = "Peace Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/peace + +/datum/gear/shirt/band + name = "Band Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/band + +/datum/gear/shirt/pogoman + name = "Pogoman Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/pogoman + +/datum/gear/shirt/lover + name = "Matroska Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/matroska + +/datum/gear/shirt/sportgreen + name = "Green Sport Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/sportgreen + +/datum/gear/shirt/sportblue + name = "Blue Sport Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/sportblue + +/datum/gear/shirt/sportred + name = "Red Sport Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/sportred + +/datum/gear/shirt/ss13 + name = "SS13 Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/ss13 + +/datum/gear/shirt/question + name = "Question Mark Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/question + +/datum/gear/shirt/skull + name = "Skull Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/skull + +/datum/gear/shirt/commie + name = "Commie Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/commie + +/datum/gear/shirt/striped + name = "Striped Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/striped + +/datum/gear/shirt/meat + name = "Meat Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/meat + +/datum/gear/shirt/tiedye + name = "Tie Dye Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/tiedye + +/datum/gear/shirt/redjersey + name = "Red Jersey Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/redjersey + +/datum/gear/shirt/bluejersey + name = "Blue Jersey Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bluejersey + +/datum/gear/shirt/bowlingred + name = "Red Bowling Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bowling + +/datum/gear/shirt/bowlingpink + name = "Pink Bowling Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bowling/pink + +/datum/gear/shirt/bowlingcyan + name = "Cyan Bowling Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bowling/cyan + +/datum/gear/shirt/bowlinggrey + name = "Grey Bowling Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bowling/grey + +/datum/gear/shirt/alien + name = "Postal Dude Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/alien + +/datum/gear/shirt/clown + name = "Clown Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/clown + +/datum/gear/shirt/bee + name = "Bee Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/bee + +/datum/gear/shirt/long + name = "Longsleeved Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/long + +/datum/gear/shirt/long/striped + name = "Striped Longsleeved Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/long/striped + +/datum/gear/shirt/long/striped/blue + name = "Blue Striped Longsleeved Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/long/striped/blue + +/datum/gear/shirt/usa + name = "USA Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/usa + +/datum/gear/shirt/cowboy + name = "Black Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy + +/datum/gear/shirt/cowboy/white + name = "White Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/white + +/datum/gear/shirt/cowboy/navy + name = "Navy Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/navy + +/datum/gear/shirt/cowboy/red + name = "Red Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/red + +/datum/gear/shirt/cowboy/short + name = "Black Shortsleeved Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/short + +/datum/gear/shirt/cowboy/short/white + name = "White Shortsleeved Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/short/white + +/datum/gear/shirt/cowboy/short/navy + name = "Navy Shortsleeved Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/short/navy + +/datum/gear/shirt/cowboy/short/red + name = "Red Shortsleeved Cowboy Shirt" + has_colors = TRUE + path = /obj/item/clothing/underwear/shirt/cowboy/short/red diff --git a/sandcode/code/modules/client/loadout/socks.dm b/sandcode/code/modules/client/loadout/socks.dm new file mode 100644 index 0000000000..dc3a7f0988 --- /dev/null +++ b/sandcode/code/modules/client/loadout/socks.dm @@ -0,0 +1,188 @@ +/datum/gear/socks + name = "Socks" + category = LOADOUT_CATEGORY_GENERAL_UNDER + subcategory = LOADOUT_SUBCATEGORY_SOCKS + slot = SLOT_W_SOCKS + has_colors = TRUE + path = /obj/item/clothing/underwear/socks + cost = 0 + +/datum/gear/socks/bee + name = "Bee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/bee + +/datum/gear/socks/candycane + name = "Candycane Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/candycane + +/datum/gear/socks/candycane + name = "Green Candycane Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/candycane/green + +/datum/gear/socks/christmas + name = "Christmas Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/christmas + +/datum/gear/socks/knee + name = "Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee + +/datum/gear/socks/knee/bee + name = "Bee Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/bee + +/datum/gear/socks/knee/candycane + name = "Candycane Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/candycane + +/datum/gear/socks/knee/candycane/green + name = "Green Candycane Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/candycane/green + +/datum/gear/socks/knee/commie + name = "Commie Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/commie + +/datum/gear/socks/knee/rainbow + name = "Rainbow Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/rainbow + +/datum/gear/socks/knee/striped + name = "Striped Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/striped + +/datum/gear/socks/knee/thin + name = "Thin Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/thin + +/datum/gear/socks/knee/uk + name = "UK Knee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/knee/uk + +/datum/gear/socks/pantyhose + name = "Pantyhose" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/pantyhose + +/datum/gear/socks/short + name = "Short Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/short + +/datum/gear/socks/thigh + name = "Thigh High Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh + +/datum/gear/socks/thigh/bee + name = "Thigh High Bee Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/bee + +/datum/gear/socks/thigh/candycane + name = "Thigh High Candycane Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/candycane + +/datum/gear/socks/thigh/candycane/green + name = "Thigh High Green Candycane Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/candycane/green + +/datum/gear/socks/thigh/christmas + name = "Thigh High Christmas Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/christmas + +/datum/gear/socks/thigh/commie + name = "Thigh High Commie Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/commie + +/datum/gear/socks/thigh/rainbow + name = "Thigh High Rainbow Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/rainbow + +/datum/gear/socks/thigh/stockings + name = "Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings + +/datum/gear/socks/thigh/stockings/blue + name = "Blue Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/blue + +/datum/gear/socks/thigh/stockings/cyan + name = "Cyan Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/cyan + +/datum/gear/socks/thigh/stockings/fishnet + name = "Fishnet Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/fishnet + +/datum/gear/socks/thigh/stockings/green + name = "Green Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/green + + +/datum/gear/socks/thigh/stockings/orange + name = "Orange Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/orange + + +/datum/gear/socks/thigh/stockings/pinkish + name = "Pinkish Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/pink2 + + +/datum/gear/socks/thigh/stockings/purple + name = "Purple Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/purple + +/datum/gear/socks/thigh/stockings + name = "Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/stockings/yellow + + +/datum/gear/socks/thigh/striped + name = "Thigh High StripedSocks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/striped + + +/datum/gear/socks/thigh/thin + name = "Thigh High Thin Socks" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/thin + +/datum/gear/socks/thigh/uk + name = "Thigh High UK Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/uk + +/datum/gear/socks/thigh/usa + name = "Thigh High USA Stockings" + has_colors = TRUE + path = /obj/item/clothing/underwear/socks/thigh/usa diff --git a/sandcode/code/modules/clothing/under/_under.dm b/sandcode/code/modules/clothing/under/_under.dm new file mode 100644 index 0000000000..a1605a083e --- /dev/null +++ b/sandcode/code/modules/clothing/under/_under.dm @@ -0,0 +1,2 @@ +/obj/item/clothing/under + hide_underwear_examine = TRUE diff --git a/sandcode/code/modules/clothing/underwear/_underwear.dm b/sandcode/code/modules/clothing/underwear/_underwear.dm new file mode 100644 index 0000000000..2176206a3d --- /dev/null +++ b/sandcode/code/modules/clothing/underwear/_underwear.dm @@ -0,0 +1,24 @@ +//Fuck it we making underwear actual items +/obj/item/clothing/underwear + name = "Underwear" + desc = "If you're reading this, something went wrong." + icon = 'sandcode/icons/mob/clothing/underwear.dmi' //if someone is willing to make proper inventory sprites that'd be very cash money + mob_overlay_icon = 'sandcode/icons/mob/clothing/underwear.dmi' + anthro_mob_worn_overlay = 'sandcode/icons/mob/clothing/underwear_digi.dmi' + body_parts_covered = GROIN + permeability_coefficient = 0.9 + block_priority = BLOCK_PRIORITY_UNDERWEAR + slot_flags = ITEM_SLOT_UNDERWEAR + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + mutantrace_variation = NONE + hide_underwear_examine = FALSE + var/under_type = /obj/item/clothing/underwear //i don't know what i'm gonna use this for + var/fitted = FEMALE_UNIFORM_TOP + var/has_colors = TRUE + +//Proc to check if underwear is hidden +/mob/living/carbon/human/proc/underwear_hidden() + for(var/obj/item/I in list(w_uniform, wear_suit, shoes)) + if(istype(I) && ((I.hide_underwear_examine) || (I.flags_inv & HIDEUNDERWEAR))) + return TRUE + return FALSE diff --git a/sandcode/code/modules/clothing/underwear/boxers.dm b/sandcode/code/modules/clothing/underwear/boxers.dm new file mode 100644 index 0000000000..ed6c0757b5 --- /dev/null +++ b/sandcode/code/modules/clothing/underwear/boxers.dm @@ -0,0 +1,125 @@ +/obj/item/clothing/underwear/briefs + name = "briefs" + desc = "Not going commando." + icon_state = "briefs" + under_type = /obj/item/clothing/underwear/briefs + body_parts_covered = GROIN + slot_flags = ITEM_SLOT_UNDERWEAR + +/obj/item/clothing/underwear/briefs/jockstrap + name = "jockstrap" + icon_state = "jockstrap" + +/obj/item/clothing/underwear/briefs/mankini + name = "mankini" + desc = "Kinky." + icon_state = "mankini" + +/obj/item/clothing/underwear/briefs/boxers + name = "boxers" + icon_state = "boxers" + mutantrace_variation = STYLE_DIGITIGRADE + +/obj/item/clothing/underwear/briefs/boxers/heart + name = "heart boxers" + icon_state = "boxers_heart" + +/obj/item/clothing/underwear/briefs/boxers/uk + name = "uk boxers" + desc = "You got a loicense for that dong?" + icon_state = "boxers_uk" + +/obj/item/clothing/underwear/briefs/boxers/usa + name = "usa boxers" + desc = "Not as free as going commando." + icon_state = "boxers_assblastusa" + +/obj/item/clothing/underwear/briefs/boxers/commie + name = "commie boxers" + desc = "Seize the means of reproduction." + icon_state = "boxers_commie" + +/obj/item/clothing/underwear/briefs/boxers/striped + name = "striped boxers" + icon_state = "boxers_striped" + +/obj/item/clothing/underwear/briefs/boxers/bee_shorts + name = "bee shorts" + desc = "It's hip to..." + icon_state = "bee_shorts" + +/obj/item/clothing/underwear/briefs/boxer_briefs //this typepath jesus + name = "boxer briefs" + icon_state = "boxer_briefs" + +/obj/item/clothing/underwear/briefs/panties + name = "panties" + desc = "Panties." + body_parts_covered = GROIN + icon_state = "panties" + +/obj/item/clothing/underwear/briefs/panties/alt + name = "panties (alt)" + icon_state = "panties_alt" + +/obj/item/clothing/underwear/briefs/panties/slim + name = "slim panties" + icon_state = "panties_slim" + +/obj/item/clothing/underwear/briefs/panties/thin + name = "thin panties" + icon_state = "panties_slim" + +/obj/item/clothing/underwear/briefs/panties/neko + name = "neko panties" + desc = "Favored by cat \"girls\"." + icon_state = "panties_neko" + +/obj/item/clothing/underwear/briefs/panties/thong + name = "thong" + desc = "More revealing than your average panties." + icon_state = "thong" + +/obj/item/clothing/underwear/briefs/panties/thong/babydoll + name = "babydoll thong" + icon_state = "thong_babydoll" + +/obj/item/clothing/underwear/briefs/panties/swimming + name = "swimming panties" + icon_state = "panties_swimming" + +/obj/item/clothing/underwear/briefs/panties/kinky + name = "kinky panties" + icon_state = "panties_kinky" + +/obj/item/clothing/underwear/briefs/panties/beekini + name = "bee-kini panties" + icon_state = "panties_bee-kini" + +/obj/item/clothing/underwear/briefs/panties/usa + name = "usa panties" + desc = "Not nearly as free as not wearing any." + icon_state = "panties_assblastusa" + +/obj/item/clothing/underwear/briefs/panties/commie + name = "commie panties" + desc = "Seize the means of reproduction." + icon_state = "panties_commie" + +/obj/item/clothing/underwear/briefs/panties/uk + name = "uk panties" + desc = "Insert loicense joke here." + icon_state = "panties_uk" + +/obj/item/clothing/underwear/briefs/panties/striped + name = "striped panties" + icon_state = "panties_striped" + +/obj/item/clothing/underwear/briefs/panties/fishnet + name = "fishnet panties" + desc = "They don't hide much of anything..." + icon_state = "panties_fishnet" + +/obj/item/clothing/underwear/briefs/boxers/long + name = "long boxers" + icon_state = "boxers_long" diff --git a/sandcode/code/modules/clothing/underwear/shirts.dm b/sandcode/code/modules/clothing/underwear/shirts.dm new file mode 100644 index 0000000000..984d36cff5 --- /dev/null +++ b/sandcode/code/modules/clothing/underwear/shirts.dm @@ -0,0 +1,333 @@ +/obj/item/clothing/underwear/shirt + name = "shirt" + desc = "A shirt." + icon_state = "undershirt" + under_type = /obj/item/clothing/underwear/shirt + body_parts_covered = CHEST | ARMS + slot_flags = ITEM_SLOT_SHIRT + +/obj/item/clothing/underwear/shirt/bra + name = "bra" + desc = "A bra." + body_parts_covered = CHEST + icon_state = "bra" + +/obj/item/clothing/underwear/shirt/bra/alt + name = "bra (alt)" + icon_state = "bra_alt" + +/obj/item/clothing/underwear/shirt/bra/thin + name = "thin bra" + icon_state = "bra_thin" + +/obj/item/clothing/underwear/shirt/bra/sports + name = "sports bra" + icon_state = "bra_sports" + +/obj/item/clothing/underwear/shirt/bra/sports/alt + name = "sports bra (alt)" + icon_state = "bra_sports_alt" + +/obj/item/clothing/underwear/shirt/bra/strapless + name = "strapless bra" + icon_state = "bra_strapless" + +/obj/item/clothing/underwear/shirt/bra/strapless/alt + name = "strapless bra (alt)" + icon_state = "bra_strapless_alt" + +/obj/item/clothing/underwear/shirt/bra/halterneck + name = "halterneck bra" + icon_state = "bra_halterneck" + +/obj/item/clothing/underwear/shirt/bra/neko + name = "neko bra" + desc = "Favored by cat \"girls\"." + icon_state = "bra_neko" + +/obj/item/clothing/underwear/shirt/bra/swimming + name = "swimming bra" + icon_state = "bra_swimming" + +/obj/item/clothing/underwear/shirt/bra/swimming/alt + name = "swimming bra (alt)" + icon_state = "bra_swimming_alt" + +/obj/item/clothing/underwear/shirt/bra/tubetop + name = "tubetop bra" + icon_state = "bra_tubetop" + +/obj/item/clothing/underwear/shirt/bra/babydoll + name = "babydoll" + desc = "A babydoll." + icon_state = "babydoll" + +/obj/item/clothing/underwear/shirt/bra/kinky + name = "kinky bra" + desc = "Kinky." + icon_state = "bra_kinky" + +/obj/item/clothing/underwear/shirt/bra/beekini + name = "bee-kini bra" + desc = "Buzz buzz." + icon_state = "bra_bee-kini" + +/obj/item/clothing/underwear/shirt/bra/usa + name = "usa bra" + desc = "Not nearly as free as letting them bounce." + icon_state = "bra_assblastusa" + +/obj/item/clothing/underwear/shirt/bra/commie + name = "commie bra" + desc = "Seize the mammaries of production." + icon_state = "bra_commie" + +/obj/item/clothing/underwear/shirt/bra/uk + name = "uk bra" + desc = "You got a loicense for those tiddies?" + icon_state = "bra_uk" + +/obj/item/clothing/underwear/shirt/bra/striped + name = "striped bra" + icon_state = "bra_striped" + +/obj/item/clothing/underwear/shirt/bra/bikini + name = "bikini" + desc = "A bikini." + body_parts_covered = CHEST | GROIN + icon_state = "swimming" + +/obj/item/clothing/underwear/shirt/bra/bikini/blue + name = "blue bikini" + icon_state = "swimming_blue" + +/obj/item/clothing/underwear/shirt/bra/bikini/red + name = "red bikini" + icon_state = "swimming_red" + +/obj/item/clothing/underwear/shirt/bra/bikini/black + name = "black bikini" + icon_state = "swimming_black" + +/obj/item/clothing/underwear/shirt/bra/fishnet + name = "fishnet bra" + icon_state = "bra_fishnet" + +/obj/item/clothing/underwear/shirt/bra/fishnet/sleeves + name = "sleeved fishnet bra" + body_parts_covered = CHEST | ARMS + icon_state = "bra_fishnet_sleeves" + +/obj/item/clothing/underwear/shirt/bra/fishnet/sleeves/gloves + name = "gloved fishnet bra" + body_parts_covered = CHEST | ARMS | HANDS + icon_state = "bra_fishnet_gloves" + +/obj/item/clothing/underwear/shirt/shortsleeve + name = "shortsleeve shirt" + body_parts_covered = CHEST + icon_state = "undershirt_short" + +/obj/item/clothing/underwear/shirt/polo + name = "polo shirt" + icon_state = "undershirt_polo" + +/obj/item/clothing/underwear/shirt/tanktop + name = "tanktop shirt" + body_parts_covered = CHEST + icon_state = "undershirt_tanktop" + +/obj/item/clothing/underwear/shirt/tanktop/alt + name = "tanktop shirt (alt)" + icon_state = "undershirt_tanktop_alt" + +/obj/item/clothing/underwear/shirt/tanktop/striped + name = "striped tanktop shirt" + icon_state = "undershirt_tanktop_striped" + +/obj/item/clothing/underwear/shirt/tanktop/rainbow + name = "rainbow tanktop shirt" + icon_state = "undershirt_tanktop_rainbow" + +/obj/item/clothing/underwear/shirt/tanktop/sun + name = "sun tanktop shirt" + icon_state = "undershirt_tanktop_sun" + +/obj/item/clothing/underwear/shirt/tanktop/fire + name = "fire tanktop shirt" + icon_state = "undershirt_tanktop_fire" + +/obj/item/clothing/underwear/shirt/tanktop/midriff + name = "midriff tanktop shirt" + icon_state = "undershirt_tanktop_midriff" + +/obj/item/clothing/underwear/shirt/tanktop/midriff/alt + name = "midriff tanktop shirt (alt)" + icon_state = "undershirt_tanktop_midriff_alt" + +/obj/item/clothing/underwear/shirt/lover + name = "lover shirt" + icon_state = "undershirt_lover" + +/obj/item/clothing/underwear/shirt/ian + name = "ian shirt" + icon_state = "undershirt_ian" + +/obj/item/clothing/underwear/shirt/uk + name = "uk shirt" + desc = "I'm running out of UK jokes." + icon_state = "undershirt_uk" + +/obj/item/clothing/underwear/shirt/ilovent + name = "\"I love NT\" shirt" + icon_state = "undershirt_ilovent" + +/obj/item/clothing/underwear/shirt/peace + name = "peace shirt" + icon_state = "undershirt_peace" + +/obj/item/clothing/underwear/shirt/band + name = "band shirt" + icon_state = "undershirt_band" + +/obj/item/clothing/underwear/shirt/pogoman + name = "pogoman shirt" + icon_state = "undershirt_pogoman" + +/obj/item/clothing/underwear/shirt/matroska + name = "matroska shirt" + icon_state = "undershirt_matroska" + +/obj/item/clothing/underwear/shirt/sportgreen + name = "green sports shirt" + icon_state = "undershirt_sport_green" + +/obj/item/clothing/underwear/shirt/sportred + name = "red sports shirt" + icon_state = "undershirt_sport_red" + +/obj/item/clothing/underwear/shirt/sportblue + name = "blue sports shirt" + icon_state = "undershirt_sport_blue" + +/obj/item/clothing/underwear/shirt/ss13 + name = "SS13 shirt" + icon_state = "undershirt_ss13" + +/obj/item/clothing/underwear/shirt/question + name = "question shirt" + icon_state = "undershirt_question" + +/obj/item/clothing/underwear/shirt/skull + name = "skull shirt" + icon_state = "undershirt_skull" + +/obj/item/clothing/underwear/shirt/commie + name = "commie shirt" + icon_state = "undershirt_commie" + +/obj/item/clothing/underwear/shirt/nano + name = "NT shirt" + icon_state = "undershirt_nano" + +/obj/item/clothing/underwear/shirt/striped + name = "striped shirt" + icon_state = "undershirt_striped" + +/obj/item/clothing/underwear/shirt/meat + name = "meat shirt" + icon_state = "undershirt_meat" + +/obj/item/clothing/underwear/shirt/tiedye + name = "tiedye shirt" + icon_state = "undershirt_tiedye" + +/obj/item/clothing/underwear/shirt/redjersey + name = "red jersey shirt" + icon_state = "undershirt_redjersey" + +/obj/item/clothing/underwear/shirt/bluejersey + name = "blue jersey shirt" + icon_state = "undershirt_bluejersey" + +/obj/item/clothing/underwear/shirt/bowling + name = "red bowling shirt" + icon_state = "undershirt_bowling_red" + +/obj/item/clothing/underwear/shirt/bowling/pink + name = "pink bowling shirt" + icon_state = "undershirt_bowling_pink" + +/obj/item/clothing/underwear/shirt/bowling/cyan + name = "cyan bowling shirt" + icon_state = "undershirt_bowling_cyan" + +/obj/item/clothing/underwear/shirt/bowling/grey + name = "grey bowling shirt" + icon_state = "undershirt_bowling_grey" + +/obj/item/clothing/underwear/shirt/alien + name = "alien shirt" + desc = "I regret nothing." + icon_state = "undershirt_alien" + +/obj/item/clothing/underwear/shirt/clown + name = "clown shirt" + desc = "HONK!" + icon_state = "undershirt_clown" + +/obj/item/clothing/underwear/shirt/bee + name = "bee shirt" + desc = "Bee yourself!" + icon_state = "undershirt_bee" + +/obj/item/clothing/underwear/shirt/long + name = "longsleeved shirt" + body_parts_covered = CHEST | ARMS + icon_state = "undershirt_long" + +/obj/item/clothing/underwear/shirt/long/striped + name = "striped longsleeved shirt" + icon_state = "undershirt_long_striped" + +/obj/item/clothing/underwear/shirt/long/striped/blue + name = "blue striped longsleeved shirt" + icon_state = "undershirt_long_striped_blue" + +/obj/item/clothing/underwear/shirt/usa + name = "usa shirt" + desc = "Freedom and obesity." + icon_state = "undershirt_assblastusa" + +/obj/item/clothing/underwear/shirt/cowboy + name = "cowboy shirt" + desc = "Yee haw." + icon_state = "undershirt_cowboy" + +/obj/item/clothing/underwear/shirt/cowboy/white + name = "white cowboy shirt" + icon_state = "undershirt_cowboy_white" + +/obj/item/clothing/underwear/shirt/cowboy/navy + name = "navy cowboy shirt" + icon_state = "undershirt_cowboy_navy" + +/obj/item/clothing/underwear/shirt/cowboy/red + name = "red cowboy shirt" + icon_state = "undershirt_cowboy_red" + +/obj/item/clothing/underwear/shirt/cowboy/short + name = "short sleeved cowboy shirt" + icon_state = "undershirt_cowboy_short" + +/obj/item/clothing/underwear/shirt/cowboy/short/white + name = "short sleeved white cowboy shirt" + icon_state = "undershirt_cowboy_short_white" + +/obj/item/clothing/underwear/shirt/cowboy/short/navy + name = "short sleeved navy cowboy shirt" + icon_state = "undershirt_cowboy_short_navy" + +/obj/item/clothing/underwear/shirt/cowboy/short/red + name = "short sleeved red cowboy shirt" + icon_state = "undershirt_cowboy_short_red" diff --git a/sandcode/code/modules/clothing/underwear/socks.dm b/sandcode/code/modules/clothing/underwear/socks.dm new file mode 100644 index 0000000000..1205939981 --- /dev/null +++ b/sandcode/code/modules/clothing/underwear/socks.dm @@ -0,0 +1,177 @@ +/obj/item/clothing/underwear/socks + name = "socks" + desc = "A pair of socks." + icon_state = "socks" + under_type = /obj/item/clothing/underwear/socks + body_parts_covered = FEET + slot_flags = ITEM_SLOT_SOCKS + +/obj/item/clothing/underwear/socks/short + name = "short socks" + icon_state = "socks_short" + +/obj/item/clothing/underwear/socks/bee + name = "bee socks" + icon_state = "socks_bee" + +/obj/item/clothing/underwear/socks/christmas + name = "christmas socks" + icon_state = "socks_christmas" + +/obj/item/clothing/underwear/socks/candycane + name = "candy cane socks" + icon_state = "socks_candycane" + +/obj/item/clothing/underwear/socks/candycane/green + name = "green candy cane socks" + icon_state = "socks_candycanegreen" + +/obj/item/clothing/underwear/socks/knee + name = "knee socks" + icon_state = "socks_knee" + mutantrace_variation = STYLE_DIGITIGRADE + +/obj/item/clothing/underwear/socks/knee/thin + name = "thin knee socks" + icon_state = "socks_knee_thin" + +/obj/item/clothing/underwear/socks/knee/rainbow + name = "rainbow knee socks" + icon_state = "socks_knee_rainbow" + +/obj/item/clothing/underwear/socks/knee/striped + name = "striped knee socks" + icon_state = "socks_knee_striped" + +/obj/item/clothing/underwear/socks/knee/usa + name = "usa knee socks" + desc = "I'm running out of america jokes." + icon_state = "socks_knee_assblastusa" + +/obj/item/clothing/underwear/socks/knee/uk + name = "uk knee socks" + desc = "Brexit or something." + icon_state = "socks_knee_uk" + +/obj/item/clothing/underwear/socks/knee/commie + name = "commie knee socks" + desc = "Karl Marx or something." + icon_state = "socks_knee_commie" + +/obj/item/clothing/underwear/socks/knee/bee + name = "bee knee socks" + desc = "You like jazz?" + icon_state = "socks_knee_bee" + +/obj/item/clothing/underwear/socks/knee/christmas + name = "christmas knee socks" + desc = "Jingle bell." + icon_state = "socks_knee_christmas" + +/obj/item/clothing/underwear/socks/knee/candycane + name = "candy cane knee socks" + desc = "Jingle bell." + icon_state = "socks_knee_candycane" + +/obj/item/clothing/underwear/socks/knee/candycane/green + name = "green candy cane knee socks" + desc = "Jingle bell." + icon_state = "socks_knee_candycanegreen" + +/obj/item/clothing/underwear/socks/thigh + name = "thigh high socks" + icon_state = "socks_thigh" + mutantrace_variation = STYLE_DIGITIGRADE + +/obj/item/clothing/underwear/socks/thigh/thin + name = "thin thigh high socks" + icon_state = "socks_thigh_thin" + +/obj/item/clothing/underwear/socks/thigh/rainbow + name = "rainbow thigh high socks" + icon_state = "socks_thigh_rainbow" + +/obj/item/clothing/underwear/socks/thigh/striped + name = "striped thigh high socks" + icon_state = "socks_thigh_striped" + +/obj/item/clothing/underwear/socks/thigh/usa + name = "usa thigh high socks" + desc = "McDonald's or something." + icon_state = "socks_thigh_assblastusa" + +/obj/item/clothing/underwear/socks/thigh/uk + name = "uk thigh high socks" + desc = "Something something british people have bad teeth." + icon_state = "socks_thigh_uk" + +/obj/item/clothing/underwear/socks/thigh/commie + name = "commie thigh high socks" + desc = "Something something the USSR." + icon_state = "socks_thigh_commie" + +/obj/item/clothing/underwear/socks/thigh/bee + name = "bee thigh high socks" + desc = "Bee socks." + icon_state = "socks_thigh_bee" + +/obj/item/clothing/underwear/socks/thigh/christmas + name = "christmas thigh high socks" + desc = "Santa claus or something." + icon_state = "socks_thigh_christmas" + +/obj/item/clothing/underwear/socks/thigh/candycane + name = "candy cane thigh high socks" + desc = "Santa claus or something." + icon_state = "socks_thigh_candycane" + +/obj/item/clothing/underwear/socks/thigh/candycane/green + name = "green candy cane thigh high socks" + desc = "Santa claus or something." + icon_state = "socks_thigh_candycanegreen" + +/obj/item/clothing/underwear/socks/thigh/stockings + name = "pink stockings" + desc = "A pair of stockings." + body_parts_covered = LEGS | FEET + icon_state = "stockings_lpink" + mutantrace_variation = STYLE_DIGITIGRADE + +/obj/item/clothing/underwear/socks/thigh/stockings/fishnet + name = "fishnet stockings" + icon_state = "stockings_fishnet" + +/obj/item/clothing/underwear/socks/thigh/stockings/purple + name = "purple stockings" + icon_state = "stockings_purple" + +/obj/item/clothing/underwear/socks/thigh/stockings/green + name = "green stockings" + icon_state = "stockings_green" + +/obj/item/clothing/underwear/socks/thigh/stockings/cyan + name = "cyan stockings" + icon_state = "stockings_cyan" + +/obj/item/clothing/underwear/socks/thigh/stockings/orange + name = "orange stockings" + icon_state = "stockings_orange" + +/obj/item/clothing/underwear/socks/thigh/stockings/yellow + name = "yellow stockings" + icon_state = "stockings_yellow" + +/obj/item/clothing/underwear/socks/thigh/stockings/pink2 + name = "deep pink stockings" + icon_state = "stockings_dpink" + +/obj/item/clothing/underwear/socks/thigh/stockings/blue + name = "blue stockings" + icon_state = "stockings_blue" + +/obj/item/clothing/underwear/socks/pantyhose + name = "pantyhose" + desc = "Pantyhose." + body_parts_covered = FEET | LEGS | GROIN + icon_state = "socks_pantyhose" + mutantrace_variation = STYLE_DIGITIGRADE diff --git a/sandcode/code/modules/clothing/wrists/_wrists.dm b/sandcode/code/modules/clothing/wrists/_wrists.dm new file mode 100644 index 0000000000..a0009f7e3b --- /dev/null +++ b/sandcode/code/modules/clothing/wrists/_wrists.dm @@ -0,0 +1,14 @@ +//wrist items (currently we have none har har) +/obj/item/clothing/wrists + name = "slap bracelet" + desc = "oh no." + gender = PLURAL //change this if it is for a single wrist + w_class = WEIGHT_CLASS_SMALL + icon = 'sandcode/icons/obj/clothing/wrist.dmi' + mob_overlay_icon = 'sandcode/icons/mob/clothing/wrists.dmi' + siemens_coefficient = 0.5 + body_parts_covered = HANDS + slot_flags = ITEM_SLOT_WRISTS + attack_verb = list("slapped on the wrist") + strip_delay = 20 + equip_delay_other = 40 diff --git a/sandcode/code/modules/vending/clothesmate.dm b/sandcode/code/modules/vending/clothesmate.dm new file mode 100644 index 0000000000..e798afee34 --- /dev/null +++ b/sandcode/code/modules/vending/clothesmate.dm @@ -0,0 +1,12 @@ +/obj/machinery/vending/clothing/New(loc, ...) + . = ..() + products[/obj/item/clothing/head/wig] = 5 + for(var/P in typesof(/datum/gear/underwear)) + var/datum/gear/G = P + products[initial(G.path)] = 5 + for(var/P in typesof(/datum/gear/shirt)) + var/datum/gear/G = P + products[initial(G.path)] = 5 + for(var/P in typesof(/datum/gear/socks)) + var/datum/gear/G = P + products[initial(G.path)] = 5 diff --git a/sandcode/icons/mob/clothing/ears.dmi b/sandcode/icons/mob/clothing/ears.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e9fc04d1b1a54da0946849dc2a626a875ca4318d GIT binary patch literal 1669 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 RSm+JOJbm?~;F12j{{h}S*Y*Ga literal 0 HcmV?d00001 diff --git a/sandcode/icons/mob/clothing/wrists.dmi b/sandcode/icons/mob/clothing/wrists.dmi new file mode 100644 index 0000000000000000000000000000000000000000..20ba91b5d2f2f0a4eada3896cd6085f93cdbbd49 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tn`*LkmkKF1;}MA3GxeO zaCmkj4ajM$3W+FjNi9w;$}A|!%+F(BsF)KRR!~&>{Y!Ac$FEPcymhtCojD)8A=Kca z@qV=-0C=2*&CLqJFc1XbbMh2Rdl&z%xkyXNp?w7jW=(=^BfG2d@jVngn%fL~ z%(QUn2RlJGTKz`ilvglt-tDz2$x8$Sr=wO8Q;4z^7AFV>8o}i`JHbXPpNPT0L908t z1-JZzuhkM{QM&l&(A&iwLTyLa+0Uui}9f!+kvj6dXJ zS-<{OUaRW{)C}-!Ki>Q@0FzvA0@vnew9G{X&7TZ^*a5tK8K5%PcaMsne^V=d`e9zf z4m%%bez}lhBLHCJrME5s0CKA0TLlO?Rl$w-XSLf8wPIa2pf_18j5EKy*M=GMN^f02 zUH7l&2UUhbK%DtyI-oa!>VIB>MnF&~mZnii!FHi>wvQu0sY{{Uu&JD7v@uCnnUmGwkvc_Jf2Taxi-S2 z@kc@d`e7%%pt6fxoXY@c0zjG0i^uiDPGwXjoHc(W6wqj$K%JFOFA`Xs%V2TN{@ca5 z47BP28ubp8<8CDQCtd+G`rf<#hI#DqqdnX2KKi%-0ASxc7+D2__?@`eJ08oGyzXHjlwtHf} z&!?wa{jOos_#>eJ^Bk11*7_%r-?An7_T{rtKp|y69#?)DV6Ff)!>kiQE8zKN%eEyL zXMVYm>cu5Ly)bTAx{?Mq8tk$CJ7x=sGr#GK1Az72qvDNEX0;&fc~s^f{>0p8qBAY7 z{1SkT-~WzzBR~J9W?J+7G^vVZ{dOg*UL2hi)r(W`x9YZ(3{KVV4yTBGAy{?wGz*Ij+C@&jtE zlQjRipC8jt{u7~Jcq_`uN!N4zBby&UPUHo(w@H6`oSX}NJ7QdZQ33pB%+!>GT(194 zSfuj<$e~Q-2q**ah_z>hp z0U|u_h=u9T=edDi!_!tEH2~KUWw&~ax+6y56+nDsQ}L<*9-b5swm+ZuXD-fV%!a3n zdGhqYc42;bLkYD;XE~phXXrD{oOq}?Wd^|2TBCE6&&syxs1rOXAWVP0IQpH+aXIIx zf>9J;C@|;#o>0Y%UN@E%1GY{WS^;kUd^dZx-~N23(N7n_k3y%$8ASz73gF|u)5zyR z_3(N>7^nazPmC7?<<|F!m=tj)jQ{3(cLn~mC{Q282n&ySlO&@S? z)F2cf!mUkwSAdg0-YGjID1ZJi;AdlEd44Fs3w%?6lRuwtaC%Quu>k$~Wt#GdDsWmt z_H!2GrhtAC!8Zi}c7J|91m(}?Rls+G8~jor;I06^4q`|6rT`#(f4-;!szbj{I12>; z_J$|;u7EK8`GCcnY3T&FFchQ$yyS}oqJXgc`Q|wXB>=F@i0Cs$d?FvD0Iv^Yfhd5- zS^D#NI4QxcT)&3 z_~YZKaM=BTVRyttL_R;jNtyjrI4-{*J7VW9KVTSTj>|vpj#!c(FeZP$l~FGWNb&>5 z513H?BtIa@4~TbufV8%@77Uw5tgfzx${#jf3%dewhdF6I zi~l0w_8%oM({x*QTB%#*sA}>h;emWd#-7fO4B-GF~Io|zXbpt@GJ3$86sHDb! zKi@r_igkUvA@#~(OT%C9ceNVWv7r86OH^QnAZmQSvsCIwKc_EefD6Bn@$!EieE-9% z>>^P7QIa(3kT^pISUj$^Sz|b5iSX{{K@eTj5ALj3Rx1Dee1! xn2Q)&mLSW1Hk?dtn9obLCtiN5X65FvqbE!=>9l$OIY?| zjYA2y?yQvW-`l9%y0cQg^rnJB3iz&_gdae74&bvyc6QrobyhCdb;DER18j$=t{dbH zO7HBp)3@%dl<(eLuQcktW!$)rdLE7sVmVbomRr~E_ZP!?@ZZbkWPJAETKWFHjmpA& zshbij7GhKyEoS@`?3m93UYc)r=PbPg$j_vI8z)0W1+aS8b1?`tc`YN!MF#-zB}CFZgsh;`wIFlWUo8cs^g)$&s9Z!Q7I}zhXOL&7TZpF0v(K z^4)vg5u*_g^!|ohT{lcea0y7ZAqALQlC{$fa^4}lR7$r1V3-G~>+fXEM`F+YecTjcCxyI{o%rKr4-1-SY>FE20Wu8_=o%N&u?k#O>4HmcT|n zy(S^Z3K?J)!FL042)j9w6EK(|C~25*kUWTmjQ;~Jtus~h(uZtlKm-i;U(b8J__A@D4v>7iGlyLq*XzsQ9=qB%9++*a56d zl8rfMF8IyOV+A!XD~GutrV{Q5fVyeSzLkYGt=Ty=;Fh*=ZZ%{!xc7FJ**{rs(?1|? zn|8K*4Y~rOqlZA$G-*9S2BurknryrPHCEv@yVo6;#-oAKD z3$!@9DVn(#q)~-K=De{t=BrdY(9`Y(Nsxb*g38M~&3^!Qpj&sC3SQ!RvefKy8QqnC zV3v{VZvDHg$@hZHNVkBKM7{x&=nmspN{g|9*Q8ym=23=VI6cu7oSV=_*R1^H-7l>+;{ZAUks%0WUf!; z7$U&Xhkk!nj@dl4@&)r7_~{eeWcaq-0ux-79sa^0!fZJOn(+>uheK+ zZZcHI5ah{h&I1+atRX3Jyi~^wG0PD4V~}rQuKJc*DAj~XJ(Sg%x^zOMM&2X1{i8)8 z03SJlevX`gVH3G#cKwyLwG{#ujeucHo|JXog8C~GEx_N=_1{XN&@Ji+y@$>Xjnqot zR{I0QCixe7^ZQt%^BnrC>9-W)l$mc;6YclWkM`bsIDTHh#f%dp<+8Nb_O-1BufF@3 zHTJC9T3v=@Fi;RfW6PIt~iT{CWFHNk@JEyml25Edr}H2Q7ZE)2nW7`wWlb--_f1u*Udf{B(frV+Eve zo6Y7G$hXrt@>Q~S`CJqBj2l@_z6jZ{H`0!@ZfJR~=F2PolkVs3ik&TX? zI)Ye3NrG0%PJ$yxA0vS+LtP9jqS0)j5!=mNB96>%?-nZ{twue;W$O(7{E(O6?1j+N zwU)3ksPTqo46Gn zyBQEedWc>5K09HaHqOy!BSYFsK4b89qpL!!5hxOG`%F8|4p+d`-Iym&lhHg#C|m=! zfn}`0UJY)ijQh7q*i@yIug_;@*?Gc$p=RV#AJ?Jq04r*eM2GoSZjtiJX&arLwx&fL5Kb zXRWP*g>{%?ocoJKn*v|CHQr&cjM2f*VxkhRo9-|EVKP68h)+H-eILXo#FZo*YGE7=DGMybBhQ?4h^IX5 zps`t$FJTq_hV5~8bN#2hhuOsejqo3ayBl(iLn*>h3K}L$HTa#8PfAW$RlegC5i_|) zn-sW@ULP^YA5ncf*YBRNqBs5Wu`nKaagW7cA=LJ#S~(=+2N_|=&)we8Ywb6DHuDml zl-MR$Y~O3cKC67}c64cds}dDkZOU)OFaS_4#8tN8q%x+gp?*_PrWNq?v;$)!s%^3_ zOwY~M+H>-E@j={PWlo9_c+1BNfm@^NNvHH(=mUTQd3L_%U%p$(v$(ueE}9}9JcUJA zRxlsqbkh=)`*ngdKDY3PR{itD7}1r8cHVsR`O?kPUIy@VdH2u#Y?*J#+d32oKgFu@ z$*zkWF~)vBg^ppOMRnFXsgis>Lc8{h-2X4-(Tt`6Z|=)~U>kV=t57oOk8dnQio@+6 zNmY3#iB?W`V7muh+rQsV1TWIpdRFq_7GX~s<3qd%PhtZF0K>S=V{R+))R+|87bNy* zow<7IakaEq?+lFUqjH+0de-~w%vfVzljobWXGOgeIT0O}5Q7NO9S#W`RO+^b91+DNdV$82JXoD1sh@l@t1pFhJb48UC0 z08h*ad@Q>a)#4u@&lnZ1O}{gYM;r9uaCo1LVxLmc4T5lF!1qes)zEP_)KO}jzMZYm z=j)kU?U2XI1>e5%mr~hS^Yi%hqe=pEgA=Va2~YZlzU_tf9R<}DRHI7UpTwI;qo!{@ zjFFQow;>wHzp@oQehL_Yct4NSR!=>Xn>kMUyB!L!dPJhfu`ZyGL(z=+3Z2df;!IXg z)yl!zFSP^!7_%Dz-NPh8->^ti^J6MG-k6UIVzB*KAQk^Bdz3IjyZuq4%CLfFy}UN% zy<(N+$uE(jR=GckZ{tAkB~4-_vHETwcDCZ)7>$WOqjM%$AEm8(%% zvyO<|9Ps)Yv~tAsbN0~__tj1nNFN==uZ=kQ9WJ$msscGir~L^AGws5ro?xKZ_&j# zy*Z6X%wKeVZez&TmGuVg*oZ)m6OSK-U`=8{!@2z zDrrlYxcnnW(8k3K_PX%5)4uwKh zk3X(}kify8IGn&pjE&;8wB)cdB9H;%%OiCfA$vi4_3apbyTKSC+eKVf>Twxy z3Ka##Nf|tiq9H-a#|a{=5F2xk`~tp!XBeYPZN4JhE2xhRq%2<1MY(+_iTfIoJJDq2 zVuWYtlx^frKT{FCn-z1!YE{es;gO3%m{gxPC;CNnb`)SQNsM!4R>w{~K}5tA zm5JNY49U-Jte3$mx|AlQN;Yh?%xR)tW4$(1KD-I_l#PY%MY+Iv^!!+MHAd@fcdYvr z8qE*9jmzd!^5t0Ntz+rBZA}2kmzTO;!>a0v>N0Z*8j8bT$lYQXuv}JSw4+xVfO}%> zIYwuM1V06ndrCJHrntYr>F)%E9I3S0Ppt)vKdR~MBz&xSI{IDB>R}>EMXsl#ZycL+ zgyrL{pqX{dNQ1lW!T@PP#U3IacYF52?>vv~ud4e8_=NCDuv-8z*$$IfrS1eXSB)=7 z4X`B{f71u)vK9ESVLvVbyy#bjl=#5n=RWec6 z0JWoM5olc_2~TFEWvV4K@1k5Y`KscBK>2G#W4}*Q%pW{ zCtdKdIa|=+-%e!wpa7t%kjN=U z`km8S^r=qP!Uz8Cb!T;rZ|_IfJ)#!9U(Spe?Yh*bzZHvE z)@k(Y@Or+NpB_#CkZ5i00f~@d{MtYlD%?A(O1K^6?se`Kl;7?>+i!cLl|xMcz8%Qc zX=pJ6+5vq5&4!7)9xfno9lSZKcKH?rc(_3uDb@DBoTVb3dx?HLejq4>xaKe`ag>!D zP3r;|-5&dWQ?a>j^z>4}@;q#H4vOa%SWFh4#xBoC?@isscFbpLi%${Vo<`oQ z+5xBvj`ADUIi!6i^EF2$XZ7m2w`sT8U=cd5P7!FVp&pn`kb+nL6E)M7pEs>`b{ZXS9vc# z*Otb>a$y#tkEta7Sm&n#AP->ikbt}GBQc9$YT!dA&?n@EY z)@5J|AV998j6kw2ziecIm^w{<=hkcbtp zoF=~e^DSETWUky4GjZ#OO!SIK-f3M9Ax{jgRZ|Zagm?*LXCY#yG~(-9 z6^Ia*(&}?v8vjzzo`MH@M4Tsk>)~$<0ERh0sp-?zN7_GpM=_tV4T@h3ls8OtyQB*? zu-oZUuoS4jQy&WFkMLW^L#9mAuI|~Stdk7cWB+m_$cRu8>8iz==OZp(Hg&#SE9eh$ z{}ybJdyx$dQlz2iuO9?? zhyN>S@9rPdD?!o;O6&#W34lC`FU*xeqDewf|7C~);rP0V8R7_NW z6vnkDw9A)L>p&ZBdMYYBhuRnN{u6)8a42PqkNWb97i+H)X&Bqz`oJViOjAxsn}|AV z=t5LIZ3@;Q6AnO(yWgcjQt#-^)guh2j09B@+0TvjHgrwytFe=QT(N91tk~`QT!Ebf zrjxq=t*Gn!gAARjd~H-9M?oXS_*2y-bLa^RuNRi)-V8q=rM&X89P4)!HolgNF*8;F z3%cjE%^o@!v8|O9RFy2H$)9uZTLG3jEhWu|=4oT-$F0qP1`?K=&y)w=FXu|T#44&W zU2u!8v|#<>17)Bu&mtd6sGM7Z4sFMj-7yyhwLj!Wygquz_IijKM)A7ZI{#DoRirR( z(It)6DqUt;iczm~it2E61*KL2`E-*jB?BFQm6`dAg?aq7CcHF_gW#_p4}X#zo8zOoDxF~{2w{@m;tQ?LoGaWD8OgW^^Iv&8H95LSo$L~Si?qNMtL`hm?i2*`u68a0>RH{Qgxc4#Wu3jO$p7t9!PzYop1*<-MA5J<@mlEg(6O=?& zEe(w-xsK-{Gq03uu!MvQxH<~YcuU#|*`&mO{+e!V>;DE?u9ja@_o;hHx4!v!MwY%4e+;XzUg7O8r!Wu^BZmcAb-mIq5@h9?|!VnQ<$y& z;N#AKN~a~f46)=LbcB4kLyXW{%##d+oYnwu=;24u$1H&^W|})TB=5OI zCI2WKL4SN2Ak(_qdaNjIk)zAnBwcx!?n|Q>)4unSYm=RM7&bR0ud35dMhzu2&5GpD zD((eYUvMMOkPBs3I0KJ$0xj%BKcJpYRkps4<^UZ}j`aMW9Dzsp)e9!i#5u}JM+~Xy zI?w~G+~%Jdz|H3=hctTEu>QkpI$S1`e&__@38_03j>+T|6ekORHrfPW*jr`-yVVO` zPI7ZKdl2mD4*VLgKfAv4=0q~XPaA{jLTL#A-E$4H{0*`Ms0dLhCXI{}9Z~scu}>1g zc$1=yoy;q^*{|?Qa`kFQ9;&t`F{n1MJ6J>=ZyRIU6&AU%%VWqEq@)SN@BT5=L!b@p zgA^r!w$^>}NS|i4%K98L)+VJyU;Yw7Zj147jZ=uljCS=bo7T*(i-t76`z%ca*=J`9 zduW)TuIV7H)M$T-=`UttueHs_n}|Gy$C`-T!1T_< zEgnu%oU@sTLCp5=GEV!?!~_*!8?%@tcK9Az?;Sp04Cmt8D%CsqZnw8Eet==`cz?jI zpYQfp$gB3R^wX#BE1MQGq_uf@b*cqD9)7{k@@bfXuB@7sUw5-x;ZM(BaOn9-XCXh} zO-P>RUWGse@P5M@YgNP=oa2ZlcCZf&c`~zeny7`xWqlZHQgU%+&ru;bko^5c#D3q z3wzH_T1duKveg0*Cq@eK(JO|ev5`Z0=W z1EGbm<(cxH%YA;_kA3ol_@AtkNpgzx@iF+vKN*<6*N!|b%jm4E6C;F>q04KPTL=!C zm@3Su?doJeZ|+~+N3;j4mfH$M)c*-s2_%1*Aoeg!cdt~*&is}Mc8#akG?e5g{1eBL zuAffDrIIY_SMMHvIm6LZr-8!6MxU1_6}nMnbxQN2+36k7CGH4V zR4z}1aQNd$+eLF~SYz%A#vEfVh&0uzbB7;=NvUL|uJ!d=+8I#gmuY3NXsSyC8{_%$ zzbiRa;Yu*%mvLm^8u3zFh&7SYw?MCpvu53q)?gtH^DW26T9ekiBouxEIiWMQ;VP-3 zjzBx`lG)hCp>?tfSfp0x>~b2KqzJqu8vM^hvflAl343x&ZtGL)x4`Z7boGPOGA51D zYdNtDSQp;KaDDXq+OA|j?PMJqwer>M_zRnZ=J$@08n3kxCcVJxxND2>6(oCX<^8Sf zP$fI-#0ZJ=>sTEl1-Lb)=I7L(hU8+mCRkDo=B!9DOqP*Q`UczI9uzCxK^aWZxx~ zcB`<=BnA8kc& z%N#v=gcaA8lsNWF0q4FGMdh`s;Iw)D(C-p6r(NGMc42Rj*@~GdkC3#qM&E)$#|^e; zEY_BreaB9Z4s9eR5~mnvExum%qLS!87R6-E>!%iGCkW*oXdGk z=v{I)t47MW{*2f*p3ILC<8{{>UeW+c%5Qt_`J;wL7}9i{pk2CM!Q{Y_l|@gCq-vNT zQKXWnG!46vmGkX6?HYxnQu|=*s?U#atB!<}Mk`~J#g@)~FI2ZZs9bTs?!9l+NoMl0 z3Q%rP7M**mdvi*oOJ~p|?hb1sMq&`2V)zO$Lz-$`i>^tW%(~<-@MKwidP{9({~6;e zYjCNw@Cf78b-W-AmQAQO~uA|CPu3^za>)m_si#hLWPwFZX?0x0vc{VO*7^aI|WW%=+Vp z|7@iV`(YbO9E7fb%Pl(FrF_t&vx@vD|89}Bjn~A0Xhy5TsJAp)EFzt#MoV{pNjW1$ zr9`mSNGuy2Z>pogXRGSTMa((1*b!M5LN=-MeU~={m5n+t_ygYB)1ohu)BbO0g49qW z+c@9chHbL+xjmqovzSs7`_E>s;~l|cZ$4mT3$|7zHesOTIunze)x@atyih}7!zw+~ zpsGRO->NppP9%&B=Lk!9GLfzB>vU(Tf%j@Y+X(y$$4oXDKZCr|fs)^}u0fP4Rn*Z_ zO2gR!pNrK$FtXP9z~IMeLD75&0yP1dA(&1bFG!RyI>n!;#otp(3F7_PnkrG~hgx1N z(NZkrb6`$kT)GKb;rg^jM%5oqOZRqLsI0(F;BeNuf`!S##b|1c8=7Gr2-gHI;PO+lNKW~z?I16%Io$jh94`p-bZIu5HfZ}0x=3r1S=d+}Nzc?wZy99j z+xUA#>`L!R(cLMAO{6#&CdU;Ma~+DN?07(hK8$PdJ;{_!szYvzp+$V*o|YBT`=uGT zAwpZW==_rGV+=SOn@?@dmqRXk;W}E~eOUTH&-PRexR$W7{!v`hG|p+}D`vJq)<-p| zr=N88Jvy_!+0MuevGrZDb`JdI=Fu=d$hbpaxZaQY~EasM9+ zfleAsOE_C@S6)h6k#n-Een672ZODc|WQhlwf)R#GO<>6P0-C-r1PVSNZ>{G(knoO; zv-sOKwCLgpuK+7d2R}|hf;1G&prtL)rwJNwPzJ}5cD}zuGj195_(!y(-4LVwF|y^V zokkr$8e2lseYsXxbwuD$L?elz}mrL2F`P5o3! z9Cga_!$noHu^T_2FK~Znm{}1lft6u^2>U7#HH_J_>L*A&Ngin20uV0P+L+XHmf`ed z({kKvqn|3XJ&^GXqi5Zk?vy2Fobc-uHQPcN_Hj-TDJw2ec5w1e@a0T|gfdv7b@vG* zwfcDW)}2-`NR-Y0CYRGnQdpVOp`G!6aRD@zCmI_?$r3^?06Zu8Tj4VUU$wsN^G?h6 z;P5S++vQ6xg5yngtn?IE*8N7e<}bs~n4u84X+6kA36my^(0ckzB$?Nn# zaps9T9_LON&)^`!)n@S-fF-q_ta5_s6e;`+GBPKuxjwO+`|>3N774bcPDr6h@XYso*7dI-EJUS5$gWGBmh$is>`F-#G^G6 zwIZ;a_r$8zeb;-OZ#k>%pI1Dm{F*E$J!oz}lN3wKA!#Rg-}rN`%d3R$C2{!-eniR- zkcaDN5+3f){ugIXbe(x5pEhWGJX~Wxx4s1QxPsC^HDhSUG4SiA1#E#@S(nK6^2j0b z-;dy@9Loyx_M=acnRHXjV*0ueQv!Wby|G94=-Ye}G}d$y&JTY#UpWWYRKq+qVhsx? z?4^j|k#Mt?p@+T+DlANjl*r}OrAa@s4rSVrr}Q%T}2 zaywJR?d>~#8DxcEXwmQrBUcODa%J@?i3hoTL>xjToAD9n0jC?r^j|K@Z?g6C3<>yc zhi9RD+3cHm_ie#tRV>?%$0+KVP!H#8|B6Aw!m2%TqWW~AqVxQB4K<0l4~IBsuMyQW zi*Unf_dE<*bM}Ql?>D;=nDS_Y#Vi-mYb_*xnEd&7#E`0I>t6KwHP;(UXZYjQx4!pe z5SMm6N=nEl;l`MShz&Nhv@UaT7W6sK8t2?Hg5#ut)n>rBren}fS3_@~9pGUPO6&nC zj!>i%*-uhQmg~czh`#D5Q;fkp5W!Lko5o$5PgMWOvYvh%?#4_l@pAbasYN;36Cxwk z-s4p8SuV5Z=8%5#734HL6rIJ2+A^F%k}M{_1=iv5PW{#b4%7+PT8oxodIY0w`W2B@`~I75p4K!@hb z5|u#awUF1J4F579j+89ljH=VFa?(Hj+{ZHyW~Fv7=_oI|10olN27;h(LvN<^n(pHs z6rdW9C~8Q+HKOPo#i^M{vkG-@x3}&$VZVdQTz&3IFCbkKa0t3`4ETjdG}Dj^dx%cE z>7{v=qPU?n^Ojoeh$_jHf9wJAdTds^{n)xD@vWP={>p2MRGbnhQC|$9)EP*=Zc@9g z?<{@m2pW`W-Fx<;|9)%t&z%=TnbeBQ+G(4^Sp>-+X9j@`BCqgkyNXs$q%4E22;*+| z{fjdoW5RVWt3j4NMbV2z0;=$BL`ZL%O7J zhRvc`hk2i9@uEo(ze7x+1DaKawqZ!OsrHcYdA~5^ziRm1z%H@ff)MH@HTSNMA+b5X z74|Q$Z0qygK-RVNK_LY#s>5mv zB^|gK@W+Yl^=q_lGh2+@tY@R~h*3FWH7t`wY}NW3sq9|={tIj7=$K==2w^1<>B{S7 zt@C=|lgxkeZd-sJ0s))fX&!3fFNVHL@3tUiK7v(L*~c-V@S>Vd_%)os`hq3X;VG|qw zTQ$+o0wwoRuV~~wMH)Qfm%l~P#*H)MHqD~!^_G2%wYGh;Z9`8X(^f_GFGmgu-jcW9 z$yQ#Q)g(rwIu6|LK;>rCpn)>h@MTef$MHP;&}-}7q_3p150Xd)D%?@dT761KcR%BN z*}CRq26MDO0HKrKD@9EV2vfLULD}o;5=K+pzdD)=1iBJ*zsQbv&C$cm0P?MGf{+h? zHl^wgew0Q4Uh;y%C1T(DI}tEd08Qs&ww7gO7YpJqSj!ssHXqOa@)AbPH(s4zS;Jm1 zBhNQN5qwb3wE-`a5C4jQ)fFCY;0@-^Bxayra$IYEVX{mVi}heD=8t95_MuGt7S>w# zqD%VjgPdOTW>+Vcz|{Mj9)f%&sRYR$1q(VY_p$yWzx^nZCa$<K~h&Knn*)$oy zk1?XJNg{8j4!Ospt*k_tsi3Ux6$%vq#I)^%kRa1*Yo&7B7<(GhkD`8Ea0Ik|G|<72 zai%@hReVDLX2f%(Wi|1#wz&&R%wDyOqIs7S8%UEM9^4^GGa$+KuU1M4Kau}7EE=|E zTwZ&2b{n#j!7S7zxoLNK;B2JNmo;m-3CJp=La9{71e`?wc&%kn!}f+ZwC)csMu*wf z&h4E?Z(h8_--5rfg5gKcF?1aQe1*A7e(e}#g zR%inl^WH?A5Ck;o=qttr2&Lk^&&<8z=d1sWGet$k`ybw<*+PiezzcVqDwrQ7it3o* z6K}O)WA|x&#`GVNZVG|S3Zm?~W~hnd*1A$@^i>weySsp;;4gz+S08E$Se{AAG{k?2 zYeHY>nyw*Vy}`EzoePIozy`Z=kf>-n`j`58w7}ub)NFu?upb&pYJjti3|uEVAoP4? zbGYvgI^2OOeP3c2heIEcD5p5_2)s~oUc~FaJV;|5rtgzg!exsIIs*>mlp*&zF4_cT z6D$P{iPB^hPYzEpNOiql+Twnzj7r>D+Tp$O-xyC4EEW8jjxSS<=c>_Vd^(ZVu~zKz za;G%8g2< za=s|UefB)FxXc*{&78=ejF-RE!-Y^=hn`<-Gfm71b?;-97nHZyQO>{8X~Q=e+Bx>S z^ReZtY|=zGa(6IH*R6K_5Ewv`B`QrF~_$dKxoC-lNf7`FbTUi_wp~q{b z99{G;e;a^MDiGqjlU6NJk~K?(yA0%EcW9G#+5O3nhKUUe^%bM7Bsvj(u!s|#ISS~4 zSA`>;Pj5-Ezed@iauMz=nwaRKiPEcYuVa1u4D6_i+n-LKgq3bpL%!Os@)tKqjicE{ zw0%v-+ur+gB*9nzx;|60@_A?zz{>ln%Br1Mt*>xf9!Wrx`+~0#3A0Arc_(jzC`zam zL?gI4hSinJ=e1`?C$d)xlf_~~# zkl3D!EPNLHOP*QDCcp+o?ef_*JMJD6!mQ>LYGn)gl$Z%Grp%vZzBtT^h@Q*{`)igiHafXaywzBhyM5Yu=ha_yzW_Eh47dI2 zDbNW=HND3_rLToYWX7Wz#dbN{6sxA5##ejnGIOoUocqe%RssLkCrf>S<5zmUnkC#s=iK#lMK7NUi1N zfg$0;P)Zt6W<}CmQJN$aQN;tH{HR2~qly22J9WX95)c?4N_%Cu4v2HeY|MK@Wr3^TE27zkGZ1{XXJlS$MF zsMk_yUvqSQ_Zc9!Q7>ScTj(x}(2YOM6CgrD7gI9+h2Te{G0%XY@4^+?ac~O-S6LWO zve(Cb%3X9%m&}#rCgsBO6!CGgM#WVz*zlo~-P=~5Zr!4*EcdLdII2FQ~M# z6K8w(3f5IIb5QNChV}-Og~`a<1@>RZi>o=xR%Ph=MIAhqa_f71(`}SdmiP^esnM7h zCG3aYOm>#_tDcl3=4?=19{am^A;lQmhqkNP0Dt+&X0?{=f2?jTg%7>e{b~l#x-Vx7 zOSimi-gUx#nK!d#VSBPyH70lAolXeyBteDl}4Xa$6*Zof&>^NBI~68ww)ADog?c_4Ay+=-QG~~ z=UF|jfA0uB_SDnbOAsCuLV(&PxGO`U<+Qsp%FnOO`vzB6xu){VH!UUTs0&jZHv%^& zelrtlMp7-Vvg+^-L{an21Hwd~8yQI|YJm3HQV0nu=dFHsU;oB$s|0^heo)VO0CjB3 zJ#kuITorYgFbHfGQ&%vD%ea#Dx2w)ys^Vh7ZxwKz zpi4F|kqfnzBe8uM7)@HN&^P)2|L{B8r&6utlv?qvn7*O?S|K*Rt4597r~es%ckl2= zSe?5gtf+@xRhVTs`g_E=%+A@EQE$`JFQxDc8_j=oNO(>8J|x!1m5>LAVu@X9UgAsl z?($DBefsj)0Nzq;0dezg9nX{|te*jyi|D5B)2VUmKBSkB>usbf6=%y$8aoE}7z z<6}IVEvlbw7xfdXwDFw4>)JIgP1#PaT`J0a4#QlsTqQ@fY*Aau3UAn66zz{E{19`* zy?QUMG{vewiXUqVVpR#Xi*l<<3^Pi21i_f-oJtyzdE6P!s-IcnBZa^pw_KpOEJaN3 zS@plyMpmuPgEd+B$DeTv96%(LSYEY|Yu3CS*nle~&V&J)Ro3Y{X+nZYxUdhrfzh~l zvyS*N5BX$YDyT9l6+2nio|feKJ>GqjR@N3(KFRSyv!tGZ#*o_JM(^~$+VmT5gP%Wg z3;B_W(N*Q#2@-ulx8+L~8l6in?^{pjjHI;5*D-?p0>>F;WdCg)jioH5v2xosZtpHH z6vdmuHpEM&qoo?u)E$D~UP9jMh^_M^ppT<>`UCJ;)nyA+H50<$5Ob7%X2<=#9FxNV zn~>7vS)PFXp|KKvvNxDcS7J*jWc_MO!NWnm{p3pjNn!ZgX8|4k zhZ{19_-s-un&(FPmIRU1xC;!-6hC9`Rt%IB7Rk6tC$J~JDlFT2o>`6X(WqAymzKBL z;g%dBiv~;)ZnNbE!Y^S*q+%4-r=$l=keeJwSi3jhN~!P3w!821;=1D!wdxl27^&SSJBi zPvM6$SSPz1!?p(%8)oze`GTF?E}`%ROHsQoQy1Y6JKST75nMT%`VEw1jhwIrcfQRF zpKg9t?3Ttgix|x5=Pr(-@}*3PNHXw)>oB)%( zZHyH=XdXbNpBBEbVeHd9?*l4vW}iO$*Rv*z<(C!Od*eTQPhX+nM$c1X#bPTn6J5+0 zm8l?B$O_hsBI;hC#P*`~`ISMY8STmEQI}>FQDP}9h!Y&U9nRe@O#9rD0H;(Gvi{_g z=Cf@JQ|r9$WVkZuyduLKWd01LdR=VZ^XfyNPG_iwVjvqfs#>6#aqQRzgSLrr`kSP^ zAA{~s7}7xE_96S9g#xA@QP4Bu-VsIXb>8kz3k_O&>qBLqM3_L<-~j)3eXcX$J-H36 z*h?1GcXA4FJ9M`se36T+VeaWP9$rNLRihaNHJi>lsG-|n;*jJ0#UiQB{GZQ%Y3chs!sZ&B8+v41+T7VwXS+Cp=f&-LoB`GIW zGA|NZI~t!>b+`0tj5d+$+J#*O@22|Sy&Ua33vnMulo%p10JIetYRV;%bk?Ps{?-z6 zXY222)RgIs+~e71P5s$9P_*vpxjBkNso940e{`zqhR-S0s|;heE-ZFI5f3C1fLr!0L z^}`-={R1^&sPl=TUe6P_+LSrna#268RT_N^yqLHfm}?$W^;-#&RTL?3aCH53G&XHH z;kWUA1x+{Lxlgy0D9v|{EDgiSt>%kKhs?dv*IZm&A63}0FRAdmM5;nZdvssqeKx5h zOXCi}1c?-I6ljY`W;sFoF#yvul`!k@69hFP?2%YVGV690%CpA|1E`+=ch+a?HztVt zgfm|;4yon&e*4s0oFKt-88FiS!STl)c>#gh{=tDoR6aEg4QiLpea80T;hPZoiyu76 z>55{@YsA3!JIR4w9OM-yb!`k7y~sSPGfkukZG%G)b@aoqmQM zD&P6t9=o31OZH!oGC$1sF+!mCW6Jyj2a)yL1FHu>asc}~uqS%xhab=A{ZQ(WTX+tF zk5H7tK;IU?>p;koO8sn|vKoWV{qKv#N<*GG%=ZgA7(G5ZHWAjy5#X*r3H<#OxyxEj z+kV!-rPijm{2kcZ|8OEQX&)Fg6ArEowYRso8pV7=dV;^SpYxUC?^TMo?8uCy^_e)D z<+~OD_8v1meb3`%Y-_r%miCmL@aDedoi|$wt&Xm7xqn{&s;xpP$;yeD-R780zi@Pw`JwK7YeY)w*n4_xkHEUUPR;U*E_W z*wEG4sa~O9uK)ZTwe?MeQpJ1=oE=RF9Z<$=EIV^nhycN-fq;5qg@gMzlJb7949%*K zqjr?|ss8T1z6BZ~QcIFev3j|CM(c2L&3~x9`kwj2d zMr_qm=D~GPu+?Th)3cBA9X?5DsNCZ%<5t&!6(++B^T-(!$#+2TMGtlAqhO4S*_}5A zBZN<@?(Nin3Iym@g`Y77o{#H=lK2#&A-KT*IT;YXO=7_dlwy9(Pi^n(OBP|wJ9@p& zF>1H)=xywIwu{kJKWlSuUOzSx^Z7LprL_(hSU?K2{{(u*M4t;4P~#xCbqk2HYd&ln zxPtY*k$yV^U-uXM?hQrjzetG(bi($JP^Z{&j%-B!%j^9?a(>&f(Zn;5WW+riL_O<_ z+-WrbfhYqaW2tTLyKoTQRXo>g1NVI1Jr@73Q+DR`Gp2^aTNsjnNIiCeM!Y^Vs4B8f$+uSUSx_eB`8WCG% zIVE?GL|%-~VbJ%Z4G0~MLA|hGQ%AGS7me}=VfjZI(61Y_(91XBwR=JOFg0B;ne6)Q z4uSI1?9ca?u#~OL+iC-|se^#mBrV2N)#ClKAo830Ska}+_(BpeJWVU;; z9RWgK59Vr^LLm2Ev4Q;PHAOz62rrXVW+d#&dh35&pesD(3>pxtfchh9FfJ3EEPR}< za4yGvvmdH8+KCF%&2BkRtu|r{D>HLXSLc-#0lmkrlR0HI;-E(^u5k=lOF?ms*;~O5 zf&nLaln;pvPH^VfF&L3B}YsL(|4xnX@gJ4^)Qn1cRuzx2*sT_vECs+}) zmuZCn_HzN(0LCRFi!*zsIvvty1f>e2X)C47vU0Z-k~O^~!F5fAZ|M)=<%)87QBcA_ z{BHNnce~(~GB;uyetzlNIo1Ed^D5D}?EA;Aw0JG}W*GCfDCib2022gm3!uqgIgVE>ixsQdPyLt+N)5}WW82%K`jDZ;?k}SQGufu!526=1Kfzk zw7C7Uk|O+RYB5q^x?EtlQV z8Imb*^9mw+vkE$V_CX5e#6i!glV%dwi8hh9PV;kl1DGBz?`aevUVCTn!%#PM*$E3# z4;b@i@yFl)p<({K^oIJce*Ab}cBB4_yb|@^YV6yx#U!Y}fCcQycKkFzU&`-MdZT>< z+PHT)JudMriUq;b*M%jNQ+oUynf5EKi3vnGEcW4FGjiS_{0=3`YPMrc9rl{`EWN>P ztsp2tPn-`pZ_pLp4vAHgu@ro_vJiAedoV^HkhNOI0!#HpW#2gvQao$2^3AsGFeS9b znM8|VO5ouAuJ_8)y!j;LE>PwGrAP&}2;H9Z!!hQhQQY`p2hpz7ps4agB@{E1-fK7* zZU9J?WT@FLxr0lLdw16F2EI^5`Ao#(ZStrcDjZiwxQL-3d{&w>!iQ(nef$95AR5Wd zrlPWb6HLti7Br^i_jm5c4^@5Hv)Ss$dOq8Yv#{_sTQpRjzCB(WhFu-3wK%5*j{W{k z7jk>NeLuxr0FhhFfqH!*KG`5b;1iXgN&RPQ3vYnoG6RqB!Dsy;|3;p1)A`nG_gQf> z5N9z!ahEPF05##eP#g4R6pOX<3Iw7(g?R$P%fmf zc~N&ceG9FqdJ7Vsau7+#j#8};gxY?#{1Xe}mxu-M%ePI`AUn!-?*m!TT>86I2Q$icsXMPYO61-(b28MjV`(a~c^LIkcE%PA+pq|0he((eiGZ9by@I zQh)&L%Ro=+aZ(il_h7+Z;OgQc7U=3`fU$o!fI#T*>D0J$&R1qil-i3(!Z%Azdqy{X z<`1gKGUlZk+7`MA?i-cq%bhZ^XbiDBt%`MQ9OC@hoa@=~cC(I%Sa%PnhGq+E3#Iuh z5@+jeDDWU=vHbyCDSOH>ZNM@hb#&J^jhTTDAaSRN>8N|@9*mR+S~^>IoG8vC;2R-+ z;(Y^hz?{+%l&KJC(K`%FT%H`3q-ZGwNaE|HhCt#(Zzb^L8tql z7}jehXy+Mvq4&;8fb6Ry0O13?gWRp;e)^a)=^!t|(5{dRCATAgFhBM1_u|U;2z%$b zVtZ(KjXeydVwB2BP|k@GF|`*VG;S@w#s>IrWr%O`X8GgTkU*qD4Zbdkg2Vq)(|1QT z)jWSEA#@b!ASFl_5Tr>Dpwg9&^rC>lhZ3rE5)hn3(|X$CLm3k^b$HL zzxaL6d(Pf}cJJApot^pY%-%b*T846lkCnEla#2(v1U`NT}X*faPFi_OZ!pY?ThgN%!}&)yrA<@63zi z@=sbEPSYVr!Ugq~xyMmnocP}dELvAul&IZz{a-52dQfv{pCG_Lzh7O^8e`3rTzTeC%Lp5@xOz=a_jLKq|9t;B;W8}#@6=Z(4x)f2TDY-$<}r;QLl z>`Resi$Y70lxKY9)fP*A)T6(F66ll=m!m&x)m*m^x$vg+2kuk~hyW$=62*G}Nuu|I zgv0}j8<6*i|ElSh;qB-}(*&i#iAmAp#=J`&={&5$fPHPr2@yT6RJZQp7+(?I*aLb< zrD@mpqrMSxdfs+@dY{S;cFuVBeKE(w9#3hqdoqDT!BkIPEkvh`<*pt*xFJec?vv{n zfQ@;v2TmL+`gCzRu#l*1z#}TGYBRDM5B}q4a&1`mZ_}wUEl%~BAHkiMBNpSLhc-N( zt`+1$k*A8rr=GXENA3~Isb}0L?-jD}exuHsJAj!%i_w3?hoP8C5!jwXrJggN-vb0b z$1%n99JB#eO@B?^fd$tBlzBMR?msVSvP(rpxH+SlJ(Y^-ncq9#&wAP4v5~vGDMmH0 zYH{v~D^aC-amk%<5}-5>P9d zfW|<~?zUI738RkhO-i+{2WBJ1QYQVSKi}orEWc>S{I@#X@7`|io@%(`#2-)A-N{3H z?JGjcg?A?{vu`KbgM$oj_)|1TaqGnAZO3X~P-{9LMqRv08px3TB?lwWT6|oK-`Tby zQ^~%F6v_0*$7IeHHH10~N!u#fuFr_=7ne?OC5`%ZnL^8$6$8bTp_f2#+H!*H%UYF( zkCWF#^T4+LucPayTW3jvH%j@<&s%ndhURkbCLX5&wNmFjaQh;7PE6glW;}b-?My|W zDjNiFa}K-#v=Tm$W3S~8oWHB-QgYJzNd6p4CU(Q|!UjvQ@ZZmQIC>k>X4k);pTGOn za5A`mknm`&b`14R!*TBqkzKqn5UwPWazP*L}60~k}bH-)2+A(Dr zvGhCR!IsAf+~+D{HII0y_JjMQOrk){Ji9q54$OY|1_+R!r(o^{9W{nHZTQcgqn6e6 zgl5~&q8oKhzoCHHKkhYFnu5AY6U!axoWsMn@e89)F1l9{8$J=I)>N%B$Ps_we`(EI z-r^*)#Q$v9Z-$=WtN!OoSYK!P9e;264AQgU%lMa zU$yzq_oaDD;Zb2B-)1KLOeZd&lT!~sAEQbzrnf#wSZHO($0t4GlYSm2`3G`rA(|egPZ!iS_u{ukh4<6h=@f+%Lqc?k~ z8>|1d^=v!6H|J;CzXQNk-rJbQquL~HB^0%uV5>hjTNqR)3u`wBFNib8MvUA}3Fj3i zmk*J#j3f%l3VZhW!_aV$xGvwtP!2WW;gQG~aD!{OlJFA&LGGQ&U%}7B?cKx^k+;HL z*3>vy#PFJF`qb`Nl+| zyRD*Z>zwDavop26NB#!EeTWcX6IaJo2cdP^antf_SJbCT%X61;W3E~qe(jtT-D_9z zrCbmsBS&vzD*n&lPaf756Z92ohLSN5Z*g&aKFn~ zgo=(Sl?&JU+r?Tyt6_QH4{z}OzZUAKoUUmXX$l^G-hbMF;<&)q&)P^Vm#(ME8X&M0 zK7ex!=}Z#hqC(UiXSVgRy7z4hOr?MVLRWSGp8bD`-uH zg@_F(J95M0s`>8Ir7AfIv3g`A37M;{OIbAXjSRvU8z3g?&0ZXmVm za^TB(Y20^C(mw^{Rt{8EmJR_@4e|*-oBC9;^dWOVs@u24Wn@fkkqk3S)TbO@xmWme ze%fu+vGgd6UXM{UcE7J0747G?^gm~;Q$HNkq2KV4hsk2l8JeT=7s8%TEfPIgTx;Dy zKqbmIi)!3&!WLwQRv|Q-a~|6nn~~5Yivfjl;Xj8*o(fe7;#!Z^{6?dk5!?q#e7@T;e0P@=jO2mpdMPU~!8ayjDmI+haTP)F@KCooXGh&q8uDs{kq?*30)P@g; zZL1o3Q#5h7c$T^U`@gF!mw$6z4+8Y|!&}Xde;KxXKNv)_n13H+!>X4ioDeD~e zJ2)UY$^!q#e_@LsvS`JC|DZi)zrU$uM|g-U7OC%6;PS=R%`R}4GU0| z+p?$evGf8?Z3$69-Em8L*-bXl=bAl}*$%rSRcVtm7P|L{)i!*RRPO`b_*`OYiKd+V zqs%-=+XXq-s))`$`}+ReaiL;<`h~YFCcs+GR62Oga?O~Mn!BG{b)U2e-JaJHe4%v} zH!siwj_^_i3rvbpnc`*$je>i&ovx?-+%##xot}@y?G4MdBQce~!v%`nieR{*{jW_g&wl`4I87!WBgZ{o)bsVsYsT*Bw78;WtdtN%( zfY5;;=YUU(uFig~t*yNVbbm29Kk0=exNQX~Ne4)wY?yA(24Xxo+P2)G=NV2k#7Q@( zIy%iM(Kl>(!fUB#R7SV(8L&!+G01JV(Hm(l3a&By!miYo&y)K%Il0RodMv2il$F5* ztG+SF?*VoAe7r!kLerW}5>HJB+R7=|CLVv{1RY&VSn8^W+)xz?d`069IkjGeY@uc_ zBmZC%a#9Cab&Irps3F5v`y9(MswB#MGp4l5=GwmMftH&=e5nIWIHn#SyDuczhS!sx zK6qfOpo+PUS{|R<-r`>l_{a)h?j5mdzE^7FmFj_Ho-_Qsfq>a(j_N3hVs5fp@$a&l zR{l)xcEa0qWY6UxDj$a6>;v>JG;5R!7pEd}azvQZT!=dsf#q3%-_SdT>wMifu~0uD zw#mgyqk=&Q7(XEoSb%fO@mtrXD{bV96|lm@e)R=bTFFA;@;&I`*PH2dQ zC^iF_Uj}-35`3wAcubI{=UaU%E1ZNau#Rb}vr7Rzs?d&Hs=IsKlWrMwPZxSbuRSNM z)QrB@EJtKN-74{VRw!Tu_UTpG2mJbKS}Shw-iKPVVDz4o_o|O4D9sL)PFH3SEY1JX z9WBy~G0645q!G^$rVhlDdcE~d9Fgs6&9+TDX^{mItC*NES$jz7DqaERN`$Gge|11s zIRa*jESnny`uE`7SZUihFg-ZLsahrhJto)pXkYr9N7~%4TTRa?{Z&b$lQk4_zloBF z$4Xo0So`wFvf6T12-q`(ukV3KX|McdJxcV1(DFIT2DbUa!J_`&$QyWv6Jy86HPqGn zA(var$eNLTLQt;q?ktl^9uYemo3I>{U_W;^Q;L9g$|ceH0FkP`FU(`U?s(w8adb03 z2xUB&HblL#j4{BxxSuuLdrZ3LN6w)7^0Ytost=x@EPM2d&_LL||DYGpOZTHYPvs3? zuSx4^QYi~9*c{$abCTVO4~u%*8OFUDDjNjj$)}sqP~P%uKqP&23H{*(GLLKYS8?p%5Y7eU}6l8fkxkcpU_i;eusDKT@OSx&fX z1#qj43s^K!w)={V$l|8?``M7R$Dx(H-`co9t!?_uCbe<#Dhnm&s~jt0ef^Ci8?ONt zg^S<2&(}nUaH_CxCU<1oopGxvE#J3Ap*;zQ?GZlbkQynfe(6;3o4$;zwGUm(b@dUf za4fC-Ay%Xa&h|;WK{QxQE*gAJ@+0;rG8ptKQ4C)e+#Z{F~-hGh&m8GX3z8L8x$en8(z-j30IL7ktNx zfma3e=8K!E<^E-s6GHI-e>(i_YDta~aMgt1ou zO+4fZo<12v(Qf6o;5dwp$u5YKG`UAKiW=*m72SU-D%lZOGH>aX-E1$-)W zDxTbq9u-4vUtY?ry1i`1Pwizt5I&hUiz%IY^_Mlu>&K&ADXoH$!_hpAVcNLOwIyoE zH~-IQOS+=%P?s4eqamfd%o6$3tprr2uI2qC_}_AA1LB3s+5e3t{RhW-TecJ=K(fmn zBK1s$Ss1!z>>*_*Y`PVKQ_yRwEatO~M1 z_(!l-1w(+v6?XZ9txx+xetQ|jj0S#NU4-8L(L<<~&MUZ%kQS3VVSJJmjc2avhWETn zP|*DEZG2WkwWKVEuUlqT!=cI2+*1ZKh!G+J)C)H%7Ao& zBK6?ZhTQN~i`p?mYrl=2hB3m>P5TX5p0{Yx)4nLXKJ4$e3nQBiURMn6JiEypc0$MvZvBzu_sfMGm4ow8<8soAdrr#POi&jX8J zZw-T^-o1Ob_sbn6n|ZgIr1G#zDVeUlgoiNiX9P8*@j9b;q7fPO=J_|3a@pux=`9`HR)<-A@vr7G8P4 zMo?iW=RV%Ft7uX_bXmZ-;CzJe2A@yQ;P~OQFAJ!PcXJeZ2hWvWL3u5)@tp*4D)}|7mual{&*UPFP;%e}(!LjhA`!yU?pk>`pdbWi8+W zM{mU`*HO6^$zHN7*?Bw^`x_89EsJUF%Mv>U`EkPc9uI_`ka^ zJ~F2p;Q$(|mU!mZeZgoYeS1C9u$*EuE)M`sWa~`nO-L%{_^!SkK_|U2qfmw-W}Gjv zh7~S1pFRROeO2A1#$N!cVqPa8U5NGiMae*9pya=H*NSVE2k{Ttbtf8OWXAe5yh%}2 z5iEQ0;$r-DCmSmCQk0pSpTVC^048kwZHF>Hh^{5WV;9ZnQqT6^&^F&a(gV2=k2gD> zll^)D5W#>VL&H2YqtDtDH8MMzb2;K$5mZLXVJT1iRoBmi{F!B8v7fP0%aPJ8d|RZ>4tx0=KQ(XWpLh9K~ZK6#MHi9VQ8L`HbT;Er_h3Rw~;n)=>@<< z|7dhu!mD+C2JG}$e*rnZ#}ZR;N?(sziVu9swWOuFg>yT)6UnY?T8YTysmy$Lc<#pn_Th^V4=(M zYOGzq!F9MTR~)RJ??_Ro%ej&g`Lswt>yz?;Fq|m*B;9CJ0gCSJDo<08G zd}d0k)p@cB>fxDJ4#?gwQX{H^hvQoJdI>VVNRJfI>Nn3$x)f&D(6j%bC{z~P4ZD|B zAyFnM^#ZW+859k@kyZv;*6r_nJ|OrY3i>Ic=+e$*0nw(R6;jF9jGPsMxdatk9uOtV zzjp^~O#Q<)v75B?g41lpKP4lDhAOO1ekShF{kWl)`B>yiu}6CbTM%natW*ISXR_qq^Naju&UDh zt^_QCwtf1~`z(}|JD)Ce{G%CQnPOo2+v^2t4k($5GJVi+pe;y=E4plF40C&UgQ9RW z+b5L)UqjelDOa98p8T7#r^70K&pzX2jE1B?5io!G&cz*9 za!R|>j%l`JKHJ_^1Zl;$p1#1T-3N#gObzOuH9&2$7D6D5lYF@R%^j6tva;mYpU(Gh zk!HjW^$*zZuK_AQ?&R6pHRVYO`D=1mggx9-dh?l6Zv2+_F_0`VT2${qLq;hh|BrqP z7~k<8`U37XCaqM1`pP!7{=-hHh#E}PFossA<4}KmAvgr5Z}c(k*_oWB7`;AyAsN7! zKX=Y#2&xzP}Uo$Rgyn_2<-l;1y;aut0c;7ZtZf631R&;p35!)5Fd9$Q)vCdC= z&QVT|G6oiJGF?_22G5``;fPh&Q2h)21{#7?LfaVPV!>W(@CIxTJ>ahMukje&L}eh4 zsR8{Xs$G4gKq3Q!TIru$3BZeBBIEnWBcn)c0N<~s`n>LEnb-i2BE(DgY0#88&=jGu ztHHcohsanLoBN%oGvk^nb_v04PGT+~OTAV$7#f?_T}IsYqTMiqR*ytg9oOO;ir!zSpWF7SrZXR=Mu{77ChfTMMeg21o@fV9<_@89Rxl7$3Jjqh(C#VIj_0_M)ygl!Rqh1iUWv8( ze6|tg)+jq~VRH){3Pk&qeS!wnyS3m+5Ows*b^FpQ1O+7vRX!@=49!R2t)D-6@*{?0^2oIK!-}J~3+;6nLVlFlZ1HleDC|o~i(^yvu@+Zx^TuAuJ36b7F z(Ve{jsM-0n-~F0vSEXws>N{Q9cv2CqWs(yJ=(VY};ISnPrzd<{C4pSvmZIZ80OC1= zvXo;gHQ+?4)-ynnUfHCn%lQ;QdE(A-quzE5$LGx+ouU-Ren0&kXrql&eyBHtR zPM8kI`)S67Xx$1_DDo>cTIKRTV)wI=#`zyX4};hJ6>eIN<<)OS^&(sXU}f+A34#c< zXka~NV;(jP@MT}_KRa^eUdg|dI7+=6M$KT z*EKpn`@-6>7?cPz__E+s1>if^osef+Wii)H zXai$3X($kS5vM!ffFMX46Pr^Eu)_+d>@CGP7-A9RFVx$!EFp;wX;uYtb;xJgkhC%Y zB*$=SC#+w+0c%C-QQqo1^OU@F9?z{>d+3!F)q{l)<@vdUFmU_!Ln`m13IvutiJ^zC z!l)BoKk0Z`aL}n-I{c~^eK!$>KYJPoHFLw?!WAL-?=53N7F!~(bjLjZnLYOry$j^O zgl}$1zFXb{`1{)pkM!=M40Ov}-aO<6z7m)>4i<2|RRp+&8zAaaxKho-CVZK}gxGdC zUykax3wR_U)q<|o77?&F!a|50KHq4Ynd}+=kyn_JuaL}HoHNBr*n`=$-HHG1E(L&& zVT=-+k%v-)>7krt-Yt0Rv+V`UTgf6URx_0pZ)g_3K!tnjcjP0Txdi++VL4SuWPO_u zhWY39Pt@+}yUiJXI9eJ74PrgC{uKxqDbrorge#yX$*0%*kZ+Uw`8xLinZ|jo#+T`g z68vGX1lwgt>VzWA~ypZh;#UdVY^y3}7KXt@Q+cqHS>OqMqtQ0EAn(GAI34c+M;OY?(%6k>}tR|Fm{e=U|i2kI>t2gF7(`GKq zKPsSYCDW{C8Mj(nVW}6+Bh`|zPtn>Ei_XV?8XpDkO8pmS|9EqjFKD7wSmRA)Ai55b>!bDk? z*886!gR|E?6~7orNe&Y(Y#<-~cSiu5g3HvoUsu+X*tqzNKo?0uPIRRIG(VgHS4hFx z$YDVn^ejhFO*zqY8lp1jU}vP4(Z=~B`O`Rl@Gia7?svYHyEjz>&>V^m@~yvCdM*u- zAb_@cqh$m?Ih0XEYlRLB&hyzSageIbR3ji3{R5}Bp+eS?NI+>&W%{CBga*%_N9~U? zV@~Li4yP5~K_@R(FAM-`YK)pkN$s4YpMh3?J`Y$8sPTOQ63+;zTegB@^ z?#(k^k&INcSLOBv?^m*Ec-?pvvRN z-G?b3`$uN`{7)}$2EKy}97zeW;b1Z{+L&@x@g0K@3c^ImAhPi?+v?d<#(nFnk|`0B z4R%~Yoy8_R8l(NW4B12a0JYL|S~@al$i%TsSA{>h)6(QyN*q;@ojX=cB}{{-b0vaT zEf1MNfZ9<0L7!XI$AVJI*iVnH!3w7tEOH*B@Im_EudPcgKq_g{E zf~V)Cvi`X23JL)q#twg-oj+#Xnus5chvDfLvB^BE=A{Le#GFx3uqG#~{=F)353di# zL`&Mn3GuuGk%C%!UDZ*=>-2DF_Q>-$Q=-!^Scjgt6LZqf@FU#U^S63%fnC?pyD27v z2_)5QY!18E-k9U@mknQR`f`6eNu5nRca?@9lTz3d?`(IEtvh!*W9mGD!3VcU_0uIm zh13t!@9}Sh9_oF;TK8dbi5G{|M@wf{scYL_&HYISkxx56?PzL~e=F|&!)4!P7XK_@ z=%UhwSBUab@|GCaotW-t#5|5y#>sYcJtzcgoT@tnsU74|_vq^Wlf6Zy-Vbq3!(&>X zPOjI}PJHgTDKdTjr_%uf0L_y+jn(5ikGtjC2tMo7I)Hx$-_Z7|MsdEHg%lJ?e?F|J zrum3y%_IAV+cVLL*D4R0g_~a7Cr(V=_>IPclX-S>%tTVoUztk`>1k$0ClBexP_#$l zK9eKCMTd&^*FfcT%s|*P!Hms_cO^m^^%KmgC4kDaf!S++1<|+bz8hx)LL1fIL0%~> zVIY7hy+mbv_s5ShlM75dyb%7h0r5MN>~N@NSS9oUS<{T8#TSrUrz6Hy;1l5YOc7C7 z*UP69>hpO#@)ca`*9*>%5e*Parta!>L`rP&!(f4`LsBq#ZJppNQ%>5b!p~+;t72-R z-Zk{%H{R0QYUdY&1j=-+!P8Ux)gPA)Ad8837@XPs5kd^o!KF!WBv%(~q`!P<_*?N0 zi^|K_f;~I4Gd1)gr%zIyP*Uwb$^nDnSs;NIc^m{-U1cJQOh!hl9V#c5Pl2%f-ePDS z3KZ7_|N3MGyP<(bS)~kb_f!b6KWQjWyfBv*D5jiPe1|sklMn#5hS*E$3p@8%*(@vr zxmD=4!}2)hHqP&||E+9-`juenGApGovxOI%gV_ZICm$DnzW&SSlVpZGI^cLMszHDi zs=J>k$j-cxRCQ63Z4-fZL(zASeX}dIqc;D04Qw41cy#?PpsJVPIRXnOTzkjlLTiif zX@c4-k;Uc1ttp)mk-BtbE9yqxuu5IJqkG~6%E^x$h!X+io1_8tKCUl}gU!j|K5{avWUbJ|FSKU^F1PM%B8PAAd-boNoOPv6q zxWpvsyGqGVDdi$Q#*p4IP6`%N!|TP~f1vYXTp5TGOt#Wv`AhBjcle2y57)7zXCWv_kR1n-*^1EQx(MQ6+f zjR6GDg6NW%CXiDD1T|KAo#^`X`8RAX^f`}E*=yLi=+3eoTaZc;C;7@`HS8(Ae!^eC z0ytIi4|CJ&7&&XDJ0~6#Ro;ypFTWZn{0X6yU`P*H3j;O3drT+!s^+7U@ME!?ww+0N z2IS#nn29Wlx|D1yfDumz!o5H*F24o#iA(WwzYl+VYC~D% zOsrRZy?z7gV)SiIET52mo4%RhrYh{4?C;g$sE3Zwvx(&iLUBj!uBc zi_rUGJOngn7vfD#_2FGKAoJ1`)`8J<5xTG4j2}-Hvx5F+pefM^2c=614HYh!A8cnf+s>A2R}!eXnkD?5l|`QNvf#m zDg$LAKZH{WnyEZ_Q1nBToW)3=yTZ|4kEX70iS9GObsrQEg($P{rZiF@%qTjJgSY~? zW1U$XMwF=#U#4L^;WYzIxlEjvO@b3~D5Ie3R~0~~G@5<|yvZVulB6zQQKG&vU#Yz* zdAq?tzhwXCyD5|6EYDSk1;EWuxllWN1q}?!6@`1T%KuMd9E1RrNd@3u5x1}vD1`e9 zAsB$yZB5iTZ;3H$<(G*tw_Zr}S7*;r5HpK^b7&6O#_}C?RLupu+7V@}4)5t)2yMTk zAUjQzvYNfEkBID>rlWxR2|33tuw;{vK47!QW6&O+7&ti<{W($XHCXTyAX`V7`-!gB zhmqEZRhV65VdUEZw#bhXM6ToXaY#X0zh+irW6k9LEsbGz3BA*-#tEu#o}jzG(*%)h zf+Kf+3$lc?(kpY_t9$Jj=VEiz)0y~6w~1bngO#1gwiZ+IZGw|v-a9(~TNi192Xy&k z0cY+2CTJN{kZdouyXhW_G^_K2V+3~%;iyLCmmJc^F35|h+-Sb?*0>|i;A}hQ3Xn|@ zCHghekJ*`gHMI#jNz5sKJ=z$#8{Bh%w)WS|-(o_((GTCwH#-}!c#lv;UkZKJ#RHVz z`~7U~5$n@Q;^ED92@MFkwvfl3iB3(pVjhrYfgE2X4L?$PUZuNiosB*Sr_QwDZ5Ub3 f<%bu^Ug9s253cpIJK+B==F(KvdHUtCZRr02c@ky& literal 23230 zcmXt9WmsEXkjAYzq`13#p+Ipj4#6qz+T!k7w79zyTnZF-ceg^IxCD1L-#)uPlKWiA z$@si8XKs|LvMdG~F&YdE42Ha%lsfeI_rDJc67-vx&2|R{2G+=1Q^!@x!o}=|jkBwb zlOqg_XLd?*hhsk{y0q0ZOQ<o#S)+V{0 z9Wd^KVdZlFI;8rp%*=04QAB#N{GiOuaB>U3jJSDyDMixBur=4EuwAx<( zo`rA{zwYb#0JWVKK_77?uKCF4XrCZs@ zTb<`XjQb5ZLJ}vbSK+=ATGJ-5CYXn|EX6I@HdnSDR~}bx@UWys3f#w!M8-_S7*tiV zWKFf^dYi`cE1UZsd>QwcVlXY@8pW1GuVC_EuYZFBXQQ!5GJQ;U3DSHE)QmgG)! z^hSj~G@PgNHOJ#9&GLeet{_qgyv@pcwak?NPh<4pD&3E^g@iF$?7D(2z7vnff02BXc@u<3m+kZ0=j{|@40aVf@tXK)gc4NE4qKcYdEAiZ^0dEg@472% zT7qa7)w#ufuqyR-rrbTrfnQHI&24>D%hLmD@+XOwt$ zBYr&!g~3w|)B7UJc|As0%8N5X&vzQu{r0&%BEJ*ueylq~z~})WZ9m$GuJ_cTC8lqY z?NF&OZyLaIlMIg`0DYu z1wxJ05fgHCsXl=Cgx_K&RLmMwo7OIs_ABvXn6vo&ksOH)nOyU&08Wc46oyI_5ZkED z(O||qw(6QY+TX#6fhP?VaJfWqDdL)%7+6b?joG!>XS57U@1 zJ7v6=Va8HkVPG8rBEAGA3wE0LkS|Sn`&bFGrRVJ}0DU>Bs&wxcJP-8JZ;sG}V9gRa zku*E?f~^O@)y25+KUz~b^i3%~eF900K`Cq1v7_v^bJ`tbGdY{P+8+JD>oBP77Z#># z5l2+1O_9`!gDcVv@UsSbq@>09DwV3}rSL^(XSv3_M>P;TCWB73CRZv182pB#I+?6D zw^6Q^{Dc^v(K%rNF91OI4t$R)?N8acQ&GNnoTZ$Pv)>*;Ph|?vDSZXJ~G@T~tS&>xUrU$dPWvUCO`iFhgvTXo!ew`IXj zl+|(v#On6EL2u`rE$&Nsb}vXzH93!ozdG*4V*}PL3#LS3V)2V)IrWXc9XX z2FB55O*+OH1y)+40P|&)7}Hr<>C$teTK@PSxu!;&nugMfR3uFAR}Dh89!aKu%79tF zxuF#VTY6U2)nv-S|I6K!{r(FinZ5Y97hhs(tGWhD5EW?+qOpQ@Qb> zxv&ufTTtsvxVuDZr&--$9e(r5r`dNMv<}i6TyOSo-E}g8+CA{r#1;`BsLJIE_n@X2 zHqNot+bFBz@;E4@I<|ytA_p&x_rRB8%^Gf^`Q#YZ1W*O~70WfL0O5H<`?ura*2XS0 zUho&txmlP#ipL*j3$H)*FZt1XE9c8c;Q|JVzB604)zHp3Vfy~d)R>5op0R#~g*{aN z0Xu78^w?m zCSNRkW)OD#fgKZD7j^lI&$OF!e5#YjNsD%sXW7z)){7yNv2-S3I&13O1TsAt-H(1v zMdgo46E@$O=V-G=?RA1ev8xSIEolq$GjEpxzS7CZUHLf9cU7fgQH-RUZrMj^;MYai zoTqIfO`teh^%J`)t6Vv~Q3`$dD@}U7G^hkW5Us36XiF38R2%jc79+1PVFCnh=?%02 zynl_ptr@1Kd4MMllPI9WTFCxrdlD?swNh=r=)bbivFtqtBNMA;(rzu>6CEkld#>zI2ezJ1mTmEWu9Lbu6BOWDAX z_f;2Prk$%pk%%9%18uW=m#>;nqm?rfI;x00MgtRjyB- zq3-b5vP%ONjUk@Bf|w|Po6sm+9I2xE_P3F5`X;?kIOE5H5-9(MhjOlg8okyJY~0>B z7~+ihS9_|OVXlJf#@2Aa^1ba`3G2ScLzokIJlyW?R&+`a4O}Y3OvfApoFx|p!$RTw z;0P)Y^`4X?o=ZIkA9nTY1K}|=W5CxkZTH{5=)Ip`=@_HOj)7Lc+1+tUsTmO()5G_| zPNws}M$sei4{Ys`!gFGbe&uJYzdrgxNT{r~am3M@*2$QE7KQ6$9iz%9^=}A(%RT%% z@^aVCDnag>?-{!G`TC%4VlOXk{ctH0KAQQ&#E`IBC9}EVp5L4Pc2mD?$^r={WApRv z2AVFL=>xuKG&5&n%yg*EXf01?Kxp&w^#gi}yc)~DYGN-b_WhE#n)5d)^k)&}vBe9}Oogotf zm4*4`&3NdF>fS+%bKcF?ju1E{w!T^`EgXq_Dnc?0p2{#)L(yCtIrRBGKDI@!*IYCK z3}j3_2b>nP_GJPW8?@S#mz=2YFoz=Dq;8JR^fM!3ADt)L1NW?LMiK`Yb* z+rRUgTfgmlD~HlkH>(5(@+g}1mok&P8yOUV7)v#xAy_QKe3~KS95wsgNJxd5MW9ZX zsHkBNPwxUTCp1Rj^2zQm(x)zrc<({8s7ZCrQch=?ONoEXm~=YsM- zE12IDUPB~-uzVpuO_P>{)D*ef7sYU*LLtGRK&58@q7pL-(77SOT*P?u+MG$=oHo!B z4fk`EPDg@*z*sB4`u|@@7m|g}lVDx47r;fm-;AbPGym4PeN$Rh^;A;&B zu9O%uUbaY)=y8+gwX@9+>J1m4XkKsOk1I!A1!7bYHflMCIc=&XfeMoWU9IHeZgZG(s*O7QRTt1?X8$;daw4kKL@_pU!#1bgyjksT)~ zUkItl0-E!5go!1>?WQUGzo6q(6(=3b!Y0-^ZU4RnYYO#@hxc}QjekIbcOCq@pwMpd zf$`@216m-e#b6HyDBh3@P?O<7WO$p!2be$3uXVI)T+Q_rcUdLP4-8B(pW>zzOM;Wu zljiL?dT)x;l{pNjwzn?gdpdH=&nJo@CS zi<6UL-%s98Z`cF5#E6t^8Vj)iNo+srxH>&Sxwg2D08`!hBwI)e2cjkuv2HOeO2*0RUZ7%2hbbS37u>k_U2{kP$ zFw2YNR&5nQ(=eXl+kS{=JbE@p|}e=Lr8OXqE2*kO~XNx|HnXEf;3Y!Md`xy!l{RU+v&sTC%J9v42a1nKP-uh z#g0{br3i2vKZLOSL@TA9#gIqDlh&^O=7rZc%Q?sU1u!#Z)9S(-oGfWH(|e8RX0+1x z4muKEd+xu@gkSYbOqx~^P$*B!WPu=dD?i;*L(dZuZKg#=;$Bus!$S`xi_D#r)hY-z z6_fT;NEK&iKOmsCGwF(C6;UfCM+XH+)t_5g;*h_JsXpsmv+1$(!^e)TjpA8Uagt)p z#=|*MKaB=$D0s%;6-!qfk!qmbwW@VFK1eS5QwGl93C*g0er>@+$%8rqk`V#TF3TJ( zHV~qX|Brkr2YPPoH3JZmWU6 z@())6+lw=BU5wown(ClJT1AXnxSHe>jS?Z3(^IA>G$yRD1Xs`CLgkFDxq4H+9^ zCD7u!9wIO*)oyWKXM??^5n?p*qCVy_cEQK@8us$mn$)cf+sYz0n6Rzh3);O$`@0K7 z{*$o%?hg5B;@LnIz9Qo42qZL(q-sHjC!%mBq;MJuD7Z9AfWSsTAmJ||ecfyj*zrNM zH{;ir%>D;Y0!!aNA9A{D9|F(*DcU0oiRcNY3{u!ng|QDjIEPGaKj?d03pvrhTbg1& z`dlHp`Go5fQJ<1(E&Wq0e*Mi@fO4a7fHSKfCVq`bYVE)LlHTGY&hKL6Nc{fMc;=zw z9uWZSmlW6F{lUMWl8WzTkG{Fk5gnI2O&|=YGrD#AVmi%(=h44?CYRutYc}JHqkp9x z;3UM2Pdw$R;&VRkzi|0S{v8Q2-2HAh_0;{kDeC5{&(BM)3gp$Q5soz~pHP;~VLCup z#Jw0(O+}iYJ{#b?O>HypMq4TGx~+d=-5z(;^dzLHd;YA(yF>H+jCvkyVud+3;M1T; zz7^(3oL;&GtSGa3V;gAOd+!u|VR^g0cv0UxMevJ{Y_&qm&8bIMK|#?vfMrrQu@wvs z8l6ii%OMKxlo`A)3B)+g`r{5za^OTlon;sjs=VYBG4}DlpO{Ix&$jRt9!QS)j9GJB zF7fmi*K16Qf=HI%Rng}uik;kVX1+V)<^9paKPuq4BjEV*t}Jlzvx!!%AeeAFvJTzp zvjgIAI$`|Z+VVZ=jMWUruNMkDkEd~|JZAUBfr}eDYP`zbj|fyd;LO!dV+2D!RWY`! ztM!jeBWOZKTW3#xH@s~z8RI%X_N zGI!j`6S-%Ow#^Y=z}xS9{ufy9m2?5a8TA!YxMu{+%xEGNzlx+pG^j;B!S(1-BkP1m zV)_@TPY@Ue$=i}b!SNU3Z$QmCClzi{o}uK=vBi<4$!Zt?Nj_DK6x_?yir4H#Egfuz zsCR4he%?%(p*$xDZ0B*F`X`~AubHy8UW>Es8AN(G%+^bP@}lkT_(=q@6a4RDmDO>ukcT~M({*X{%|koX>ONwW2&~cj{@7O!A|%l*ZILVe>4%n4DgjOdtad)cGR0jzGyc&-LQR@pk|l4TAq0JEMuL+_d*}`QySdY4YQ`vmxT)@{k*TC1)@~I#K1vN( ztc#f`2?goN^A{ng`teQS=di^)Q!g_X=EPU3>rj{|f?_=I>=%8V7MF9%A#Vm``Rbki0| z^Q79p4l741Tf(F4QXOH@=*^tS#d+}W;^HA!#|qmx-Z;Sz^WSlo*$d;C6>;q{!?|dx z(FLf3S*vUNP);eb_C_YHGW=}$0Y$s3#2W#qV&B76S7F7@bRV6=gc?hAc)u)mAKY)# zv17*bp82qKpL;n%D^TNINofs$Yri=?xd~k!!|8lve1u$WO(P9)S$=X3A?7z8^ZUxc z%0iqNy}_Id#RA_-(OcTKON)sQK=;e_L(Ls=A zHkS&LYo=nBNC=x_PQeM;+~L|{tT91Q^3Cj9b1P#yK`MvzdYCQO4wnd z3*PPVj-F^8-yKy(El@pKlWJu8HN(1A`6F9Z-@hJh|Ar5gGl{8(q&3&A`4x4SkhPC9sQFPna440SVGHT2FPvJ4Y>+TSm%HIz{N4nT4PB_ zK~ZKNE7nFnMf(-%2yaA-zWq*f}+ z(kWvo(-RcZW*XXTG41!uk66@WL`2tqd@Boz!D18xE)@`4QQ5TQ3Gr4U^(GY0Rg^xJ zy}otq)~1Ts@AGSh{Njy#x6WK_1&JXHqr|6b6JqF5l-M%IMA@pjlR}Mq*GJ&^=0oex zu|5BH_ii3yXp2j#U5vSIs(gDFN5lki27<~xXPf>tWtrWDK0oF9kZ=eO+%v zY*OzD;Ym^oU&eI*T3+ZmEj0ra&4)Ht88ljju$%BH6B#)v$jVsJnF$HglS{-|Ne7&s z+Ru^k`_v~io|R3k>kgVXM{GmHBxpHVerfxDFz6Eo^jP&kvH@+DM)@Dh_W>?J(Kf+w zR<(u}7c4#ra>}Fvqq)oORE1=Pcp2+>6m^@=+W0B7pB0&iH2S2_zoJUR{5sh9KY$B70=n<<&gr+dj*ME)2Q!xOR0%dtB83r9^K$s|5Q1vIegqp*~yLTN{_@j?IF~1czcWA@d;+o$_T7P6Vo}#dR99Ugc#?MkoX*_jk z_N>{ov-oON*w--#%CzZCbB2!2{YafDf}}#I^qBIKwW@4h9@P-g7-~O{KFouw4RegI zqEN@*Z#w0_;W+)B2aX+vzK=#v+<-mE`{QM#dCKLIE+vZ|lvp@7Nwo9&tkPpB$mtkd zR*3SomH*^GVD&o#7(NXz%Y43r@UfHS*?4{FsUILNsEz%_r`P>n^H6o$6YW@+JyK77 zE#=QCqgM)f25~>GdFS$;D8__Bh?u!LMOa%*nYFCHgO;ebm;{rh5<0m0r)C+8dQ~+d ztOPz%CbD72BF_Tkb-6}LzQzn2Y%JQzgisNN&1>gSU&&QNWkMGn0d10cKt04{-#+?? ziN#i(MY8E6#1Zkd1M_eh4qpm%%VET>#!R9(Op_|Ez!;78bzIjncQcH>#!;*pKTO{!5x)F`NX7aWlq z%2DsY3>(RFahHAHP2u&y9AL^q%EYfGx_wP+XND9A)Kd#}1zO%SzWyz~ru)m*KHMpv@p-527%XluJ$$5?G}gN4PA zKmIgVWYdb%^7BSQjbNZQjUqn;)}g4we^?~nGIV+BY_M7@{VDc8*0gY#0qBZMx@7|> zuw{p+b;_t33S)#>czKC>6xluJsSvexrpdQ@dG3Z0LX&CE@1GP02e9c6UCAia;EwR5 zuYS@gHbb;qYk=rcHWD{MYF9qm0*?j_-t0;TEa6hibV2qldL>7au>CY{L(A5Yu{xi# zD(zsy{7(YiMe%jZXujbw_oh!D+a?GMEz3V<>$}fl9mWlS7t#PN}j~?x)K(jD8&@;j(Y@=&C^_ObR`pSQ>_G!^W)Hno9V)6l#qgK!_IMz*+B$}Gk z&8?_P(D<~Cu&h>iawx4s7INBTdKJYWAg_KN6wBD*tc&r4~Xb|owLT}23y_^-YG z`L)KIzxrG9ba)zEI~eR>=bG;jjdghGp%BmvkbhoJ(BObqEs+xcm1=WBwYE`sF$)7k zWIsVFHTlI_+bAj=M1_HCnQQKzGdpZ0-)V*_39_uCHz)a%I2AFA4H7oNT(7)a?WlIp z{&L~WJ}qv%f6AkDE1KoePqQmI9q!EU=NcV;5+`QO4t3iD&1IYGefd|3e>kpoyHvfU%6_oDhoEXtBX0cz;m;ddG zqe!Ue)6qqtnpBxduK- zocN9{?ULO47fBwhE$tRjJRi1Licw9*e? zyX*h+iNtD(74PQ&5{t-Rr?+0K8<*a9(YM-ZFXngm5>fK_UzA~Yot)7ek-ALo&BD%o z)3FquLh-_vG>$Jl>-tw;u6p7H+RI{e>t*6dC>U|$WfMWNp9~Wi@iQYtSFzJRs?jjZ zOo?^Pc?JJ-M+vhvBWR@)$=CM%wEmz+G;F!U|NfWf>3{!MCKn_Za7SjR^gLIBI~riE z+>K!|h-^VNxb4-JT4zwSgzI(Qc~a0aU5Fs5y2NEQB~R|LMU9VE-^I{75(R00J;CSt zv4}fRGT09OcF-zOlz0!Is55eno^DwjvT|usUsFFeO$D9GC5llA|l&m%FoCX zg<4@8^N^}NrZsPhJ0>w}-In=1_u zf%nKdkDi$}UzCNht*ZjR5vq`gg-aRGb^WT~uSWVEFACL|T(+&~&o%7Z%Wl$x8AGg{ zfX{Ktpx?itl9YX0e1;X!WOFM|)U%lyA&UI^vsyz+Y`y^?$ZRY$eeUnP#gu<2Dw5yP zxUJP!gFh1{6XH@Ee}R@Hkm7-kZ_V9xp!;^2T2`FYwzS^Odtqn~PZx=!$`4O3SMS(Nb?%<9-xAB1r-y{g#E;Dm#aA}!O zDQRC=A|6;-ZQj8iD(yxnKCg*LPe*ACx8RYPGA`EhKo66^w|2B3W6uAePfl@J&nbap zu6z8HF*naOU0B+&zLSXTKk!iFY?#RNg)Brp_hGE<%=k?{=zafpNifIqT^osRS4LyZ zEPLvj=lZi<_jmy&+x$!z+}pwSBVC|U)rVYuXgQC(Z!m;x9|lzrMktqp*D#?&bEC;U z^4g&K`sL{vmA7n1VL8a&Jp_HBs-V*kN@MoPV98*qskJ_$tL)tdE1j?rzO&FSyda9g zWfo;-+EM!Art^g%7Nq_d%du()>Q^0$Y&)4n?re#zE%5Zo&)#eVyu>7C#5?SnpLS{9 zkD+~k>GO_ijT_;zA~;8+jeDUyXs>S=86g37e5Sbjm75Hs`P5fM84dp(#nNlDxtjP2 zo6N+g(zU~W5!H#Lv}3#w$M7Eh4i_FoHieA1QS%T8^UoEru`s0e`iH}W^-<;0RXf#M zVUCdAboobq2k=Q10KeJ`vZ>*`?y|Fe#3iK3(v%6XO{g=3X0DKh0OokrXyCySNEZ%8 zbMEMLhNuJ9kz!J5FzVRvi{rK$EC*&h=NGZoW91)O=Y081v!O5R@`w=J+Ds=RSSe=&PV}Kua6`7tNrFHEwW#s@gKp{FT0iYwfdnKim#m`)M=w^$v?4GD#_ z>Wn}f$bda$d)h1rpX$$W$EGTAi2=KdXX%7~Ds1=m^&kHSewWYI<CE7mSIpD%}K*@=vRnpD*-84&PF~HMdeF4$n<xcPUC_$wsAHv{P?c-kP<7-wF_ZmL`SgnQ@ zf;h1zX&vIy#B!3q#w|zpk%V4f{~FIt^VUh6wC|LPp;#UJbf6b7GFKKBGBW!w##dTf zSB4jsyB%O~dlTbyzt6qK1xZtzOh1`at*m@PYNM#jdI+@8BiVrh!(1mQ&8BNuWr1l! zV@=;PPAPzr>Xlt>g@Pg)%Wf~)nv7L;p}gXBbu#6~>YubA2QsS3=feh$4DEM_U$V#h zX{L2f$iL67-NN>H?V>hLLSUyENEM%mN=_M#s=_lS1F_LEcO`u^P`7m{C@&vc7jcC?F-@M_9=mSVvjkrvJ5TVG3vE6fA5BIssg% z>kLLl1U?Gs?r>^+{LpI#3=}v3C}u%F;*gwofymg*w`npa7HJDIi-fvPM&XS8{aq*H zo;^hL=%7B3&W)u>TSTAg-Jb?Y4|E+COtW`K-*%Phm#)48a$4`7e>AHjEi|Z5U26>A zE~Dm4@p*fq;KGQ4fU)(;?~xkM#I&Kp074-TstZ5KndSD@`3)8t@o>lEYwCwJjFQ>* zbCg=hcjTl+^5>7k9Y;S&NMhlC>99(4B}o6l*>B^wJ^SDP*tfKi25c?3! ziyeY(}) zC*_4-wMAF-6%*j+F>CF2FAM0Hox(V!kmR$n4;a1hnsRl!e|6YceA<7P4?_yUE3xiy zrYh@BgE$*iv+HBXJ{5i;JyNv#cJEw#MjGF`iQSl#v`$Rn&@pU=!8PD6A+!uRI<@#$ z)c@criC!S?0Xeb^I6XLU>`1KLzDD`##D0%IT=QMG%f^8)&oPqf5=9ME{g7^$RISK6 zP;`xY-g%+sf8IjU_FNMoe^E(BAq1>gcWgCZcBgfTq(Z_|g3d?&dG?kN7ya+Rh{{r9 zAn&|HV9I2BdFw;Ib0@SV`I5Y7AbjT?6z{i778_^;B75*R}US=0z zR1p`#g2u?SgiENO$SBgw-*rpq;d^CSiigIHaKH5`>8tQu?^1w=8mw@lTM|LID*6EA*ATJ{615QN-q0#%#;TcUt32a1WiJfTu z8rU8VC4bNNBt^wgCj4kvK=6o*Ac zF*1}Y_`ZI{G9d)O_4HyH$itv$^?wf71M_q55Ss~HDcJDj`9)Gq`FOJAvxsbNZu|AE zIdXMbvXSrD1>9ms8+{L7MWI6Z3x@A@W}|o=^tie=^24|I@^w};MpI+}+mV;Z_~gM= zFj;&kGp$NIXcz0#K#|77nvtl2u@u-!5C(%$Di7ATMdhUbkaZk)JR2gTXo)0?_ zt+%jGQ7WxOg#X>gt~;w?3gIM&NW`h|58RoqW6Z?5gK_v>pw>E>^nN-<j;VlATc(7_=obMW}=RNx}(zG~b=Lnhei^YRE=gKX_-{cZs*b*_~WjDU30Mx9` z0HO`ll^W=1#mrIP4EiqRU$m2136N0x^2aV@3n?*d21BrMb#wAmGwIb86kQHuM5MkT zO~HgAF>*c**=V`P>4Q;2IIsQ^w|%EL-oh=#x&$&zFCr>PuTwlvp`5FWQH>F+*~m3w5{Eour~euW`qj^|1T-HV5LU6YBj4RH z`HMcoD~=_Po=2PdO*$G_9{7h?QAvHNN7JBD=|j{m0i%TA{LrvQRdOL*GdcubdhFe} z=Q)dE<7}YTP`^%7F;KG|%wH(@_Va6U4DtIa#dAJuq9h_|A#8|MAWjq)GgmO~QLBh= zIdNdZ2&EjLSPw|al+Zq~AkIbUZXYzJ9HpB$;sz^{?r#^?cn~T2`&%jZ`b4+uN<^hk z$Cm$t8O5_&y`otp_XMRI<(4*PN#IG#l*ev!zvs;UqNA z%(`uckq%LFrn>B{j=tr{A*_hPwy7Eilqp9TP;IH#y*=c&Eh(d zyN3Mqg-aFyzD9nk7#oUK6550#N4Huk!YjzgL!^@&J@jQT(YlU3G{Z(=sZsjs==Luq zQNgp9kGR>|Mvy*9NdKpr^<{em(3S=CY0{i1hsS3J#rMBN`EYM;K^3SCOcZiK*tiHN zc>~>LF-!=WBoYX4C2$IA`N>qxb_Ba4M5bIU(JIU*lJp%OpH>+IxGL0{$|qke1Y^1o zfWY!$8MhDKjO<;k_Nf;5-18a7X!C2yNBD zx@v#fRDV+kziA>d^~#}5U`eTVOssFbaAOn}>X1P)Pos@WS(_D;`69OELcVb^rD9O4 zUG&hyyd`XpQmOoDLJ^}p9p0vps1|S#!y_{5m*@B>EhEiTuJr z(Hm4Z$z+V)SDMG%msmvw{W)NB`ExhWCnoEC2ILCGCJZ0VZJqdx2BSKbmX+GlYxvUQ z75%wNWl?JYaC~;S$#5x(1Fu_hrqI1k9yaiS0n)xFb*=E zNRCN*j8up+8Eg;#u9+XqB9`s+`UmAM-yxgLro{=ZPpy49{uWVUD@Gm@HCRpvXIuMP zER?)uMvBTR=$3ba1E0l3^eJ(ppa?orih975t8n&w?==!6B2eo?1i)KtZF@D&8t(oHAJ93o%tQJ*_^9;v0&CskQj)h{qsvi$9Nu|a zYK2Q=9otF&t9HEZb5UZZ0RtWr^eqlqFYpT7^W8MO@gaSNVt747jeC`KP$I)v((Czj zj96WQm6$H2NkC@UHat(El!)x-GTHdQhV`*-v;lCl+L?IwVxT(fa@z5>*Q>tgzl^l3 zJ1q65%@NB+sUkJy977u~Wzk4vS?CnIdE=QRzJc6JE|TXAgMdNByN*5h`HaMAFKC$J zAotkcNX(6Ss9py;C>zRDEe;x$iXP4Q{woT>xcoB#IZ1pGW3U*d zScRs-WtHqh_Aa4^iEtFi!g8*FhxP zu<@c(y^6i7?;Z8nFj&HG0ud}JYq9-HBkBBc)kVqqLV8uSd;D)b7Ip~xmV%J6GK5lJuC4!jHbj2*nZ zq}(cO<;5rO={xaQH!po*3?d*7$bsEzNj+$F@+rPIIX3k0GJ zS(arHgQ7nZL9=8pCjs|NFmJov0U0!QWr>MiFj9^MN91V}7gg*2rO076gYUiiAQZ!0 zA^Q*SGIQGvC}>(_*sS1=&xCvNkeh!Y9 za}Ss{x2so6@;Fhdj=TBa&WlbTT)h0)#4TTEDB0tA-_@An%j>=#KNYI;=zqB;(8cWe zP@89LZa%<;UdIzmmaDYXGPdclO;ywN#9fABTcp9`(fUF|LzDIN=JMIjpz_(E=P@6~ zSE16qM>M3g!uR?7`Ell~HQ%Q4!0jCCyNykSMf>x903;00;BD!P{+QEte_654vO8yC z-ckD7kX`44{-;{98oAsJkCMjMsvU2p77~-wA5A&WmfS>3E_4m6tVulJ2U%WvtD%!= z8x7QNdU}PL%!~VPu@5gfMm6g#ow9HLPPU!zZpWR9G?~>#KIYtn5esHBln#@U_o#LM zXVoejZzj-%pc)`;e~$nTR^`lB;Pm|LR%N6tDb`_CXZ@I{uFi<>2`+b=E-9ho&OnEH zJJf#lePvhrT`nu0v$LBsVl(&SolNfKf^<1@|YrZ+0KpFY*!-T}{ zM83@TECt>!8jH=?&(kplKHGt$<%(~Y!2i6+4fQO7!gg>YB?a)0V{KlOpCv`%G*Zv4 zN8iZ{*?19h4z(*W!_DbfD3`0(tAdbPc7{y+u0^4z4TA1a>_SH$x6eD!gm}|&BJvHp z4e@5=4|v8gIjzm~-e2U_$r1i9%lr1Sz^}SvvG#z0HW`_JIEJ2{x8v{U9^Ht6vH_P@ zsgU=D6m3Z7K`vsxY1|UTr)2w6`^A@g`_1NW&iI$kC4I;>-MOOP1GW`Hhj?z%GuvGd znOxtiQ9*Dc#fF0~G-yFXRl{oawGk7s8!GS3zwk))ih-5%66XKx&JAhF+Wyv8gUTVKPNe99(%3z zmrtm&JEHf49E&Bd(_L4K?Gs1W9{z1ps{dX4yq+_6F|@mDYIu?-#NR4<&Od#=Lr_UU z5ooip-IxORd;4qEFR|7aeqgK<%VWUtSe57Xe#hf&-n)(e>p{TU=Q53_v+Hf&M@N6? zJ-sV_=muPo-2gl^=GBJ7Z;+x3-iqN*H;LG5p%fjr~QSf%ypklhbjnAXb}n?ozn@7kiT z*Ge{x_v@IW-B+V3mu(#W75g0z6WtG*n-Isji?AVs4Mq+;^o1v!i{~sSyx5q_((hF$ z%jGbR#XnEn-m`iG9*+21V%~kGzl_Hl36JLaK2kg+alFH~2NatpL#?F(%)vbtYFe^aPhrwSbVa)USIBL?Ob|) z;kb}cv#o95N^8WJsv&Ui-_}99?921puTqLW2-k;ocym8$<>Kd;_1s{N^c+34h-2IGC5UU4`?D&6wJ^CqsH8%Tc%<*#Jy`1H>GnnM|(z@Y2 zS$ZwmNac~_|GY}_GcWc9V-uUNwXq*CdT>ogUg>@M?#MdeU}r-fOuyU&%_z^9rxtFX zO`3n>xDYd)4#5cB1Mz1YC~O_*M&EwkH?;h6)q7l81{v7C6@F1p3jyIWsANlUkW9U9 z3wZl#Jf>9dUS6#5%?~)4Su%esb8OwZ!X$q!BY>?6z-GN|Jn;uT!EL^X89oIGn*AtR z#3pNnb64o@i2MCpha}b{Kx`@kKV$fyQ6vj1;01o;etCP>D&VN>u|u>Yt=9LAe8E=c zhQa6!x#yYYMnd$(sneG~B2RFL&q=fg8og6wDg15bA3JB5USrwv&M4{281`hc>)*TF z@@g3DwJR%*P>1g!YXM8|ylJu&$84v~1l>MjRr9pT8gXk(_2`{#(>GI{W$lg}*yxnP5ur#i<*j4s-r~H=i|i z(WSz1KG<&;>V<25d@r-l|^G{;6Y4nZk~J5l`CWiX#3tt;m!Zw ze(zZORNC8~6A|ju?4(}Y3p5O!DPTP9cU${Mr{xMM>n=a`hH%)Ub{iu2Lwy(a;br^F zEbwU);}eXL|D|m1h7uV>W{{bDRr+_)8)>)C`talFdsou-Lt37DDooz%wg+6(W=m~G zMiyK(>F>q-e;XAzg%>TEUX7xMeb_aX9y&-m-bK6uZL_>OKt%ISvI4v< z`&?Sib0315HHJ@G;=lQm!61M0ZE)O-jWWD7l!`^0sX(!89b22hfZyaCpr0PF0(DDY47d9#S+E(Oo!|6<@`;!=+6c~)K&Yv zny1J9lYWkX+`i;R!;1*k_I0b6(xSbm!}`!N+N%9WX&mzgT@|AN19lbO3ows|s1$pe zlMly-u2QXegLW~IyjDHZDzrV3GP3R*|MiDIf*qY3JH*pA%??ITJe`5Ds5$#HK*C+C zC+fjd=ybjpp3luFFpj)gRj;cdB3gdtL@i%5PoLB0*Nm8P3yq-E?|3gL43>l59mR%0NcMiuQ|nBBcL#i zB*o|XaDTZ#^o0^emPM;*5`+K!qbx`F)ck8DfLN%{#j?DT`fqLJ)AmcPkLTgwffwDZ zFkH_YOvmfP^UnL*z0sN$G}<~Hpe?)Bbed`^N)%uZnkJ%B5~4$aj9fUs2u60SI~wEN z#a}4J4-gVvG3UX37vX8@Rf^&jNQL2^@*b2A=YLB756_yTz52^VcU;YirPw1QB`}C)~J!7R_)qKjjGuiRn$yUd#_eeBW7)inl;*@ zF^XD6(bxpBMFa}z?mJnkmzUKsD-y|qvxPRf%TYKfAP3!a&b|CWT$FTSNeQDQ92L>u*cBD+0! zLF)r4++W=A&Hw;zkYDx%@C4^3>4Juiq+F`BX!KGfNZZ{BYLLBu+Ber4jRWFymwd7& z%8ZosxR-p;ctdt5lYj{{Htb*O*&aYC@Dfj&Y=&upi;pjkV7! z5`vxPpFP+{PmZdP7u2&ioZ8md)VZuk>$vI!#70hR-Hk~ zA#%L0PfsGeFx@9LLM<84#tEs*Vl;V7saG~yBuxA9(__iZ?Vm+a>bLwB+Us#M1FU5; zoro?gc&%The`mjBbM*Qk#G}fjRc^Zo1Xs-?7TG_Pf5F;4wAxRrqbDOtQ_&`(Ip|Vig*Zk z&3Crqg?PR#zam$_I)6Qwp&Pk3X#gl|8oM}{!}ToPC8gtY8Pv`TbLxbhxKyRI()5-; zvk~UVA?u`jrLt-c>Q6S(s!mzY<&sFeAHcPMq8_3V{DjDjOYgwAu7Bz;rSr!J+?;%2 z_yO{-`zf_@FxKBcy4mlr#JoFj6vqh$4V}0WM;<{H^IV__ihPqG5G=y7Gpc8_OG7&E z$6YzOu$}K!|9+&gCfpQKZ2ygUk#yG_<+p(k2WW%4W=cCpIX}A>P$O>ZQu7I@6dtXxupO|yL9$FIq30 zS`>4EZCI{ko^^9`yDw}Grp=An3>+ayFMU%*iRh$l;{@Aw5~UT5mEQ}=3{l}t zdG-9j-xYeCF05^@@-y31Oy4kwF)j@;qUtgJ1o}yCUp~ZJB6ARAY6A~t%o)5ic?Pnp zCF$qMP~{d!lGX$4_|Xnzh}|~e;+iuPVjH?UjI2luAQbV403esvzIZ*sz9%b(bY9Z~)S zUno6v`BWrkrRoiQjkRSuuzNqM4qy>hR}UOd=zc`TS|wrVEAEdYM1CZfhDb`bnZt?VTwqli8P`~ecC_Kdo?B zcmR3J+`TcmiK~s5MJr|E=kf>;OxfF(vdXrXQ{USkFL2$gQ>p-3(K;9z-ct<9-vc6UzyAarK-tZU2uXYNio4IQ+F-rrIK40jJ0!Ra` z=347c($Xd0#jsZrR^u>yor5%|J5)~|4JbSU+9(8!v|eFGww`ep9a-DNc&4N(^`1Jt z?0|$8F%@|VyPX|aY@=)I)2ihJWDntDGx)iMcc5{71rYX=-^sR%g|!yqC1Sk zB((WfchvtH!nnvX^fR!Uh8;)9D{Lb%hTFT>LI`Z!sOQnWPbvp!xUk$~sG#sva%CmzwxhN?1lN6W6?(h}?R3PKmWC$% zboCAqaa=i3XD*qLQ2h23ug)A+VJGxu1<7!1M$L0F?9gA-m^U@Clby4g3AwNYV3y&8 z2Xti?oF~>3h*HsER&GxL&|C+P^V6yWDQ?XGp4g)bsAm#^aA=QbGz31nD^+t#m#!%2 zu$0sS=goNwKWKqYs&ldW>(oXH;i8UWa(H;fq6?7^JtunaJ&7nOAK64@&n^U^DXdP( z^sJtLXVRN=7(`f1a#BXo=%`ZO;`dN}=N4b-M(71%S!Ks!Ev{PF0v(u`tSzWAwavuS zvSL3P+$r&+igJeU>?#NI;wn{6sBAzo+4BYsA8Q?DyOxqJ!<9+}U^o*#FfeMPFR z%m*#2%t~6S2YCXyR~l0LjH*868?VSyqyx+jwX1|HuM_oql7(&SX*G60?~8aCVs6$9 zOSEE}OLv;QC+k%M2rp0KXr;44HB~)(<0LKFrhI!zTSEz@&-nb?DA~8- zG#{IpL>7Mb`H+;9EX@0ku6q_OKMqgUimklApP)^IA%GBLleZ2V|9Unzx35Q_1LqzA z)c5_5{hdgU+}Y`PN!4ip7im_x5LNDkLZsWQ05CtvBD;Cg=lcWJr5ny}8ZjBoddS|W z>vWL>DW=&PsEBf!U(vq6>{g>%NreyqQ;|Y5;Z#?R&c@>82I@VGSGq~~F!*wx3bVAt z`g|)kj^Ub~_@*CgNNy!K0xK0c^nk?=4!met{eN4$ts}d5uEQw~dr3wp z74(P#;6NNwpZ%JBV%iG^0(zasH9u|dK9vk27$*Eyn{MDuTE7ICCASfhC8zy4kbrnC z0f6oOs`wf2&uxl-g$k~+fi~$L;#azPhvJbtr;WPB6o2t3x76{?%18Y-wD_j0tpI$o zo9dFidVAJ{iH% z&Zm@qg68`*u5Tz*KawYBkN^$o6~6=JHI}G_UPBw5^}(1rbW6vkFe-M8sQ?zh>Iu%e z81A>+TQbLN!M_-)OEAg42KJah|9$n z>acA?+n6VWi4Xp)S;`S!u9~D5>@GjD>RJc!fcV%LlKZr!d6FE^VL6ZQ-IM)3*pB}d zO+v$sGSa@?8^c6@xEP`QW9jpZ_cJOu3)jX-PkIh_pHt7$=hY9MK&BYo#eDPdf0dGb zgs0x-9P^F3u!nb$A3+72u;c!m4w=t9nvY`UbG&WBTLSj_#;2+r8fQP_`Yat<=6W45 z^$z0rWC3D$U(1T>P{4ff+`{Ksg`EW~&&z-ug=>y%q_B6zPRuIg^ui^%1IsH{yjr;J z>a=A}RIk{-S3Q*<$%~N{yB@pu5UDImt93Myg3{dtn2D7Ron?LqzB4+78HQbBg5XC+ zM!qb0lb`GJ>S?@Pbv~}|(SE!v{*!yozV8se5NFQ4OU{CdVAAEQLfku;(7pbu1OpD- zA?tGNe2k ztr{(wS<`rF#(61oL+p|u{=$=^OBjE?YV}`ga?4dRl0h5Gw`tMKk^lJ;X%dh)>=l6o zJ{NR)kxgy3MJIZCp@&9HJYxu0wDQB+sIXl zpSc3ebt4k9C#2$DVWn%l{N_NlSB$bSfm*aKH_^E&a!|fzuOpf;B1s=r0#%lwSyA$3 zI4O5nkMvlR|9YW?n}|aQ06_is%*(udlb&PKxcUWD-rAC(A5ocXQFshc`5!rd`*BPE zfcEykybgE`gq~A|F$~vR5?ds}N5`=u~Q6^2_o0Q^yZ+-Elu{aGQokXO zy`Kco(?uVXJ>XkSDJXhk;|#Vp0%*wIAJ;nHWHJD=EMyYi1E zqd8$u@MDt=6G8@}51~*%5AzCsmgUvy>7&U_Y?pVPE6LF#Yi9eOsG+*JFGBBQa99zjqIp37l&o zTs;V+|EDV-80iT7a@$Xoa+D`!o$uENl4n?uJGW}5b52bobcF+EP8=svi+NoH)kjrgA4FsS8#YKY}Z7{bZG#>wJfDc z`+ks_hQ6R$T(;fslwP8^0@z-4JGVIrlA>?Cd=_=Zc|xFVWV!s|Z#mTi)3;js{NHK1^qnR8;X1W2j{>PjsQa=X1}Y-;5bOv4{*|QW%0#9KRmV+=0Q?|X4gvcM3W|F z?ZTeyO9NS3Quum!s4$d7hxp-4?OZ~qgU0R*+cT;D#9j-WlF2-o_>xV?$}& zLXWvg*#bw8HBs#X_s$!N@x500pY+kY#z0qXdG$ng`c=W0ak)~PSjNJ}hi$@aOB-0G za5CQSsvdWGtbk$*lbA+QTBCC6gaGzNe4a|zG^u`Nf}gxah7vUR-(F=Ml2%x>G>b`k zBV{!AGZ=ky$ot2U6xs<&16Z6XMcq5tzG8?RKaPtuR{v(YKAs=1wU#WikamblacKtU zOkr{7xVw(e+A8Y@(R$F_W_|)`rbyNE9RYO$ zjSX3uA-hT92pn9e@IV}yk9u&ReH&c=#50{73c)sI6@4}t>wo2e`{JP7%I2Ivfn)S- z6W3n;2PKB(fyZ0u^gc+4aK8T-3zNFrHTZt*233emA{eS%bzpNN3Q*#}4(&J?^wwk} zzZ<7d@C&~64s18l}BdOnW}`Wbs}ZLf3<4^=QC&Xc@P3wsNNI7{w#tBfm`h2PUbSKf4wy~SzvAA zIy^>rEEkoTB6h=x&F?<%#OkOk+a&4NRUTN|dGQ)oHDwWr6vn<}o7o9fp}rk@`Bi)E76l^0HqOQ|@PV^>gAvQXtlZ8cKWXHR<# z@a2iwx{=Yk+HO5_f@|qRbLZQNfbtchIx&aG8ymi*)QDFsRPK({%S_&Q`m#noMz z=E2p6WRv)V!|ba)%cQbsp)o?H)78HY=KWb`{|{Dk)*X*)sqLHCw(pG=vgF@MDOjs0 z2Ea;lHi}6%Sz%L&w(fWE8f0M$WK)Y2u$bnB2#K7J#*a+}D~##0z>F@<xvgkb6XlaF`Bxz@+ z{w2hj4%RPjfZ1BUcHE&k)su2Jybq23E(!MP*yhT;V4OSR<0d?NBfT54Y&dXA^1!&A zST+Tv4H+4l5a^^S2<8l+hv3D>&{vA^pX`)>aY*o7K-EM3dl z!3#G~_#`G3WJK^>+QTbL9Gu^DU%ZZR5Z&o4pgyG61qdeSI-&fn_;Rc!>W}4 z&i8V_tc>9cr&PrlP=V=-0C=2*&CLqJFc1XbbMh2Rdl&z%xkyXNp?w7jW=(=^BfG2d@jVngn%fL~ z%(QUn2RlJGTKz`ilvglt-tDz2$x8$Sr=wO8Q;4z^7AFV>8o}i`JHbXPpNPT0L908t z1-JZzuhkusivD>f%c;S_U0lb(j z;>9dxfNZmw^qE|;4adHX|bZf-=LJ1PFHt-`6{?`VMT)>leR^kKR&$=(-W&^t|o|Br^8wo;@_g65@XotgYBmCYjQ`?uY?hPZ;t#cNJFKgZt2Hue{v zxcgG0*{3IuVgZxnKhZfrYdv%iR3bQDlElk@=wz1`5D_v<3siH@JKEFKEJY@fLqy0f zFH)9kPW6NLT-T~bcAV43KhOdMh}nvIbA0o{uohrj!mK#dW)wiDYxBZh{`~a(0t_{sU&;kPU+gJO2A9`2}V*yG8M>~kJ5D_#Q zg<|!}HP-Il?)VL$O%o9dQ5JKvSzHy5tbn6hKotK0=T#ou`;3*#&#-pKe}+-`2U>st zqDq76bF7H!fpxFWtkEFg)=H$}vwiQc*2|=vSumQ?Zi(s`EMO47=_-2^{zF$mwo-j( z^ieRZ1=yCLjiy}KLd_74yFF+v#mj{)wAQ5Z3F6-IEg+IV3M2BL`kk;PLVD|c*IJH| z`GZ%ShF7ET#XaC)E?B#JoBXAxFvg?u)%&iu-k>5?yfLhTy7|}c+-`Ay3P$_Cfweog z$v(C;H2JO4DRPhab~w@DolA@%rmNAKTuEvvWp1^mOTg1Y(hm!2YK zB_sK3Zh2__9t)TxM%@S0ygG9N@k9y{i-xHoA{ftrI`GQIof(?NT}s7b}-~J#0n(fAJzgU$$zT%0npY1 zfyIj#5i9~HjMhySpSoR$BN>HJyrGliKXeYTlX^X8n}a-Uw!1-jRXKm z4HyA2=!bq~G-EYla|tp!y7vYA!+Jv}$=}xkPI?c}%^!vKzz6s{QRzB%lz_--;(w$f zV&md}WMabI7)1#Y^#J{F9uv;x046HS00vsXN$?M{fRpC$Xn=e7?l>nQOzL;;r1-nX z?P>Cd4Uo^TxP`(4XKSl4QF)$-L`nnCDu0Is^wUh96wV^QoXgXv%YX8V{d08SJU?K{ z{O9=rQ|6yaen6Bye`90K$>nmVK0m-|B+~lIGh~+MIwE7+YipE$^FE3BWaTja_WX#E z^8-e~IQ99{%1>CCxiFApXJ=<9{;Bwaj^m3_BL0s8yY9b7Gw!0b?+BZuIvN14^Ur;E z*O#KSm2ntMNlewo}bz-_n{QezxU%7Z* z^ssbn3m9-(5Hgv}z}rW%fNAUV19^Dkh3B2@Y929yh#)NsFnDB^7yOtk;xul3&{rZp zbWFJG`fdx@cXvrTzB*dTge+j1`usp3%jGLhrd9b$6rk9zZUc}?&Lax6ZjxEeW4P`l z@7?Vyjvbc2y$lJ0FbW!`Ml6w}XggtuSa zCgEiKvNb4WQ>*M!rne)EItM(N&8KTuzKhWwN?Gg|_ByT+W#PQ^8qH=s-MsZaJJfrY zqfx4m!*xMZ)aM8J3F`6ZoS6&r9pS%ZGKX%7W)sdquM;KAT$o2cf8Ck;`eV1z>>Lh9 z;m>&S^xl(ClUYpr$Ajl+sUi@C(Vj2XGAYX6z0Tb4Zl;@=L{B3OWdVcq`Mym1Q&ulu z4ga2mK0oOt$vk1T#(j(Z>b76`Xlia5QxPO>NH`g^(I`>jwUt7xN1ro_1!S^$MEUbg zy*5~)lW@}EwcYc<&=$~7pC3R(I@H3G(B~($6S?rHRm<41ILtzAs~Wkr%H?t-x-^sJW4A$Sc@_+<$=M$Yjq%v7t`ju`9hE=GkGPo4_rIrA`B6B^is(=a7^IJ1y?iyy z4w-~LKNy3J@i1aq^G~Y+4Ly<&0HY0+jUCeecgJmJa*>npP&r~sMdu?N0mrrgh}P!^ zDM3J3`3a+qgYp52=Bo_}}))>R)c8NVXrUkaH&GoT> zLA@WwU;z-V&yUIy5zCsGK0oFq(YlEdSjU`$0{(u; zE#)b06vEHl7>fl=Tb~bLs}iYOyRPuEzZpX?Vn`+D*{^P6+i?K2(cwyMuQZwkL}6~g z959RpjI;(V5vNsMm}XfuRx zwG#njOnB{hEr99h^8*M_w1o7nqKmxZWL6f!RZq|emYqP9kY1jnv+GrNi&nEWJp9_JG3`++WP!+-hqKZrx_IU)cu3&N24^?fDU9$`yY7A1tTyX>;XSW-iP^xGB|C){E3W`qhCC zs9YcT9s!Qz4V|_=Kk|86mQXa>$*wGglP^H&!3OdBcifpwuBRgm%ioh9q5aVS4KXVb zx}%NRrJ)s>+yvqQ;muRl=eHxUgw(B~Yq;)&u>s>zy>+v1Q0A!o{jTd55i`cnG#Yo3 z5wUS#ocerem8ZY{*p0Q~!;QF$J?k)|9mJ=oy) z%AoT9thyGS+^j%Li*zh>m-AP<3h%-)^X@tuQ> zWR4WC{qRQ}*Hqsw^5E`=l#F4!I?h*lG!YI#!I;{{ z(vJ?L!7~l^AO47HxyV8S?u_xPFdt=fG{9mS zvbh{$jNkLWbCr61A7w52f#yMVCZH@uy}nQCrB_IP?th`_OMmix{{3%%8ut8TCdbwU zmbi~9?Ct}_Vi6^Vv{z?FDU@Zi^UVY1R##BU?)$aDT4{E^{uX7~D5dze{D5oU`vJdr z`|nUnkSUiE(Y_R+AA(;z(L`Vk8-xd%hEs>PsLS}`B zzxr2Zb2(%RUw`(fV4wwLM5xzmG-_26$u#AM(SZyA1Zvd^u|$%1JVmu!q+(Uk=6tz1 z2t5rjo6QpUlBj2%Z6(4gO68(I{)G~#CLaEvTUyLZ zPxzDV$^zggtu3XO$!2ooa=FOLKiOA3o#<%*Z?}%Vd>PMcbPPA!Uw-5FdJPI2B{mA% zmuZ;R`4&XPmy2A!jJI2-T-puKomYM*dWN9*^DmHHU8K5M#%KWp^G`hHpHr!WWoT;% zid!izJoO#wdOtiaB6!UP+0{jg`UR3--Un`<$O}Dc=xKl;Auluz(^m1pPk^@1aY=!2 z&=8^!1W^{%@?`%n!J~|xAxK21tanwI>H6J`KIbbNMPji;xC=foB4%!-^WDJXGe<$qSd=G&1^;Z#PQT%2-{QiSMFxn&T%wV*~-v7J{5c-48UC_}8 zLy|#6ER&tZXzhPb&S#$h5Nr8`I{txWH;l#@gZIhD09dnrmSmb(s0v<&^Dtx=!jNPT z6aM12@3QdZbFHYDKX#{Y9(@e2Sbhz+e^t%S*S7&-9he_1Eb!z57_$r ze*suXF!IpRd9U!Z)fJYH`LMr_2#28cjRK|oBLB9!!aDwNu|5WZpqypkeqodCo^{vR zh7G<%@U1uBF!Qco<=fTq4HfNWZQJK^#BPNB@w{TDgY#hRl=1%wop;i&RhB^j0000< KMNUMnLSTYcK|t~V literal 0 HcmV?d00001 diff --git a/sandcode/icons/mob/screen_operative.dmi b/sandcode/icons/mob/screen_operative.dmi new file mode 100644 index 0000000000000000000000000000000000000000..70824ea89870660c3a4992a48c1d8b658ab5be0a GIT binary patch literal 4280 zcmV;p5J&HcP)V=-0C=2*&CLqJFc1XbbMh2Rdl&z%xkyXNp?w7jW=(=^BfG2d@jVngn%fL~ z%(QUn2RlJGTKz`ilvglt-tDz2$x8$Sr=wO8Q;4z^7AFV>8o}i`JHbXPpNPT0L908t z1-JZzuhk%I$c~OO~SVgf)Rk9Q+CMl72B{3z17hy^6ZFX@7raKQk0D;}X zlGp`^T@j~>0*RTP)6?DO>)UBaE?v6B&;I7`K4J{`r+@p`H-V>`U;b!r@uTNw7skQQ zt*vzco@Rb;*B8N)Abx&!q1Y!wPaS`!0&Z=s2h%e%oGi>GW^P!x8*T<)ZmtF2m|N`O zd6N9Mw$_8)l`t;;9tBLHieVUHjM?WA7DNG2{0UeC==f9mrc_Ef4oGZikH>#-wE1_A z5Pwev6bglrk#}d}Zn&9v?Md+$x3`WAe@_LBvi7?(&<{@||M5|P#DB2vFBY&CL=wK= zpZ`D#7!m*RP=Hv_KvqLaL(4!ta-W`pw056O1JxEpfKBd;jvD_X6cE?y5HYX<1ke`d z(!6;i43>1AjVR5>Z!8s~xI!d3zl>h!LY0&{`?aHgP^d?=?Y*up$&g_Lj@O>n?-h7U|@FxI%@p;D?kj`{uw?9 z22y|kKImt%=m+cgUK6Di)*6a?wJBDnUEwzypv0nq!onD_YZ0C42Q|4N2s`I%rQ=w5Cod1X`z=HL#cz_}_Sr$wck-d$=8cS$% z%u≫no&xw-O8Bu>8Qo&@PALe?%X^zGK>hU@!#$Sw%#Z`_T*v0~YMAOj&E=@wei> zoxva!@-wavO9%mvuYhEJN1E_?0RE$`01?=U_|?gDF}0lGovZbr()9VCMhbvywJ89u zmhyZn)g(gr)$4w-dA|nt)*;evvNS~gtL1zT_op@Y@2llJfj2n+5uXWL7Y1@E{^Dvi z5Cl-XmM!%vQ=lH@5G(xTYAg8Qo6|+2Of3IH^Z^O{-|{1}x|+zpZS=tWM_U2l!hq3O z>ocVzG(tVfB7niIzA6+TOsf`~#wXkkVSDcgsCfLX1X?!5OMV@2?ZjBP7iq%H zE!Y{h0!G7swC4ff3LvL2_p2BLPc^Vcu@Oz9L@>s(pteE4;JfEc&49ELXYqq8V6^;4 zUjYK_z=e~k;@P{IKu1{+_^M?PECRH=0>)YlaN%TBl#ODE{;Xj^x!XhL)AqERkM{Q4b-28hK0F2a@0qm=QC&9m;0-iK~PX+w$ z)|bJPFedf8_N4e#!fNWc_7IceTyc7*^yPD_PiTstv;qN{lae(sy z2gh*y`G-HBaAW9QXNv1Fyxj7sRx6hFBfHY-F8THj>9$3_J8%(ETc{ zcwcOz<};sZ#OY@rnRNGB*fCiRwXsPS$a?6!$J;jvbk|nk`!7&ldr0U@py>>($_d*NAtbEIQtFjZiG>Iu_yd z^)UGLDT}QTdN_WsWmg?v`}egQA$%NE)_P+?&lc3 zbHBO*@P4|{cQ`t@FKDd(d;@upH*QvfCGA2_J7aUYNn|wuGpZGT>x@iGy20Bw)4}Bz z=8Kej-3bHp$7x@CP+wW_BEX3%cFK1&($1N&@R!ZZ%C*IGVkHcwfPMV=uVqSHtGmyu zrTpmp`Diq$co1Y*H(BOXgUD)jOe%hT!?bD=p-@Eey+T;p#woEk1U)u?7sRHq*02%j zzUcwxwLuJh`-8!KK?(l+ei(^Ae>Mg8O1*(hgq_I4k2lH7eMVh{LIKp?3K)n#POI7@ zA0?bjmwM9Otxs_>UE*$i3K2mm+jm4XpaS;s$M3>u{P}>20iWWzfE7ND838KOQGdkH()L_W{xUN<6)=sCLBdc8PQs6p9B?ir;>BwpduLg4a758~BV^oL0INAgXu# z-~P8K>D)6M1@!Ufzn&|*Wfxo}V1!E3AB{i1Y`eMq<9g^bACY?1Q?Hq=4tLW$xBz063X0jX(h~et*6Q>=@pAE?qox+Ye574HOZe zSx^<$O^&pHi~AZC$Bb}i8@5NQ0Dxyx+wt|0D1h<%^T7ps5&rYre)05YVW$!diaAwh z)1(1SS}YcWAk3ebBccke;q(El)e*6X625BAB&HV?|3~RjC}2$f{PxoY2!&ri?-zf3 zI~_cu>nNN0RR_MTmiQxG_NBh?gI_5 z6{WbCuDj)ju-^9>2ip%Aw?DrJy-GO!nF*ftT8;vk}h&dKcp!zYplM zyS7#XfsCpXMmc8vDqD4Lg!=*Q%#72Y--E6`;gnze(VcA2UZIJA_fFX&w;w=b@21Sq z_5+AOTMAwoP?(YJ2Mig*^XJEvV1&yrs3Klm&@D@$W+0ovh2i1M1G>?(Bi8PWN4g_6 zL=4@ZKj68AgY(BcN;w56)3YOH_gMkmkAE!Z1CEkE|3LiJYG*(A;if!~R6x@Ch_Rdx zI7kd; zGdg|1xu5>9ydICJ7JOK5^hfJjb*$ilYn9g;t;{TNW+8St0c&Mg976Hze$GFHN}njV zGV{x-vRdk&?rA_L1QmcY3!2R;-pen%`Z2(>Lm&vNA^9%b{N2@CD}QT@{=XqS`|AJ? zTs+>2V{^Okdp!9W?d;)7k+{u;0%M#dyyonC6kOf@{7$21a&!KBuV107oIak!X~Ucci1oSivT|-u84IP z;R?Wf4kjU}3+rVUb_%nzpdy$}@q^!2f<;}$m%1}UCDeh94`noLns@GGgMUvqiy(yI zHiZ}FId^9@IRD&<;<-Dk0Sg|BY4}63!S1O;&pcou?kK~p4Z?bfH-BFX%GMplimWCw z(2Dl{iHy6h#rZUUQqKkC1$;PnXEpdGelfhW;hueGgSGxUc26C86wn@#7iQ;RTH|fh z&?s&K*MXcQh$n4ja^J=gNvL)!CDS1|+-a52ID5%*Y{-4dS8@E0@G0R_#-{{C2$q+8g+^G`QOB89ib{ml z9YU%k75)=_(<6%B3b4@1*;n5BTn9}HBCe%dBED$0aITw(lyC4ekn&CEyDyq8=as=A zV(~=ytD8C~oSdgXwiC1_h2M)keZZ@CY%1^~wv0lov-$mT%3!TwDpdgmq9vY`33GH3jInKd@+#9tBL$i#>gSR*DVNZM(1!TYbO%v!3e@&+={oYGDudD4^}|lij8Ds2H;Ay2O(+>_h?kVNV|r z8H=%o2o>8a6|IKG^P|KEbfejDov^j;xKhg+THSrXq$Aja-sR{DeDGYO`Qu`WmW39U z)t2TNFN-wnp3{-t5OK#f?zMDW_(EPOE(G-=z)~8REJ5!8I7e6U$dE9S<(|hru$fgq9UP_;$8v%Pk5O7tr^Zk z7Ijf_n!mo43KS&%F9h4L)}2p$_f)fJD-nENa>tZn2(ZLt8*(=~Tas;G?-#2#bFcp3 zdp$S(W|qhHOcnrk{dV1rkFTs)U=6noIl)8pxFY^#&B&`t*^3uHISsIw=D@pGy=g_> zH-^PSX7=ldP6)ahsdCV=-0C=2*&Akf4Fbo9X*?tOf;A z^ue8R?6#58Ht}fMX)|`yCh3FgHuhNQCGkU^@{%S_n@eZt((*&&1ocRYYsr=^Su!PZ zC7F`2ya5CjyL~vjATA4#5CDP_@y$Ts?w&pW#X0AHF5mY*D{~85*;J&^cR)q&zbNKlRNG8Y4-rjW>#-Jcm45Jc8PF{JJAwh4fT#u?8t59hE@X0$b3v03 z(?CjfoOb+c6$)Xs;a6oqy{$j6!e^KM(&rF=E*Zu#gLHiM2AI+4!rP0Rqq^$S54$lQ4IF0;CRu55UpbsF`y>)4|*W zLc*>G;0UAU*ZwbV&1S%H!@I!MgkO~bx~NR0<(ekIDafN121o&&I&A0!Jqoe)AauZm zod?x75=0ab;N>9J2?Lu9Vkt;D<*l$52CM}Bs%C&Lfhat+D`5@}fzSW}W3QqXBDuxy z;m@lUyW=1{l^!*pdpmB;_^q&!_+vlxFP7i~3_n&oepLoUWO)X)nl2$*kVh>Hh)C7< z>YAEuICG${gW=y(1u^^xjQyuN2FT8U=BHoZXP_+UT>kz(tLAIk_24<^jnNl5&!y8hq)p$5gVSK-r#R6)J;UfjBohUo>H zv|HYQ>ct=XvAQ<)QYo{fExuo=-;T0=O$J6 z==$q_>30PiHpApNOxrfekQvBo#Bcf-P_Hj2BEj(I*>9gw3mz%dl<+f$;a4XVi06Wn z1G5i|J_AB#AOU_YE8%A2-w_P(qTmVm)Mr79s2?jOWar>hpHb;t4_pT>o`s}818Eck znu*`^bwIrg&?WRl)YQ&(A+iq0z{EQsQIn7D2UJ(=Bo$+OdJV`F&%O%rYhggM@mD{@(uRJAa+lp9we?W`z+xr7rjNg*|0b%<5TemKmhGEC3Onxg zrHZH!;jvi4%w*uZ*GH`BjH-w*U27v5AcXqip64N?ps!gBXr(@12!$Js!P7eu=Dm9r z1B3)UrqVbIFt}FM3seQKi^36e zR26;%^bVx~nmDi0ZQJADumJb&g=gG^dE6SYW-_W#l|6ELeSF#a}%KJ zgfalC>!PYMpym2}0i7Cjc0e?$up%+P;62!Sk4iW30c_l=gt3~g(mHcCsWhZYSWpiG zzINc$5U7TAGOvlfw7)`LpD&`IZC~v3C(f&u@1)?yH5A39Vn8;d8j6sr>zbXmna-5U*K59`(uFPs=0oCKZLJH4(pLU7cO6d?@f(Zojo8*W@EMP5eo{tkO86qxbQf? zCK8JbsA~+Uq|YDzUGj7vegtq~W}-Rz{FDYS&d04|(S$j;7joGG7Hm_GaovK=+x(k6 zaC7kSO`GI`T9cGc1DA_mXkiQ}Z2c-tgBegspP$#p=bNN*jx|G{uSqqqW-^LdNFWOX zdtvf@=!`;FcVS7XuXVi!xjM(7;29vC0sDVTRRXAr2xCCOBjxdHS_!vWpDzT=Yw*Hs z+&U%`=B|BeX5?mJ+di0hUk%2dr>3Qv|BGg(ZDyLx0DyhJ5nOKq1EBT#d{F(U)Zsf< zN35q9HFxb(<54aPTX(|MkAP|DHq>)U37gg%$dqzNGwRQLhJ8m5liM(4vNZ2|ESI41Ss^fch!4sKL^BeERLl{Xwrs9=JD@zX znOp-I&}w~tU_m7a9sbQ4v7W~F4MkPU+qzRF^4vw1_V*d+4O$2M(?^F-eMP)61d5T> z-XQSuC((QZ<%a4O|BRJp1c|rvU!; zz^S2aJBug5*0{%4e;xRMDtkq5D<05leSV>pGT|vk%{})QtO-0ge-^&`@rV`c0YaQ{ z%btZ*+#eypgC0{YPB-oI@Gdto9uPcCEA{zB&q6U1o^cYU?*9_Uffvrlt(lBXIwUC5 z2z(Du?bFs^(>`_1^_CY8D78B(CR}JiC3qUVY>imD-#8o(ybg#(AQBRmyq$GG>HY{I z1X4g@?m~*tm~g3;?vJ=5V#3v|)_n{0;OhVqJl9kCyKwD1Y}uzGVs;}UVz9RK`L~NN zgaGNWWncOIOW{`>1J7nkIA>7%fgDU*#tS(Qx z>5g8&PQlV^y4uVJj1)|x@;;O8NI%iZEGegZiCgb#(?PY$({8$>4|r&U<^&g~=3rw3 zil;Q6uiLt|%}ICk_v-Ujs{Z`%WXpF!2Jkx@bZ(}EzG>ItUjZx;dsvob=WY6p{JTxD zubm$HeK)6FZb065gXy69sRgZBZ;EL z&5>6|PF+9wdOQi-TH~!B3c4Tz5JC-zwr!)~dlVz^%>4;d)BOslV6LlF3*S5&w`Q_1 zm4$VN!K2T|Er3^#sfzeGtuV8S$_N>z9K$x-vs=i}DIP35YcxM?%hgemTw zYDEn2d?&imXV4o{5wHmG?n$`+kROl_>xNu#Zo=7ITFrbV_=TTyVSP+}3se{M;=zRZ+@*2`oH_G)e9U#0 zx7B0~SSSNF_8aH|ZrHvgMZi>A75;%wpn|Z$nji(RJGhq&_H;|nMfzz{H_{CN>2K+()n~~kS;o22n8K%L3PXYpr-Rc;B zvtDrSw+F$#0KxxaAtaOOii7>ZP7?G!s+XY$*`!ME`u98jcb)<5VW7;4-O=-cmoFX4{`KBB z$vBYB!G{;&UO;@jbY@--E?!i7#WD``cEi`t#VxSe7!%NTL6=#+0&HMIm&bzM^Ukvu zM;PdWKi)EGMkDaSdEW)GgymdVzYa24cxht9N;x3?v1DqY-TcEWACffEY8@~?H~XOH z=HB^e4xYOix4Ja=i~AC$#xf#ez~7yTTk|={A{#lp`LLy7$^!ug5`!4sSPlRdTO5 z;pW&_-?QG8mhXa2Ekx#e$abIc9B~aLNxAO75UFAuxYBvZ54f9vDPSXTGSb0Rs^0%1 z`tC9v;QK#+t^4tZADZj$)aOC<)BT+lUr4fS^S}%8Qu#W3G38Ww8cnpSL}f ft+2K_y2bYY(M0)xZNCf700000NkvXXu0mjfM>&eZ literal 0 HcmV?d00001 diff --git a/sandcode/icons/mob/screen_retro.dmi b/sandcode/icons/mob/screen_retro.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ba20a9e8bdf4f9acd56eb9235ea04cda41c9e2b3 GIT binary patch literal 2627 zcmV-J3cU4+P)V=-0C=2*&Akf4Fbo9X*?tOj=^1|B8Ob)5ymH2l?XHU##|{a&O(Sbzx;><|JmP28uYx!R1Pq;4}3URX! z?m_;V04DiIp9f2Rdr{|d8=*(}oi)HDAJ`3sd~Zs64g6+=-z#km}(vqB=O@LTHc18r! zk}RYo8EHwLpG|-?5oczTKq?>+0^(1!PV$z30U=Wb01$xOy!~bs1fw)jwD_YTz@Q}O za<$V3HwkQhC^1MQ%r7ti-7w4dM`Uex+rLq*jsL;T<`$k`;I{dr;erJHqcue@FY^lw zVj%a4)A+3D$u)rk<2SkH7Z@zE^SlH8NC-fh{y`5{)dSN#cw&5xc1Zj#J9ok#4FNzX z6ac6#N|vaha35BQ4Vs@c7f%QLk!S-x`B3! zzRzgd`5)Yb#aZ_^+dh9J1ONaGjmetE5TF@;*K`MZsZ`e!0I5J)l2P(s1e5>F?+D4M z`kJV&C-Crx_W2_t0I5~XjfoIAf$H-rAP`h$2mn}MhyZ>*mcYtp)$b-CQ2xjWzyy^3 zMNqi{A_AB&alVR|OG#)12+#m%&`$f@0}7ZwG6IMiVfgn9hzwFSfC$xB!0;b5B$&Vq zKmh*txUO^ZR`W+j099m=ph6fDK+L#bsOo(BEI?&K0)&E4fv5o*v_N`6LGnjO0KoBa>p!(!FV*@)QR9!qKJ@Pn7)*o<{)W9e@b_~`SO?efR_1N`J~ z^<2C^z<>UYTPM2WkJfaw9Z6RVW+k9?fEIZ7!n3ZPkDdUA;c3Phd&8@SAR!6SDWWwF zNJ=uzkY)UL2J{2a1)&+LuNeWOEf>@P?FkTOe7<3Ppk{bwg`uo)oe+m5g8Ka`#((oq zsNb)4oQHQ8l$PY|OajC}b_Q5pm1Kbdjez+R39ts7nI-&pRgzH-&JCD`2WoCeSz%xj zpn;%b(+wHYJcweF4@@Gd}@@%gsWZ-QnByk`V}OrrkYswDf`9xPp- z0AF75miF45R}s7k&>%j4et}W=DNd$=W`1pWf7Xbix`0)I{9j4#!#P^%<+zkyoK3}f| zweF}Xg0jL^V|*yRAQ!r=0iFd2J3b#kLlN{ozrlGdIBGk(De-Q279i~Sd$~yUSg@mAk3cDBfL*VgdLynh9N@ow18^GS?3Z- zLM4cLXc~6u`o#E$A2^J>`OUqFb_{Q#z4d^w&xc#EuV zIK}~W4Q@(GO~25SXo}GC0D$Qif}_Ud&Pl1lUFUrL)?Ogr5=nSkklDEd4F4Jj)&flt zuyeR#A^d{`akI@({1(+%^D%*tQ2wO&O zhRQZ!3XHXkZ|`^H(OiHAJ)g>U^S*m>#3fFuzA**>T$;*$*+19U#ycKq95@+gHo!p5 z_`|=dKkWD2&skWy?lAuKch*WzCgZuFmb0O$Q#HezNKUYIm@w~~>Fe|8DoDJ^Izikg?H0x+|-=2^AT5NnL>e>LYdOS5Z3#>e?T{BB}|Ec=;xBgQq#!mtJ zkDP*uiU>WQ<0&=qgTHTmgy3l$(8%!3(zu0)aWERXAbaWW1}jeiH4{qIXk<_)fSOS; zRpPD*V8m;}A;a4)NyVE^Uem>>p?*5LTr96m)<(hQM~oB*cHi=6?)~1MxDX3)YgPV*G=R(aTfGx^>}lu`80%FHUE-0Bi#KGGte|9W6MbBCeL^ z`u?=P@&=ctvViWlJ6*l9Kf49s%l^5(@vdL@=)rP9`){6=HihZ**Zp&So6z0GCZlt| zZ9F>;z2uJr*rXS+3vxksK_@Q`ef;Fc>yg2=5}^C(5uf%**z?-njl&V$uv}2_a^XmWr literal 0 HcmV?d00001 diff --git a/sandcode/icons/mob/screen_slimecore.dmi b/sandcode/icons/mob/screen_slimecore.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a4854f16c3d38ec683ba00c8621e57629b52ac70 GIT binary patch literal 4097 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 literal 0 HcmV?d00001 diff --git a/sandcode/icons/obj/clothing/wrist.dmi b/sandcode/icons/obj/clothing/wrist.dmi new file mode 100644 index 0000000000000000000000000000000000000000..20ba91b5d2f2f0a4eada3896cd6085f93cdbbd49 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;m;-!5Tn`*LkmkKF1;}MA3GxeO zaCmkj4ajM$3W+FjNi9w;$}A|!%+F(BsF)KRR!~&>{Y!Ac$FEPcymhtCojD)8A=Kca z@q

" dat += "

Clothing & Equipment

" + /* skyrat change dat += "Underwear:[underwear]" if(GLOB.underwear_list[underwear]?.has_color) dat += "Underwear Color:     Change
" @@ -590,6 +592,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Socks:[socks]" if(GLOB.socks_list[socks]?.has_color) dat += "Socks Color:     Change
" + */ dat += "Backpack:[backbag]" dat += "Jumpsuit:
[jumpsuit_style]
" if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits)) @@ -890,7 +893,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) class_link = "style='white-space:normal;background:#ebc42e;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" else class_link = "style='white-space:normal;' href='?_src_=prefs;preference=gear;toggle_gear_path=[html_encode(name)];toggle_gear=1'" - dat += "
[name]
[name][colore]
[name][gear.cost]" if(islist(gear.restricted_roles)) if(gear.restricted_roles.len) @@ -1470,6 +1479,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) facial_hair_color = random_short_color() if("facial_hair_style") facial_hair_style = random_facial_hair_style(gender) + /* if("underwear") underwear = random_underwear(gender) undie_color = random_short_color() @@ -1479,6 +1489,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("socks") socks = random_socks() socks_color = random_short_color() + */ if(BODY_ZONE_PRECISE_EYES) eye_color = random_eye_color() if("s_tone") @@ -1640,6 +1651,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else modified_limbs[limb_type] = list(modification_type) + /* if("underwear") var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in GLOB.underwear_list if(new_underwear) @@ -1669,6 +1681,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/n_socks_color = input(user, "Choose your socks' color.", "Character Preference", "#[socks_color]") as color|null if(n_socks_color) socks_color = sanitize_hexcolor(n_socks_color, 6) + */ if("eyes") var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference","#"+eye_color) as color|null @@ -2682,20 +2695,32 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/datum/gear/G = GLOB.loadout_items[gear_category][gear_subcategory][name] if(!G) return - var/toggle = text2num(href_list["toggle_gear"]) - if(!toggle && (G.type in chosen_gear))//toggling off and the item effectively is in chosen gear) - chosen_gear -= G.type - gear_points += initial(G.cost) - else if(toggle && (!(is_type_in_ref_list(G, chosen_gear)))) - if(!is_loadout_slot_available(G.category)) - to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!") - return - if(G.donoritem && !G.donator_ckey_check(user.ckey)) - to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.") - return - if(gear_points >= initial(G.cost)) - chosen_gear += G.type - gear_points -= initial(G.cost) + //skyrat edit + if(href_list["toggle_gear"] != "color") + var/toggle = text2num(href_list["toggle_gear"]) + if(!toggle && (G.type in chosen_gear))//toggling off and the item effectively is in chosen gear) + chosen_gear -= G.type + gear_points += initial(G.cost) + else if(toggle && (!(is_type_in_ref_list(G, chosen_gear)))) + if(!is_loadout_slot_available(G.category)) + to_chat(user, "You cannot take this loadout, as you've already chosen too many of the same category!") + return + if(G.donoritem && !G.donator_ckey_check(user.ckey)) + to_chat(user, "This is an item intended for donator use only. You are not authorized to use this item.") + return + if(gear_points >= initial(G.cost)) + chosen_gear += G.type + if(!color_gear) + color_gear = list() + color_gear |= list(G.name = G.color) + gear_points -= initial(G.cost) + else + var/choice = input(user, "Select a color for [G.name].", "Gear Color") as color + if(choice) + if(!color_gear) + color_gear = list() + color_gear[G.name] = choice + // ShowChoices(user) return 1 @@ -2736,6 +2761,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.skin_tone_override = use_custom_skin_tone ? skin_tone : null character.hair_style = hair_style character.facial_hair_style = facial_hair_style + /* skyrat edit character.underwear = underwear character.saved_underwear = underwear @@ -2743,6 +2769,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.saved_undershirt = undershirt character.socks = socks character.saved_socks = socks + */ character.undie_color = undie_color character.shirt_color = shirt_color character.socks_color = socks_color diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d6279b8a97..c12e2ac1b8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -534,6 +534,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["chosen_limb_id"] >> chosen_limb_id S["hide_ckey"] >> hide_ckey //saved per-character + //SKYRAT CHANGES + S["color_gear"] >> color_gear + // + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this @@ -899,6 +903,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["modified_limbs"] , safe_json_encode(modified_limbs)) WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) + //SKYRAT CHANGES + WRITE_FILE(S["color_gear"] , color_gear) + // //gear loadout if(chosen_gear.len) diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index f58be1373a..cc36d2b02e 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -20,7 +20,7 @@ /obj/item/clothing/ears/earmuffs/ComponentInitialize() . = ..() AddElement(/datum/element/earhealing) - AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS)) + AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS_LEFT, SLOT_EARS_RIGHT)) //skyrat edit /obj/item/clothing/ears/headphones name = "headphones" diff --git a/code/modules/clothing/outfits/vv_outfit.dm b/code/modules/clothing/outfits/vv_outfit.dm index 0bc8c87a45..0daf2b39aa 100644 --- a/code/modules/clothing/outfits/vv_outfit.dm +++ b/code/modules/clothing/outfits/vv_outfit.dm @@ -28,8 +28,20 @@ mask = item_path if(SLOT_NECK) neck = item_path - if(SLOT_EARS) + //skyrat edit + if(SLOT_EARS_LEFT) ears = item_path + if(SLOT_EARS_RIGHT) + ears_extra = item_path + if(SLOT_WRISTS) + wrists = item_path + if(SLOT_W_SHIRT) + shirt = item_path + if(SLOT_W_UNDERWEAR) + underwear = item_path + if(SLOT_W_SOCKS) + socks = item_path + // if(SLOT_GLASSES) glasses = item_path if(SLOT_WEAR_ID) @@ -68,7 +80,7 @@ //Copy equipment var/list/result = list() - var/list/slots_to_check = list(SLOT_W_UNIFORM,SLOT_BACK,SLOT_WEAR_SUIT,SLOT_BELT,SLOT_GLOVES,SLOT_SHOES,SLOT_HEAD,SLOT_WEAR_MASK,SLOT_NECK,SLOT_EARS,SLOT_GLASSES,SLOT_WEAR_ID,SLOT_S_STORE,SLOT_L_STORE,SLOT_R_STORE) + var/list/slots_to_check = list(SLOT_W_UNIFORM,SLOT_W_UNDERWEAR,SLOT_W_SHIRT,SLOT_W_SOCKS,SLOT_BACK,SLOT_WEAR_SUIT,SLOT_BELT,SLOT_GLOVES,SLOT_WRISTS,SLOT_SHOES,SLOT_HEAD,SLOT_WEAR_MASK,SLOT_NECK,SLOT_EARS_LEFT,SLOT_EARS_RIGHT,SLOT_GLASSES,SLOT_WEAR_ID,SLOT_S_STORE,SLOT_L_STORE,SLOT_R_STORE) //skyrat edit for(var/s in slots_to_check) var/obj/item/I = get_item_by_slot(s) var/vedits = collect_vv(I) @@ -140,4 +152,4 @@ if(id_slot) var/obj/item/card/id/card = id_slot.GetID() if(istype(card)) - card.access |= stored_access \ No newline at end of file + card.access |= stored_access diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index 0d16f9bdfa..7d670b14cb 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -24,10 +24,15 @@ var/mob/living/carbon/human/M = loc if(ishuman(M) && M.w_uniform) var/obj/item/clothing/under/U = M.w_uniform - if(istype(U) && U.attached_accessory) - var/obj/item/clothing/accessory/A = U.attached_accessory - if(A.above_suit) + //SKYRAT EDIT + if(istype(U) && length(U.attached_accessories)) + var/please_overlay = FALSE + for(var/obj/item/clothing/accessory/attached in U.attached_accessories) + if(attached.above_suit) + please_overlay = TRUE + if(please_overlay) . += U.accessory_overlay + //SKYRAT EDIT END /obj/item/clothing/suit/update_clothes_damaged_state() ..() diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 23cb2b1c15..60c34baa9b 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -16,7 +16,10 @@ var/adjusted = NORMAL_STYLE var/alt_covers_chest = FALSE // for adjusted/rolled-down jumpsuits, FALSE = exposes chest and arms, TRUE = exposes arms only var/dummy_thick = FALSE // is able to hold accessories on its item - var/obj/item/clothing/accessory/attached_accessory + //SKYRAT EDIT - Removed the old attached accessory system. We use a list of accessories instead. + var/list/obj/item/clothing/accessory/attached_accessories = list() + var/max_accessories = 3 + //SKYRAT EDIT END var/mutable_appearance/accessory_overlay /obj/item/clothing/under/worn_overlays(isinhands = FALSE, icon_file, used_state, style_flags = NONE) @@ -62,29 +65,33 @@ if(!alt_covers_chest) body_parts_covered |= CHEST - if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) - var/mob/living/carbon/human/H = user - attached_accessory.on_uniform_equip(src, user) - if(attached_accessory.above_suit) - H.update_inv_wear_suit() + //SKYRAT EDIT + for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) + if(attached_accessory && slot != SLOT_HANDS && ishuman(user)) + var/mob/living/carbon/human/H = user + attached_accessory.on_uniform_equip(src, user) + if(attached_accessory.above_suit) + H.update_inv_wear_suit() + //SKYRAT EDIT END /obj/item/clothing/under/dropped(mob/user) - if(attached_accessory) + //SKYRAT EDIT + for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) attached_accessory.on_uniform_dropped(src, user) if(ishuman(user)) var/mob/living/carbon/human/H = user if(attached_accessory.above_suit) H.update_inv_wear_suit() - + //SKYRAT EDIT END ..() /obj/item/clothing/under/proc/attach_accessory(obj/item/I, mob/user, notifyAttach = 1) . = FALSE if(istype(I, /obj/item/clothing/accessory)) var/obj/item/clothing/accessory/A = I - if(attached_accessory) + if(length(attached_accessories) >= max_accessories) if(user) - to_chat(user, "[src] already has an accessory.") + to_chat(user, "[src] already has [length(attached_accessories)] accessories.") return if(dummy_thick) if(user) @@ -102,9 +109,14 @@ if((flags_inv & HIDEACCESSORY) || (A.flags_inv & HIDEACCESSORY)) return TRUE - accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', attached_accessory.icon_state) - accessory_overlay.alpha = attached_accessory.alpha - accessory_overlay.color = attached_accessory.color + //SKYRAT EDIT + accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', "blank") + for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) + var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, ABOVE_HUD_LAYER) + Y.alpha = attached_accessory.alpha + Y.color = attached_accessory.color + accessory_overlay.add_overlay(Y) + //SKYRAT EDIT END if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -119,9 +131,11 @@ if(!can_use(user)) return - if(attached_accessory) - var/obj/item/clothing/accessory/A = attached_accessory - attached_accessory.detach(src, user) + //SKYRAT EDIT + if(length(attached_accessories)) + var/obj/item/clothing/accessory/A = attached_accessories[length(attached_accessories)] + //SKYRAT EDIT END + A.detach(src, user) if(user.put_in_hands(A)) to_chat(user, "You detach [A] from [src].") else @@ -152,8 +166,10 @@ . += "Its vital tracker appears to be enabled." if(SENSOR_COORDS) . += "Its vital tracker and tracking beacon appear to be enabled." - if(attached_accessory) - . += "\A [attached_accessory] is attached to it." + if(length(attached_accessories)) + for(var/obj/item/clothing/accessory/attached_accessory in attached_accessories) + . += "\A [attached_accessory] is attached to it." + //SKYRAT EDIT END /obj/item/clothing/under/verb/toggle() set name = "Adjust Suit Sensors" @@ -230,7 +246,7 @@ . = ..() if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return - if(attached_accessory) + if(length(attached_accessories)) //SKYRAT EDIT remove_accessory(user) else rolldown() diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index ee7e4c48e1..da91b18742 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -2,6 +2,9 @@ name = "Accessory" desc = "Something has gone wrong!" icon = 'icons/obj/clothing/accessories.dmi' + //skyrat edit + mob_overlay_icon = 'icons/mob/clothing/accessories.dmi' + // icon_state = "plasma" item_state = "" //no inhands slot_flags = 0 @@ -9,6 +12,9 @@ var/above_suit = FALSE var/minimize_when_attached = TRUE // TRUE if shown as a small icon in corner, FALSE if overlayed var/datum/component/storage/detached_pockets + //skyrat edit + var/current_uniform = null + // /obj/item/clothing/accessory/proc/attach(obj/item/clothing/under/U, user) var/datum/component/storage/storage = GetComponent(/datum/component/storage) @@ -17,15 +23,12 @@ return FALSE U.TakeComponent(storage) detached_pockets = storage - U.attached_accessory = src + //SKYRAT EDIT + U.attached_accessories |= src + force_unto(U) + current_uniform = U + //SKYRAT EDIT END forceMove(U) - layer = FLOAT_LAYER - plane = FLOAT_PLANE - if(minimize_when_attached) - transform *= 0.5 //halve the size so it doesn't overpower the under - pixel_x += 8 - pixel_y -= 8 - U.add_overlay(src) if (islist(U.armor) || isnull(U.armor)) // This proc can run before /obj/Initialize has run for U and src, U.armor = getArmor(arglist(U.armor)) // we have to check that the armor list has been transformed into a datum before we try to call a proc on it @@ -45,19 +48,57 @@ TakeComponent(detached_pockets) U.armor = U.armor.detachArmor(armor) + //SKYRAT EDIT + current_uniform = null + //SKYRAT EDIT END if(isliving(user)) on_uniform_dropped(U, user) if(minimize_when_attached) transform *= 2 - pixel_x -= 8 - pixel_y += 8 + pixel_x = 0 + pixel_y = 0 layer = initial(layer) plane = initial(plane) - U.cut_overlays() - U.attached_accessory = null U.accessory_overlay = null + U.cut_overlays() + U.attached_accessories -= src + if(length(U.attached_accessories)) + U.accessory_overlay = mutable_appearance('icons/mob/clothing/accessories.dmi', "blank", WRISTS_LAYER, U.plane) + for(var/obj/item/clothing/accessory/attached_accessory in U.attached_accessories) + attached_accessory.force_unto(U) + var/mutable_appearance/Y = mutable_appearance(attached_accessory.mob_overlay_icon, attached_accessory.icon_state, WRISTS_LAYER, U.plane) + Y.alpha = attached_accessory.alpha + Y.color = attached_accessory.color + U.accessory_overlay.add_overlay(Y) +//SKYRAT EDIT +/obj/item/clothing/accessory/proc/force_unto(obj/item/clothing/under/U) + layer = FLOAT_LAYER + plane = FLOAT_PLANE + if(minimize_when_attached) + if(current_uniform != U) + transform *= 0.5 //halve the size so it doesn't overpower the under + pixel_x += 8 + pixel_y -= 8 + if(length(U.attached_accessories) > 1) + if(length(U.attached_accessories) <= 3 && !current_uniform) + pixel_y += 8 * (length(U.attached_accessories) - 1) + else if((length(U.attached_accessories) > 3) && (length(U.attached_accessories) <= 6) && !current_uniform) + pixel_x -= 8 + pixel_y += 8 * (length(U.attached_accessories) - 4) + else if((length(U.attached_accessories) > 6) && (length(U.attached_accessories) <= 9) && !current_uniform) + pixel_x -= 16 + pixel_y += 8 * (length(U.attached_accessories) - 7) + else + if(current_uniform != U) + //we ran out of space for accessories, so we just throw shit at the wall + pixel_x = 0 + pixel_y = 0 + pixel_x += rand(-16, 16) + pixel_y += rand(-16, 16) + U.add_overlay(src) +//SKYRAT EDIT END /obj/item/clothing/accessory/proc/on_uniform_equip(obj/item/clothing/under/U, user) return diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index bc83eb752d..17f109cbc7 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, S if(ears) if(H.ears) qdel(H.ears) - H.equip_to_slot_or_del(new ears(H),SLOT_EARS) + H.equip_to_slot_or_del(new ears(H),SLOT_EARS_LEFT) //skyrat edit var/obj/item/card/id/W = H.wear_id W.access |= dep_access diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 9ac270bf34..6c3bf3e1cc 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -365,16 +365,23 @@ var/slot_priority = W.slot_equipment_priority if(!slot_priority) + //skyrat edit slot_priority = list( \ SLOT_BACK, SLOT_WEAR_ID,\ - SLOT_W_UNIFORM, SLOT_WEAR_SUIT,\ + SLOT_W_UNDERWEAR,\ + SLOT_W_SOCKS,\ + SLOT_W_SHIRT,\ + SLOT_W_UNIFORM,\ + SLOT_WEAR_SUIT,\ SLOT_WEAR_MASK, SLOT_HEAD, SLOT_NECK,\ - SLOT_SHOES, SLOT_GLOVES,\ - SLOT_EARS, SLOT_GLASSES,\ + SLOT_SHOES, SLOT_WRISTS, SLOT_GLOVES,\ + SLOT_EARS_LEFT, SLOT_EARS_RIGHT,\ + SLOT_GLASSES,\ SLOT_BELT, SLOT_S_STORE,\ SLOT_L_STORE, SLOT_R_STORE,\ SLOT_GENERC_DEXTROUS_STORAGE\ ) + // for(var/slot in slot_priority) if(equip_to_slot_if_possible(W, slot, FALSE, TRUE, TRUE, FALSE, clothing_check)) //qdel_on_fail = 0; disable_warning = 1; redraw_mob = 1 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1706763f6b..8bb9e78b38 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1176,7 +1176,8 @@ if(head.flags_inv & HIDEEYES) LAZYOR(., SLOT_GLASSES) if(head.flags_inv & HIDEEARS) - LAZYOR(., SLOT_EARS) + LAZYOR(., SLOT_EARS_LEFT) + LAZYOR(., SLOT_EARS_RIGHT) if(wear_mask) if(wear_mask.flags_inv & HIDEEYES) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 56948bfc0f..b6e8aee44e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -25,19 +25,47 @@ var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + //Skyrat changes - edited that to only show the extra species tidbit if it's unknown or he's got a custom species + //and also underwear slots :) if(skipface || get_visible_name() == "Unknown") . += "You can't make out what species they are." else . += "[t_He] [t_is] a [dna.custom_species ? dna.custom_species : dna.species.name]!" + //Underwear + var/undies_hidden = underwear_hidden() + if(w_underwear && !undies_hidden) + . += "[t_He] [t_is] wearing [w_underwear.get_examine_string(user)]." + if(w_socks && !undies_hidden) + . += "[t_He] [t_is] wearing [w_socks.get_examine_string(user)]." + if(w_shirt && !undies_hidden) + . += "[t_He] [t_is] wearing [w_shirt.get_examine_string(user)]." + //Wrist slot because you're epic + if(wrists && !(SLOT_WRISTS in obscured)) + . += "[t_He] [t_is] wearing [wrists.get_examine_string(user)]." + //End of skyrat changes + //uniform if(w_uniform && !(SLOT_W_UNIFORM in obscured)) //accessory var/accessory_msg if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform - if(U.attached_accessory && !(U.attached_accessory.flags_inv & HIDEACCESSORY) && !(U.flags_inv & HIDEACCESSORY)) - accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" + if(length(U.attached_accessories) && !(U.flags_inv & HIDEACCESSORY)) + var/list/weehoo = list() + var/dumb_icons = "" + for(var/obj/item/clothing/accessory/attached_accessory in U.attached_accessories) + if(!(attached_accessory.flags_inv & HIDEACCESSORY)) + weehoo += "\a [attached_accessory]" + dumb_icons = "[dumb_icons][icon2html(attached_accessory, user)]" + if(length(weehoo)) + accessory_msg += " with [dumb_icons]" + if(length(U.attached_accessories) >= 2) + accessory_msg += jointext(weehoo, ", ", 1, length(weehoo) - 1) + accessory_msg += " and [weehoo[length(weehoo)]]" + else + accessory_msg += weehoo[1] + . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." //head @@ -100,8 +128,18 @@ . += "[t_His] eyes are flickering a bright yellow!" //ears - if(ears && !(SLOT_EARS in obscured)) - . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears." + if(ears && !(SLOT_EARS_LEFT in obscured)) //skyrat edit + . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] left ear." + + //skyrat edit - extra ear slot haha + if(ears_extra && !(SLOT_EARS_RIGHT in obscured)) + . += "[t_He] [t_has] [ears_extra.get_examine_string(user)] on [t_his] right ear." + + //wearing two ear items makes you look like an idiot + if((istype(ears, /obj/item/radio/headset) && !(SLOT_EARS_LEFT in obscured)) && (istype(ears_extra, /obj/item/radio/headset) && !(SLOT_EARS_RIGHT in obscured))) + . += "[t_He] looks quite tacky wearing both \an [ears.name] and \an [ears_extra.name] on [t_his] head." + + // //ID if(wear_id) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3262dd5fc9..0096227f96 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -145,10 +145,17 @@ else dat += "
Eyes:[(glasses && !(glasses.item_flags & ABSTRACT)) ? glasses : "Empty"]
Ears:Obscured
Left ear:Obscured
Ears:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
Left ear:[(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"]
Right ear:Obscured
Right ear:[(ears_extra && !(ears_extra.item_flags & ABSTRACT)) ? ears_extra : "Empty"]
 
Gloves:[(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"]
Wrists:Obscured
Wrists:[(wrists && !(wrists.item_flags & ABSTRACT)) ? wrists : "Empty"]
Uniform:Obscured
 ↳ID:[(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"]
Underwear Section:
 ↳Underwear:Obscured
 ↳Underwear:[(w_underwear && !(w_underwear.item_flags & ABSTRACT)) ? w_underwear : "Empty"]
 ↳Socks:Obscured
 ↳Socks:[(w_socks && !(w_socks.item_flags & ABSTRACT)) ? w_socks : "Empty"]
 ↳Shirt:Obscured
 ↳Shirt:[(w_shirt && !(w_shirt.item_flags & ABSTRACT)) ? w_shirt : "Empty"]
Handcuffed: Remove