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 283428495c..88f794b742 100644
Binary files a/icons/mob/inhands/__inhand_template.dmi and b/icons/mob/inhands/__inhand_template.dmi differ
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 0000000000..e9fc04d1b1
Binary files /dev/null and b/sandcode/icons/mob/clothing/ears.dmi differ
diff --git a/sandcode/icons/mob/clothing/ears_extra.dmi b/sandcode/icons/mob/clothing/ears_extra.dmi
new file mode 100644
index 0000000000..09c9a4c6e3
Binary files /dev/null and b/sandcode/icons/mob/clothing/ears_extra.dmi differ
diff --git a/sandcode/icons/mob/clothing/underwear.dmi b/sandcode/icons/mob/clothing/underwear.dmi
new file mode 100644
index 0000000000..acbd2f5ebd
Binary files /dev/null and b/sandcode/icons/mob/clothing/underwear.dmi differ
diff --git a/sandcode/icons/mob/clothing/underwear_digi.dmi b/sandcode/icons/mob/clothing/underwear_digi.dmi
new file mode 100644
index 0000000000..c8c92ad96d
Binary files /dev/null and b/sandcode/icons/mob/clothing/underwear_digi.dmi differ
diff --git a/sandcode/icons/mob/clothing/wrists.dmi b/sandcode/icons/mob/clothing/wrists.dmi
new file mode 100644
index 0000000000..20ba91b5d2
Binary files /dev/null and b/sandcode/icons/mob/clothing/wrists.dmi differ
diff --git a/sandcode/icons/mob/screen_clockwork.dmi b/sandcode/icons/mob/screen_clockwork.dmi
new file mode 100644
index 0000000000..aa72185aeb
Binary files /dev/null and b/sandcode/icons/mob/screen_clockwork.dmi differ
diff --git a/sandcode/icons/mob/screen_liteweb.dmi b/sandcode/icons/mob/screen_liteweb.dmi
index 41fdde558c..3fbbb6b5da 100644
Binary files a/sandcode/icons/mob/screen_liteweb.dmi and b/sandcode/icons/mob/screen_liteweb.dmi differ
diff --git a/sandcode/icons/mob/screen_midnight.dmi b/sandcode/icons/mob/screen_midnight.dmi
new file mode 100644
index 0000000000..1b991bb960
Binary files /dev/null and b/sandcode/icons/mob/screen_midnight.dmi differ
diff --git a/sandcode/icons/mob/screen_operative.dmi b/sandcode/icons/mob/screen_operative.dmi
new file mode 100644
index 0000000000..70824ea898
Binary files /dev/null and b/sandcode/icons/mob/screen_operative.dmi differ
diff --git a/sandcode/icons/mob/screen_plasmafire.dmi b/sandcode/icons/mob/screen_plasmafire.dmi
new file mode 100644
index 0000000000..3a07a34232
Binary files /dev/null and b/sandcode/icons/mob/screen_plasmafire.dmi differ
diff --git a/sandcode/icons/mob/screen_retro.dmi b/sandcode/icons/mob/screen_retro.dmi
new file mode 100644
index 0000000000..ba20a9e8bd
Binary files /dev/null and b/sandcode/icons/mob/screen_retro.dmi differ
diff --git a/sandcode/icons/mob/screen_slimecore.dmi b/sandcode/icons/mob/screen_slimecore.dmi
new file mode 100644
index 0000000000..a4854f16c3
Binary files /dev/null and b/sandcode/icons/mob/screen_slimecore.dmi differ
diff --git a/sandcode/icons/obj/clothing/wrist.dmi b/sandcode/icons/obj/clothing/wrist.dmi
new file mode 100644
index 0000000000..20ba91b5d2
Binary files /dev/null and b/sandcode/icons/obj/clothing/wrist.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 7eec72ba27..ee54019f71 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3661,10 +3661,12 @@
#include "sandcode\code\game\objects\items\cards_ids.dm"
#include "sandcode\code\game\objects\items\chrono_eraser.dm"
#include "sandcode\code\game\objects\items\computermath.dm"
+#include "sandcode\code\game\objects\items\items.dm"
#include "sandcode\code\game\objects\items\circuitboards\computer_circuitboards.dm"
#include "sandcode\code\game\objects\items\circuitboards\machine_circuitboards.dm"
#include "sandcode\code\game\objects\items\devices\extra_arm.dm"
#include "sandcode\code\game\objects\items\devices\PDA\PDA.dm"
+#include "sandcode\code\game\objects\items\devices\radio\radio.dm"
#include "sandcode\code\game\objects\items\plushes\goat_boss.dm"
#include "sandcode\code\game\objects\items\plushes\plushes.dm"
#include "sandcode\code\game\objects\items\robot\robot_upgrades.dm"
@@ -3682,12 +3684,21 @@
#include "sandcode\code\modules\cargo\packs\emergency.dm"
#include "sandcode\code\modules\cargo\packs\misc.dm"
#include "sandcode\code\modules\client\asset_cache.dm"
+#include "sandcode\code\modules\client\loadout\boxers.dm"
+#include "sandcode\code\modules\client\loadout\shirts.dm"
+#include "sandcode\code\modules\client\loadout\socks.dm"
#include "sandcode\code\modules\clothing\refactor.dm"
#include "sandcode\code\modules\clothing\head\misc.dm"
#include "sandcode\code\modules\clothing\masks\miscellaneous.dm"
#include "sandcode\code\modules\clothing\outfits\standard.dm"
#include "sandcode\code\modules\clothing\spacesuits\chronosuit.dm"
#include "sandcode\code\modules\clothing\spacesuits\hardsuit.dm"
+#include "sandcode\code\modules\clothing\under\_under.dm"
+#include "sandcode\code\modules\clothing\underwear\_underwear.dm"
+#include "sandcode\code\modules\clothing\underwear\boxers.dm"
+#include "sandcode\code\modules\clothing\underwear\shirts.dm"
+#include "sandcode\code\modules\clothing\underwear\socks.dm"
+#include "sandcode\code\modules\clothing\wrists\_wrists.dm"
#include "sandcode\code\modules\crafting\recipes\recipes_misc.dm"
#include "sandcode\code\modules\hydroponics\grown\misc.dm"
#include "sandcode\code\modules\integrated_electronics\core\assemblies.dm"
@@ -3791,5 +3802,6 @@
#include "sandcode\code\modules\tgs\custom_procs.dm"
#include "sandcode\code\modules\uplink\uplink_items.dm"
#include "sandcode\code\modules\uplink\uplink_roles.dm"
+#include "sandcode\code\modules\vending\clothesmate.dm"
#include "sandcode\tools\Redirector\textprocs.dm"
// END_INCLUDE