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 += "
"
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] | "
+ //skyrat edit
+ if(gear.has_colors && (gear.name in color_gear))
+ var/colore = "Color "
+ dat += "
| [name][colore] | "
+ else
+ dat += "
| [name] | "
+ //
dat += "[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"] |
"
- if(SLOT_EARS in obscured)
- dat += "| Ears: | Obscured |
"
+ //skyrat edit
+ if(SLOT_EARS_LEFT in obscured)
+ dat += "| Left ear: | Obscured |
"
else
- dat += "| Ears: | [(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"] |
"
+ dat += "| Left ear: | [(ears && !(ears.item_flags & ABSTRACT)) ? ears : "Empty"] |
"
+
+ if(SLOT_EARS_RIGHT in obscured)
+ dat += "| Right ear: | Obscured |
"
+ else
+ dat += "| Right ear: | [(ears_extra && !(ears_extra.item_flags & ABSTRACT)) ? ears_extra : "Empty"] |
"
+ //
dat += "| |
"
@@ -179,6 +186,13 @@
else
dat += "| Gloves: | [(gloves && !(gloves.item_flags & ABSTRACT)) ? gloves : "Empty"] |
"
+ //skyrat edit
+ if(SLOT_WRISTS in obscured)
+ dat += "| Wrists: | Obscured |
"
+ else
+ dat += "| Wrists: | [(wrists && !(wrists.item_flags & ABSTRACT)) ? wrists : "Empty"] |
"
+ //
+
if(SLOT_W_UNIFORM in obscured)
dat += "| Uniform: | Obscured |
"
else
@@ -197,6 +211,23 @@
dat += " [(r_store && !(r_store.item_flags & ABSTRACT)) ? "Right (Full)" : "Right (Empty)"]"
dat += "| ↳ID: | [(wear_id && !(wear_id.item_flags & ABSTRACT)) ? wear_id : "Empty"] |
"
+ //skyrat edit
+ dat += "| Underwear Section: |
"
+ var/undies_hidden = underwear_hidden()
+ if((SLOT_W_UNDERWEAR in obscured) || undies_hidden)
+ dat += "| ↳Underwear: | Obscured |
"
+ else
+ dat += "| ↳Underwear: | [(w_underwear && !(w_underwear.item_flags & ABSTRACT)) ? w_underwear : "Empty"] |
"
+ if((SLOT_W_SOCKS in obscured) || undies_hidden)
+ dat += "| ↳Socks: | Obscured |
"
+ else
+ dat += "| ↳Socks: | [(w_socks && !(w_socks.item_flags & ABSTRACT)) ? w_socks : "Empty"] |
"
+ if((SLOT_W_SHIRT in obscured) || undies_hidden)
+ dat += "| ↳Shirt: | Obscured |
"
+ else
+ dat += "| ↳Shirt: | [(w_shirt && !(w_shirt.item_flags & ABSTRACT)) ? w_shirt : "Empty"] |
"
+ //
+
if(handcuffed)
dat += "| Handcuffed: Remove |
"
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
zcmX|92~blB68#h?7*GyHybuZmcEk}}j(|WwBw$7fA)thDLr`u(0}6&?l31=IW&{D{
zGT{(8#5F*eph!YUm=&o(4v}!G;KC4u7_RUQIrx9s+8Mj5tE*pi_3N(p7&vUecEmme
z007%Dr~L2$pk=w4fS&dya%koJt<4gNI}?f)iA2G{!AVI;{(5?a!WX#+#04WG27?h{
zV&dlJ#^G>?L?VGexOnkmU|?WoW@cJi8U};u1OPl9p927BG}_0<$LS&91Ut>n&Q45B
z0DzO7ogE5=I(F>X=5ht^oXIAaRw^DF0{BSAVmF&tnW2PKznE)LR}+#`6UbKpAib>U
zekbBLM}yk~vXDaA;m0A%f1q8Xbrp!(7f-)uH?)-h+S(d&!VqEJrrAb<4&~oJz>Iod
zpb}5-Uw>3?ll3dH(UF&EeD()dQ-8!7x+~1Y>TZ5?)eQ#FEIJi$QRkXd6Svh?040ms
z_tqG=N8Td=*eULJQm6Gn#CB&2ak2ME)(+SHOOBSYD_@RmJy<@_5jox16Rsy7pISS5
zwkj^_{_wOtjde;%j>Rw=X|w_DoLK?|cC<-%Q#yT{sOTdBOg-^jKv;&&mtoDFyQI-C(tF08nuapN1OZH;?t9^X>
zT*$OML3}j(ind`k22_}4HSB7Z;KDbuU>i>sRu-Z$dd7zCz0iHr?t5C$?;ctt*t#jg
z|KlYsaiF`f*n`gH!$~?ds3~2khg=+&-r1{clOy@rGePF{qphTl+oURTXUU^WX3?xl
zj{|QncTsAW1vE##_d!_a&5zf}kYVleze_7U=tJ)l2li)=4$ed^gYHM)GP9u33Zz8Q
zTzW>ynv8&Q%&ormrQ(=sT90l5IHc+-J=xozU7AgZnWal`tgO>5RD!Mg??~SVE;n}$
zmgyP&btrISyhlQIb@Zk~wg--dD>Otu$X|an{d`qKL>xntN6oD$lUuJMjpv{z5^^yU
zE==io%Hy^sUxjRAX@19N=EFLab?#aZY;M}s&IOg1w?y;hTHm%mI(wYXT~x+G5^2f%
zNJz5IotDDA6&6Lp481?d>?xux>;$U3gXImHq3Yd@dp~&FZ;@pP1rK3HJl>hUw)Teh
zbH!{qt^zC9Xx{(hfeSr)w(_tVeA+_fQ2Odz6~()HEsFZ5k|I&xIG4>hiw?zVC@Qg%
z{E>7-vC;iYADQ|3^VEp8!i>An->%LJ-)NBOYp(39AhkAEztyP5{?p|}!!+?JpK2Xk
zE>a2B!y6C-ysp+L-+fifgC<4;%_m`nO8QJ41Y34MD?8dd1ZlNA;|2bOT$}|M#6~_J
zJwGlS{He1Zp5MQ`D3h(7NZpt*ciYXwhnxn9LjQlMH+D*^Coia&gV69h`(3I#UE-4#
zE2S>>Ob4OX9UE#pexWvIinaorsV^zcQa5NP%XB}t$Vf_7#N>qG-FG82!k-_C!0*b1
z;j*7REM|_Bzy(;VdJtv)*x>WR_-ep)RBYVHn$1T^o+|4}I9rv!V^Cr^U*M^<-kd&s
z5_&R-wQkeokti(hg{8{a<^}3;KmCL0^95tcw>aA8KK6F!ta?urJ>qHd!YHgJ$z3+j
zndJ3mZbT1Ef#v3$1!LtNZ@9WVUb^Z%2kuo?bCs$LT&sV5o=Sgz{O~`Odyv?T^-R{a
z0!`2-&v?FsJ-KJ2ffpmq$ot^I0o%L3QX=(_X5^n?+%U}(5LXkUdyu~KO`WF?{v6U_
zyuSM{=j2>=g?C=A9)*ARq~FOjXd+vWWZT$2jvTxN!FvR_0X
z^|!Qy4sRc(gScB+aZAPV6+i{t4UfY4Rub)Jb=2M@Pr$)2GA3!vP2Y>;Oj|mIVM<
zEY{A>&LSV+a=8|e1&6}{01G1{BQzRqW@cuZUR*5~pb+EciU;g?!y)p5MRNCyaR`nM
zyiB|lLyU|7fcT<&xt*}C!>VM~JpS(D!7}{UX{=R{@+z#N>4{1BV(8J}$jGV`9m9Dh
z7q=!fN)B3cr#^-6%7cCGJQ9pRPfAItxfzpwq|9Py}p@TKN{
zpL58#G6zpi*W+e?cSWwc)e8?qFW9Ds}k<6Z-7>>t}CIzGPC9S153=
z2}(SPYb)w;^gn#L7y;KZBNd?24kBVy%>AXW8#6VakdPNOl%aB41#QNkNJ?{{BLFCw
zIy>0A#}_RYQ_f5}X=2MCn!6f*AT(#W&fi#vN>JCYx_2dN8k8z7wcWS+%)cDT4JEvs
zt1);BJhXWKp0$uN5E?W$wLJW>PZ5WEcU4wu4*#Tnt9X;v(aluq1NsD=85(pH5vP7>
zK{K92_zez5n0+UVz$a$%I2)7m1aBuF7vZiu#ua52sdp6xQjnN9^#k3de%Gi}l%U>QezR!d*}v72o}
zCce^pQ;J9aW9@(;TvMX?N>BCThwcM$c+?{a^1RntbQXqh##BhPfe$@2X^T?J^{UAp
zgG#=&RMI_k?+-F4*23FR_3hv*#z{4p1MA`4ed~8Powkzll?#EVc)RcBEA^eUtUTX;
zK4+7X_4n)3=sl%3>V5xAWgjcDR*GML_~#bYT&;r5O2l3iUHj5>a;iNbo#F+Omc~~l
zO)ta`79{W3wx4F@)xrY5?a4TVVAw^Vd)SigG;mx*7tc*~_6tBMx@5kAaTN?$nBTDU
zgWCBRc(32`VbEO@qZ@5`y5a`>2Rl4)
zh6w?E{wP5lUpECieGnIkk}tx~Q>3~ySnk_z4o3eXg3Q8p7Ah9s7Z;B4F^xrxNwb88
zX`>TK|9UrWvu7@vBF?)ls!f>j;fUzrlQTFRsgtqdy=AGkrMrXgzowwowpzmM!mJ~g
zCoe)0tdZ!mR0cTcq&!ffE{!l4K7?Fi|qY|A=}=WwT2V-3K(Mn(}6?
zrD*67R|@ismB&Owf|v7exjmh$ZeBM@9{XkkAhHbGwE-PE>tC3iEivU%;uG7&JZMdF
z=#kj1pI+_QA139e9D5>wMB-1^w$+;Q!<5hdu5ZH6rQWm5)mibsX@sBKfIO=_vvjD0
z9?j=H0-TKJq(RF$I%AX_lRk>Y#7-LrwW|M3?f7-Mfl`*h1iVva%$8Bd;*#{0r4?H#mu!QiK1{H0$G9HWf;#g%O
zGY^^LaoQ7ZLfT?1j>ZQYrTo1Ry|$UD%hfsz?$e=`nih{G7jN*vy+Zp`E>ozZ%o1pM
zk4-V#smd1^G=2^t@R-+$H#zN#w|w)b}^BkS`hxDd$tIXbMMdjP07^*+0}U~8KTrHLk)+zC0?s8>9->r
zVu|go$elq6?6&UKp0}$i3feeV1m@9Gr^)9x7BgaYIJfTn?ZHoXsS`mWO#QVHNw&!eap9$C
zr&h*$brQYH$9}80JS06cDWSZGun9A)mAgcvQ~W$aSrF`u9vU*9DV+G?I>H
z|BJQs0D^ZV^hUq=eLkh|JJ-M4RDAI6G~0`G55{pzOD<=MPR=wCfuQSiE}F!9TG~ig
zv#`EdvAtruIZRu#fINRaRO0wo{$sW_6tNL3Jp^;m9
zKdZmI4^gt#K>VH&+)za|U+en(_!_tJ7?YItM|
z@v3^zz0==SLB5sW`dS>OD*cIV%DCOQqdDiATCeB!p56ZJ$7s~&z4_os**3a7D&`a_
z?MbmSmX8}4<1a32U~`XG-!{b~Z4_X%$kJGn`co{+8OJlz(BFi3bJf7P$yI0AwaRj)
z!Ph8qdKZH?!t#-Xh?dO!ahY&K;eLzB{a<4`Y+7YoLiFbCdASzEYHOa!J3NoWrrq>9
zie@NpCPd%Kd#H9}Aqmdb{>7bFR=O~!yN*UDWtOwe>fO$bYN{K~_aKK}`uUE$e5YXK
zp{iu;Z)3Q2GG!sGSkaVaVxMtQ+4Mnhrh?QNnZqwrYi41+R1YuD6@~%F*p!j!;m+Vp
zLE#YiA-PYcX%)h>KI@x1ITOCZh=7LpU2PNm?1aaYK64^mcCQ?Vct5wyv`zeFFlU3S
zJBHcrr`m)NB}#KK5Ba>j=!pw9&{RyaG5nm$l6=pYp8ST#KKHNMgKpc3PQ0I#e_oY%
zxSW0>`7T#K$Yga%cX_9CP6X!{`({R{VW$$yd;iRi)jz%L;=827ozzXKUV>@54yrQg
z>K6~8ZqtFT{sKj#WEkSSk=B*_`P$VGxTN471xDwGQu~Mgcge858*$J
zSVcY@UuKpiKhL=}{PRRG+&9p^*wEzGSwP;C=k>dVCL_w+*Kw(^uPTL@p(~Wwt$0}n
zC=B~DeoqGd^Bj8!c8-j%LVfG_VPP*L7ZzR&3=LUA@=i{LP|*CmMRT~Z
zmH*dRQE?8AjE+50h^mJ{Mn)zipw!4_-acAbTH1k>f`YMxa*Rh@T(2Fq?#9W%kwgm4
zoOCan#08u^Nfr!HB=7L>@VoM~ySqEHv#bZ4ATASAy+B1Za1;uz$NDC1q}o{u82n4I
z|JBuKD(Ab;q$b76V$ViK<|-%+ekt0Ha)(~o+qYD?uRb#}ibSIWuhY<^S5?s`BqZ26
zIq9CgoEjKl->Kdd1pkjC&x^P?n`?Z>&Btf?;M+4z&G@jk#l_Elb*6_WCwy{f5?cO-
z2pYa;+S;Ea(U+H(wy$12)YGGjt&jY(=z5)wPAZiUoHYOA0DVwQ3^|TG?YU(HY}41o
z3R%?E@sX>|aTdI{v_#S=si=fLsxVa|XJ%$zSZIl~Tg>TB&&*WN*42H{5<#P1{DNRK
z-{9j}bxFzdE@WRv$K9mlwE
z$J$cU#6;k2qxpuJr)SyP?(Wz%x#E4+8PkEu$-E0x*L^xc<3}}hyeDr?zg}io
zAv98+qNA?tt}RLoUB7h@&~(uq_+wIzdSNm#q5I@YkzGVm62mgmnp{*=v`MPEN2|m2
z9=#}JZEfA!_>M>u*!>kQFCQP+_-=h@(yE~{wpL%(Ajr#m4Suo2Rs4F}aLRMc#88k6R
zV=$ve&e4(68(j5kcNnCD#J$&3v{(DOlcvKXhf{soz6`KhK|>7jG8Ud}^&fpn%Dnn3!zXAPNiB
zr@R-Vy|Zc<1M69vo1333;x+8;-MI*qOIzP*jTWD|F9?^y>=9WPTQ>(Bu4!(~*2^93
zt_@^bj^@SGJ4}?^?OJwc#={-OJwIF@$|x@UxSS6YbD6Dr5n{>qxtZE_>WB2kJLO-@t9dDIoA+
z-YaEcY)UO3`D4ERGvOcN;D_{FY}pGbQeNa>*8I($@$m2n^V_Wx7bRFa8Z#TCoi()T
zdW#8RbZQ`C_5UUi3Vfg45?5YBL*v!7n)vj08KUVSC#)lSR)4*$5`6dW9WKPn%L_ry
zwMatULgO5f*w$8M*OO^4JcuKn82a|@oBVlsMOj(6&%sK1MFrjR@^Ycv`QXqHCx}a)
z0Sv|E`nteVGfGOX4cJ~6pYi6L5#ni#o}Tu`T%G`nyY5U${1}2#V}#t>PxnIS<-EuT
zI-j8WQk%OH5-P!sc*bJ1?_0Mp_qVJPCKAe6Q-chAd`0>CYX9UUUw-gTj#hT-^~L&&
zWud#yGqsyyvUd>e=)pt;KIDx)T`l%le=g950hVuK7<*z(E|A6ZS)&AvAC&ZLtvXuB
z{g-V0$iAnst3!u<$9$NhN!BDxjVx$*U?AOp*t2AO-+o#mMcU`NK8YjO@jIC;87?lj
zemg5GMGsF;i^jJE{W6y}E-ugXBX^FEUk}X86xN~=85kK`nu1A+UFMs#rTx?;OUufx
z&|-GjN%j)?_*}<~oNq<$4J=5R8iYqiko0F{aNNZ-vxb~ZRq?4cobM{oHcK)#c+;RjwTG!FMCDvS->c(0LO(FaWfg>
zih$XZAK#YuBww*PCh0ba=&v80OR-zH7bF4kDzJZn4d5EfM)%iGXYvzeFFpmcdLdQx
zjW$wlHT6!lP-`g*=EJG1tB)EaUvfp?Jz7FF51W*{xWS~AkkES>-MZ-7EJ+an4B&$|
zXLS+2-%m5P&a{;|`!rEdbWotibaC?FiD;ff$(`tddSiJlG{O@R@1g@
z5=5*O2x{f&>VQs0h->jFxE-TWty06kOpT2Bs)Ve_ck{0p4^2?~N7Cr~&m~1{-uy3T
z*8j$X#7k#W1H)!~b+octiq8wsP*?Bm-4vA_IBEq`SPQ*EJ9OQC=1S%cwR6UDkDNl=
zpf$Htz*SK%v=n*WYpxjsYI!wotDjF^-~LlkAK2j!|9L)SmcCrj$EmHADT3&3bg+BS
z^B2C*5A$c5rn3wQsLN$CRMoo3)_XGxyZU8K^9b#AFA#1QQB^)>#v~qGh-yFuxXeh2
znN~CXUdCK>*(lDsA84L=bq$=xa{WT(Xv|+M7GDt081nceJcgCb-;buq0)Z}hegMonph*pFe3*qX5|9xx;K;4cOyyy;1Ap0
zk#YN3FbAUL#&~7W@XPv{Yxi{9&h*+Gov{O`ce=EnM|wjLOJB6R8dxDDHgv`!ZR@Kt$JPDBxYji$hYOgt*5O5a_%dn
z3&_er_@z7>Tj8tlx6Z5CeX@aRK#37NK-ed|sBhK>0hBtU2#w^jwRIzOdB9Lj3UcP=Yu4$211ETQTHwYa1p*3~?
z@bG&YK3!7px*6Ba1?2stq@+)}H~|3x#DwoIiO89_aX*}MQWBH4qvl;IA6fgeO_<~3
zz6q?NXqtC<1t)sfh<3T3GO%eq1x?lN>zeoaRr)L!to@dOaShSc5URJb3Y5MF1<}H@
zX5Ui%QD$f94F5yD6_;9M`}tbirbMo`?)$gFtOQOw%1(_B=T>%x-Ir@MyO9C7m8XjPr^uM4
z#UAS~i$>&gUQe2L&$ET-U#``>xHOXy@~uc|ljcX1?0bjq55OSQDaP3T%dS|I1bU@r
zmhPZjh>%5fNj<9{s%pH;67145`BsN
zyfYNw(lZ7zIZMB#hE~K_a3JGaZ=|8wE8P}W=1V%rCC}LVRHRyH)RwQdMyQq4SXM?X
zl&{KeKn_YFd?xF}KX(=bXSx(`BRibPUikSbN>rA}=jFq)u3~CEWi)Iy$-mG5wlw=D
zt#K*S0bhjp>#XQ#{a&qnA6o=3nzYWF`&@y3t@I!gIn0KA&4^H%YyLV=^e7fh?Le#M^
z^C&pX-@kvOK&-iYx9Di=X)9R+vX!%8c?fcP8XdN{Z>QLo+H?4$FnkC(w6aLa^&$0Q!0#+wqsGG7#pPqJTy0q9pDN)Wn
zc#nF|HF{dcD7~_lt~DV_ENc56eV81>su9m^5n@NBJlC!
z@V!(2klbC}RJwWXfxG+fL2-8Ryq`bEUCVaE6**!}`;gm3&V7%q
zFLM4oO|&dOy$qy^R*nu&%ezL5|9)(%Pr&m5^W~|V+-@mDOlN)MlrP*UKWa3kChBKq1
zA)sJP|Nb3cK|!H&q3uPntC|xq$X%Xju3uoWrW!6u!J
zh1t!c2r%h}e?DcSqXmZkJA8K>
zS?y3lH^<4znd7Ky;yr1pZ<*aCFuBwx8OMLNEXQW>$q+`X^NaSROK1wJz5B&q^|xtw
z4N0qXLU5&)74@B$=>jS=R@7{mb-_Su^3jFa$8NB-h}B`)lT&|Xj`%y*!rvnsiCCdW
zwCQeNHx|5XZQE}+R+^Tz3i0y#j;tQg^G0IAqr`rM#4MP#p3l9b=%1c0@P|#BAp9kc
zJYg_7Lqo&X+Ev4`ycmj`M5$axMQ_UxptZvGq;KRQ(8hOKJ_YZ@__+Txq#9X8*6$yt
z+pFIka^jp!33HA$FfuwP4r0#j3mkXfJHLeXY~9@tdc)nceq>}U$U^WEeqYgR;TO+6
zrxq3#w5Nd24!d=+rtA6n`hHr`)YL4t1m*6?!D?Uj0>5c33IRf=0$((%UF|mBN-G
z0M3paqPdh@#9Kdk)2%ROKrFv)yXX++{6jeLYss|wN_=ACN!QNKjz+?#PqmUFA|7yR
ziAuEx58mkien}?HLIEzYe`F+>fQ0s2Ru*BnBJOVO0XaYi5-z2$U%wtEwOdQwkRVJx
zDtyfuahf%Vl6O0tJ~O683kV1p_CflKhSo{Vr3{c;(ZFp8`j&}GR89^m)uzLE1bZ$S
z*bGQeFLdD=4;ozbeP;@5m+_Z1J0JYT-b)(N{~xEr2*g-`<2H`pM}iG*{Y@!h0G9HO#gxN?c!qL
zy?^0*|1;JA)bKwG68_&fh;3)BY0;P7vk4Y>(3>}JO3%GBmL*?ob~pB11Y%;=^Wodb
z>B8Dt|H0X!yn;UEi|`k!nCQ}i)OLoQ2(dXOSD}9*zL^{>(>ETb^=i{N70y{
z;mQw5-N3*=6}8@v#`_{3S%FP9t*d^SP~s0lvENC5%JI2aM(c31(gYKSW(a#
zt7yduX3g#v#rx#Mm_2(IH?Z$uSYp*tI%=a}VUZsH=w?)TdAaMRhX}#?3(&f=$3MCe
z930#kTR*9kIiQj`u$C#DGk$!2DP?8KyQr?Dp(G_7a&o_OTQzLw~gO^g3YlrbRS{Ry?dJRQXiH7
zcwz$)?wf`$x7jF(hkwS{N6#PmY7pVRNdkdOz&Vg5R^?M-Vz!B%sVRAETjn9fi|P!i
zk4F=qz_@|iM@dlsa+tWc>{@U)H!rW{EdhxlM|{67s>rx%AEEl$tSAGFpHHuFioL>b
zxijIUz_{wU57rB^w}@?M;VU6Tc<3+_a@x
z+8isU2_eH-f2*Nla9vE&-p`(@+Pm_R^#3~w@FpgH`tQ8)G07N)&sTed4^V?KPi=HcbV7b|oBe%RZ$Z%a96zzqjS=HOD9ecaR7
z*f@-af;{9BCtiajt$>*K^zu?T5o><#p$vTU>60g=>cPcg93Y(i%*h#`59BZ;aV1)a
zUi{O3ZpFE!E{@|AMjx%Lb+Bbkb@gT+DHbS)VJJeI!PKzJ=2-tJH%QOKq^PH-mwV-z
zKyr&5bR+$l?O&mXJHQEpFF5-F20J`DdX??8?LiyUA;^xU?qrdZdnH;X@1>YAuTHyLaT*N9
zpmq|fr%#`1bxBG|X?Zod+!4j{Fd6hhnfB09i_PeQ(Z<#mKBO;1-d*kiAUimyxlzs9nT);b+1nP_EF)yTK<s#bLav}qd`1+XwOCR+((5K?WX+7;t
zlZga}voI@6iW(XpzhBrt60ZPi2WghrU$lQqkdMR#p4{4`r?Zz$K`Z=oj<23{IMmof
z43rI>UAgzqiI@2Q1AzNK;-LO-q!;Wl{uh|tzmT$wiRRstNL!Its)xoZ7x61X*=ei8
zXne^F{w=+lW*7q}x_Onniq2U?`bp{ie!=l#~?K
zSo-|8ohs)E{r4J){$8E?+WMFH=M2%PuweC77!R-@I3M&V4JS^iA|;~4|J3aVL5^sk
zWbR@%r+b8QW=Jp3vyvsny*
z!TDuQ01J7j5*sBHH+5_)k}LAs(Xjvu(#lrHfzYTnxdjE*GfK#OqQn~dc7*C`;-ZcG
z@j1sSD4#5`Zx!#GGrFh_#oE(|0wu8(^;~BaDqOLtUxG|UCG#$gQ!1Ksg7F$NEVAIP
zddmHD&!w`uI%YtODQal+eL0aaxG1Zr;OlE#M1~nTRS}fTeL%)COJ&uu6MoQgS$b{c
z{yYaKHJ#co67z0L(|x<@tB@
zA!x7wd^LO=+H4`-}FAp(J&XL
zW5=5@HVMhe$-d33EG%MMeV(g}-vQaFsjvUVx9}W=*OArjcs?CCk5uKpzzNWDOQ}AF
zAOHt#I23u_fuN@OU;ENl7akseDpp@GLW8f#f-ZbLDCO-3v~+a|&rQ4~B_&HQE*L}D
z0Ru-XX#9m2nw*>jQ!o8D3a{{j1-AoNd(75fNr|PzQt01WfZ$)WlaeY3pNpbOmKeDr
zz$sJ{?vpiyYxN1UBPI=!*;5aY%LY(tG#!-*>_4h-Iimj){{4R)w*J$A!hc7RFJfI)
zRVAcmbLkMP(GWt$sCfIIQX3CT*9QT*UhQk!Vux*2%($fc_%Dlh?ah3v0_kdF|;#g
zr=5EG7awV{oIpkfKZV)!*-|CEf^|fWor77yd*4r^=GdnAe*oACPW3T2mRJBsZ9i5>
zrWf<}RvtXU4{|ZxwnbgRqOO13x>)C}%?E
zx_Ww8_<$igDX?D7V@OT>D*&Oxlr!~9ZQ}=-01g0Xb{VHa7$_kJE1_p5CYOT~zisMm
z17y#viGg$9p%pL`DU|5U0ujdl7A0|e_HAg~y+pPzt6s+MICA&viW#mv*WMte#)TdI
z)KBWk8zJ0=*%;aC79b)>QMXWDlHb{D7Gi44IF&&8UQ##x#lQH8zJh!g9bM_-ia&jI
zv5Rnth>;NoGMlY&>mE}VVdLX~(||A6puKm|5>F~vA=;k4M!8`*_76yg0d1ta7@kMZ
zy;qQ+8A5tz)1ynf7!e3yn}323Pnb>{Torudh!5MpAO8p+q)p2tXc~M4btGW+--9H$
z5h3+A2*Q%Y`KRAU^PJ?jz-8jT39>WzUWx-1lDfsV>N4#_sI!fD%jlUzza3}`?M*8a
zv%=)_qUYx3-rKNaJq>i}I>Bjo;Bj_WC!lHCt2~ph`Ru91DqYfJ;uKMvuqyf-T>sL&
z%f?pa3-in}NRJK^YIdI-LQVbdkVYJv)rS^gigwus@4jaZoF|63g&GP1wK4CZRxx(7
z>0Gg_x^h`
ztB*52tlW&SO30(Fe3xkCd^$Hfd-WCsz!5cpO>DgfWF&m7IB8qza{mYeG&~5|n8@)U
zaF4%R<6i)LObF)@4W_ymf*M+*8I?c_k*`$Ak2u+x&bwH3X$~QKF;nZ~y|!gAS2Ih1
zI5&|7_L-TP8NTp0SyHMntM{gY%tIa;E`+KIOW@vz$wIcXPHsgXEKf)#i2Xe`KZc~7
z9ROztoy^Mm#8hJjHOO6T=t7UAM4tq+MyKJRM%z@9SrWIsI@6*U0jdFfu6F6<9LJdc
z4SaI$U(Q&s1$F
zt2pub|XGDb1tO~f<$$LWYIz)Q
zO$dRwQ~xPB`TWDs(6@Zh+M9i#dw7rpJ+}tFgdu}~RS$czfQ@3KqWpzz4v|VNEfw0&
zo&`&
z!{PAm`Tga)1oa!Y!`84|>rLm1Gsk%T+M`y?#wb^`6GUUJ5w>GwDu(clL{ws)fvZ3w
zs*fILUTM&)z@>|s7W$TR6GS8{Rfl!fKu`NtuZ#ty1`%r@F+xQE&CSKYB!!_#t+%G>
z`#gv1{vrs#bgvwTq1e4GqUYKQZ?x=RXnd(3rkmkza{Oxp3;z(L~okuO8*VCc#
zF6|0jQBCnTT_0$-1q@5q+Q9r<+t^65t=mUIw=Wt*O$hc>xl3&xk}s)~+4ONpcDN_p
z=G{-_Mu&&J6b7E02g<46d$-);>c(HYBQNVU(uPMby1$Prik!P%{g*;7a!>FdmEHfT
z5bwXC5U?7CfMkQ?w$bd1q>qL0!n`{4$UbL=y;s?+Ts91&)5hf{3?vp@Fic%17MEM|
z{iun@mXXY5Vs@uMyKpDBNN(!K{dZO$EznAlfSC|piH!yn!>XDVAWP{#Qk%e>>NM`nVM9^XsPj7P8o!;)0mzK9z6vxsfo@Q4BR=cfeI0w+SpTOJ~CxutMdZtk2aXu2M
zBt3#4k%qudzHd4w>GJA%m5tHSAqwx~u^kqPDzBN@lUfc?w5GcDBT2kx#5#RuM1sL>
zUwGCIRC*yBC`D?`%X6S5i@e2d>B?=zU%-H=SsQU7Y+_lgwTt+n(*X9QeERU>GJ8{R
z=k0nyAMPodA_`VNhD6J0s@j_>Y9$~=A?j#+
z5`Zk8!UwGX*Lu|VmXi5HrNT*NxW;lwRPr4py5C~r7mpJ|PfHF{yNsg8!TTYH?!GNL
zy<~P5na3w+OwEDWbCxlN=8H($H}i#7f{J5ozX{DNNkU-aTiNx%OaLPn4KPr1tj$9p
zLU`mYmjoZ7HHZDr)YMO};N#vHruk(1DWI^9DOmUN944yXa*~wQKS9jTC>9*^n@mv`
z94Bz>^kgv!!YX8TB{8O_(9{S6={DJ;9b9l8K=?FSCM|GA!u448!Fy;MRu)*$;F9?H
zH;cz*=N3Z{i5XEy4V$1pvl~mw*rrSXbswc6d`To%zIA!C(sb10wPpYULyQaX^8IIYY&S@+(z6DY
zYq?_go$h=x6}ZC`sAUk|!mf_PCKDx`b-#{YzgkLyb>_Zh#8gki-kN(V(%Lu`Sx}qB
zLt96Fv18g$bQj^;dVQd$LB*6vaEj#5>A6Odx2je%X+PR6V8_Y!Z#k|GUj+
z=sKJl*P>aTt!J^1RAK#ycocEBT_6z8I3`UkcZznGu-e^P#xFJWYm9Zo
zMkl-V)X2W%EL8iZo~+jcQ+z>2N)ve7FNg8#qbn+CG|-h0B(pv5`M5&+M^dQaHE$qL
z6$%LivW!x^m7+syX%nLHR-0hCN0(-;`J@+ZU;NYLFt>)SehC3&Q&h@1si{Mpk!t~H
zU@Yn+L%bGYT=2jw4X75{GJ)cfXQq`KuKNWn|CXUDFFqtMO
z&Y=S|NLJ4sdXG{2y1$QKDu~^b+{H~0OsiGUz3tU(^>0;k?Y}7F|BdkZzaifK?X82*@J$SxXudbC^du``(MxN9Dfb(^2dR2;yw0zp
z*nL%9A+Uh2d_>h&IxATL4576zAkc6#do#^%=j-U1!+4c@Hjv0fFLx#G{u0NLOnU2a
z7fUH|0_H=?YsX`W?hUY3p)-&g|Dv0!@!A#JKR8Hz(s38Nnc{#e<~+lnHF<$Wdpl>D
zNC|^2Zp4N>Oiw-b%(9c^ct4J%gsqiq0qp+~WT4T!_O@y{(4e>W7x#td1O4G`Fmj-)
z1)|XCN#}YKNZ#35NIg|@`7gW~Wb=rt^{k=fth&_{8@ffb@wV3iS`xFhX_mtMxNbhc
z*Qde)wxg&n{AP+G_vB6Ced_he!@HVki5HUSk7kTBLNHZGevy#DHoHki-u;@0Nl5GvF9NEeH}dA8
zc1gd)aKI%2D*QE8NhIYJvq@I6@~WsvGO*g)4F<`xQ8ozoNoR_zfF72LJd~9_I@=#k
z{TMJnmda9ANM{qdJ9oYvQp|zcKDcicFh=Yv-Cy4U0MOFh94glDF3uQ7n0d5l*A;CC
znwDx$(enSvXp-nyU5#w1gMD@&6e2Zl?GvJn>^p|*CJpsPevX)2p~Hn}X?h!j-*iDi
zCxYbio?DOIKb$XXR}AVm%GErWM3novFUoYl58hgh?*ns`lHD3(roZ0M>h~wr?}V>w
zy(ju4%!q{a(`vLpP+g`E6aDpP^s_s3C$pRvRUJjvrjn&(I4a7qN**^*hh4tqJ^&~K
zLIfxXxXa>?MAK`qeJktIuT(|l4hv~
zq|hr2`VtTzkEA+TKsrHRo)1h-<@2NQPoW0#sx82~Ke0p{jT%`l0P#b?r0NcBWD5lC
z^Fwh=mx*0E)rRQ>HQb+1fkfuhr%!8F?W1o&@?&Bcw92__$-?a^e}xj_c03nI1`1ka
z{nJk+5#A@OpUID&t?lRN0JlCp#ZF;J!Fp{n8}{{yr`i9uLV*?ep?%X~?#RJfa%<
zz6(RZ4MFf|T0Ll7J>rFeb%yt;W)T$R_GdMC#`H%!
z8ygP;17!tGsy{KD!h0WiWFdzJsN_rpfu;^R9I+_bNs$tta8kFa5q5&Y+EeohoT~}t
zJ@3AXh8N=Wn~>HN;5>?Hn8k;3enWs^XN4p=xDsNNrI=wE{#Jt3E6ZJ*(2@b2$>c@k
z`Ntu3;G;Z3gYggI8KQL!@c$uQ)~X3JoQK-pQ%~|2;Xs2LjhX>uK|@Hc&Ng4Q_c4_d
zwL1@o@^eTE=vH1Xw@TJJl+#M9i(L}xahAACHLFRIJu3c-7P-@Q@
zXLn%I`j!{9KMkkune|=39-9)~@hHAAyTv*vxxuqqn{8BR`6QwaMWhTjy86OI_HsW^
zK@3NIAYk-eq4#ov9#b7jT(^ZJ1`djZf$R5O=N+@OSGd9WZnM16^C4^4g?+k6q1*H%
zz89#nbQ9vPCv24c>r^NB@aO`z-cS#_GcQWF?gscFg36S{LWSx`$5`92^T_jED&e}h
zG%|@^U3C-7xNuc>kO#HI5-1q7d>93zRg(F^`pBBVHi&qBV6Ohfu0w
zGm6?L*KZh?y0>0S+#a~f<0CF;BGJB}cOva!@9@}$eAEbr+wrjW*Ea|%HN_`|@ZP;!
z+fk2^?3xtXM6l_f1XqlXf9Pc@oH}#&=lp)oVQ%hlK(JPG%XUK;2P!z3A!??Hh>6vF*%h6&x~4=TLe`$Mhq9arvj>0``PK-=oUk5?2XUQh|`#4*W-)JozT
zHzxh9C6&U-Ad`;(-y9Zt8x!wbv%kNueF2EN0^~LvWvr#e>9LFFr#cOPs|G58-$1|c
zuj;eIRTAf)twHRvD)9RMRRI!at7~U#OF3EYNDcjRoD>`A?`KQt4L_VmdWo~ZGPcY?
z0jG5gSeC4S->J4f<(AHq|sB2Z-3yL&KUz&a=pvSar5-Ns2~o0^)2C3Tc4fu3@CV01J~dS=AU&fdQH
z-)9H@uH5x|Jw|G$q1tovx$_wr8Ced8`E<2sE3?;Bx^yU=sdwWzBA~_kCFOOmMU)2Re%qR7xjO&)~h7
zh)5XrQ2O91dIyyQ!XZtg<;MA&m+sB|UF0AmWQMm(EB(1=c8mEB_rSTH$NbG1o
za9oFCn59C%xRB$PvGiCoZH^X%9G#x;))(;}-p7s|ee8_U?M@b_h?PTE;y~DyRL1sE
z*=fE{z?!p%%d&|rdI}2f#w(mzZ%d)ikGJuHhEIx&DxCiMq)NEo*6~+gMs-z!I79^m
zdL0{q@jg*biC=iyV3%h{$5SOCZJ4Xzy8MvSfB#M~IJuwS7wIWCmNw>=JdEgWCl`M2j8k;~B{eA|xA
z4IkD0RTx~&?Ahf+nDebg88m898QcY6*V!bka+M%JeYq?miGl#_!k{JK4P2(!ZMidl
z#XNd;bo4XB(dYaw?LUc2_Fb@&`CqG<@1l|gvsFPml);1at%E)&H56O6J=50@vuum`
z0j8U;&g<>J)?f*!dDmxw46sBKdp~=6da#a!t-%XTYD&`xDm~V(k+VnxayR`4&Iha7
zcSIBmph)jr&{xqPD=@NA1)jjc!{}bT{HV|$IDADQtXxH*ATuBMobXHVedSY6ye$i+
zcds^Z1s)zA=&iw;H%hnnt{oq40YN1t@MgW&^RreE6+G6D?}wl*T;Eje+-K=Xosb
zVsX68KC#$q*K`>PfLuPTQT;C#S@jGro{rx5%7k%Pddd1YZ3EdiO6(!&R+AsA&I&uX
zEN{OwF*6gwhBfV&`U`}^g>3KeqR^tu$&`E3`l68gGto<%+e0$@PW4@VwLS-=T#P`F
zQtmn?Y30ks!Fm0vwI~mV4i<^mEi#P;G1*~?wHg~Pn?orU0mbGq!unu3-?@BWkZGcJ
zQzgr1E$V#hcV9$Nz_z{Ri|y$eJ+PQw)1Kwt=cs@(CY?VkNR8^5*!oLvvu%{k`D!Ce
zTUw$_ui`A6tWWklABbSQ*V02t&+q;cBgiczh%1sY*aEXaryc|1Qd1xuLx&`*iIRi8
zKV-N2K9du1c~np_t<7w~V1{`y}kJ0Lx(@UW&GLoiBRJ#uIFsHWsqz>L4adW*F
z`gP7%20co3;Q`a*>YRUt*)?1!GAw)b#O6NMv;&zcT75dTtkS@$Ikou&Rn%>>X_1}d
zZXOe|yG)gCjOxq;zhsC^iig&>w`uML>gXht)KKI^v=IhnsmA0wfZWHg|BJ1xHZPB4
z)K7S`{ec)KP`ptYA*$N%W1Cmjv;NTMCoe}`>4@h#8J~$Tv;bC9rFOrQk1%dZTq_{+
zCI?5ScD3E@>PTmMa`o%zQKpyf{$kK4s!ifQfR`xtIe2N!`tXH~TwSf*&~4;Gq)?31
zW&S-PdlnG57l7OeFRqp|s&HKe;QiM??+*n{I@OTns`~(vX5fe?ldvIBGnQW(td#or
z*PB9muYnfY#i^u{9{_eNj}_b`+LH~M1PSc7iH^S!%VnlUBqXmgB_h#~6uQBbB8vuR
zqW)HcA__VQ-2aL4-0d7bhB=sWI-T#67qpzHwqrqum)TLyc);6rEyoH?7QmbYk^r6A
z;KfYVOWRA^TC*;cA2@?kIL00_yov-I=!L%NdrO|yvcJD=`d+6>eCPY+87pZdha5Ot
zQ)KZw*`WccM0Do7BlGXBtgx0Fb`{+O*CG#KqD##j;X5(-y!V;SKIkn;NgO?F)%97$
z)=#fL^^g5q3&2s0usW20u&E8Kyln-M>bX*pG#*=|o2XrH6lzqO#dj@zcrB0mgtbCU
zwuEXR74YOhU?nS!=MwGxFFDjp&NQ6LR_T9#%j6M$Zm$8)XbWlPw_R2+(cAchc4{;WTU~TX`=1Uh9*2aD{qrb+0qwnyLI23ljBjQ}
z{%gzjwdKF@xBtqc2|Bu#lI`sQ|1ScR^BAwQX)pX8L?X}KqP{d%xapvac#wnl-
z1l3pwNW(l`jq9lAK=S!BH@8W#YVBr4O<5TYP_}BPJq3+7wn?G0$ynxHzzY)9t+uXq
zclprkzXRK;g@O`U4INa=RXzXFn5=x`n;BW_wn?yy2!yf~(zWw{Wbs5mOlACFEvv?-
zcOSEUUxLRsBn^s>j*doP1?>kw`uXE6C^mis@|>TaCtS}^Z_`Lr0mLP=ngkhK7#(OP
zbb;8>a(1*i07T#wvw>10`0WcAP%O&p=+GQ*PiB9oOhDqy?aen^MxenW`h3$m2Iy0Z
zMq;SwDEMV?VMqgmeTKjGW4-sA{0Oizy5lw!G+L<(7JuLdl`pWmAfUdkE^08NL56+)
z>Z^YtXP}>7jXogD?`kDMATWz3AVK?nbF|PTvI4;GV9$`ts?PCyXrKt5J2;&~ddEGw
zNg3G!)bc-WA*R|Q>4a!O3dey2T(_}(f3DAGeuK9_t!XcTev0Y1?!F4Ch?($+IR^|}
ze+a3tYMW7lc7B8;E6!E7&O8FmK6hv)F+|LN$)$CD*<`}W-bqVznNXf~0z7yDEFOMB
zQx84wvu1xK(EGb(9R=p9toNSz#wiFOLpP!p#NS}u=m;z1b*e^v=tb#*DgjrX
zmyS8OvJA;BBt!%i*sy~J?KxQIs-OT27lQ($18Hn+YfI72jt5jH4qWHAO$2dHy
zYRj&sda&Mr3y_Gk=jhem$dpN0B1>D!<~Gv@I|7Vs`&aMm&-9h1;@o-lww;H+buZYm
z-Nb`Lnb4QbkldCv9<#;z_Tisig;FNy8;10~CiVMyqbN8G6;!@$s$(8e@?!4Yf!^oo
zUpLm)aAL?`aW^o>I3LYl(}Lt@p?*2yl#n#kQ;UcUTyrOj{ZrQJBAJ~}jL_T@90vja
z0;Qi33+}gDcGuP@M{(=HV=LN?tz>ii2*>;0*P_ohf31G%x&6n`-^Z=e<{bu^0?o}vdHkF@9eT_P5vDm#N9NA2hQ7_Dy6rM
z1lk$u(JcE}L_p5^vpl^b-5Ch99ue|v5Ssz2lS71w+@3!8wIm|JLHQ=LS{U`+TlNE2
zZf4II)DsTVHr)#ZvNy1P1FYVxH5CH(#p+E^uK`ZXK}r0bfsz@yEE}ix>^@V-hNju$
z7)g+&pRBwEu@7nh^9AQ8Gg%@M1f4c!3{c50Be(P0SfSn&iA-rUP|f@SSj)c9+
z;c;8Vb${|^9>Le;zKWYD^|6aZuAq<@jB8qM>Q#iqkB%Z0!XU+(Gn9saXs``?oUq}A
z*$zI!bLp?;OAoRJ@LUUa75E!I&VG5fB_9v`3q$v>&;9Ki9X)sJPC8%c8~FQKI8M{4
z(>wY;@6$Qs7ZScK7VU-rMG!g|@%%
zYcG!{bHr72z#5jlP#;W~UZ6x+ef@62@K>TuQL0@1|8d^^)o;bcnm_rQ3R>z-*eK<}
z0xkylot53ZBb&nfe10ALyqH;_9mQ($M#1w%1P}?H=i5Ucv^)FySU)O&wVyX>NoamMZpbmeC)86i&S`yrfL^amCr_8&x&HF?
zUlQ;Llj>Hr4m&%$jt%V_eiuMs58a^F6C>tbm}HjqzrVc?!hkhd+_ct;Gmdc8v@Z4X
zYnk{V$F0mc^~Z^^y_MB1FYZD?W1DIMkwE{rEV%#{ssXX$GYBBxe;2YjPl5{x8vt0N
zjPN{Lr+fO#`~jaoBGN7vrl%L4g_8BITLlqv4w<4LZTen6U&qJ4W(@6iHJC6E8?rjw?LAkiws1e@yNx6``LH;ve>l}gC
z4QSZBpn|#q*((8?laPQW3yu8_a?3|1ErN%mexDGh7*$)kKerGn!TEGy`SxH(Ps7N_
z=quI(nX4|@u4li#8f|QC=~zU`OxF_Kei9e9B{?-Qq3fR!?@~qE(nLJ!{i@E~!7bK%
z#NuprMRt@Bu$ukl^F--vnsTSMe);0Jn+9)jgRT|2DrAbCVx0VgcBvf?YV6m5SHy=7
zgRVdV<}uC+h|`yqbF$(o?!qQDCMRxAEj0EAHU#et+Iud8lk7FygJtc#c)GM^AVB)w
zb9kliqMM1{OqvXf0#b+AKPsY`(?9;qs(>S!Geh1dM$wU&ho#9)}(e(R5!Ep+x#ADwulVx1i0Bs+!LC{IM+6?aEJtl3Lfl%jZEdj-;#=o;j@|$
zBhHda|08|Xz;dv_+~BZ7&$iel!4!I2n&`rk8Z#p~S3giRep$nzS67N2i5ZYiATWvo
zjxxsYF`S9ft;sX>Pd_Np*Jml+{M4(#Cv+=`9P(S)6QT2Bw__y=3H@0Gu0*1y94pgl
z3P|KiTM13O-BEw+E_!QrQ#L@vnDjn$^=Qs-es*tNOh{~p5po9Pp77fVYn|dH?^TDw
zG7OV}DATZLxoLf=qzFl(32sUf(QV-na(zUUxP`Mjag9veZg{V-J5K?P{X>9IL(Kq80;~{fyGNt
zu189hQBttM5$bMh;+FC%;)O1a!I~mHiwSLpkcGC~qQ$YGNKABeJaE_%9W@UsQB2oC
z2x_j00yw0fAbT5RU=s{n!WOFx{tONeODP^MF8bU-Bdi#e+A*VHc@@WAP&sqtsm%oL
zf!k@~4m7rwsVDnp?mZ)Bc)U};UbnXIi+z={x=zEi8ZzLrQ)*_
z;)pWuV5(i+Sfx?5QCTG-X$y0UeD$1i!YPHF&a6m7LrZ%y*MvP^{V>ML@q>B&P@xFw
zd|Y|zKjYhedZf@OW_aO!kCf5+1;(pd>XS|rWWnFd`QX7jEXt?RvIT!wi2KdsX8rM|
z?y-10TRNl`;)?XrU?y1mTD0MQ^HX`a*F%k*yOFds6zO^u@^HVAnB`!S`;18n90
zI!Ymm`@i(CY6W#T6YY-mc|AJi*1)0L6<4#(C>ibFMMo`kSr|!ah0wTMv}55jdHoWx
zZ~7k(*|I~wc?nIxOyg!O*#LFB8~o7Ll{d?t*o_)H|NZ1w-kEy(h-o0`i{LkXz6hj*4D-wi~
z7SC`~V!E=lGhibKLN&M!sHTK%u}!ZVv%Qmqp(<&1RKvFfRw&B?fT2>1gf${Rtkuy8
zf&-5$uI^8C`X$Jmvz1{6Nf-L@0bIoT`pH*w-0A7*N4B<{IN_b0s_$}h1^<4^&CKl0
z(dX0A)wNfNCV7qWv+hmi&}B&D&$a1@7HysYR`<@WxPOM;`pk>3Jh<53tQgv|Y)U9xCduU~wDc8y1FAg#72`9CP|xR62%M0EfMBr7W2O5;QxhX#?SKS$
z_^4wi$abgXQzR4`otob@h?<4}nfQIMdfrZxd_@yB2#5Mpi5H%r}K
zi~z4!uk<9Tu%sQf(7KNkLqZwEzRfJ)w?-m!%9*I;(6Ef>YOI5(>KGz+lAJDvidDzM
zLv(CxEGm@l`Sa($SNqbipcLCt)XdXyVr9vkaz>hY*R)l;AM*bCqdSs=wy__Dxt=Jw
zFl+nY8Dil#&Eorhg?vXVYH!8tPt8GFR-v%>NwN;9ND!aK`yqIo_va;hjp2n`Qxo%h
zv1je|UVOY|%AT3~DPreCdvD&PHZxfWw1(xZ~(
zq#R$RJhqI)UmzG%vP1FN;(N(+7vUXT@wMeCk_8^Y5sN4d2Lra4Gjtj|gP=&}ikeRU
z$4{SZ;Ne*GN}=-6WGrv;(MKf>Co|5Xp_l$7^dgXxlZ~q;qnI@uT3uaLPUY@qyKcle
z*LwFCJYT+i0pKoOvF`hJ)al;v^$)ie)dD(|yD!kNSl6c6cjx}|=U*L7AS^E;Xv!)~
zfr^@%AX@VF_|4kyD!bIYtmk&u26q4$vDyAzNB;8fga}R8vk?OEn3Etkv*eX*QUbQ?!g_v*AgtbH0}kxU20JD$YIqkXOZY
zyf0YJFG^{BZqz19Vml%6^Y8%fmPV%$bs<3zqrII_>UNym(S!$K_!I`*U;f4KL^s8r
z*&<#j!t-c1UeuS^fQSG5%z1sNmyNCdkMc##H~}<@;=rwitj9J3)7@rpS3YVjaZ!^E
z;>oQndGJ$l=7mR1=#a~ls=?paUr~M6c}2F{Dm&L3Bo=Uv}ttFS8xr~qWYdVl^*PYSs@o}yO_Zg_A7fxXZI{2}21;Fk*q@S|9RBem_i~e#mX@ZbCLA0(_*;_CDJN$J
zRBO}=IM=fi@T>zlBT}egznyrE00P=`E(HaP3~p<1+dYN-z@QTM-TwWVv;&Z_i@tmz
z0*+8kPVX`@z+){};uK~XPt}ntu`Y?Bqlb9tD9iNjCbzgOSROWFDYvn_;(lUWi~!f8aXlEQX#maFqZ&CGpWh=
zD{S{&_|N;qpm#)f77_H1#=L(;3va}6?hcIrRPs|<2Jz!{d*fr{jWij&HDM)^d;&)#
zBuV@Leb~{PQ%@D@rc==wqyv^R`*)r9M6yqR18;eSxRo7r}0
z>7SJ=V#2b&^iimZw-hJOf$vU8wT~Y5=GN9|g_RP})%(cOelgbpINo*Jf^>>adlZr9
zImnwu=j1Shz4MJ<USop;p;YF2#hW?{jC
zPtHmLfnyuq@(KzpL_|bqK!$5`_jt2z%nmF`1A~Kjdp?LYpybg6s}lh^>%@!O>8Vjs
zxX?&fGE!B5gX12Z0;H*UpY~$XoYX#`Ut)2+8yiW?{D*mwP
zo*AVA7tf>!d0HW-;S{I}J}RWnQ8_q%=(UxvDdo!@9urF5&v`3g{CN@kM+y?1vkCD%R>zxTCN^!s210zv_l
zJs1s8rQa?u19NFWlYS{Kj_&H|0U$Qk!2wDaOYFVwSlx?R`Y9bPt&}7H!(u@IF^LK#
zc)6ZuWNaKG0V^DY1%@gZXeP3eUrtX2qV%L+GR9lM#{ZI-;0oH3LKJ|ABOyVe9J{>c
z@J~SA%;A?w>hwvQr%3{Mw}sQ1kx_0{!t
z?Zx%ADrqR8Ed~ePS6Yq@bz+HN(+fG0$xk7?$Qq_y8#Zt6SKo+0DI=OBhVsdM&1wq{AI&1kzlblN
zQFp$3X6x9J%>7yq>>NN!J#7G=ggzXADztrlebRwP{M1hEJX*E@#C|pYw-elc2-g?m
z1iW#5ee2w>+z;YeF!c8JjvQybU2g@blMq4y9jF^I)?t7850DR=
zJ(^Sz|I<4(ln4y;e48yKf6T?d$%#R$aDbj3mFe-25piSEDwOb4PR!l$L>a&ZR(^T3
zDvmlDxdgJd>WUn$XjoSB;XCYUIy*#2BAgIzWNb6?PVlpi7ST@?zg^{&MAWgd#Vc->
zW4SJB^Y9-?$$WFRKz1wSKsUT_aqqz7Sv|h>LVxA3lJ8l$QqEMyy1EZRrn~58y9ui9
zOz+iRN+-ZS;7HoseEzpLg)7yOtN$2ezEzIEFQ3sQnxuu9(J>xEp8mWIM+#SQW$s|y
zC@*lwSqh`jIftZ>%0RuUYAT08PwE_JCANOj-0xjb98D_;Ce_#%^s^C=}XVI
z9ls@xRBNM?%@^Pj+8rPUt_fr;?Y&lR6vFhbQ%r4g%SY*z&YZXf-@Ft|3`giZz_Q(*
z+kC&DZ?2ITJi$jSVf>HJPqMZDI1F`0Wh<$I1@p+=@|e)Y|L*cSIi-}BLz3@UE4OK!L35JJL3JM6Qn3%j5T8BA0
z<>7*5YCiOg>j`flIa)K{%Ew>eE18=b4B7oAod9AU4q*fkyk<`04X%9tzaH_X)bKeU4lhMto`|A}iUlyv#A{_8k>rMY#59_wb1OW9g36#hz!+E@(
z`B>G=s_aw7LL-%qogLS8AlRudYr%3+wNY9NQe!b7pZ2*f%-ozAcm-m!qi6B~YX=`9
zS2%jWms_5A_2lT6sY49|49EZrXV772Wd8f9Ej;kPA`8suq_K0C=>?)?q8lpM@HP9-
z2{KiIn6R}8K@w=4?8%f?NvWL@ZAk6o%LZwhi60cdPK0%v<7$I{-B{W#w*b1&&C%CD
zfoTUOu27iUqN0h*&rH#3BA-U{`|*y~q35z^Bcv)!w6t!;ko5TpfP73~p;xP?{Y+No
z<~imV(CO~Gs*YYqOO{d#<+fPZVX?rs$Tk3Qhcc&K@F5_vqNo}DB}$3HkHk7%2&(vY
z07w*fVT;25D48<{GE`ijqn_Twb({7%X2_%S(S^nZn(0M|{({a6l9TUnCSy`Cl@tbI
z@=Y8g?y^248WAXQwK)Jg!&B`QvrOL%bBv%>?G4f8(MiOUvd8bTvfd~K9F86u3GA{q
zVY$}J-QIDlHJwIkAlO6AnQ5O$76A^(RMinb)`M)z=6RuPz0mj!q}O-x!jvPKLU6$!
zqIw>go5z3uF8;yldJUEgIJAdYx~*8^Ca20JTdo%qx9^wq!U%+8fFVf<2987C+mj!P
za{7Q;{`26Gk$ud
zi>^F;?2Bz;g1~|-&0uN`l#jYUL^0h{2#k8G(E4wmK3!5dyR
zyioaBTdF6#?NmLTo^)`yBxA}rs)@S$^7yUC_K#u8N0NV^+G+eJ4E3dPaH3Q>>57m#
z5#RnXNXIywSZaX%-&}yrz`=_7=e5-sy@s30aO<9=xQ>b}%U82NxGHK%rmV7Ljk#w|9N;A$gA6@s>SE%fI}XhP4Pb-PJWU5>m^{M<8b}
zA%Ar=?hnWUtB7p3R+HFJ<0{}yL&+M$N)&!L^VVa(;rowWzC8bzJlxz6Vdk~b3;&`Q
z_1MG&ZuTJUVd%l1u0^>-$1MS(sf$u^o5G;{U!qZQDqHl0|Bjh4qYKRGr5_elqN{d)
zHb1xDu5>Y55JoqTPT9p=Dkv2ruB;3~eC~)T^^*J`IzbD_*{CKd?$b|X^*;>PGtO{k
z#Muk5vYw9T^VQer`XEWtBASeQD*-WjeB4X#)bU3vzqe(@^r+MCQ-%0d;Za9ddo7l-
z%x#XqqkAkW4bp*3D)r9)&JG8b2w#Tmq8j
z+SCsrW-mw_2c9Fw^L@fajE`I_sNeu||q;vJ{pFNAA
zw?zMNU%n5XLE+WfKvk8+
z(9|@mI1AWPj9ssp&^PnOY8@P*_F#eIh><)tbRO5(WvNnj&&Na!@-vB;xa(RJhJvo`
z=}#lRNMYf~1|F$ZpWn1;O-FSM8>Ez6Z7*W*)RS5X!Bk>%c7FW3wpr`*xnWpcwLZ4!
z-!uqf@mVm^HT~ck=IZ};k4`>~TsimxXxQ#N*9WQmwtdYI=Ep})G{wV2##7|9F0>rK
zc#^)o7d*Y(8bzz=AYYy?w)PI46j&))m3V#qD(^0Pfi0alXZ~W)kNfKD*O95hBN=BQ
z8CK5a)<>vF1?((up*OZSH;W*^(CKP%X@IT7?!Nv!+MWOUT{N0(lKKZqZI8}^T(A$9d{
zUriCPDCOr*d7bBV9Cr)`8NYj-6Ip?FQC#~BvPfe}ls2<6P!pQ%&hPlKH_FqWKfoi3;9uK==Z^**#Ns_X
zKK}^fb)Yq^`~r^z*uhWV7XFD#Bz^kc3rQx=yX<@_pKgXv#3{8t>j39u4#LAOd%~>2
z(lX!u`6lQNkF3$>)=(QviNotaFdX^4QfA-g*oG)X@Iii0L9h}A*~YR(2IXo%Xa8^$
zzo7}Wnz+i(c4zmVAqp##H~1JTT_l)6w0({cTAHoAW+p3P_e8c^iMK;SmrZ24t{m2k{4t3+`OloDU5Y9w`cxAXEidTO@uFWwOo%
zuNb*Yj~!gbx%CozT7iX1D#R7FwN)w#y5VmaCTaubDZz-k%F09(*a&Hz?|?AlvbAZmR4SCBtRnif+v|uKYsAnnVeIHDqLW(b
z&d_EIoVo3b(&n=kA}L08sx?AFiYNJS>U_tEdksLxPhaZ*7Gn;Dk^aVwzz^cHfkSP^
z`YPDiNJFsy@|M6r_kY3y+cIR;DbwHPCR-)3h_RAsG&yR$cY~Fx_~|yS+5`8ZJ
z(o?_qi)iYxLB%zxle=Py2?R3mE%~{Z29$=%fKZ5wPX79yIL9%p
zN%8h6#tW|{Xz`qo@EMrI9*I-uyAy~067}sdNr0eHv8(wqtXTY~Z;r_e0|0p!?Ah!G
z9Vv#ww|-F%`lJ^tF}5se15d;IwD;no_IzmuofpvOq5)W67g|OvE9frB|7mk6PqSM>
zekkfvs$(Go2*I@pvxSD)#JAf&d-8V|?-&FvYe7~x?2HvtackYTGi}}tVm$3`Qgl_o
zUp~Y3DeR$PFQ-c&-rb1Udrk^ZGFD;+2?(eki`^eH<%@2~lE`2tu=1l=Vx~uprD!(q
zsZy^6UoQNFDKUWw)hFu&8M1Le9)ZQuGO+BMwY+Ye6te$IbmJ3C;&oc2oGm9wIGE{y
z!g2ck!Yg;VL3gBpCt2u6`lB&2fV6NK?!t?DB;BtG?=5lEp?4|%I*|p4x|&QAxtu!+
zLsee;Z$v^+zo$dTulVi-vmy$f&%Nc4aD(`a^sFgZp&|$px8s5hXq&rtU($0|s
zM5K^?BUE8+M>p~j)5=uhcHAorRnjMWyC=Nk
z4mPdb$301G!j~Ft-zT?>u;D~fgQ{-GvUm>0ZYu_rZ+~N$942Oi1?*y@4~)AhoKefg
z3>z<6(?wM~&TiSoN`ySejDS!qe;4yXv@=UlYFYb8a-c8kc{M!U
z@Nl!-{9`D$>ZaG^IzkM}tPeoSjG}*74z14sTj4_1T*voPN#Hs%7J<=ocn@nDQ}Nd(
z(^$%cy3hvcqq_@WgN;i?$qHh$!+$e`eS2@arQAZ;@S!fRmds1@ND8hQ>JTWrR6Urg
zePyK2-|yytS6b3?^?(o#v|7%8lQwR4$HA^UKH@rR+XfjnMM;}>+-vgCH9s|q{$c&>
zpn3x1D`4sdDc`@3eTSA9aMi%x54r}(uFatyaG8UfBh;{j4JiYcZ}ak)^T&m{(fDM{
zgwWY~wp$b*4-m^pGs*eh0c7;Jr=Y0b<|$`wV{6B<^5e&}=0bGazH-2H?SYk5MK-$n
z>A*+8+Kk&-gs~|fQDM1WY9z5HfWk!jf2v-O1a6hp|L%NEZBuKC1px&^Mv~t9yLix&
zZ}Y)ghSd$xZeX`X3;xo#%P=7s83ur}UOPyFiWcE;Ok_*Y=?#hX>sA13?Y|n{-nBqJ
zoPPTaAk)IRCSpE#LRD!qc}J4le~%#C&a&dt)Iz8|%Ik_TpB%Ez;LhYBvg}^6jrgi5
z#`x;*b&J(}Xxl0y?8e?m^XCVtB?fgaXzBCR?AFJR8bskw7v$evwh>eg<;H#8e0~HP
zagbN4^T*s(zksyY@vp4wz-?@+B68lFT6L>*1%kHb8a-tUa9aa6IN}*4v^VIML7voQ
z&d>mBLj(;ig|6L%C_Hy^bt@F~Bxf#vx8eCh%DegIS=sv_0=#Vb!>o`>!N3~lMeyd`
z`fHX~CZ?TW?+h(16*5C@vc{c-$F*L_vQGQEV8h?BbzIoeqOh7d$(yqU%zXUiS)uSQ
z+j}ow2tG12RO!D%8&}C)(A1Pg$|z0&CFBq=6k$+iXBZJ6atGrhJM<|t$Qnoo
z9DW=DWU(H$XI$#>*U8-o9D?ha?krf5SuyyD6pmuxkz<3o5P-rvmfhj5_19UeCZ+>W
z4Jq=yF7HMzA%8+xP>`G}aAI6mzyOgA=`FGB!AjFI@K^S4|73>-^`xi3h;(#z#(@AT
z4r-4ThGEbgPal^Wfd&H_vUl&_zg}In=jP$TfOQ&3Y)`YjjbW$t1tzU#H4v4=84gH%mVj3v~I^e$-
z`&-1BcBR;gAtp{V9TbPSO|;=l3Q3*K1@C#{{Zxk?d4svUQ7SlN;1y`*Cx{_6aH!D_
zbusp~_0S}}mGQb+@64T@>KJH%SK`@}ETilRK}I^`80x(aYm3v)eRm0e)Ro+GLSqh+
z!r1-PoHj(;P#nWUEG+8gDp#=$&+i{u8{kN--|uUsuPpJN7P!p)a}Hy=HoD?hexn
z$kEMB18_iN&w)$?cu97HeiI~aQBs1sb?a8OqSQHUoEj_M5_x%kYHH#8P;M}SK{Cgt
z>ItMg?!0^B(|P@qJN!aIWKMJ`{3VNbo?CKdW6mXny=8?SEv|XC*;cWGeIjifUis1@
z?kMUx8Ji*rxZ3LkeWM@Z#7hl$djAx(uCm3_C#P`vpRTN8J}!y&{bNb=6w7^(
zK>Myfglas+*)wSzKd})B+nvqqM4R03-+412)Bz@%sCo?e{Y1^ZbMcNAc!^AtN@eZ+VSJkzoc0$z;^%c><6D^&3;dZ0_^rh1F7A=?9_JojvZ}xi8Q5a0d3lKeZ*(CxGhkj19wY){FR&gi{P%+A^}F^bv6^9l#x3_(7fTnXWnO^P9KM9BtB_7
zfB+;akeczV3XC<{*wJB@U5t?O^WXw=;VV$HD!CeHisp~rf~?iKkBJEbEsx8%n&0GW
zM0+>;8?k3YOJLsp{Oy}6Xrc0^&D+;vy-;(XUq+6Oj>=D;@&Nx(4uihYH((r|d(F
z$&2x2A6C-1(CeL8KhbCvR`R=g5j@|6LQll5Ek_!F{czMKHXM|li_u^Wz`Z^WDHr!e
zsjv>4Oa&zQVm0j#N`1;>T(A%V#)L>cJu_vH)eJ!J52$W9%=8j+;S?lbffBtB
zRam_8v7|%?(CfFw2iHN`Uj6aocaxqrCf^+?K}EXPCHbLEvkj^b9zTw@Cth-aP<&9m
zQA_wIIqbDSaFBOOV()yozkf_mi5W1;8ye3;=8rs6N1SGI`OBMkWnc4|gZS@yg}g34
zlk5emH(pne;2$1;F8dS65BLrmPt5a~f)_6GK<2qn__^$mVEr5?ur2q?a!5;0k9skC
zq=gQLU+GVuGu{#s%&hS!>Lm3W-Cy=!P0?@%9|cqh5L9X1hMgnhg`XsUNcbk2oPa`P
z6o+52q;N|b-6MyC7I#u{GdM*lBv_s;tPeg42ny;I&wfG8XA5M`?$XRpS^{e)
zQ**(85?nRVO3CYwGc(B}e{r1;mTNhM*5`F^q^J6ig0G11#OJH_BQ)7vwaA1a46l
z58FLx&9|=SGM5j8`|$l^tRjP@JaJ418uJir<;Qf5^*&P?{WbG{+pg_QyKHYhNzJ
z*Iky3LNod-_`&EZy6>0A;8!ON&hq?hC$J^DHUt4+`6#fgjcA-9CjH4Bu3f
zj%=~-OHF=AIm$n%q%q9$`X_C{8BOJ`8N4SvYtH#7Rq+|aJKXJ3JWt%MIoIFON?~}`
z&+AK`<4cVPn+^g(&@~JrfR?hnaQQ&VN*9iGP_#+EO+P*$9Ms*mwSXlvUk+SUc-2k1^Z6Q!wRR&LJRc-7vh3fDX4q??8$-8PT+WrUVaw4y*!@u?6i0g~SrBxh++tBU3Dk`QD}})=
z+BHo6^GLz=R;m76zlo<0@8{vK&0(<{e9QDA@a($y84C)QNZT|0R%NvTbTLhq0L{VYom068$Q^T18eP3
z1z2wx8R0Z>Zfai3*>2j+FBRsfzm`4?DHrrahZ*O?2G(AB^if@J$IkZWKs}r)#D|zA
zvsQU~jpAL~i8p<)EB;I04B72B)YWA77*rmZ9kE_6D~26SAq>vx68Ims6b}{JLm{@0_dUH4uvrX@idYD
zW^J`#rMGwkFDWJ)3)q|RVm6xXhXv^{TqTj
z;?=lOH}9MB;>?W$l_!Xop&!-y0?`ytq%EGhD6D<^pR_G|Xy#=B@X`MdxG*aBzcq{d
z|M9)Ale-{ZkB8-f^=iVRagyJM6F>qrl1lkl@E?QOubhu@Erkm!LMFc%d0x5AofUvL
zXb43<>8?cR)+I7d`pZ
zJHuOQN43NABOaKLr}{lDypR6#IhW60ETJ(le#WAYja7CHlSzB~AzLhE2;yfC~MkHzkgKHm5+9N;kccH3$VXa8i+QkHKf
z?D(x;<#5FhS~vMKxBDy0iYr;|_dy_IGO*)Yb4q*z+E~Gq-@3EytxFyzlRdHM9GJtGmcf066i$oe{l>gip35qlhHW|o{tM|;jyib>3Yq+@7r$UQLR8hbmG}xDS+d5ZD-Ff!GDi?O<;Vg~!K}FiX2D$0~wyD_IuqZFo>P
zC_>O^{?S1i#4U4ZP&NS<0(&7TO#=fus-8L0nkSdZi5I~GRf!j{Ci5uDHB?>}Tw%&O
z!&*dZzh3OjBI0Z1M+Sfggw{&tcaf8tS2P!{per=~d{BK)Vj_lpig{OLX`|IQ=(gjK
zq2N!h-eZ+OurHHmnSy`XqwMS>$J*#1jv~=fMb6oN3qX?;>t1EAi@IN(T^WiHEV5^>
zwSVspH;l1xY%L)FgWqZQvzn{@NG2@gDSk7u{EmF}aCq9qo;rqxz2gv@745Y55i$IDWrv`gjw)sbW3i9gI^1$|ZPE%YE5V3qQOy)>V0c>&
zK(Wce3(OFcE9CAAzCTfT(?PS!7HDMvdXP%i{Xe5+;kKE};CD`U+k~_#nXqe0%tMvJ
zmG2f9{|lgW>%s1l(b@64x&7ZkclQrSzU>h)eQ6B0%>91uzB_k_dWWsLyWExCP|qp1VcDj!7Um
zMFz>@UloxP7KTUNx{`y(GO%C=ayuL(JCD7x_67iL^xj4w(q_FGLLls84$`a}5Qj%)
z@eNHLwX7uF&x2upjxX99TNgW)+{ov)NO_5N5<)YnNI9P3$8p~wI{P&fOq=2KvQ4PX
zo_x-4)*|8p*4$oVMkV6cap&JlgvEWR{b2#V;qI)JNXIW?Yvf|&+oC$_Z-WV&acQHj
zx@s?{2-ls|O?|0;*HYVLZFbaTPg-vpu{lqn?}fx&xL!&+6RVpk?61pJ4m-DT+fgyj
zFeazIkNr4J*P%$7wdI9wa>u$jHH+r3TV143>WmGOdqQluV}6GfeM>+1ckCC#P99cm
z#jF6XW+!*D-$r&R0kxz7ewvk6Q!V^*CU5ErgZ6hjoW&DX%n!m?yG1U5fffV?gD`rP
z4^5y7Oz+qsE!BJfGBYyBqB2C85B){P
zY)3D%n%j>9SO-LkA;O8aDOV|V(>v`)4bvp_^WklYxKbPVDv}O^rd{7fI%^!tY*Sa0
z6MPG%*xIE3aA-M*$k3gHi;{EqeE{eMJ+iPRgiW_tbOe>veBTL;Mf_vIqK&>2pn%he
zxE|~?T5yH$gj$_hlla`l@?>a1RIMAwR0x1hwkrohDk^L)ee*@zgAa|Gyx^W9H@7(4)~O3b&DV?t?#~tT5`JnLLEvDO_33W?8hut)
zuylZDcyZvIOI`D2bsK)TMtu^Y%pSQR*#Q20mQ5#^JThsc{dc2He&*OGC)BmkoM}d?
z-H6A2BFlZbgB9YHdQa?1^Gtz6FGfL=-X^6YV1Q++x)gnwH*&J**;DH>{h7FubA_FR
zmx$D=IYs3D+*KHQPpb0Fj8(b|T=5{(9xKAQ^`J~!9On^EcGNscqC
zE5fociIt2!%QsS%%`YuN*G{FDkzufi_r(~h1Ri~J=?(c+QvH~JJn>u8?Mb9ZNOTg3
zI!dev5pppee=6A8E}KYK(9&dK7)_=So)<9&9}dV}NiJu({WpCJZGW}&nn|**Fb9dc
zzM*tmycF=AcE$*Nzfx*-Wo?$g*rvNFV)w|+9%R$$b8Ssk!2e3N&yOWWHPGlCgIRVP
zqnnBwM{|BCAOAsN;}tmKa2oarQ}g7Gzt0-@`3eG1
zBTCTNl8D?+di%gSs_Uh1cO^2KN#t*Wly@V>3+Z+P1*2?(y@p+$*@434)yDZ#MG}xu
z_v(UgGxsvucngBU-e*LE&fCG_?7aW8>=p;Y>9s}bgJmS%QRKl#ydXGMLEB!8MXLQ3
zSg=U5)G6Ko%rB^=SKQ~H#a{xO4@~$Ti1)7ZrMdT{`J7olTv7`B7e+A9ykkneVL^6O
z$0m0I*DWx9h^%rgxfLcX`67@I03(`udR@sJ7`!4;P;%vB
z^~v}3=&8+!3GadvIrihrH8qVRx
z{KSywV-$KnBMk2rhstCIz8;=jfG%|ik6(ono}@b=ME5ZjgTs_bu#!S@W;PryVdUsL
zXwf#SqTNfF_>v^zJ36E?A^?g{*4AIny%?AHb<|A%gETZVjYQ-(&z+exCQtbx+wP)S
zjU_)WvR-g&!OUr~OdMRUK#{~#wt`+<*obKp>hmxai>EjzfbZEl-a6$Js#(cvb~F$o
zTMCzci045oM!VD3)gMR3Av7LU+>w|3FGjm<8mz3(;BHT8TD`UxXcIY{97eI}@K`5k*M8SVV!
zVMN9Hv%d7DR$n|74_^NyP#sryUB81mQTN<@)*?fVUG;=h7m1rSp4
z9M>5HbXWNb@vs$z5z~SbjOMKfMEeLrWW@i~Z~QMaMMkXxU`kP6ASxlr;7TXLi`XpC4Y)xPFsYi)`YT
zLPC0a&_4RY3r`V
z)qum}$9NrQJ@B2M-lS8mMm;o|=VW7hKg|}?FK{ropXT{~65KB5yr|4=d@%Qdwca4?
zK+<~-qjroIpo13Amur8fJHp$A)$doM4xC2m&XP#;3147fL+^*sSBFm0|5(1R9nW=i
zJ6h>t*wf;q;}u3*(>d2=VtEmxMXo9|n|i`0s?oiSILzkK_!Z_CH+ch@+&RlAe~ys7
z7BxR<@>N()IT{zPW+RkEsO-+4f|~mg^Mxy
zzhAYnx%lVQmgDRm;?!|iZXZt+?ZsiZ=4;kTCmrrCugO(V-^HM_+S@6RUv#n0HsD`Q
zeD{&xPr@#}5Fv*|b>;y)>mgSXlL-uwW+yuxGsME3MrWSrg5|j_8nr$3K?Pj`bvwA*Eh8;~sj-WkB6PdN)2g^bGgXucS=9eiV
zAw2ah7W`po1VNUF&61-0%JYsEVz0`-RTXO5IM8#H>_f>Ap%d4|H$=xCpIv|psqAYvJB$5+o;W>oXPX7YfX8|g4*7qpa=Ws2#y|NMU43Z;r*!AR87SJ
zR}tuqo{ehZCyZRFM+Z6WC%9|!enx;(CPv#DW$>*AjN5SEW!dv23F}3}FYP`}_f!Aa
z)J(su7}V5DaFs`3M;w!*;Az4w0V@s!j~)fLv7RM@-88np!aw@EVweD(
zMQxRyZ}74`G89;yk4=oHtiW^+l94d^-ko_rR?h*mA4jqFSa(yTP8
z@@=A){^Z7tpt^qH`LkP|%}U2X4<8xE#IMu-K)F3-31Zt&H5#XIDQzS<`4Z&*_tIBa
z7I_mrT1Oh4rBu`nxDy|UP#Z~$kvdBI)^mSb&Vp8yMjsa@wPxwYP%b{!zvny-EAsg5
zkke}T1519+SCB+Q=fUJ|*Mt^M@&oTj4aJOWgyB35wBr+9Gmu~am>=&KbF|3#ev`-H
z&hq!3K=ftM<``kS57hYhUr0r;7F_QI1cxV=&V!htOACw&=@+7MqR$8C)>D56N-S69
zR$5L!h7IKnLQB!VYW)wVv{Eot>ern;>B>NG@~7Ub4AGzd!rr6rS&37I@h;Kh$=n+I
zCix3~$DE6&i}?Z;K`%In={>K|jP-SO{lw*qVPUSCW^v}RbD|jeTlOsBUkNOuy!k>V
z|G~0bOaWb=CI=&I83rOAU72N6**h$~uOa(tP)zLI7wWDbh
z?oJ>Jz^olmeV5ww+arJs63B~HapWZw>9evrUV??0}m2i
zowllRiNlv$bkCv|Fls`flH$z|#(h~7<-K^&9?!+&cO)EzS;9kOVBKq1fA%e&zBpwo
zOhFT5D{P3#lFu~Tbkmz({X06)S>i$
zc(_jCd<{Z;Eah(coQU}hl^I#g`Hl;6-Z1JrM&i{gg*@!rrZAB70%B1xL%dy#n=}@_
zlLyeuM<7AWuowT(m00kN^9^EA_a)^$35h=IrZB^|q(9B_;Czzjr
zeH{N;$Oa?yaDRK4IR}$(FM{ifeR%Oo=yK;xfbhhhzjDmIVY+kehWcnbQhzin0qdEL
zpk;$0CMDxFbr^xxn+ya72M)GYU$R4cXmf%!IAeZ@rS!gnS){x_HxrqB`Ccr)y*q*Y
z#uStM8P*`3=_#%cxx7XN>zS0Rul160Q01u-1Fg=BeVIzG2U@TFLnQL&X?|0F22~a^
zC}WkGq*JnH7%y=~LgG!U4+~YEoONmDcr>n7XB_Ic+24)&*+%zD9Y}XKWl>6&@M0tit<5E8Gd_cx_oLgb2;WQjG3ZT<@q6RPU@E#0>AqIqqNhnBeBvi?EMcE6drPO*ilPGT9j)$zt(?bpz@Ut1pJL
z&gJ!WJ*hO$w`9*)6n37yX{M?cSL^qQvk$VEgsz8^3@^^)!rM1X>C*GdW}d#=KZ^F4
zqu@fy2OPtryp={@6p1v&e<~IHrX&;!pi$nv+Ixb-{*M)-HwUDwEiK$YJQC2>a+Vf#
z3SZneMGV7^j=Aaoq+;2_{Tz#gxS;M7C7kdjLgl9=E1Y)M>-P2jR6R!+e!S%`{M_&S
z=?gUTi^rDUgk=npbL>wLEAJ&cc{bh9Sk^ONR@~Fw;I46aIDW1gD{5RG%XD%hN*p&`
z^Qp_qY)g3c<$Rcn76Py^)iWYUtNcG3nIz_odla5&VxyZ%iIcQdsIr7yB}`t6Rbl9!
z6o2)!`%x+9(y|p{g3Vlcl1Tlcn&UA`+xzic>Tsu$MB?#vg?$KQtrsrHl`|+IbWx0X
zwh|7-0uI|QUF^RLK^6+=u`1bj1pL-Mf~;IOz-D|Bcfs6l4B9
z%GNGRcf=*AJ&BBgxBuNdki+d~377z=E;?%>QLIinR)cDP+)7q?Z+CQ8BFSK_Q
z76L(g=Dx%_dVcWv5#0Pm;!;5}#R|G^f41V58vV0l4Ks`ztRdy4V*d2zo=>InZ?d91r
zRc@8)e^f*4h1mbYVEg}t14h&rDZb&X+BaCrHp>ct;X)-0crD)wmSnDLq>*b=qR&r(
zpjMqcL_ZXL7az)&QW7#R<=ekTjspS!yR8n#QTTRht!_Yoi}t=xN}+i=I_zX8&fF}=
zJhZaxCQL5Gw4qg&OyPUrOUncA@0b`z;p$s6umrs}lGwx#MOSQU}U|<@sc?m}WP6-?_SYN+>?HK?lnY*nQuFHV#W?OcJ_}QFxFvT?4%I{+=^yvQ-
z_a0D9ZSC4<5EZwG*x440N&poB6#)SuDk=mJ6i`&Efk!r=nQN^%=bG<3-~Pb&omx{Wa;kjA
z_x)RbzKY}km-(}EeD9{MFZuc9_rFHVM_=m!3(jHmpmUw%NJIJI?jw1!h~4^L&f6cnCP@^wI+Q4+uB2K!W(3d-=4q6TKincx)opdJIoNmSxmI49{^V7OgyU2W-oMuc53KU_i!B)eb_9B6#h
z-23J3-0bs(&kNi$I^GVoG$%_ajcrJ#L0<$q1Wjt>Io$X#z~vrTSVAk8qBHV_7fAFL
zVg58IAC-6F?tmtSn-q(xoQB)0yCipTwmG3r*_|;DzLlHp$y8KO_)=9B&j;G}^<~&G
zB_$-jfb>!nOhV#TDq9$;cJ8014JCwFPst)li5KuG-dqM%nxxe9+r9$-<=b`}W4AsS
zpLdA`4uttQ$H)E{gWr-$;wigt%$>bEx8mh>>i5wU5J2dtH#YSxecg{_J8-mh?J)IA
z`Q`8#<8z1JLvg!&X;%P@IzJ@l3d36y^U!s3(OF-bx{3iNw`B-~XNh;JQIfJUya978
zi!(*DZ$Wmv4JqYn?O%gXL6dwVg|YmYR+ox?`(FUTQhp)i&YZ^e
z4`40kb%Sbz<>lq!l`&=yPOqvgA+GTm^r(cr=nZ~jCrsifHr-+!q|RL!=7_pqs9qv%
zE#q=8JgwHqW>+&@pNcsSv$S-|aD_5E^RY6;Y{6mHUuWi2A1&aln)da-0lwTTX+-mf
zA|Ui^&j1I+AXzv2^d_?_822xpM#i%?tY(Z(HkgD6eWLwz^~aHfr>J}oSn^)Ae1Tg<
z;wgBG^Uv}KvHqRX_{5m4fwema}XB*YubBh;P``chjbEIS3s;J?2Ouk
z>Ik2ubT|wIHEH$aC4}L)Y%|CUyEPwAJ`fp^heIXrxh=0n6@Dz-Gk-w74vbx}YP<>A@`s+fd(@x|QoZbttJi8>*Vo4@fWyZk$82%={(j9pv!isC
z<>dy~NhJm;`sGXVSIY*czzu2OTL(>2O`+$UUXUn1Lq&1jI_6DP-geH6Ny6B87IMcLV|sJ=T4SdF)VFnIt0x%JKKIPRsbv*44PHI8@xa^f0Je6T(xl)0i*K;&e)
z>^pJ95lH?=x@j6NN3;xF0wyjo;vYDmVd+hXfM?|l4VOoTMELK~p5U5a;%6p2m@Bi+R=d3>v^|+s!52ySLurxf^W9HPNjI=I
zBeUiRjuezOV7qj8Z#5pS5xcc-f8=jNWB(raVTUbWpN|K2tj@IDec%-q56OsxnEiU7
zx>Jx+3qF&Nds)Q$It3Bdya60xE5#ziOc})TGh18Cn&fRC!^Q(it#Qz3zZ!iOiyU?e
z6#wA(O@26`dS@;b#2>-AjO6QS+ye&>B0w(kW2c%_C4QAC5ZLrNCr78~v1SRX{Ag97
zrM}?Wq%n(P(JvE{ENeSEgREpr<;#Ehk
zGuVNsH#CJ$*}Q$m6|yt`Q01ry34o(ZpE@)uv8q?DOPJBR)0rVJ{Q0Cd5m?HdvhlgQ*M>*J9;G7~(ND5cLGwBtT9-4DrYdV8N4
zz56(H*(73v{D?WO6H)_8-0a$yOA|)kuqYVxcQu~*G{JIi)Jy9Y}bo8WLFl1ToMa*9at#~)(90`~X^^#Pu?jPY2dWRD5
zT1kl5;Gp?0mKHs*f{c
zzax6$U7tiMkwz8G%rnjiK}sE%DLh~%VEF^lQ4Me&GBH5Mcp3eNtl@basE-VAUAtyF
z)7caUvhc25UbRwe7J*wKZeVUsxo2qj%-Q)4sM3es8wP4dVY@((xJ+dK@NlBsieT@X
z^}o1WpOq#_IR$Hzv{RSG#6$A;E`MfshS2mB2jFvSz1TH+wQ&5L(Nfl>yj?=^1~%TW
zUT<%ENTNCoE-%AZUrOylGmXNmQQSznkJu3v$$d4j610#fkZT+Zklv{Q+mvU#~DW;!L
z3uu!gIMLxxyA#^1X%#KIltDG^wnHC^%eX6Y8YT+3uI|s1$WT}}>)&7CK712Tk11SH
za!a`<^)WxpL89``)V}!Gi1~v7hGr4$Sx5d`DG?D=pVZuk9SQec&1~%Mdp}Lp(jGs&
zYVvz$01SQbJD#IW)4*EOj4@b;8m&S#e(2gCKM7Z;HfSy>JHN(Op48=Bf6xdB8GJFt
zw~mIM!%9n;Mbv*k>uyU!@uXnchBu83*xn|ss2X?ld3dJ}r?LE;0A51TJSNlc8K
z`g#7ucN6q*Dpg(mth6kF@u_&;_Gds*PWge=YZlk``*-ApNKtee{37?~)!*dYsHh#V
zzu@$9Bj4SfQvipubs*8uy5sftQ0upCrcC-cd(PMS?Q>qQ60j?JI)4G(2B(qJkGEyk
z-9&wu7=ZiA*rRvEJXZVTvfr?2DSBv#+YR@aEr1g?8>9@7;suG&E!Hu5TXthTqZhaU
zE`-qlWZ%VjWs?aFL>9ZX;w$^4#cKv^WXapJowL7sZ!hhrbGkOFMp67*Blfgs77?8y
z_$P$-FQ!6*eQfirK9G-h3_rDtcL+G}n0J7r?BM4ePTc&v`I#TQzaW}>xAP8H-<{_j
zAo_p(AG`EST(dB4d`8%NiYBPY^0zJ=e=ayR?@b9~jnAP_-_S&BRQYa^hp(LP=>ec`
zNdyRc8+VbYlwD-K?ZXTAj-JZi)0unxKsqP~>W#T%*OT*{i@oh;UN8|<1ah0xNgP_)
zTQ%}9t+dP=RKJg~;uc8yb0XV>k?ovULq_Kqqd8BWadli>U9Z9aocGgasEl9|LZ4mc
zt_Q{4yL;@Lw<2
z&hH2iBDW<_K>{|AtkOkQJf4ACvm7omAIGWm1i0rj;3l?CPGu{nj^W|%vmZdcUeFF9gO!p`GCudk0%050muqNAKs}fE9ug8r`>^F!-W)IoQTqcyXo`rQK
zwn?$5@WC1lIJ;52pf}tNWhh#=&>vdXTGeD5kz%20keiysceT8eNW~@^fm$O#XOq8l
zDP?r@aVvYybBYyrS>+2unVYVM?fFq5(MbMREWj(l1feZI++!ZWGLw_*`cEW*N}<`n
zK9}-5%=jI*KtN@kha12m-lf;~@0CyBg7<6#xGcsHyc`g~X$t`Mlp3sCKRtEW^P5DX
znEJ1EXXWH{u^3eLxT&crX3*_>Ab+^C5CA3dVN6CJ-g@HxXd4<-P9n7{&`XMo8+%Ti
zFz0|7D+cx5``d(j0PI-0Zi2q4X+lcDi>tuBqhQ}>u~t#$OLxo%np15k`s<;ifdQM7
z8mXr?!{xZo^)QsC;$y}!t1pE8PV|I6tMRMzsM%}JJz)^sLW@rEEBQIZiQ~|6%IKf%
z*d+Kvrnx&exWMBbb@FH_HROps7f}Y;rc#}d&J;(aVh%}X^%hual(@}Y1dE{ymv8+z
zic1-resgQm$j~t3%a`jw63WWRXsiHK;Pq!RK=n3O%oCMGM?b2g4gDVqArdVPPu({sm};k_`=g28gT7Wl{@WT3-wbXh(tg
zal?D^v~mFf0r|_9GeEV8*^%17f(ddbC}Ypdsy(XcxH-w!0;JNYIJ;gM^ft&F<8tcI
z@UYAo<`~doLgQn(;EC%A9UvSNJfiUiqajqZ6981?Ole&32JzvK${Z6wu@A87$y|0(
zCV-^^YuUixzZy2__80!d30)&o_bB>mr=A@M?46yNxocz;&C66kfb(T!UDz?DFMtf}
z76&VQHfGYhJ3Ge#U<&;UfeT|4CO}s~(Tvkqm{5}_0F%=Wig}K`KZXQFiZ<$HQ4x`c
zb1dBso+z#2@eN;S<^5j2&Q53MaUrNfdyc1>*vt{3GD=h1Yi@IA1sQA9e^Kx0+FUVs
zeI-C9>r3SBpJ?$w{T79<7}B!sJ-hH6B$AYWSQUiKd&HRwL;Zr9+pMXpQnH2(&xD|7
zSoDLd$040fA5x02KDw^3rxz2i$R_Lj>TFMLaHAOzW-z#_Hm#sb@g(1kVi4>-4^{Es
zD9)0eB4j2J3ggYK_wWbR)A0I**Dw7s@0=uy);ADQyJ%=pnGmTvh>MneJ)peCVP
z%s~w)<6;nlEyb`Y1;8k(0Ge%M9L})>l$B9XaDjqPuE2p3OZXoRiQtNl@pubq04frq
z3ZDibGD}qacc~cYvG@J^a!zK2mfMw&Yb4V0B5TlWZCe}fYawMggSnnq)LO|42vrZNO{HscumzaDm(sE
zCZ@Xgn&d{Ct*2^TOdLq$rp_K6PM(w+PGd8R0x{q%G?WU7$Do%+t^v|qFA}xh^VMg~
zc5QWannzvaAUkisqXM1E*SNSVL|6Sueu0!MyRp#L<=K2Fod6sGd?Ky*8tt>?>JF&9
zni|d*7&;Dkb(fd$??#IZvN+b$1al>KN2IkT2q9!#s}U7tV1BjM4}hsp4`z9P<^PJd?eME8qRxkn>Tx_MU*;(L~i!_c_6Wsi19062R)oK3QAp
zT(QMscz?uU2W|l+{fSmIpFEI6x}TF1vZA_pzZd7IM%z1P*B8p{-Ui0M2%`L6COR3t
z3d}hj9Br0|?(9mj6!4g3S)`hYR_VIRcq@FiO$*A-tLcGDmOif;)$hXNX8aPB-J2
i=ufmQy_c&oxk`B5-a>Kn{ngkg7(G=|m=cL1`TlGDlp
zg+c%|NqzNcLKy@cS+(Qqkn~mFNtWo)h8)-rIUG(rx1~=0S1t}`4y|NzJJB_ESWbf{
z`io>K${_e7eO8;hV9YsmLPS|b1<0(aZEbChBCw+yOs4Db1Hb9tpWnlr032W?lZsAN
zQ5dqQeyt?sxJsY{bLMR!Z@aBBU9V)Y4JGqx{gkHO(UOvd2E4NXX?o^K$w{bdeVBzR
zz>}tp`H0Pe*_5koo6vx7v?ECTCqhgQQJ<)g?lNi*27JvmF8lQf>H*T2L%%g^FEyXf
zGlG1{TYqwYX6!r=m36+#d6OvCU41d%1cn;hZXm-N+_xoWu%wM&;x-22v7}1*Vb)hd
zuHWNgc0N5UwtIUM+ZR%}fJW%5_S0lp4D?<802r7kJAeSfi3$J-X45zk03URspwc8S
z0ALi_f;O|thg|F_@;okCON^g0+X%k60K
z7XJQ#*5?bcCkLT%4-Ym@l}%?7%%RJ&4sOB-|vq92HJ4~E-%RM*rD%khVUOj~2L@O2;omsue^irNAE;Q*1C
zkPBI*(|rXGo%;kAH!(eE~kK!<(z^`fQHBEo?j;#cK
z|Kj4{#Ep$)5Ed%uEogF~xA}9K`aZ!K+fExho5f&}F
zelz%xQj2+sZB!??rdG$OqBD0pi(j$
zhDA&IJf#e5LKfTifVbP2JaRCgK3K%p`j_3c*6V0mHb9gUv^}&@CL(KgCC~Cm5bsNQ
zLD|+R*($>+8i4pLIpIvakGca!dOyGNI+zuX_nX;p;*&zaBNGgQ7x2H5xQp9T4l?H6Dw-{s3a9q!En=fn>U9L7foeh;hv#r;uMvHUy;qoTt>2tOrNJ7
z>grlAGgak^;N!@oj~H)`MoEw~0?SRI27-AnF0L8INsALX+H+u=L0hyS&cPKsSJDj}
z_k~@Up<>-QZp|Tb*}ygcp6WC+=JWKTc(aw(rLlzGw~_r1*Y``3y54vWI*my@eyFP_^IMsDEz_Y4y_9tnWG(9Eux}gx
zWmg!X)J`?uN8oN9fM==N@4%wPL3t!8Tb1zGg^Yt9u2EL;E6mv!@7P^
zTruJM)mtaYVr@DD=$AS+)}`oL;{at9!ZQwwfhj~o2sFADrj16Q{fV$y{xW~g&uAp<
zc|1=BkW=m)_f8!4kzx)V0C2F4p+x)<_OOs%p6urC&Tu$6SsEl=%>8o!OVcxF
zh9z);&=60RJwsL_GKz6bTC`j1R(f|B#|Y1OTqOVec4A!E;3peU?(DR+bjVuE@4&{zPq!F-lPcqA%gWZR|TVCF~uC7i=i7{JP
z|MdPzJOdYwZsBzR67k8=cff$5I&2|tgd
zGQsE8CoHz}n>Fz3Gqm~_W8$b5g_t9|Vj7@VxT7!bp4>D;S{%c5N}VZM{|4F&tw$tZ
z6eT1HF1*pT0tUI@W*bnhAq1*)HYy+ABmPiy>v~|)eow@aqi$ZJ!VjQcTVttv)wtFc
zm!e32GjpY1?mp_~$tIc_m!NWW33^thAC0!)EyN6%0bGBw9sQ9pd&j4FKb?b{Oyb5)
z5060ex`A_(WM=iKk4}Pux8x$`_3qFi-9}(#5=Q_OMG=XMNNI$f7
zuD`-H9n`gXLJ;1$`&=TNos{D1@awj1Zi<@ex;Jtg@3s7E7dt+x$e=xZun?2wEM&56
z2l(cynSqb+_o>!6xN1KEz^N`o2+ATifLw$wmxyD$nz-4`YxSo{;g+S2Y4pMiF8+eZ
zzE)w6?*J>BB~WW3B1*aQOFLQqeYOzTl6Ti;x8CqCVQ(Kyp&DIMM80&oq1M$kvCZ!5
z^7iSBBQIlXrQu-Z3>(@t0_aK+R$a0vJ{o3vYV8mfI(k~$cXib7NyMG
z;qO4|b`F`1moU3l#*QHL&8e2LO1C|IF;<~;dAPO1A=nJqXUvj)ob^l2M)_qgJ|#A6hxG4O2uy$>O!|Yd6_13D{crID_o3Gs62CymfcFV}T7Y75Tm0|b6ySM);i{Czb}Nq&E7Lc
zm0_N-kDn@r4gZ;&jK3x-fLjr?>8BtxxbnUuGP1rpV2XM_sJ(HvWssC*TFuT?%PTLS
z=A4QeQVPb)2C(nwguoB3GA7MRl(gL~@;dax7Dh!$HVM237i|eQ4*avv-27YfF25BKa}HWyZ$VI`%B_g}He
zIV4i?T1iCTQPfzkuf=|V<)YwPOF*y@
zO0qw{%uHJKf{$-46!9o0O%nA)9Nu8y(BB}%AphtY4;?Fe^})Eo6xgUP8HvW)Z@-U0
zj@!b(%e>hN`PL}^(kS4$Jb(NuLr)ogIs{Cd;cqfzYaY(Y