diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 67fc80168a8..1e0fe3a78a9 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -110,7 +110,7 @@
// Also recharge their internal battery.
if(H.isSynthetic() && H.nutrition < 500) //VOREStation Edit
- H.nutrition = min(H.nutrition+(10*(1-H.species.synthetic_food_coeff)), 500) //VOREStation Edit
+ H.nutrition = min(H.nutrition+(10*(1-max(H.species.synthetic_food_coeff, 0.9))), 500) //VOREStation Edit
cell.use(7000/450*10)
// And clear up radiation
diff --git a/code/game/mecha/components/_component.dm b/code/game/mecha/components/_component.dm
index 3d770e0dce0..4058500dd2a 100644
--- a/code/game/mecha/components/_component.dm
+++ b/code/game/mecha/components/_component.dm
@@ -138,12 +138,26 @@
var/obj/item/stack/nanopaste/NP = W
if(integrity < max_integrity)
+ to_chat(user, "You start to repair damage to \the [src].")
while(integrity < max_integrity && NP)
- if(do_after(user, 1 SECOND, src) && NP.use(1))
- adjust_integrity(10)
+ if(do_after(user, 1 SECOND, src))
+ NP.use(1)
+ adjust_integrity(NP.mech_repair)
+
+ if(integrity >= max_integrity)
+ to_chat(user, "You finish repairing \the [src].")
+ break
+
+ else if(NP.amount == 0)
+ to_chat(user, "Insufficient nanopaste to complete repairs!")
+ break
+
return
+ else
+ to_chat(user, "\The [src] doesn't require repairs.")
+
return ..()
// Various procs to handle different calls by Exosuits. IE, movement actions, damage actions, etc.
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index f5821b18d19..1dd50dc0bfe 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1567,15 +1567,27 @@
for(var/slot in internal_components)
var/obj/item/mecha_parts/component/C = internal_components[slot]
- if(C)
+ if(!C)
+ to_chat(user, "There are no components installed!")
+ return
- if(C.integrity < C.max_integrity)
- while(C.integrity < C.max_integrity && NP && do_after(user, 1 SECOND, src))
- if(NP.use(1))
- C.adjust_integrity(10)
+ if(C.integrity >= C.max_integrity)
+ to_chat(user, "\The [C] does not require repairs.")
- to_chat(user, "You repair damage to \the [C].")
+ else if(C.integrity < C.max_integrity)
+ to_chat(user, "You start to repair damage to \the [C].")
+ while(C.integrity < C.max_integrity && NP)
+ if(do_after(user, 1 SECOND, src))
+ NP.use(1)
+ C.adjust_integrity(NP.mech_repair)
+ if(C.integrity >= C.max_integrity)
+ to_chat(user, "You finish repairing \the [C].")
+ break
+
+ else if(NP.amount == 0)
+ to_chat(user, "Insufficient nanopaste to complete repairs!")
+ break
return
else
diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm
index cd39b61fef4..d0bd4e80034 100644
--- a/code/game/objects/items/stacks/nanopaste_vr.dm
+++ b/code/game/objects/items/stacks/nanopaste_vr.dm
@@ -2,6 +2,7 @@
var/restoration_external = 5
var/restoration_internal = 20
var/repair_external = FALSE
+ var/mech_repair = 10
/obj/item/stack/nanopaste/advanced
name = "advanced nanopaste"
@@ -10,4 +11,5 @@
icon = 'icons/obj/stacks_vr.dmi'
icon_state = "adv_nanopaste"
restoration_external = 10
- repair_external = TRUE
\ No newline at end of file
+ repair_external = TRUE
+ mech_repair = 20
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index cbfac3ae02e..9f25d74a027 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -17,7 +17,7 @@
center_of_mass = null
var/list/datum/stack_recipe/recipes
var/singular_name
- VAR_PROTECTED/amount = 1
+ var/amount = 1
var/max_amount //also see stack recipes initialisation, param "max_res_amount" must be equal to this max_amount
var/stacktype //determines whether different stack types can merge
var/build_type = null //used when directly applied to a turf
diff --git a/code/game/objects/items/toys/balls_vr.dm b/code/game/objects/items/toys/balls_vr.dm
index 6c0b1c25a84..30f2c56d15c 100644
--- a/code/game/objects/items/toys/balls_vr.dm
+++ b/code/game/objects/items/toys/balls_vr.dm
@@ -48,4 +48,23 @@
name = "purple tennis ball"
desc = "A purple tennis ball. Now you've seen everything. Purple, seriously?"
icon_state = "tennis_purple"
- item_state = "tennis_purple"
\ No newline at end of file
+ item_state = "tennis_purple"
+
+/obj/item/toy/baseball
+ name = "baseball"
+ desc = "A classic baseball; a rubber core surrounded by yarn and covered by faux leather. Getting hit with one is akin to getting punched."
+ icon = 'icons/obj/balls_vr.dmi'
+ icon_state = "baseball"
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/righthand_balls_vr.dmi',
+ slot_r_hand_str = 'icons/mob/items/lefthand_balls_vr.dmi',
+ slot_wear_mask_str = 'icons/mob/mouthball_vr.dmi',
+ )
+ item_state = "baseball"
+ slot_flags = SLOT_MASK
+ throw_range = 16
+ force = 2.0
+ throwforce = 5.0
+ throw_speed = 5
+ throw_range = 5
+ w_class = ITEMSIZE_SMALL
\ No newline at end of file
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 7e5f8fd0798..62e6bfa9788 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -431,3 +431,44 @@
icon_state = "brainzsnaxred"
drop_sound = 'sound/items/drop/soda.ogg'
pickup_sound = 'sound/items/pickup/soda.ogg'
+
+//Candy Bars (1-10)
+/obj/item/trash/candy/cb01
+ name = "\improper Tau Ceti Bar wrapper"
+ icon_state = "cb01"
+
+/obj/item/trash/candy/cb02
+ name = "\improper Hundred-Thousand Thaler Bar wrapper"
+ icon_state = "cb02"
+
+/obj/item/trash/candy/cb03
+ name = "\improper Lars' Saltlakris wrapper"
+ icon_state = "cb03"
+
+/obj/item/trash/candy/cb04
+ name = "\improper Aerostat Bar wrapper"
+ icon_state = "cb04"
+
+/obj/item/trash/candy/cb05
+ name = "\improper Andromeda Bar wrapper"
+ icon_state = "cb05"
+
+/obj/item/trash/candy/cb06
+ name = "\improper Mocha Crunch wrapper"
+ icon_state = "cb06"
+
+/obj/item/trash/candy/cb07
+ name = "\improper TaroMilk Bar wrapper"
+ icon_state = "cb07"
+
+/obj/item/trash/candy/cb08
+ name = "\improper Cronk Bar wrapper"
+ icon_state = "cb08"
+
+/obj/item/trash/candy/cb09
+ name = "\improper Kaju Mamma! Bar wrapper"
+ icon_state = "cb09"
+
+/obj/item/trash/candy/cb10
+ name = "\improper Shantak Bar wrapper"
+ icon_state = "cb10"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm
index 1a872e99ac0..80c760c3f96 100644
--- a/code/game/objects/items/weapons/storage/backpack_vr.dm
+++ b/code/game/objects/items/weapons/storage/backpack_vr.dm
@@ -6,7 +6,7 @@
item_state = "saddlebag"
icon_state = "saddlebag"
max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags
- slowdown = 1 //And are slower, too...
+ slowdown = 0.5 //And are slower, too...
var/taurtype = /datum/sprite_accessory/tail/taur/horse //Acceptable taur type to be wearing this
var/no_message = "You aren't the appropriate taur type to wear this!"
@@ -35,7 +35,7 @@
icon_state = "saddlebag"
var/icon_base = "saddlebag"
max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Saddlebags can hold more, like dufflebags
- slowdown = 1 //And are slower, too...
+ slowdown = 0.5 //And are slower, too...
var/no_message = "You aren't the appropriate taur type to wear this!"
/obj/item/weapon/storage/backpack/saddlebag_common/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index ee28f497b69..3fdba7eaa94 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -5,18 +5,26 @@
* re-implemented in other classes.
*
* Contains:
+ * Generic non-item
* Trash Bag
+ * Plastic Bag
* Mining Satchel
* Plant Bag
* Sheet Snatcher
+ * Sheet Snatcher (Cyborg)
* Cash Bag
* Chemistry Bag
- Food Bag
-
+ * Food Bag
+ * Food Bag (Service Hound)
+ * Evidence Bag
+ *
* -Sayu
*/
-// Generic non-item
+
+// -----------------------------
+// Generic non-item
+// -----------------------------
/obj/item/weapon/storage/bag
allow_quick_gather = 1
allow_quick_empty = 1
@@ -67,7 +75,6 @@
// -----------------------------
// Plastic Bag
// -----------------------------
-
/obj/item/weapon/storage/bag/plasticbag
name = "plastic bag"
desc = "It's a very flimsy, very noisy alternative to a bag."
@@ -85,9 +92,9 @@
// Mining Satchel
// -----------------------------
/*
- * Mechoid - Orebags are the most common quick-gathering thing, and also have tons of lag associated with it. Their checks are going to be hyper-simplified due to this, and their INCREDIBLY singular target contents.
+ * Mechoid - Orebags are the most common quick-gathering thing, and also have tons of lag associated with it.
+ * Their checks are going to be hyper-simplified due to this, and their INCREDIBLY singular target contents.
*/
-
/obj/item/weapon/storage/bag/ore
name = "mining satchel"
desc = "This little bugger can be used to store and transport ores."
@@ -239,25 +246,14 @@
/obj/item/weapon/storage/bag/ore/open(mob/user as mob) //No opening it for the weird UI of having shit-tons of ore inside it.
user.examinate(src)
-/*
-/obj/item/weapon/storage/bag/ore/proc/update_ore_count() //Stolen from ore boxes. OLD way of storing ore.
-
- stored_ore = list()
-
- for(var/obj/item/weapon/ore/O in contents)
- if(stored_ore[O.name])
- stored_ore[O.name]++
- else
- stored_ore[O.name] = 1
-*/
// -----------------------------
// Plant bag
// -----------------------------
-
/obj/item/weapon/storage/bag/plants
name = "plant bag"
- icon = 'icons/obj/hydroponics_machines.dmi'
+ icon = 'icons/obj/hydroponics_machines_vr.dmi'
icon_state = "plantbag"
+ desc = "A sturdy bag used to transport fresh produce with ease."
max_storage_space = ITEMSIZE_COST_NORMAL * 25
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
@@ -265,8 +261,9 @@
/obj/item/weapon/storage/bag/plants/large
name = "large plant bag"
- w_class = ITEMSIZE_SMALL
- max_storage_space = ITEMSIZE_COST_NORMAL * 45
+ icon_state = "large_plantbag"
+ desc = "A large and sturdy bag used to transport fresh produce with ease."
+ max_storage_space = ITEMSIZE_COST_NORMAL * 50
// -----------------------------
// Sheet Snatcher
@@ -400,24 +397,9 @@
/obj/item/weapon/storage/bag/sheetsnatcher/borg
name = "sheet snatcher 9000"
- desc = ""
+ desc = null
capacity = 500//Borgs get more because >specialization
-// -----------------------------
-// Food Bag (Service Hound)
-// -----------------------------
-/obj/item/weapon/storage/bag/dogborg
- name = "dog bag"
- icon = 'icons/obj/storage.dmi'
- icon_state = "foodbag"
- desc = "A bag for storing things of all kinds."
- max_storage_space = ITEMSIZE_COST_NORMAL * 25
- max_w_class = ITEMSIZE_NORMAL
- w_class = ITEMSIZE_SMALL
- can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment,
- /obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/coin,/obj/item/weapon/spacecash,
- /obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/pill)
-
// -----------------------------
// Cash Bag
// -----------------------------
@@ -432,12 +414,12 @@
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash,/obj/item/weapon/spacecasinocash)
- // -----------------------------
- // Chemistry Bag
- // -----------------------------
+// -----------------------------
+// Chemistry Bag
+// -----------------------------
/obj/item/weapon/storage/bag/chemistry
name = "chemistry bag"
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "chembag"
desc = "A bag for storing pills, patches, and bottles."
max_storage_space = 200
@@ -445,12 +427,38 @@
slowdown = 3
can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
- // -----------------------------
- // Food Bag
- // -----------------------------
+// -----------------------------
+// Xeno Bag
+// -----------------------------
+/obj/item/weapon/storage/bag/xeno
+ name = "xenobiology bag"
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "xenobag"
+ desc = "A bag for storing various slime products."
+ max_storage_space = ITEMSIZE_COST_SMALL * 12
+ max_w_class = ITEMSIZE_NORMAL
+ w_class = ITEMSIZE_SMALL
+ can_hold = list(/obj/item/slime_extract,/obj/item/slimepotion, /obj/item/weapon/reagent_containers/food/snacks/monkeycube)
+
+// -----------------------------
+// Virology Bag
+// -----------------------------
+/obj/item/weapon/storage/bag/virology
+ name = "virology bag"
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "biobag"
+ desc = "A bag for storing various biological products."
+ max_storage_space = ITEMSIZE_COST_SMALL * 12
+ max_w_class = ITEMSIZE_NORMAL
+ w_class = ITEMSIZE_SMALL
+ can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial/,/obj/item/weapon/virusdish/)
+
+// -----------------------------
+// Food Bag
+// -----------------------------
/obj/item/weapon/storage/bag/food
name = "food bag"
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "foodbag"
desc = "A bag for storing foods of all kinds."
max_storage_space = ITEMSIZE_COST_NORMAL * 25
@@ -458,16 +466,30 @@
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment)
- // -----------------------------
- // Evidence Bag
- // -----------------------------
+// -----------------------------
+// Food Bag (Service Hound)
+// -----------------------------
+/obj/item/weapon/storage/bag/dogborg
+ name = "dog bag"
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_state = "foodbag"
+ desc = "An intergrated bag for storing things of all kinds."
+ max_storage_space = ITEMSIZE_COST_NORMAL * 25
+ max_w_class = ITEMSIZE_NORMAL
+ w_class = ITEMSIZE_SMALL
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks,/obj/item/weapon/reagent_containers/food/condiment,
+ /obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/coin,/obj/item/weapon/spacecash,
+ /obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/pill)
+
+// -----------------------------
+// Evidence Bag
+// -----------------------------
/obj/item/weapon/storage/bag/detective
name = "secure satchel"
- icon = 'icons/obj/storage.dmi'
+ icon = 'icons/obj/storage_vr.dmi'
icon_state = "detbag"
desc = "A bag for storing investigation things. You know, securely."
max_storage_space = ITEMSIZE_COST_NORMAL * 15
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
- can_hold = list(/obj/item/weapon/forensics/swab,/obj/item/weapon/sample/print,/obj/item/weapon/sample/fibers,/obj/item/weapon/evidencebag)
-
+ can_hold = list(/obj/item/weapon/forensics/swab,/obj/item/weapon/sample/print,/obj/item/weapon/sample/fibers,/obj/item/weapon/evidencebag)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/bags_vr.dm b/code/game/objects/items/weapons/storage/bags_vr.dm
index ccafe5fa635..6f9d0a0b151 100644
--- a/code/game/objects/items/weapons/storage/bags_vr.dm
+++ b/code/game/objects/items/weapons/storage/bags_vr.dm
@@ -1,15 +1,2 @@
/obj/item/weapon/storage/bag/chemistry
slot_flags = null
-
-/obj/item/weapon/storage/bag/xeno
- name = "xenobiology bag"
- icon = 'icons/obj/storage.dmi'
- icon_state = "chembag"
- max_storage_space = ITEMSIZE_COST_SMALL * 12
- max_w_class = ITEMSIZE_NORMAL
- w_class = ITEMSIZE_SMALL
- can_hold = list(
- /obj/item/slime_extract,
- /obj/item/slimepotion,
- /obj/item/weapon/reagent_containers/food/snacks/monkeycube
- )
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 13a7d7ca3dd..b18180c3524 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -79,6 +79,8 @@
/obj/item/weapon/storage/fancy/egg_box/open(mob/user as mob)
if(open)
return
+ if (isobserver(usr))
+ return
open = TRUE
update_icon()
..()
diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm
index 579e8a7419a..8feb3b2c92b 100644
--- a/code/game/objects/items/weapons/stunbaton.dm
+++ b/code/game/objects/items/weapons/stunbaton.dm
@@ -23,6 +23,7 @@
var/hitcost = 240
var/use_external_power = FALSE //only used to determine if it's a cyborg baton
var/grip_safety = TRUE
+ var/taped_safety = FALSE
/obj/item/weapon/melee/baton/New()
..()
@@ -100,7 +101,7 @@
/obj/item/weapon/melee/baton/dropped()
..()
- if(status && grip_safety)
+ if(status && grip_safety && !taped_safety)
status = 0
visible_message("\The [src]'s grip safety engages!")
update_icon()
@@ -109,6 +110,8 @@
. = ..()
if(Adjacent(user))
+ if(taped_safety)
+ . += "Someone has wrapped tape around the grip!"
if(bcell)
. += "The baton is [round(bcell.percent())]% charged."
if(!bcell)
@@ -129,6 +132,17 @@
to_chat(user, "[src] already has a cell.")
else
to_chat(user, "This cell is not fitted for [src].")
+ if(istype(W, /obj/item/weapon/tape_roll) || istype(W, /obj/item/taperoll))
+ if(grip_safety && !taped_safety) //no point letting people wrap tape around the grips of batons without a safety
+ to_chat(user, "You firmly wrap tape around the baton's grip, disabling the safety system.")
+ playsound(src, 'sound/effects/tape.ogg',25)
+ taped_safety = TRUE
+ else if(grip_safety && taped_safety)
+ to_chat(user, "The grip safety has already been taped down.")
+ if(istype(W, /obj/item/weapon/tool/screwdriver))
+ if(taped_safety)
+ to_chat(user, "You painstakingly scrape away the tape over the grip safety.")
+ taped_safety = FALSE
/obj/item/weapon/melee/baton/attack_hand(mob/user as mob)
if(user.get_inactive_hand() == src)
diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm
index a6bc8c7d34e..56366d7cdd9 100644
--- a/code/game/objects/random/maintenance.dm
+++ b/code/game/objects/random/maintenance.dm
@@ -111,6 +111,7 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/toy/tennis/cyan,
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
+ prob(1);/obj/item/toy/baseball,
prob(1);/obj/item/pizzavoucher
/* VOREStation Edit End */
)
diff --git a/code/game/objects/random/mapping_vr.dm b/code/game/objects/random/mapping_vr.dm
index 3075c404154..732d6146017 100644
--- a/code/game/objects/random/mapping_vr.dm
+++ b/code/game/objects/random/mapping_vr.dm
@@ -156,5 +156,6 @@
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
prob(2);/obj/item/clothing/ears/earmuffs,
- prob(2);/obj/item/clothing/ears/earmuffs/headphones
+ prob(2);/obj/item/clothing/ears/earmuffs/headphones,
+ prob(2);/obj/item/toy/baseball
)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index d59bb442ead..4fc7725bf64 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -39,6 +39,14 @@
/obj/item/clothing/shoes/brown,
/obj/item/device/radio/headset/headset_qm, //VOREStation Edit,
/obj/item/device/radio/headset/headset_qm/alt, //VOREStation Edit,
+ /obj/item/clothing/under/rank/neo_qm,
+ /obj/item/clothing/under/rank/neo_qm_skirt,
+ /obj/item/clothing/under/rank/neo_qm_jacket,
+ /obj/item/clothing/under/rank/neo_qm_white,
+ /obj/item/clothing/under/rank/neo_qm_white_skirt,
+ /obj/item/clothing/under/rank/neo_qm_turtle,
+ /obj/item/clothing/under/rank/neo_qm_turtle_skirt,
+ /obj/item/clothing/under/rank/neo_qm_gorka,
/obj/item/clothing/gloves/black,
/obj/item/clothing/gloves/fingerless,
/obj/item/weapon/tank/emergency/oxygen,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 7aa869ac15f..36b00526a85 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -11,6 +11,9 @@
///obj/item/clamp, //VOREStation Removal: without leaks those are pointless,
/obj/item/clothing/under/rank/chief_engineer,
/obj/item/clothing/under/rank/chief_engineer/skirt,
+ /obj/item/clothing/under/rank/neo_chiefengi,
+ /obj/item/clothing/under/rank/neo_chiefengi_skirt,
+ /obj/item/clothing/under/rank/neo_ce_gorka,
/obj/item/clothing/head/hardhat/white,
///obj/item/clothing/head/welding, //VOREStation Removal: Locker bloat, grr. They get fancy goggles or can raid the welding supplies locker for one of these.
/obj/item/clothing/gloves/heavy_engineer, //VOREStation Edit: chief gets the good shit
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index e83c3764a8c..8a9bb829995 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -137,6 +137,11 @@
/obj/item/weapon/cartridge/cmo,
/obj/item/clothing/gloves/sterile/latex,
/obj/item/clothing/shoes/brown,
+ /obj/item/clothing/under/rank/neo_cmo,
+ /obj/item/clothing/under/rank/neo_cmo_skirt,
+ /obj/item/clothing/under/rank/neo_cmo_turtle,
+ /obj/item/clothing/under/rank/neo_cmo_turtle_skirt,
+ /obj/item/clothing/under/rank/neo_cmo_gorka,
/obj/item/device/radio/headset/heads/cmo,
/obj/item/device/radio/headset/heads/cmo/alt,
/obj/item/device/flash,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 890a55deab5..81f2911baae 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -35,6 +35,11 @@
/obj/item/clothing/suit/storage/toggle/labcoat,
/obj/item/clothing/suit/storage/toggle/labcoat/modern,
/obj/item/clothing/suit/storage/toggle/labcoat/rd,
+ /obj/item/clothing/under/rank/neo_rd_turtle,
+ /obj/item/clothing/under/rank/neo_rd_turtle_skirt,
+ /obj/item/clothing/under/rank/neo_rd_suit,
+ /obj/item/clothing/under/rank/neo_rd_suit_skirt,
+ /obj/item/clothing/under/rank/neo_rd_gorka,
/obj/item/weapon/cartridge/rd,
/obj/item/clothing/shoes/white,
/obj/item/clothing/shoes/laceup/brown,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2b64c20d0f9..b337e0db897 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -49,6 +49,15 @@
/obj/item/clothing/under/lawyer/red,
/obj/item/clothing/under/lawyer/red/skirt,
/obj/item/clothing/under/lawyer/oldman,
+ /obj/item/clothing/under/rank/neo_hop,
+ /obj/item/clothing/under/rank/neo_hop_skirt,
+ /obj/item/clothing/under/rank/neo_hop_parade_masc,
+ /obj/item/clothing/under/rank/neo_hop_parade_fem,
+ /obj/item/clothing/under/rank/neo_hop_turtle,
+ /obj/item/clothing/under/rank/neo_hop_turtle_skirt,
+ /obj/item/clothing/under/rank/neo_cmd_gorka,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_hopformal,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep,
/obj/item/clothing/shoes/brown,
/obj/item/clothing/shoes/black,
/obj/item/clothing/shoes/laceup,
@@ -133,6 +142,13 @@
/obj/item/clothing/head/helmet/dermal,
/obj/item/clothing/head/helmet/warden,
/obj/item/clothing/head/helmet/warden/hat,
+ /obj/item/clothing/under/rank/neo_warden_red,
+ /obj/item/clothing/under/rank/neo_warden_red_skirt,
+ /obj/item/clothing/under/rank/neo_warden_blue,
+ /obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench,
+ /obj/item/clothing/suit/storage/vest/wardencoat/neo_bluewarden,
+ /obj/item/clothing/suit/storage/vest/wardencoat/neo_warden_heavy,
+ /obj/item/clothing/under/rank/neo_sec_gorka,
/obj/item/weapon/cartridge/security,
/obj/item/device/radio/headset/headset_sec,
/obj/item/device/radio/headset/headset_sec/alt,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
index 0bad0521c1b..3ab22cc1f4c 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security_vr.dm
@@ -13,6 +13,22 @@
/obj/item/clothing/suit/storage/vest/hoscoat/jensen/alt,
/obj/item/clothing/suit/storage/vest/hoscoat/jensen,
/obj/item/clothing/suit/storage/vest/hoscoat,
+ /obj/item/clothing/under/rank/neo_hos_red,
+ /obj/item/clothing/under/rank/neo_hos_red_skirt,
+ /obj/item/clothing/under/rank/neo_hos_blackred,
+ /obj/item/clothing/under/rank/neo_hos_blackred_skirt,
+ /obj/item/clothing/under/rank/neo_hos_parade,
+ /obj/item/clothing/under/rank/neo_hos_parade_fem,
+ /obj/item/clothing/under/rank/neo_hos_blue,
+ /obj/item/clothing/under/rank/neo_hos_blackblue,
+ /obj/item/clothing/under/rank/neo_hos_blackblue_skirt,
+ /obj/item/clothing/under/rank/neo_hos_parade_blue,
+ /obj/item/clothing/under/rank/neo_hos_parade_blue_fem,
+ /obj/item/clothing/under/rank/neo_hos_gorka,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_hos_parade,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_hosformal_blue,
+ /obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench,
+ /obj/item/clothing/head/helmet/HoS/hat/blue,
/obj/item/clothing/head/helmet/dermal,
/obj/item/device/radio/headset/heads/hos,
/obj/item/device/radio/headset/heads/hos/alt,
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index d72db42995a..ac03b1c209f 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -463,6 +463,12 @@
/obj/item/clothing/head/caphat/beret,
/obj/item/clothing/under/rank/captain,
/obj/item/clothing/under/dress/dress_cap/femformal,
+ /obj/item/clothing/under/rank/neo_captain_parade,
+ /obj/item/clothing/under/rank/neo_captain_skirt,
+ /obj/item/clothing/under/rank/neo_captain,
+ /obj/item/clothing/under/rank/neo_captain_kilt,
+ /obj/item/clothing/under/rank/neo_captain_blacksuit,
+ /obj/item/clothing/under/rank/neo_commandutil,
/obj/item/clothing/shoes/brown,
/obj/item/clothing/gloves/captain,
/obj/item/clothing/under/dress/dress_cap,
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 054da3a31dc..1da8e0a1596 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -242,6 +242,7 @@
prob(2);/obj/item/toy/tennis/cyan,
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
+ prob(1);/obj/item/toy/baseball,
prob(1);/obj/item/weapon/storage/box/brainzsnax,
prob(1);/obj/item/weapon/storage/box/brainzsnax/red,
prob(1);/obj/item/clothing/glasses/sunglasses,
diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm
index 7afc90d082e..c700e2ba93b 100644
--- a/code/modules/client/preference_setup/global/01_ui.dm
+++ b/code/modules/client/preference_setup/global/01_ui.dm
@@ -14,6 +14,7 @@
S["tgui_fancy"] >> pref.tgui_fancy
S["tgui_lock"] >> pref.tgui_lock
S["tgui_input_mode"] >> pref.tgui_input_mode
+ S["tgui_input_lock"] >> pref.tgui_input_lock
S["tgui_large_buttons"] >> pref.tgui_large_buttons
S["tgui_swapped_buttons"] >> pref.tgui_swapped_buttons
@@ -29,6 +30,7 @@
S["tgui_fancy"] << pref.tgui_fancy
S["tgui_lock"] << pref.tgui_lock
S["tgui_input_mode"] << pref.tgui_input_mode
+ S["tgui_input_lock"] << pref.tgui_input_lock
S["tgui_large_buttons"] << pref.tgui_large_buttons
S["tgui_swapped_buttons"] << pref.tgui_swapped_buttons
@@ -44,6 +46,7 @@
pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy))
pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock))
pref.tgui_input_mode = sanitize_integer(pref.tgui_input_mode, 0, 1, initial(pref.tgui_input_mode))
+ pref.tgui_input_lock = sanitize_integer(pref.tgui_input_lock, 0, 1, initial(pref.tgui_input_lock))
pref.tgui_large_buttons = sanitize_integer(pref.tgui_large_buttons, 0, 1, initial(pref.tgui_large_buttons))
pref.tgui_swapped_buttons = sanitize_integer(pref.tgui_swapped_buttons, 0, 1, initial(pref.tgui_swapped_buttons))
@@ -56,9 +59,10 @@
. += "Client FPS: [pref.client_fps]
"
. += "Random Ambience Frequency: [pref.ambience_freq]
"
. += "Ambience Chance: [pref.ambience_chance]
"
- . += "tgui Window Mode: [(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
"
- . += "tgui Window Placement: [(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"]
"
+ . += "TGUI Window Mode: [(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]
"
+ . += "TGUI Window Placement: [(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"]
"
. += "TGUI Input Framework: [(pref.tgui_input_mode) ? "Enabled" : "Disabled (default)"]
"
+ . += "TGUI Input Lock: [(pref.tgui_input_lock) ? "Enabled" : "Disabled (default)"]
"
. += "TGUI Large Buttons: [(pref.tgui_large_buttons) ? "Enabled (default)" : "Disabled"]
"
. += "TGUI Swapped Buttons: [(pref.tgui_swapped_buttons) ? "Enabled" : "Disabled (default)"]
"
if(can_select_ooc_color(user))
@@ -107,14 +111,14 @@
if(pref.client)
pref.client.fps = fps_new
return TOPIC_REFRESH
-
+
else if(href_list["select_ambience_freq"])
var/ambience_new = tgui_input_number(user, "Input how often you wish to hear ambience repeated! (1-60 MINUTES, 0 for disabled)", "Global Preference", pref.ambience_freq, 60, 0)
if(isnull(ambience_new) || !CanUseTopic(user)) return TOPIC_NOACTION
if(ambience_new < 0 || ambience_new > 60) return TOPIC_NOACTION
pref.ambience_freq = ambience_new
return TOPIC_REFRESH
-
+
else if(href_list["select_ambience_chance"])
var/ambience_chance_new = tgui_input_number(user, "Input the chance you'd like to hear ambience played to you (On area change, or by random ambience). 35 means a 35% chance to play ambience. This is a range from 0-100. 0 disables ambience playing entirely. This is also affected by Ambience Frequency.", "Global Preference", pref.ambience_freq, 100, 0)
if(isnull(ambience_chance_new) || !CanUseTopic(user)) return TOPIC_NOACTION
@@ -125,7 +129,7 @@
else if(href_list["tgui_fancy"])
pref.tgui_fancy = !pref.tgui_fancy
return TOPIC_REFRESH
-
+
else if(href_list["tgui_lock"])
pref.tgui_lock = !pref.tgui_lock
return TOPIC_REFRESH
@@ -134,6 +138,10 @@
pref.tgui_input_mode = !pref.tgui_input_mode
return TOPIC_REFRESH
+ else if(href_list["tgui_input_lock"])
+ pref.tgui_input_lock = !pref.tgui_input_lock
+ return TOPIC_REFRESH
+
else if(href_list["tgui_large_buttons"])
pref.tgui_large_buttons = !pref.tgui_large_buttons
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 3e5d539a860..4479f4fd2c1 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -501,6 +501,12 @@
ckeywhitelist = list("hunterbirk")
character_name = list("Amaryll")
+/datum/gear/fluff/aria_conduct_medal
+ path = /obj/item/clothing/accessory/medal/conduct
+ display_name = "Aria's Distinguished Conduct Medal"
+ ckeywhitelist = list("hunterbirk")
+ character_name = list("Aria Blue")
+
// I CKEYS
/datum/gear/fluff/ruda_badge
path = /obj/item/clothing/accessory/badge/holo/detective/ruda
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 13d2f7e50d3..156b5a4c87a 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -313,6 +313,26 @@
..()
gear_tweaks += gear_tweak_free_color_choice
+/datum/gear/suit/ranger_poncho
+ display_name = "ranger poncho selection"
+ path = /obj/item/clothing/accessory/poncho/roles/ranger
+ cost = 1
+
+/datum/gear/suit/ranger_poncho/New()
+ ..()
+ var/list/ranger_ponchos = list(
+ "red ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger,
+ "tan ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/tan,
+ "gray ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/gray,
+ "green ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/green,
+ "blue ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/blue,
+ "purple ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/purple,
+ "orange ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/orange,
+ "charcoal ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/charcoal,
+ "white ranger poncho" = /obj/item/clothing/accessory/poncho/roles/ranger/snow
+ )
+ gear_tweaks += new/datum/gear_tweak/path(ranger_ponchos)
+
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
diff --git a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm
new file mode 100644
index 00000000000..28ca463500f
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm
@@ -0,0 +1,592 @@
+//template for quickly making more, if it's ever needed
+/*
+
+/datum/gear/uniform/BLANK_selector
+ display_name = "DEPT - BLANK's Uniforms"
+ description = "Select from a range of outfits available to all BLANK personnel."
+ allowed_roles = list("")
+ path =
+ slot = slot_w_uniform
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/BLANK_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+*/
+
+//Command/Specific
+
+/datum/gear/uniform/site_manager_selector
+ display_name = "Command - Site Manager's Uniforms"
+ description = "Select from a range of outfits available to all Site Managers."
+ allowed_roles = list("Site Manager")
+ path = /obj/item/clothing/under/rank/neo_captain
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/site_manager_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "uniform w/ dress"=/obj/item/clothing/under/dress/dress_cap,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/command,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_captain,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_captain_skirt,
+ "TG&C utility suit"=/obj/item/clothing/under/rank/neo_commandutil,
+ "TG&C black suit"=/obj/item/clothing/under/rank/neo_captain_blacksuit,
+ "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_captain_parade,
+ "TG&C jumpkilt"=/obj/item/clothing/under/rank/neo_captain_kilt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmd_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/head_of_personnel_selector
+ display_name = "Command - Head of Personnel's Uniforms"
+ description = "Select from a range of outfits available to all Heads of Personnel."
+ allowed_roles = list("Head of Personnel")
+ path = /obj/item/clothing/under/rank/neo_hop
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/head_of_personnel_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "uniform w/ dress"=/obj/item/clothing/under/dress/dress_hop,
+ "HR director"=/obj/item/clothing/under/dress/dress_hr,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/command,
+ "TG&C command utility"=/obj/item/clothing/under/rank/neo_commandutil,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_hop,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_hop_skirt,
+ "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_hop_parade_masc,
+ "TG&C parade dress"=/obj/item/clothing/under/rank/neo_hop_parade_fem,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_hop_turtle,
+ "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_hop_turtle_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmd_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/pilot_uniform_selector
+ display_name = "Civilian - Pilot's Uniforms"
+ description = "Select from a range of outfits available to all Pilots."
+ allowed_roles = list("Pilot")
+ path = /obj/item/clothing/under/rank/neo_pilot
+ sort_category = "Uniform Selectors"
+ cost = 1
+
+/datum/gear/uniform/pilot_uniform_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_pilot,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_pilot_skirt,
+ "Major Bill's flightsuit"=/obj/item/clothing/under/mbill_flight,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_pilot_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/janitor_uniform_selector
+ display_name = "Civilian - Janitor's Uniforms"
+ description = "Select from a range of outfits available to all Janitorial personnel."
+ allowed_roles = list("Janitor")
+ path = /obj/item/clothing/under/rank/neo_janitor
+ sort_category = "Uniform Selectors"
+ cost = 1
+
+/datum/gear/uniform/janitor_uniform_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "TG&C janitor's uniform"=/obj/item/clothing/under/rank/neo_janitor,
+ "TG&C janitor's uniform w/ skirt"=/obj/item/clothing/under/rank/neo_janitor_skirt
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/civvie_uniform_selector
+ display_name = "Civilian - Basic Uniforms"
+ description = "Select from a range of uniforms available to all personnel. Includes miscellaneous corporate contractor uniforms."
+ path = /obj/item/clothing/under/utility/grey
+ sort_category = "Uniform Selectors"
+ cost = 1
+
+/datum/gear/uniform/civvie_uniform_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/civ,
+ "TG&C plain turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck,
+ "TG&C plain turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_turtleskirt,
+ "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_suspect_turtleneck_blue,
+ "TG&C blue turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue,
+ "TG&C red turtleneck"=/obj/item/clothing/under/rank/neo_suspicious_turtleneck,
+ "TG&C red turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_suspicious_turtleskirt,
+ "TG&C comfy overalls"=/obj/item/clothing/under/rank/neo_suspect_overalls,
+ "TG&C comfy overalls w/ skirt"=/obj/item/clothing/under/rank/neo_suspect_overalls_skirt,
+ "TG&C contractor's suit"=/obj/item/clothing/under/rank/neo_contract,
+ "Corporate, Major Bill's uniform"=/obj/item/clothing/under/mbill,
+ "Corporate, Aether Atmospherics uniform"=/obj/item/clothing/under/corp/aether,
+ "Corporate, Focal Point Energistics uniform"=/obj/item/clothing/under/corp/focal,
+ "Corporate, Grayson Manufactories uniform"=/obj/item/clothing/under/corp/grayson,
+ "Corporate, Grayson Manufactories jumpsuit"=/obj/item/clothing/under/corp/grayson_jump,
+ "Corporate, Ward-Takahashi uniform"=/obj/item/clothing/under/corp/wardt,
+ "Corporate, Hephaestus Arms uniform"=/obj/item/clothing/under/corp/hephaestus,
+ "Corporate, Centauri Provisions uniform"=/obj/item/clothing/under/corp/centauri,
+ "Corporate, Morpheus Cyberkinetics uniform"=/obj/item/clothing/under/corp/morpheus,
+ "Corporate, Wulf Aeronautics uniform"=/obj/item/clothing/under/corp/wulf,
+ "Corporate, Zeng-Hu uniform"=/obj/item/clothing/under/corp/zenghu,
+ "Corporate, Xion Manufacturing uniform"=/obj/item/clothing/under/corp/xion,
+ "Galactic Survey utility uniform"=/obj/item/clothing/under/gsa,
+ "Galactic Survey reinforced uniform"=/obj/item/clothing/under/gsa_work,
+ "Utility uniform, black"=/obj/item/clothing/under/utility,
+ "Utility uniform, navy"=/obj/item/clothing/under/utility/blue,
+ "Utility uniform, grey"=/obj/item/clothing/under/utility/grey,
+ "Utility uniform, tan"=/obj/item/clothing/under/utility/tan,
+ "Utility uniform, green"=/obj/item/clothing/under/utility/green,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_civvie_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+//Security
+
+/datum/gear/uniform/security_selector
+ display_name = "Security - Basic Uniforms"
+ description = "Select from a range of outfits available to all Security personnel."
+ allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
+ path = /obj/item/clothing/under/rank/security/corp
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/security_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "undersuit, modernized"=/obj/item/clothing/under/rank/security/modern,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/sec,
+ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/sec,
+ "skirt"=/obj/item/clothing/under/rank/security/skirt,
+ "turtleneck"=/obj/item/clothing/under/rank/security/turtleneck,
+ "corporate"=/obj/item/clothing/under/rank/security/corp,
+ "formal, navy"=/obj/item/clothing/under/rank/security/navyblue,
+ "formal, tan"=/obj/item/clothing/under/rank/security/tan,
+ "Proxima Centauri Risk Control"=/obj/item/clothing/under/corp/pcrc,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_sec_red,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_sec_red_skirt,
+ "TG&C blue jumpsuit"=/obj/item/clothing/under/rank/neo_sec_blue,
+ "TG&C white"=/obj/item/clothing/under/rank/neo_sec_suit,
+ "TG&C blue"=/obj/item/clothing/under/rank/neo_sec_suit_blue,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_sec_turtle_red,
+ "TG&C turtleneck & skirt"=/obj/item/clothing/under/rank/neo_sec_turtle_red_skirt,
+ "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_sec_turtle_blue,
+ "TG&C blue turtleneck & skirt"=/obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt,
+ "corrections officer"=/obj/item/clothing/under/rank/neo_corrections,
+ "corrections officer w/ skirt"=/obj/item/clothing/under/rank/neo_corrections_skirt,
+ "runner's turtleneck"=/obj/item/clothing/under/rank/neo_runner,
+ "ST: Original Series Ops"=/obj/item/clothing/under/rank/trek/engsec,
+ "ST: Next Generation Ops"=/obj/item/clothing/under/rank/trek/engsec/next,
+ "ST: Voyager Ops"=/obj/item/clothing/under/rank/trek/engsec/voy,
+ "ST: DS9 Ops"=/obj/item/clothing/under/rank/trek/engsec/ds9,
+ "ST: Enterprise Ops"=/obj/item/clothing/under/rank/trek/engsec/ent,
+ "TG&C bodyguard's suit"=/obj/item/clothing/under/rank/bodyguard_suit,
+ "TG&C bodyguard's skirt"=/obj/item/clothing/under/rank/bodyguard_skirt,
+ "TG&C bodyguard's turtleneck"=/obj/item/clothing/under/rank/bodyguard_turtleneck,
+ "TG&C bodyguard's turtleneck w/ skirt"=/obj/item/clothing/under/rank/bodyguard_turtleskirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_sec_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/security_warden_selector
+ display_name = "Security - Warden's Uniforms"
+ description = "Select from a range of outfits available to Wardens."
+ allowed_roles = list("Head of Security","Warden")
+ path = /obj/item/clothing/under/rank/warden/corp
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/security_warden_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/warden/skirt,
+ "corporate"=/obj/item/clothing/under/rank/warden/corp,
+ "formal, navy"=/obj/item/clothing/under/rank/warden/navyblue,
+ "formal, tan"=/obj/item/clothing/under/rank/warden/navyblue,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_warden_red,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_warden_red_skirt,
+ "TG&C blue jumpsuit"=/obj/item/clothing/under/rank/neo_warden_blue
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/security_detective_selector
+ display_name = "Security - Detective's Uniforms"
+ description = "Select from a range of outfits available to all Detectives."
+ allowed_roles = list("Head of Security","Detective")
+ path = /obj/item/clothing/under/det/corporate
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/security_detective_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/det/skirt,
+ "corporate"=/obj/item/clothing/under/det/corporate
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/security_head_selector
+ display_name = "Security - Head's Uniforms"
+ description = "Select from a range of outfits available to all Heads of Security."
+ allowed_roles = list("Head of Security")
+ path = /obj/item/clothing/under/rank/head_of_security/corp
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/security_head_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/head_of_security/skirt,
+ "corporate"=/obj/item/clothing/under/rank/head_of_security/corp,
+ "formal, navy"=/obj/item/clothing/under/rank/head_of_security/navyblue,
+ "formal, tan"=/obj/item/clothing/under/rank/head_of_security/tan,
+ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/sec/hos,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_hos_red,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_hos_red_skirt,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_hos_blackred,
+ "TG&C turtleneck & skirt"=/obj/item/clothing/under/rank/neo_hos_blackred_skirt,
+ "TG&C parade uniform"=/obj/item/clothing/under/rank/neo_hos_parade,
+ "TG&C parade uniform, feminine"=/obj/item/clothing/under/rank/neo_hos_parade_fem,
+ "TG&C blue"=/obj/item/clothing/under/rank/neo_hos_blue,
+ "TG&C blue turtleneck"=/obj/item/clothing/under/rank/neo_hos_blackblue,
+ "TG&C blue turtleneck & skirt"=/obj/item/clothing/under/rank/neo_hos_blackblue_skirt,
+ "TG&C blue parade uniform"=/obj/item/clothing/under/rank/neo_hos_parade_blue,
+ "TG&C blue parade uniform, feminine"=/obj/item/clothing/under/rank/neo_hos_parade_blue_fem,
+ "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_hos_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+//Cargo
+
+/datum/gear/uniform/quartermaster_selector
+ display_name = "Cargo - Quartermaster's Uniforms"
+ description = "Select from a range of outfits available to all Quartermasters."
+ allowed_roles = list("Quartermaster")
+ path = /obj/item/clothing/under/rank/cargo/jeans
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/quartermaster_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/cargo/skirt,
+ "jeans"=/obj/item/clothing/under/rank/cargo/jeans,
+ "jeans, feminine cut"=/obj/item/clothing/under/rank/cargo/jeans/female,
+ "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_qm,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_qm_skirt,
+ "TG&C casualwear"=/obj/item/clothing/under/rank/neo_qm_jacket,
+ "TG&C button-up"=/obj/item/clothing/under/rank/neo_qm_white,
+ "TG&C button-up w/ skirt"=/obj/item/clothing/under/rank/neo_qm_white_skirt,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_qm_turtle,
+ "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_qm_turtle_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_qm_gorka,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/cargo_general_selector
+ display_name = "Cargo - Basic Uniforms"
+ description = "Select from a range of outfits available to all Cargo personnel."
+ allowed_roles = list("Cargo Technician","Shaft Miner","Quartermaster")
+ path = /obj/item/clothing/under/rank/cargotech/jeans
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/cargo_general_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/cargotech/skirt,
+ "jeans"=/obj/item/clothing/under/rank/cargotech/jeans,
+ "jeans, feminine cut"=/obj/item/clothing/under/rank/cargotech/jeans/female,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/crg,
+ "TG&C shorts"=/obj/item/clothing/under/rank/neo_cargo_shorts,
+ "TG&C skirt"=/obj/item/clothing/under/rank/neo_cargo_skirt,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_cargo,
+ "TG&C utility uniform"=/obj/item/clothing/under/rank/neo_util_cargo,
+ "TG&C dark"=/obj/item/clothing/under/rank/neo_cargo_dark,
+ "TG&C casual"=/obj/item/clothing/under/rank/neo_cargo_casual,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_cargo_turtle,
+ "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_cargo_turtle_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cargo_gorka,
+ "customs officer"=/obj/item/clothing/under/rank/neo_cargo_customs
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/cargo_miner_selector
+ display_name = "Cargo - Miner's Uniforms"
+ description = "Select from a range of outfits available to all Mining personnel."
+ allowed_roles = list("Shaft Miner","Quartermaster")
+ path = /obj/item/clothing/under/rank/neo_miner
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/cargo_miner_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "TG&C miner's uniform"=/obj/item/clothing/under/rank/neo_miner,
+ "TG&C hunter's uniform"=/obj/item/clothing/under/rank/neo_miner_fauna
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+//Engineering
+
+/datum/gear/uniform/engineering_chief_selector
+ display_name = "Engineering - Chief Engineer's Uniforms"
+ description = "Select from a range of outfits available to all Chief Engineers."
+ allowed_roles = list("Chief Engineer")
+ path = /obj/item/clothing/under/rank/neo_chiefengi
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/engineering_chief_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/chief_engineer/skirt,
+ "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_chiefengi,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_chiefengi_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_ce_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/engineer_selector
+ display_name = "Engineering - Basic Uniforms"
+ description = "Select from a range of outfits available to all Engineering personnel."
+ allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician")
+ path = /obj/item/clothing/under/rank/neo_engi
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/engineer_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/engineer/skirt,
+ "turtleneck"=/obj/item/clothing/under/rank/engineer/turtleneck,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/eng,
+ "ST: Original Series Ops"=/obj/item/clothing/under/rank/trek/engsec,
+ "ST: Next Generation Ops"=/obj/item/clothing/under/rank/trek/engsec/next,
+ "ST: Voyager Ops"=/obj/item/clothing/under/rank/trek/engsec/voy,
+ "ST: DS9 Ops"=/obj/item/clothing/under/rank/trek/engsec/ds9,
+ "ST: Enterprise Ops"=/obj/item/clothing/under/rank/trek/engsec/ent,
+ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/hazard,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_engi,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_engi_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_engi_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/engi_atmos_selector
+ display_name = "Engineering - Atmos Tech's Uniforms"
+ description = "Select from a range of outfits available to all Atmospherics Technicians."
+ allowed_roles = list("Chief Engineer","Atmospheric Technician")
+ path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/engi_atmos_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/atmospheric_technician/skirt,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_atmos,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_atmos_skirt
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+//Medical
+
+/datum/gear/uniform/medical_selector
+ display_name = "Medical - Basic Uniforms"
+ description = "Select from a range of outfits available to all Medical personnel."
+ allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic")
+ path = /obj/item/clothing/under/rank/neo_med
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/medical_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/medical/skirt,
+ "virologist skirt"=/obj/item/clothing/under/rank/virologist/skirt,
+ "turtleneck"=/obj/item/clothing/under/rank/medical/turtleneck,
+ "vey-medical jumpsuit"=/obj/item/clothing/under/corp/veymed,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/med,
+ "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci,
+ "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next,
+ "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy,
+ "ST: DS9 Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ds9,
+ "ST: Enterprise Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ent,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_med,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_med_skirt,
+ "TG&C virology jumpsuit"=/obj/item/clothing/under/rank/neo_viro,
+ "TG&C virology jumpskirt"=/obj/item/clothing/under/rank/neo_viro_skirt,
+ "TG&C dark jumpsuit"=/obj/item/clothing/under/rank/neo_med_dark,
+ "TG&C dark jumpskirt"=/obj/item/clothing/under/rank/neo_med_dark_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_med_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/chemist_selector
+ display_name = "Medical - Chemist's Uniforms"
+ description = "Select from a range of outfits available to all Chemists."
+ allowed_roles = list("Chief Medical Officer","Chemist")
+ path = /obj/item/clothing/under/rank/neo_chem
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/chemist_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/chemist/skirt,
+ "TG&C chemist's jumpsuit"=/obj/item/clothing/under/rank/neo_chem,
+ "TG&C chemist's jumpskirt"=/obj/item/clothing/under/rank/neo_chem_skirt,
+ "TG&C pharmacy jumpsuit"=/obj/item/clothing/under/rank/neo_pharma,
+ "TG&C pharmacy jumpskirt"=/obj/item/clothing/under/rank/neo_pharma_skirt
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/paramedic_selector
+ display_name = "Medical - Paramedic's Uniforms"
+ description = "Select from a range of outfits available to all Paramedics."
+ allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic")
+ path = /obj/item/clothing/under/rank/paramedunidark
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/paramedic_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "dark"=/obj/item/clothing/under/rank/paramedunidark,
+ "dark w/ skirt"=/obj/item/clothing/under/rank/parameduniskirtdark,
+ "light"=/obj/item/clothing/under/rank/paramedunilight,
+ "light w/ skirt"=/obj/item/clothing/under/rank/parameduniskirtlight,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_para,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_para_skirt,
+ "TG&C light jumpsuit"=/obj/item/clothing/under/rank/neo_para_light,
+ "TG&C light jumpskirt"=/obj/item/clothing/under/rank/neo_para_light_skirt
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/chief_medical_selector
+ display_name = "Medical - Chief Medical Officer's Uniforms"
+ description = "Select from a range of outfits available to all Chief Medical Officers."
+ allowed_roles = list("Chief Medical Officer")
+ path = /obj/item/clothing/under/rank/neo_cmo
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/chief_medical_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/chief_medical_officer/skirt,
+ "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_cmo,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_cmo_skirt,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_cmo_turtle,
+ "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_cmo_turtle_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_cmo_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+//Science
+
+/datum/gear/uniform/research_director_selector
+ display_name = "Science - Research Director's Uniforms"
+ description = "Select from a range of outfits available to all Research Directors."
+ allowed_roles = list("Research Director")
+ path = /obj/item/clothing/under/rank/neo_rd_suit
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/research_director_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "KHI uniform, command"=/obj/item/clothing/under/rank/khi/cmd,
+ "ST: Original Series Command"=/obj/item/clothing/under/rank/trek/command,
+ "ST: Next Generation Command"=/obj/item/clothing/under/rank/trek/command/next,
+ "ST: Voyager Command"=/obj/item/clothing/under/rank/trek/command/voy,
+ "ST: DS9 Command"=/obj/item/clothing/under/rank/trek/command/ds9,
+ "ST: Enterprise Command"=/obj/item/clothing/under/rank/trek/command/ent,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_rd_suit,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_rd_suit_skirt,
+ "TG&C turtleneck"=/obj/item/clothing/under/rank/neo_rd_turtle,
+ "TG&C turtleneck w/ skirt"=/obj/item/clothing/under/rank/neo_rd_turtle_skirt,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_rd_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/science_dept_selector
+ display_name = "Science - Basic Uniforms"
+ description = "Select from a range of outfits available to all Science personnel."
+ allowed_roles = list("Scientist","Research Director","Roboticist","Xenobiologist","Xenobotanist")
+ path = /obj/item/clothing/under/rank/neo_science
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/science_dept_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_science,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_science_skirt,
+ "TG&C utility"=/obj/item/clothing/under/rank/neo_util_sci,
+ "KHI uniform"=/obj/item/clothing/under/rank/khi/sci,
+ "ST: Original Series Med-Sci"=/obj/item/clothing/under/rank/trek/medsci,
+ "ST: Next Generation Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/next,
+ "ST: Voyager Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/voy,
+ "ST: DS9 Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ds9,
+ "ST: Enterprise Med-Sci"=/obj/item/clothing/under/rank/trek/medsci/ent,
+ "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_sci_gorka
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
+
+/datum/gear/uniform/science_robotics_selector
+ display_name = "Science - Roboticist's Uniforms"
+ description = "Select from a range of outfits available to all Roboticists."
+ allowed_roles = list("Research Director","Roboticist")
+ path = /obj/item/clothing/under/rank/neo_robo
+ sort_category = "Uniform Selectors"
+ cost = 2
+
+/datum/gear/uniform/science_robotics_selector/New()
+ ..()
+ var/list/selector_uniforms = list(
+ "skirt"=/obj/item/clothing/under/rank/roboticist/skirt,
+ "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_robo,
+ "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_robo_skirt
+ )
+ gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms))
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index c5e3200a2bf..db1e8fda212 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -29,6 +29,7 @@ var/list/preferences_datums = list()
var/tgui_fancy = TRUE
var/tgui_lock = FALSE
var/tgui_input_mode = FALSE // All the Input Boxes (Text,Number,List,Alert)
+ var/tgui_input_lock = FALSE
var/tgui_large_buttons = TRUE
var/tgui_swapped_buttons = FALSE
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index fa84a8c8ec7..ec4e6ca70bf 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -343,9 +343,31 @@ BLIND // can't see anything
icon_state = "aviator"
/obj/item/clothing/glasses/sunglasses/bigshot
- name = "big shot's glasses"
- desc = "A pair of glasses to help you feel more like a \[BIG SHOT]."
- icon_state = "bigshot"
+ name = "colored glasses"
+ desc = "A pair of glasses with uniquely colored lenses to make you feel like a \[BIG SHOT]."
+ description_fluff = "A prototype model of the AR glasses which focused on stylization and \
+ functionality. The concept never caught on and was replaced with the earlier rendition of \
+ the modern AR glasses. These have quite clearly seen better days as the AR function no \
+ longer works, the toggle merely obscuring the users vison."
+ icon_state = "salesman"
+ var/ar = 0
+
+/obj/item/clothing/glasses/sunglasses/bigshot/examine(mob/user as mob)
+ . = ..()
+ . += to_chat(usr, "Alt-click to toggle modes")
+
+/obj/item/clothing/glasses/sunglasses/bigshot/AltClick()
+ set src in usr
+ if(usr.canmove && !usr.stat && !usr.restrained())
+ if(src.ar)
+ src.ar = !src.ar
+ icon_state = initial(icon_state)
+ to_chat(usr, "You press a small button on \the [src] and deactivate the AR mode.")
+ else
+ src.ar = !src.ar
+ icon_state = "[initial(icon_state)]_fzz"
+ to_chat(usr, "You press a small button on \the [src] and activate the AR mode.")
+ update_clothing_icon()
/obj/item/clothing/glasses/welding
name = "welding goggles"
diff --git a/code/modules/clothing/head/neohats.dm b/code/modules/clothing/head/neohats.dm
new file mode 100644
index 00000000000..bfc675c5ebf
--- /dev/null
+++ b/code/modules/clothing/head/neohats.dm
@@ -0,0 +1,45 @@
+/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes.
+this file deals with hats/headwear. */
+
+/obj/item/clothing/head/helmet/HoS/hat/blue
+ name = "Blue Head of Security Hat"
+ desc = "The hat of the Head of Security. For showing the officers who's in charge."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_hoshat_blue"
+ valid_accessory_slots = null
+
+/obj/item/clothing/head/soft/neo_softcap
+ name = "suspect softcap"
+ desc = "a dark-colored softcap."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_softcap"
+
+/obj/item/clothing/head/neo_irs
+ name = "IRS cap"
+ desc = "a blue cap with the letters 'IRS' emblazoned on the front."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_irs"
+
+/obj/item/clothing/head/ushanka/neo_ushanka
+ name = "Ushanka"
+ desc = "an old beat-up ushanka."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_ushanka"
+
+/obj/item/clothing/head/ushanka/neo_ushanka_blue
+ name = "Blue Ushanka"
+ desc = "a light-blue ushanka."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_blue_ushanka"
+
+/obj/item/clothing/head/papakha
+ name = "Papakha"
+ desc = "an old beat-up Papakha."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_papakha"
+
+/obj/item/clothing/head/papakha_white
+ name = "White Papakha"
+ desc = "an old beat-up white papakha."
+ icon = 'icons/inventory/head/item.dmi'
+ icon_state = "neo_papakha_white"
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index c3bdad4e4ea..bbf0809bc4b 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -98,6 +98,7 @@
name = "shipping cap"
desc = "It's a ballcap bearing the colors of Major Bill's Shipping."
icon_state = "mbillsoft"
+ item_state_slots = list(slot_r_hand_str = "redsoft", slot_l_hand_str = "redsoft")
catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills)
/obj/item/clothing/head/soft/med
diff --git a/code/modules/clothing/shoes/neoshoes.dm b/code/modules/clothing/shoes/neoshoes.dm
new file mode 100644
index 00000000000..1174827930b
--- /dev/null
+++ b/code/modules/clothing/shoes/neoshoes.dm
@@ -0,0 +1,14 @@
+/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes.
+this file deals with shoes/footwear. */
+
+/obj/item/clothing/shoes/boots/jackboots/white
+ name = "white jackboots"
+ desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ icon_state = "neo_jack_white"
+ icon = 'icons/inventory/feet/item.dmi'
+
+/obj/item/clothing/shoes/boots/jackboots/silver
+ name = "silver jackboots"
+ desc = "Standard-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
+ icon_state = "neo_jack_silver"
+ icon = 'icons/inventory/feet/item.dmi'
diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm
index a55d6ff93d5..bfdaea02229 100644
--- a/code/modules/clothing/suits/armor_vr.dm
+++ b/code/modules/clothing/suits/armor_vr.dm
@@ -169,3 +169,10 @@
/obj/item/clothing/suit/armor/combat/crusader_explo/FM
name = "field medic low tech suit"
icon_state = "crusader_explo/FM"
+
+// martian miner coat
+/obj/item/clothing/suit/storage/vest/martian_miner
+ name = "martian miner's coat"
+ desc = "A sturdy, rugged coat once favoured by miners on Mars. These coats became strongly associated with early Martian Independence movements as a result, and remain moderately popular amongst members of the Third Ares Confederation."
+ icon_state = "martian_miner"
+ armor = list(melee = 25, bullet = 15, laser = 15, energy = 0, bomb = 25, bio = 0, rad = 0)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/neosuits.dm b/code/modules/clothing/suits/neosuits.dm
new file mode 100644
index 00000000000..5f70441870e
--- /dev/null
+++ b/code/modules/clothing/suits/neosuits.dm
@@ -0,0 +1,159 @@
+/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes.
+this file deals with suits/overwear. */
+
+// labcoats
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_emt
+ name = "EMT jacket"
+ desc = "A dark blue labcoat with reflective strips for emergency medical technicians."
+ icon_state = "neo_emt"
+ item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat")
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_robo_coat
+ name = "robotics labcoat"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_robo_coat"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat
+ name = "long labcoat"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_labcoat"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_highvis
+ name = "high visibility jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_coat_highvis"
+ item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat")
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_redemt
+ name = "red EMT jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_redemt"
+ item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat")
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_blueemt
+ name = "dark blue EMT jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_blueemt"
+ item_state_slots = list(slot_r_hand_str = "emt_labcoat", slot_l_hand_str = "emt_labcoat")
+
+// generic labcoat subtypes
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_hos_parade
+ name = "head of security's parade jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_hos_parade"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_engi_dep
+ name = "engineer's department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_engi_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_cargo_dep
+ name = "cargo department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_cargo_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_sci_dep
+ name = "science department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_sci_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_med_dep
+ name = "medical department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_med_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_blue_dep
+ name = "blue security department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_sec_blue_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_red_dep
+ name = "red security department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_sec_red_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep
+ name = "off-duty department jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_civ_dep"
+
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_police
+ name = "traffic officer's jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_police"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_ranger
+ name = "ranger's cloak"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_ranger"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_bodyguard_dep
+ name = "bodyguard's jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_bodyguard_dep"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_hopformal
+ name = "hop's formal jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_hopformal"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_bluemed
+ name = "paramedic's jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_bluemed"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_hosformal_blue
+ name = "head of security's blue formal jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_hosformal_blue"
+
+/obj/item/clothing/suit/storage/toggle/labcoat/neo_leather
+ name = "leather hoodie"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_leather"
+
+// non transforming coats
+
+/obj/item/clothing/suit/neo_gorka
+ name = "gorka jacket"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_gorka"
+ body_parts_covered = UPPER_TORSO|ARMS
+
+/obj/item/clothing/suit/neo_gorka_cargo
+ name = "cargo gorka"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_gorka_cargo"
+ body_parts_covered = UPPER_TORSO|ARMS
+
+/obj/item/clothing/suit/neo_runner_coat
+ name = "runner's coat"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_runner_coat"
+ body_parts_covered = UPPER_TORSO|ARMS
+
+/obj/item/clothing/suit/neo_medical_coat
+ name = "medical coat"
+ desc = "it bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_medical_coat"
+ body_parts_covered = UPPER_TORSO|ARMS
+
+// non-transforming armoured coats with storage
+
+/obj/item/clothing/suit/storage/vest/wardencoat/neo_bluewarden
+ name = "blue warden's jacket"
+ desc = "A common style of warden's jacket with armour vest, but in blue. It bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_bluewarden"
+
+/obj/item/clothing/suit/storage/vest/wardencoat/neo_warden_heavy
+ name = "heavy warden coat"
+ desc = "A heavy and somewhat-imposing looking armour vest over a long jacket. It bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_warden_heavy"
+
+/obj/item/clothing/suit/storage/vest/wardencoat/neo_armsco_trench
+ name = "armsco heavy coat"
+ desc = "A rich red longcoat trimmed in black with a warm brown synthetic fur ruff around the neck, lined with layers of para-aramid fibers for increased durability without compromising comfort. It bears a tag that says 'Product of Total Gear & Co.'"
+ icon_state = "neo_armsco_trench"
\ No newline at end of file
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index f1385484783..28a7dab8264 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -602,3 +602,51 @@
/obj/item/clothing/accessory/pride/vore
name = "vore pride pin"
icon_state = "pride_vore"
+
+// ranger ponchos
+
+/obj/item/clothing/accessory/poncho/roles/ranger
+ name = "red ranger poncho"
+ desc = "A rugged all-weather poncho, perfectly coloured to match a popular line of neck gaiters. You could probably use it as a tent in a pinch!"
+ icon_state = "rangerponcho_red"
+ item_state = "rangerponcho_red"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/tan
+ name = "tan ranger poncho"
+ icon_state = "rangerponcho_tan"
+ item_state = "rangerponcho_tan"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/gray
+ name = "gray ranger poncho"
+ icon_state = "rangerponcho_gray"
+ item_state = "rangerponcho_gray"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/green
+ name = "green ranger poncho"
+ icon_state = "rangerponcho_green"
+ item_state = "rangerponcho_green"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/blue
+ name = "blue ranger poncho"
+ icon_state = "rangerponcho_blue"
+ item_state = "rangerponcho_blue"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/purple
+ name = "purple ranger poncho"
+ icon_state = "rangerponcho_purple"
+ item_state = "rangerponcho_purple"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/orange
+ name = "orange ranger poncho"
+ icon_state = "rangerponcho_orange"
+ item_state = "rangerponcho_orange"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/charcoal
+ name = "charcoal ranger poncho"
+ icon_state = "rangerponcho_charcoal"
+ item_state = "rangerponcho_charcoal"
+
+/obj/item/clothing/accessory/poncho/roles/ranger/snow
+ name = "white ranger poncho"
+ icon_state = "rangerponcho_snow"
+ item_state = "rangerponcho_snow"
\ No newline at end of file
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index a49a604b0bc..a001d5aa7cd 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -190,3 +190,28 @@
icon_state = "wardenblueclothes"
item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
rolled_sleeves = 0
+
+/*
+ * Tan uniforms
+ */
+/obj/item/clothing/under/rank/security/tan
+ name = "security officer's uniform"
+ desc = "The latest in fashionable security outfits."
+ icon_state = "officertanclothes"
+ item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
+ rolled_sleeves = 0
+
+/obj/item/clothing/under/rank/head_of_security/tan
+ desc = "The insignia on this uniform tells you that this uniform belongs to the Head of Security."
+ name = "head of security's uniform"
+ icon_state = "hostanclothes"
+ item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
+ rolled_sleeves = 0
+
+/obj/item/clothing/under/rank/warden/tan
+ desc = "The insignia on this uniform tells you that this uniform belongs to the Warden."
+ name = "warden's uniform"
+ icon_state = "wardentanclothes"
+ item_state_slots = list(slot_r_hand_str = "ba_suit", slot_l_hand_str = "ba_suit")
+ rolled_sleeves = 0
+
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 4393be1bfd6..3c3ba740499 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -239,6 +239,7 @@
name = "sleek overalls"
desc = "A set of modern pleather reinforced overalls."
icon_state = "overalls_sleek"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
/obj/item/clothing/under/pirate
name = "pirate outfit"
diff --git a/code/modules/clothing/under/neounder.dm b/code/modules/clothing/under/neounder.dm
new file mode 100644
index 00000000000..59a939987e8
--- /dev/null
+++ b/code/modules/clothing/under/neounder.dm
@@ -0,0 +1,1098 @@
+/* Sprites ported from skyrat/tg, serves as an alternative to the virgo versions of certain clothes.
+this file deals with uniforms/under. */
+
+
+// Civvie
+
+/obj/item/clothing/under/rank/neo_chef_skirt
+ name = "chef's skirt"
+ desc = "a high class skirt, made of a stain resistant fabtic. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_chef_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_teal
+ name = "teal suit"
+ desc = "a somewhat garish teal suit. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_teal_suit"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_teal_skirt
+ name = "teal skirt"
+ desc = "a somewhat garish teal skirt. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_teal_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hydro
+ name = "hydroponics jumpsuit"
+ desc = "a dirt resistant suit. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hydroponics"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hydro_skirt
+ name = "hydroponics jumpskirt"
+ desc = "a dirt resistant skirt. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hydroponics_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_janitor
+ name = "janitor's jumpsuit"
+ desc = "a cleaning jumpsuit. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_janitor"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_janitor_skirt
+ name = "janitor's jumpskirt"
+ desc = "a cleaning jumpskirt. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_janitor_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop
+ name = "head of personnel's jumpsuit"
+ desc = "a proper HR professional's jumpsuit. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hop"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop_skirt
+ name = "head of personnel's jumpskirt"
+ desc = "a proper HR professional's jumpskirt. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hop_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop_parade_masc
+ name = "head of personnel's parade suit"
+ desc = "an over the top HR professional's wear. this one is a masculine fit. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hop_parade_male"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop_parade_fem
+ name = "head of personnel's feminine parade suit"
+ desc = "an over the top HR professional's wear. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hop_parade_female"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop_turtle
+ name = "head of personnel's turtleneck"
+ desc = "an HR worker's turtleneck. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hopturtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_hop_turtle_skirt
+ name = "head of personnel's turtleskirt"
+ desc = "an HR worker's turtleskirt. it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hopturtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_civvie_gorka
+ name = "civilan gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. For those who appreciate durable clothing. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_civvie_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+// Command
+
+/obj/item/clothing/under/rank/neo_captain
+ name = "captain's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_captain"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_captain_skirt
+ name = "captain's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_captain_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_captain_parade
+ name = "captain's parade suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_captain_parade"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_captain_kilt
+ name = "captain's kilt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_capkilt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_captain_blacksuit
+ name = "captain's black suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_captainblacksuit"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/bodyguard_suit
+ name = "bodyguard's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_blueshield"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/bodyguard_skirt
+ name = "bodyguard's skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_blueshield_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/bodyguard_turtleneck
+ name = "bodyguard's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_blueshield_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/bodyguard_turtleskirt
+ name = "bodyguard's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_blueshield_turtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_ntrep
+ name = "NT rep's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_ntrep"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_ntrep_skirt
+ name = "NT rep's suitskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_ntrep_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_commandutil
+ name = "command utility jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_util_com"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_pilot
+ name = "pilot's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_pilot"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_pilot_skirt
+ name = "pilot's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_pilot_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cmd_gorka
+ name = "CO's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. Who said command-wear can't look slick? It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmd_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_pilot_gorka
+ name = "pilot's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. In the pipe, five by five. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_pilot_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+//'Suspicious'
+
+/obj/item/clothing/under/rank/neo_suspect_turtleneck
+ name = "suspiciously comfortable turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspect_turtleskirt
+ name = "suspiciously comfortable turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspect_turtleneck_blue
+ name = "curiously comfortable turtlneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue
+ name = "curiously comfortable turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_blue_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspicious_turtleneck
+ name = "suspicious turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_red"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspicious_turtleskirt
+ name = "suspicious turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_red_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspect_overalls
+ name = "suspiciously comfortable overalls"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_overall"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_suspect_overalls_skirt
+ name = "suspiciously comfortable skirt overalls"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_suspect_overall_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+// CC
+
+/obj/item/clothing/under/rank/neo_centcom
+ name = "centcom officer's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_centcom_skirt
+ name = "centcom officer's skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_centcom_official
+ name = "centcom official's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom_official"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_centcom_intern
+ name = "centcom intern's uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom_intern"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_centcom_turtleneck
+ name = "centcom official's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom_officer"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_centcom_turtleskirt
+ name = "centcom official's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_centcom_officer_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_admiral_green
+ name = "admiral's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_admiral_green"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_admiral_white
+ name = "admiral's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_admiral_white"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_armsco
+ name = "arms company suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_armsco"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_armsco_tac
+ name = "tactical arms company jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_armsco_tac"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_contract
+ name = "contractor's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_contract"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_contract_tac
+ name = "tactical contractor jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_contract_tac"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+//Security
+
+/obj/item/clothing/under/rank/neo_sec_red
+ name = "red security jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_red"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_red_skirt
+ name = "red security skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_red_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_warden_red
+ name = "warden's red suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_warden_red"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_warden_red_skirt
+ name = "warden's red skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_warden_red_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_red
+ name = "head of security's red jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_red"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_red_skirt
+ name = "head of security's red skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_red_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_blackred
+ name = "head of security's red turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_blackred"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_blackred_skirt
+ name = "head of security's red skirtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_blackred_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_parade
+ name = "head of security's red parade uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_parade"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_parade_fem
+ name = "head of security's femme red parade uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_parade_fem"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_blue
+ name = "blue security jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_suit
+ name = "white security suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_suit"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_suit_blue
+ name = "blue security suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_suit_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_warden_blue
+ name = "warden's blue suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_warden_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_blue
+ name = "head of security's blue suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_blackblue
+ name = "head of security's blue turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_blackblue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_blackblue_skirt
+ name = "head of security's blue skirtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_blackblue_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_parade_blue
+ name = "head of security's blue parade uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_parade_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_parade_blue_fem
+ name = "head of security's femme blue parade uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_parade_blue_fem"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_turtle_red
+ name = "red security turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_turtle_red"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_turtle_red_skirt
+ name = "red security skirtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_turtle_red_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_turtle_blue
+ name = "blue security turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_turtle_blue"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt
+ name = "blue security skirtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_turtle_blue_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_corrections
+ name = "corrections officer suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_corrections"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_corrections_skirt
+ name = "corrections officer skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_corrections_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_runner
+ name = "runner's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_runner"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_hos_gorka
+ name = "head of security's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. Favoured by the Head of Security who wants to stay dry no matter what. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_hos_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+/obj/item/clothing/under/rank/neo_sec_gorka
+ name = "security officer's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. For officers who expect to be patrolling in harsh conditions. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sec_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
+
+// Cargo
+
+
+/obj/item/clothing/under/rank/neo_qm
+ name = "QM's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_skirt
+ name = "QM's skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_shorts
+ name = "cargo tech's shorts"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_shorts"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_skirt
+ name = "cargo tech's skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_miner
+ name = "miner's overalls"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_miner"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_miner_fauna
+ name = "hunter's suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_miner_fauna"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_jacket
+ name = "QM's casualwear"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_jacket"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_white
+ name = "QM's button-up suit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_white"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_white_skirt
+ name = "QM's button-up skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_white_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_turtle
+ name = "QM's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_turtle_skirt
+ name = "QM's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_turtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_qm_gorka
+ name = "QM's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. Preferred by quartermasters who do heavy lifting as well as paperwork. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_qm_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo
+ name = "cargo tech's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_util_cargo
+ name = "cargo utility uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_util_cargo"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_dark
+ name = "dark cargo uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_dark"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_casual
+ name = "casual cargo uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_casual"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_turtle
+ name = "cargo tech's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_turtle_skirt
+ name = "cargo tech's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_turtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_gorka
+ name = "cargo tech's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. No need to worry about improperly packaged goods ripping your jumpsuit with this. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_cargo_customs
+ name = "customs uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cargo_customs"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+//Engi
+
+
+/obj/item/clothing/under/rank/neo_engi
+ name = "engineer's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_engi"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/neo_engi_skirt
+ name = "engineer's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_engi_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/neo_atmos
+ name = "atmos tech's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_atmos"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_atmos_skirt
+ name = "atoms tech's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_atmos_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_chiefengi
+ name = "chief engineer's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_chiefengi"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/neo_chiefengi_skirt
+ name = "chief engineer's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_chiefengi_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/neo_ce_gorka
+ name = "chief engineer's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. For the chief engineer who values style and safety. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_ce_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+/obj/item/clothing/under/rank/neo_engi_gorka
+ name = "engineer's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. Not rated for high-power electrical shocks. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_engi_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+
+// Sci
+
+/obj/item/clothing/under/rank/neo_rd_turtle
+ name = "research director's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_rd_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_rd_turtle_skirt
+ name = "research director's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_rd_turtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_science
+ name = "scientist's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_science"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_science_skirt
+ name = "scientist's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_science_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_util_sci
+ name = "science utility uniform"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_util_sci"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_robo
+ name = "roboticist's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_robo"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_robo_skirt
+ name = "roboticist's skirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_robo_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_rd_suit
+ name = "research director's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_rd_suit"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_rd_suit_skirt
+ name = "research director's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_rd_suit_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_gene
+ name = "genetic engineer's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_gene"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_gene_skirt
+ name = "genetic engineer's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_gene_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_rd_gorka
+ name = "research director's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. For research directors who like to get their hands dirty. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_rd_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+/obj/item/clothing/under/rank/neo_sci_gorka
+ name = "scientist's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. A favourite of mountaineering archaeologists. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_sci_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+
+// Med
+
+/obj/item/clothing/under/rank/neo_med
+ name = "doctor's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_med"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_med_skirt
+ name = "doctor's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_med_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_cmo
+ name = "CMO's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmo"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_cmo_skirt
+ name = "CMO's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmo_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_cmo_turtle
+ name = "CMO's turtleneck"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmo_turtle"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_cmo_turtle_skirt
+ name = "CMO's turtleskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmo_turtle_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_viro
+ name = "virologist's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_viro"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_viro_skirt
+ name = "virologist's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_viro_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_chem
+ name = "chemist's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_chem"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_chem_skirt
+ name = "chemist's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_chem_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_para
+ name = "paramedic's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_para"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_para_skirt
+ name = "paramedic's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_para_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_para_light
+ name = "paramedic's light jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_para_light"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_para_light_skirt
+ name = "paramedic's light jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_para_light_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_pharma
+ name = "pharmacist's jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_pharma"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_pharma_skirt
+ name = "pharmacist's jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_pharma_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_med_dark
+ name = "dark medical jumpsuit"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_med_dark"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_med_dark_skirt
+ name = "dark medical jumpskirt"
+ desc = "it has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_med_dark_skirt"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_cmo_gorka
+ name = "chief medical officer's gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. Why worry about stains when everything slides right off? It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_cmo_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
+
+/obj/item/clothing/under/rank/neo_med_gorka
+ name = "medical staff gorka"
+ desc = "A rugged weather-resistant uniform made of ripstop fabric. A popular choice among paramedical personnel. It has a tag denoting it's made by Total Gear & Co."
+ icon_state = "neo_med_gorka"
+ rolled_sleeves = -1
+ rolled_down = -1
+ permeability_coefficient = 0.50
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm
index 82386c97697..228c22b0951 100644
--- a/code/modules/clothing/under/solgov.dm
+++ b/code/modules/clothing/under/solgov.dm
@@ -63,6 +63,18 @@
icon_state = "greyutility"
worn_state = "greyutility"
+/obj/item/clothing/under/utility/tan
+ name = "utility uniform"
+ desc = "A comfortable tan utility jumpsuit."
+ icon_state = "tanutility"
+ worn_state = "tanutility"
+
+/obj/item/clothing/under/utility/green
+ name = "utility uniform"
+ desc = "A comfortable green utility jumpsuit."
+ icon_state = "greenutility"
+ worn_state = "greenutility"
+
//Here's the real ones
/obj/item/clothing/under/solgov/utility/sifguard
name = "\improper SifGuard uniform"
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index a1375bfca67..0011b4fbcc2 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -301,7 +301,7 @@
/obj/item/toy/tennis = 15)
//VOREStation Edit End
- contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2) // VOREStation Add - Slurpable blobs.
+ contraband = list(/obj/item/weapon/reagent_containers/syringe/steroid = 4, /obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteanshake = 2, /obj/item/toy/baseball = 2) // VOREStation Add - Slurpable blobs.
/obj/machinery/vending/cart
name = "PTech"
@@ -1177,11 +1177,13 @@
products = list(
/obj/item/clothing/under/rank/bartender = 5,
/obj/item/clothing/under/rank/bartender/skirt = 5,
+ /obj/item/clothing/under/rank/neo_chef_skirt = 5,
/obj/item/clothing/under/waiter = 5,
/obj/item/clothing/head/that = 5,
/obj/item/clothing/head/flatcap = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/bar = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5,
/obj/item/clothing/accessory/permit/gun/bar = 1
)
req_log_access = access_hop
@@ -1203,6 +1205,30 @@
/obj/item/clothing/head/soft/sec = 5,
/obj/item/clothing/head/beret/sec = 5,
/obj/item/clothing/head/beret/sec/corporate/officer = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_bodyguard_dep = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_blue_dep = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_sec_red_dep = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_police = 5,
+ /obj/item/clothing/under/rank/bodyguard_suit = 5,
+ /obj/item/clothing/under/rank/bodyguard_skirt = 5,
+ /obj/item/clothing/under/rank/bodyguard_turtleneck = 5,
+ /obj/item/clothing/under/rank/bodyguard_turtleskirt = 5,
+ /obj/item/clothing/under/rank/neo_sec_red = 5,
+ /obj/item/clothing/under/rank/neo_sec_red_skirt = 5,
+ /obj/item/clothing/under/rank/neo_sec_blue = 5,
+ /obj/item/clothing/under/rank/neo_sec_suit = 5,
+ /obj/item/clothing/under/rank/neo_sec_suit_blue = 5,
+ /obj/item/clothing/under/rank/neo_sec_turtle_red = 5,
+ /obj/item/clothing/under/rank/neo_sec_turtle_red_skirt = 5,
+ /obj/item/clothing/under/rank/neo_sec_turtle_blue = 5,
+ /obj/item/clothing/under/rank/neo_sec_turtle_blue_skirt = 5,
+ /obj/item/clothing/under/rank/neo_corrections = 5,
+ /obj/item/clothing/under/rank/neo_corrections_skirt = 5,
+ /obj/item/clothing/under/rank/neo_runner = 5,
+ /obj/item/clothing/under/rank/neo_sec_gorka = 5,
+ /obj/item/clothing/suit/neo_runner_coat = 5,
+ /obj/item/clothing/shoes/boots/jackboots/silver = 5,
+ /obj/item/clothing/shoes/boots/jackboots/white = 5,
/obj/item/clothing/mask/bandana/red = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/security = 5,
/obj/item/clothing/accessory/armband = 5,
@@ -1229,6 +1255,8 @@
/obj/item/clothing/suit/storage/apron/white = 5,
/obj/item/clothing/suit/chef = 5,
/obj/item/clothing/suit/chef/classic = 5,
+ /obj/item/clothing/under/rank/neo_chef_skirt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5,
/obj/item/clothing/head/chefhat = 5,
/obj/item/clothing/head/hairnet = 5,
/obj/item/clothing/under/waiter = 5,
@@ -1257,6 +1285,23 @@
/obj/item/clothing/head/surgery/blue = 5,
/obj/item/clothing/head/surgery/green = 5,
/obj/item/clothing/head/surgery/black = 5,
+ /obj/item/clothing/under/rank/neo_med = 5,
+ /obj/item/clothing/under/rank/neo_med_skirt = 5,
+ /obj/item/clothing/under/rank/neo_para =5,
+ /obj/item/clothing/under/rank/neo_para_skirt = 5,
+ /obj/item/clothing/under/rank/neo_para_light = 5,
+ /obj/item/clothing/under/rank/neo_para_light_skirt = 5,
+ /obj/item/clothing/under/rank/neo_med_dark = 5,
+ /obj/item/clothing/under/rank/neo_med_dark_skirt = 5,
+ /obj/item/clothing/under/rank/neo_med_gorka = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_emt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_highvis = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_redemt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_blueemt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_med_dep = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_bluemed = 5,
+ /obj/item/clothing/suit/neo_medical_coat = 5,
/obj/item/clothing/shoes/white = 5,
/obj/item/clothing/suit/storage/toggle/labcoat = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/modern = 5,
@@ -1282,6 +1327,10 @@
/obj/item/clothing/shoes/white = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/chemist = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/old/chem = 5, //VoreStation edit, pre-fulp labcoat.
+ /obj/item/clothing/under/rank/neo_chem = 5,
+ /obj/item/clothing/under/rank/neo_chem_skirt = 5,
+ /obj/item/clothing/under/rank/neo_pharma = 5,
+ /obj/item/clothing/under/rank/neo_pharma_skirt = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/chemist = 5,
/obj/item/clothing/head/beret/medical/chem = 5,
/obj/item/weapon/storage/backpack/chemistry = 5,
@@ -1301,6 +1350,8 @@
/obj/item/clothing/under/rank/geneticist = 5,
/obj/item/clothing/under/rank/geneticist/skirt = 5,
/obj/item/clothing/shoes/white = 5,
+ /obj/item/clothing/under/rank/neo_gene = 5,
+ /obj/item/clothing/under/rank/neo_gene_skirt = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/genetics = 5,
/obj/item/weapon/storage/backpack/genetics = 5,
/obj/item/weapon/storage/backpack/satchel/gen = 5
@@ -1318,6 +1369,8 @@
/obj/item/clothing/under/rank/virologist = 5,
/obj/item/clothing/under/rank/virologist/skirt = 5,
/obj/item/clothing/shoes/white = 5,
+ /obj/item/clothing/under/rank/neo_viro = 5,
+ /obj/item/clothing/under/rank/neo_viro_skirt = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/virologist = 5,
/obj/item/clothing/suit/storage/toggle/labcoat/old/vir = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/medical/viro = 5, //VoreStation edit, pre-fulp labcoat.
@@ -1344,6 +1397,12 @@
/obj/item/clothing/suit/storage/toggle/labcoat/modern = 5,
/obj/item/clothing/shoes/white = 5,
/obj/item/clothing/shoes/slippers = 5,
+ /obj/item/clothing/under/rank/neo_science = 5,
+ /obj/item/clothing/under/rank/neo_science_skirt = 5,
+ /obj/item/clothing/under/rank/neo_util_sci = 5,
+ /obj/item/clothing/under/rank/neo_sci_gorka = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_sci_dep = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/science = 5,
/obj/item/clothing/shoes/boots/winter/science = 5,
/obj/item/clothing/head/beret/science = 5,
@@ -1366,6 +1425,10 @@
/obj/item/clothing/head/beret/science/robotics = 5,
/obj/item/clothing/shoes/black = 5,
/obj/item/clothing/gloves/black = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_labcoat = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_robo_coat = 5,
+ /obj/item/clothing/under/rank/neo_robo = 5,
+ /obj/item/clothing/under/rank/neo_robo_skirt = 5,
/obj/item/weapon/storage/backpack/toxins = 5,
/obj/item/weapon/storage/backpack/satchel/tox = 5
)
@@ -1416,6 +1479,10 @@
/obj/item/clothing/head/hardhat = 5,
/obj/item/clothing/head/beret/engineering = 5,
/obj/item/clothing/mask/bandana/gold = 5,
+ /obj/item/clothing/under/rank/neo_engi = 5,
+ /obj/item/clothing/under/rank/neo_engi_skirt = 5,
+ /obj/item/clothing/under/rank/neo_engi_gorka = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_engi_dep = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering = 5,
/obj/item/clothing/shoes/boots/winter/engineering = 5,
/obj/item/clothing/shoes/boots/workboots = 5
@@ -1436,6 +1503,8 @@
/obj/item/clothing/head/hardhat/red = 5,
/obj/item/clothing/head/beret/engineering = 5,
/obj/item/clothing/mask/bandana/gold = 5,
+ /obj/item/clothing/under/rank/neo_atmos = 5,
+ /obj/item/clothing/under/rank/neo_atmos_skirt = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos = 5,
/obj/item/clothing/shoes/boots/winter/atmos = 5
)
@@ -1454,6 +1523,9 @@
/obj/item/clothing/head/greenbandana = 5,
/obj/item/weapon/material/minihoe = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro = 5,
+ /obj/item/clothing/under/rank/neo_hydro = 5,
+ /obj/item/clothing/under/rank/neo_hydro_skirt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5,
/obj/item/clothing/shoes/boots/winter/hydro = 5
)
req_log_access = access_hop
@@ -1472,6 +1544,19 @@
/obj/item/clothing/under/rank/cargotech/jeans/female = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/cargo = 5,
/obj/item/clothing/suit/storage/cargo = 5,
+ /obj/item/clothing/under/rank/neo_cargo_shorts = 5,
+ /obj/item/clothing/under/rank/neo_cargo_skirt = 5,
+ /obj/item/clothing/under/rank/neo_miner = 5,
+ /obj/item/clothing/under/rank/neo_cargo = 5,
+ /obj/item/clothing/under/rank/neo_util_cargo = 5,
+ /obj/item/clothing/under/rank/neo_cargo_dark = 5,
+ /obj/item/clothing/under/rank/neo_cargo_casual = 5,
+ /obj/item/clothing/under/rank/neo_cargo_turtle = 5,
+ /obj/item/clothing/under/rank/neo_cargo_turtle_skirt = 5,
+ /obj/item/clothing/under/rank/neo_cargo_gorka = 5,
+ /obj/item/clothing/under/rank/neo_cargo_customs = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_cargo_dep = 5,
+ /obj/item/clothing/suit/neo_gorka_cargo = 5,
/obj/item/clothing/shoes/boots/winter/supply = 5,
/obj/item/clothing/shoes/black = 5,
/obj/item/clothing/gloves/black = 5,
@@ -1508,6 +1593,9 @@
/obj/item/clothing/under/rank/janitor = 5,
/obj/item/clothing/under/dress/maid/janitor = 5,
/obj/item/clothing/suit/storage/hooded/wintercoat/janitor = 5,
+ /obj/item/clothing/under/rank/neo_janitor = 5,
+ /obj/item/clothing/under/rank/neo_janitor_skirt = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5,
/obj/item/clothing/gloves/black = 5,
/obj/item/weapon/storage/belt/janitor = 5,
/obj/item/clothing/shoes/galoshes = 5,
@@ -1535,6 +1623,8 @@
/obj/item/clothing/under/lawyer/purpsuit = 5,
/obj/item/clothing/under/lawyer/purpsuit/skirt = 5,
/obj/item/clothing/suit/storage/toggle/lawyer/purpjacket = 5,
+ /obj/item/clothing/under/rank/neo_teal = 5,
+ /obj/item/clothing/under/rank/neo_teal_skirt = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/shoes/black = 5,
/obj/item/clothing/shoes/laceup = 5,
@@ -1555,6 +1645,7 @@
products = list(
/obj/item/clothing/head/det = 5,
/obj/item/clothing/head/det/grey = 5,
+ /obj/item/clothing/head/neo_irs = 5,
/obj/item/clothing/shoes/brown = 5,
/obj/item/clothing/shoes/laceup = 5,
/obj/item/clothing/under/det = 5,
diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm
index 1161a8604ab..784bbcca65c 100644
--- a/code/modules/economy/vending_machines_vr.dm
+++ b/code/modules/economy/vending_machines_vr.dm
@@ -637,6 +637,10 @@
/obj/item/clothing/mask/bandana/green = 5,
/obj/item/clothing/mask/bandana/red = 5,
/obj/item/clothing/mask/surgical = 5,
+ /obj/item/clothing/head/ushanka/neo_ushanka = 5,
+ /obj/item/clothing/head/ushanka/neo_ushanka_blue = 5,
+ /obj/item/clothing/head/papakha = 5,
+ /obj/item/clothing/head/papakha_white = 5,
/obj/item/clothing/accessory/pride/bi = 5,
/obj/item/clothing/accessory/pride/trans = 5,
/obj/item/clothing/accessory/pride/ace = 5,
@@ -925,6 +929,10 @@
/obj/item/clothing/under/suit_jacket/checkered/skirt = 5,
/obj/item/clothing/under/suit_jacket/tan = 5,
/obj/item/clothing/under/suit_jacket/tan/skirt = 5,
+ /obj/item/clothing/under/rank/neo_civvie_gorka = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_leather = 5,
+ /obj/item/clothing/suit/neo_gorka = 5,
+ /obj/item/clothing/suit/storage/toggle/labcoat/neo_civ_dep = 5,
/obj/item/clothing/under/scratch = 5,
/obj/item/clothing/under/scratch/skirt = 5,
/obj/item/clothing/under/sundress = 5,
@@ -1131,7 +1139,16 @@
/obj/item/clothing/under/tropical/pink = 50,
/obj/item/clothing/under/tropical/blue = 50)
premium = list(/obj/item/clothing/under/color/rainbow = 1)
- contraband = list(/obj/item/clothing/under/rank/clown = 1)
+ contraband = list(/obj/item/clothing/under/rank/clown = 1,
+ /obj/item/clothing/under/rank/neo_suspect_turtleneck = 1,
+ /obj/item/clothing/under/rank/neo_suspect_turtleskirt = 1,
+ /obj/item/clothing/under/rank/neo_suspect_turtleneck_blue = 1,
+ /obj/item/clothing/under/rank/neo_suspect_turtleskirt_blue = 1,
+ /obj/item/clothing/under/rank/neo_suspicious_turtleneck = 1,
+ /obj/item/clothing/under/rank/neo_suspicious_turtleskirt = 1,
+ /obj/item/clothing/under/rank/neo_suspect_overalls = 1,
+ /obj/item/clothing/under/rank/neo_suspect_overalls_skirt = 1,
+ /obj/item/clothing/head/soft/neo_softcap = 2)
/obj/machinery/vending/loadout/loadout_misc
name = "Bits and Bobs"
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index c55cf89469c..ff5768559da 100644
--- a/code/modules/food/food/snacks.dm
+++ b/code/modules/food/food/snacks.dm
@@ -42,6 +42,9 @@
/// Canned food switch to this state when opened, if set
var/canned_open_state
+ /// For packaged/canned food sounds
+ var/opening_sound = null
+
/obj/item/weapon/reagent_containers/food/snacks/Initialize()
. = ..()
if(nutriment_amt)
@@ -290,7 +293,7 @@
/obj/item/weapon/reagent_containers/food/snacks/proc/unpackage(mob/user)
package = FALSE
to_chat(user, "You unwrap [src].")
- playsound(user,'sound/effects/packagedfoodopen.ogg', 15, 1)
+ playsound(user,opening_sound, 15, 1)
if(package_trash)
var/obj/item/T = new package_trash
user.put_in_hands(T)
@@ -302,7 +305,7 @@
/obj/item/weapon/reagent_containers/food/snacks/proc/uncan(mob/user)
canned = FALSE
to_chat(user, "You unseal \the [src] with a crack of metal.")
- playsound(loc,'sound/effects/tincanopen.ogg', rand(10,50), 1)
+ playsound(loc,opening_sound, rand(10,50), 1)
if(canned_open_state)
icon_state = canned_open_state
@@ -6136,6 +6139,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb01"
+ trash = /obj/item/trash/candy/cb01
nutriment_amt = 4
nutriment_desc = list("stale chocolate" = 2, "nougat" = 1, "caramel" = 1)
w_class = 1
@@ -6152,6 +6156,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb02"
+ trash = /obj/item/trash/candy/cb02
nutriment_amt = 4
nutriment_desc = list("chocolate" = 2, "caramel" = 1, "puffed rice" = 1)
w_class = 1
@@ -6168,6 +6173,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb03"
+ trash = /obj/item/trash/candy/cb03
nutriment_amt = 4
nutriment_desc = list("chocolate" = 4)
w_class = 1
@@ -6184,6 +6190,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb04"
+ trash = /obj/item/trash/candy/cb04
nutriment_amt = 4
nutriment_desc = list("chocolate" = 2, "salt = 1", "licorice" = 1)
w_class = 1
@@ -6200,6 +6207,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb05"
+ trash = /obj/item/trash/candy/cb05
nutriment_amt = 3
nutriment_desc = list("milk chocolate" = 2)
w_class = 1
@@ -6216,6 +6224,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb06"
+ trash = /obj/item/trash/candy/cb06
nutriment_amt = 4
nutriment_desc = list("chocolate" = 2, "coffee" = 1, "vanilla wafer" = 1)
w_class = 1
@@ -6233,6 +6242,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb07"
+ trash = /obj/item/trash/candy/cb07
nutriment_amt = 4
nutriment_desc = list("chocolate" = 2, "taro" = 2)
w_class = 1
@@ -6249,6 +6259,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb08"
+ trash = /obj/item/trash/candy/cb08
nutriment_amt = 3
nutriment_desc = list("chocolate" = 2, "malt puffs" = 1)
w_class = 1
@@ -6265,6 +6276,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb09"
+ trash = /obj/item/trash/candy/cb09
nutriment_amt = 6
nutriment_desc = list("peanuts" = 3, "condensed milk" = 1, "cashews" = 2)
w_class = 1
@@ -6283,6 +6295,7 @@
filling_color = "#552200"
icon = 'icons/obj/food_snacks.dmi'
icon_state = "cb10"
+ trash = /obj/item/trash/candy/cb10
nutriment_amt = 5
nutriment_desc = list("chocolate" = 2, "caramel" = 1, "peanuts" = 1, "nougat" = 1)
w_class = 1
@@ -6826,6 +6839,7 @@
/obj/item/weapon/reagent_containers/food/snacks/canned
icon = 'icons/obj/food_canned.dmi'
+ opening_sound = 'sound/effects/tincanopen.ogg'
canned = TRUE
//////////Just a short line of Canned Consumables, great for treasure in faraway abandoned outposts//////////
@@ -7008,6 +7022,7 @@
/obj/item/weapon/reagent_containers/food/snacks/packaged
icon = 'icons/obj/food_package.dmi'
+ opening_sound = 'sound/effects/packagedfoodopen.ogg'
package = TRUE
//////////////Lunar Cakes - proof of concept//////////////
diff --git a/code/modules/food/kitchen/smartfridge/engineering.dm b/code/modules/food/kitchen/smartfridge/engineering.dm
index 2e31edf34c4..721f5040dac 100644
--- a/code/modules/food/kitchen/smartfridge/engineering.dm
+++ b/code/modules/food/kitchen/smartfridge/engineering.dm
@@ -1,7 +1,12 @@
+/*
+ * Industrial Sized Sheet Storage (but not actually industrial sized)
+ */
/obj/machinery/smartfridge/sheets
- name = "\improper Smart Sheet Storage"
- desc = "A storage unit for metals."
- icon_contents = "boxes"
+ name = "\improper Industrial Sheet Storage"
+ desc = "An industrial sized storage unit for materials."
+ icon_state = "base_industrial"
+ icon_base = "industrial"
+ icon_contents = "sheet"
stored_datum_type = /datum/stored_item/stack
/obj/machinery/smartfridge/sheets/persistent
@@ -30,3 +35,17 @@
if(O.type == I.item_path) // Typecheck should evaluate material-specific subtype
return I
return null
+
+/*
+ * Mining Variant
+ */
+/obj/machinery/smartfridge/sheets/mining
+ name = "\improper Mining Sheet Storage"
+ icon_state = "base_mining"
+ icon_base = "mining"
+ icon_contents = "sheet"
+
+/obj/machinery/smartfridge/sheets/mining/persistent
+ persistent = /datum/persistent/storage/smartfridge/sheet_storage
+/obj/machinery/smartfridge/sheets/mining/persistent_lossy
+ persistent = /datum/persistent/storage/smartfridge/sheet_storage/lossy
\ No newline at end of file
diff --git a/code/modules/food/kitchen/smartfridge/medical.dm b/code/modules/food/kitchen/smartfridge/medical.dm
index b1749068165..f7a5ea9bb57 100644
--- a/code/modules/food/kitchen/smartfridge/medical.dm
+++ b/code/modules/food/kitchen/smartfridge/medical.dm
@@ -1,21 +1,46 @@
+/*
+ * Medical
+ */
+/obj/machinery/smartfridge/medbay
+ name = "\improper Refrigerated Medicine Storage"
+ desc = "A refrigerated storage unit for securely storing medicine and chemicals."
+ icon_contents = "chem"
+
+/obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/))
+ return 1
+ return 0
+
/obj/machinery/smartfridge/secure/medbay
name = "\improper Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
+ icon_contents = "chem"
req_one_access = list(access_medical,access_chemistry)
/obj/machinery/smartfridge/secure/medbay/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/glass/))
+ if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/))
return 1
- if(istype(O,/obj/item/weapon/storage/pill_bottle/))
+ return 0
+
+/*
+ * Virology
+ */
+/obj/machinery/smartfridge/virology
+ name = "\improper Refrigerated Virus Storage"
+ desc = "A refrigerated storage unit for storing viral material."
+ icon_contents = "viro"
+
+/obj/machinery/smartfridge/virology/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/reagent_containers/glass/beaker/vial/))
return 1
- if(istype(O,/obj/item/weapon/reagent_containers/pill/))
+ if(istype(O,/obj/item/weapon/virusdish/))
return 1
return 0
/obj/machinery/smartfridge/secure/virology
name = "\improper Refrigerated Virus Storage"
- desc = "A refrigerated storage unit for storing viral material."
- icon_contents = "misc"
+ desc = "A refrigerated storage unit for securely storing viral material."
+ icon_contents = "viro"
req_access = list(access_virology)
/obj/machinery/smartfridge/secure/virology/accept_check(var/obj/item/O as obj)
@@ -25,15 +50,27 @@
return 1
return 0
-/obj/machinery/smartfridge/chemistry //Is this used anywhere? It's not secure.
+/*
+ * Chemistry
+ */
+/obj/machinery/smartfridge/chemistry
name = "\improper Smart Chemical Storage"
- desc = "A refrigerated storage unit for medicine and chemical storage."
+ desc = "A refrigerated storage unit for storing medicine and chemicals."
+ icon_contents = "chem"
+ req_one_access = list(access_chemistry)
/obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers))
+ if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/))
return 1
return 0
-/obj/machinery/smartfridge/chemistry/virology //Same
- name = "\improper Smart Virus Storage"
- desc = "A refrigerated storage unit for volatile sample storage."
\ No newline at end of file
+/obj/machinery/smartfridge/secure/chemistry
+ name = "\improper Smart Chemical Storage"
+ desc = "A refrigerated storage unit for securely storing medicine and chemicals."
+ icon_contents = "chem"
+ req_one_access = list(access_chemistry)
+
+/obj/machinery/smartfridge/secure/chemistry/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/))
+ return 1
+ return 0
diff --git a/code/modules/food/kitchen/smartfridge/research.dm b/code/modules/food/kitchen/smartfridge/research.dm
new file mode 100644
index 00000000000..eaab3c635ba
--- /dev/null
+++ b/code/modules/food/kitchen/smartfridge/research.dm
@@ -0,0 +1,13 @@
+/*
+ * Xenobiological
+ */
+/obj/machinery/smartfridge/secure/extract
+ name = "\improper Biological Sample Storage"
+ desc = "A refrigerated storage unit for xenobiological samples."
+ icon_contents = "slime"
+ req_access = list(access_research)
+
+/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj)
+ if(istype(O, /obj/item/slime_extract) || istype(O, /obj/item/slimepotion))
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/food/kitchen/smartfridge/hydroponics.dm b/code/modules/food/kitchen/smartfridge/service.dm
similarity index 52%
rename from code/modules/food/kitchen/smartfridge/hydroponics.dm
rename to code/modules/food/kitchen/smartfridge/service.dm
index 93afa67b19d..8d0485cd190 100644
--- a/code/modules/food/kitchen/smartfridge/hydroponics.dm
+++ b/code/modules/food/kitchen/smartfridge/service.dm
@@ -1,7 +1,59 @@
+/*
+ * Chef
+ */
+/obj/machinery/smartfridge/chef
+ desc = "For storing all sorts of delicious foods!"
+
+/obj/machinery/smartfridge/chef/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks))
+ return 1
+ return 0
+
+/*
+ * Bartender
+ */
+/obj/machinery/smartfridge/drinks
+ name = "\improper Smart Drink Storage"
+ desc = "A refrigerated storage unit for tasty tasty alcohol."
+ icon_contents = "drinks"
+
+/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment))
+ return 1
+ return 0
+
+/obj/machinery/smartfridge/drinks/showcase
+ name = "\improper Drink Showcase"
+ icon_state = "base_showcase"
+ icon_base = "showcase"
+
+//Showcase needs a special icon update
+/obj/machinery/smartfridge/drinks/showcase/update_icon()
+ cut_overlays()
+ if(panel_open)
+ add_overlay("[icon_base]-panel")
+
+ if(stat & (BROKEN))
+ cut_overlays()
+ icon_state = "[icon_base]-broken"
+
+ if(stat & (NOPOWER))
+ icon_state = "[icon_base]-off"
+ else
+ icon_state = icon_base
+ switch(contents.len)
+ if(0)
+ add_overlay("[icon_base]")
+ if(1 to 3)
+ add_overlay("[icon_base]-fill")
+
+/*
+ * Hydroponics
+ */
/obj/machinery/smartfridge/produce
name = "\improper Smart Produce Storage"
- desc = "For storing all sorts of perishable foods!"
- icon_contents = "boxes"
+ desc = "For storing all sorts of perishable produce!"
+ icon_contents = "plants"
/obj/machinery/smartfridge/produce/persistent
persistent = /datum/persistent/storage/smartfridge/produce
@@ -11,43 +63,15 @@
/obj/machinery/smartfridge/produce/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/grown/) || istype(O,/obj/item/seeds/))
- return TRUE
- return FALSE
+ return 1
+ return 0
-/obj/machinery/smartfridge/drinks
- name = "\improper Smart Drink Storage"
- desc = "A refrigerated storage unit for tasty tasty alcohol."
- icon_contents = "drinks"
-
-/obj/machinery/smartfridge/drinks/showcase
- name = "\improper Drink Showcase"
- icon_state = "showcase"
- icon_base = "showcase"
-
-/obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj)
- if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment))
- return TRUE
- return FALSE
-
-/obj/machinery/smartfridge/seeds
+/obj/machinery/smartfridge/seeds //I honestly don't know why this exists when you can store seeds in the vendor. It's not even persistent.
name = "\improper MegaSeed Servitor"
desc = "When you need seeds fast!"
- icon_contents = "boxes"
+ icon_contents = "petri" //There's no seed base in the current batch
/obj/machinery/smartfridge/seeds/accept_check(var/obj/item/O as obj)
if(istype(O,/obj/item/seeds/))
return 1
- return 0
-
-/obj/machinery/smartfridge/secure/extract
- name = "\improper Biological Sample Storage"
- desc = "A refrigerated storage unit for xenobiological samples."
- req_access = list(access_research)
- icon_contents = "drinks"
-
-/obj/machinery/smartfridge/secure/extract/accept_check(var/obj/item/O as obj)
- if(istype(O, /obj/item/slime_extract))
- return TRUE
- if(istype(O, /obj/item/slimepotion))
- return TRUE
- return FALSE
\ No newline at end of file
+ return 0
\ No newline at end of file
diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm
index a929c8eda88..c683bf9a603 100644
--- a/code/modules/food/kitchen/smartfridge/smartfridge.dm
+++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm
@@ -1,12 +1,10 @@
-/* SmartFridge. Much todo
-*/
/obj/machinery/smartfridge
name = "\improper SmartFridge"
desc = "For storing all sorts of things! This one doesn't accept any of them!"
- icon = 'icons/obj/vending.dmi'
+ icon = 'icons/obj/vending_smartfridge.dmi'
icon_state = "smartfridge"
var/icon_base = "smartfridge" //Iconstate to base all the broken/deny/etc on
- var/icon_contents = "misc" //Overlay to put on glass to show contents
+ var/icon_contents = "food" //Overlay to put on that show contents
density = TRUE
anchored = TRUE
use_power = USE_POWER_IDLE
@@ -67,26 +65,35 @@
/obj/machinery/smartfridge/update_icon()
cut_overlays()
- if(stat & (BROKEN|NOPOWER))
- icon_state = "[icon_base]-off"
- else
- icon_state = icon_base
-
if(panel_open)
add_overlay("[icon_base]-panel")
- // Fridge contents
- switch(contents.len)
- if(1 to 3)
- add_overlay("[icon_base]-[icon_contents]1")
- if(3 to 6)
- add_overlay("[icon_base]-[icon_contents]2")
- if(6 to INFINITY)
- add_overlay("[icon_base]-[icon_contents]3")
+ if(stat & (BROKEN))
+ cut_overlays()
+ icon_state = "[icon_base]-broken"
-/*******************
-* Item Adding
-********************/
+ if(stat & (NOPOWER))
+ icon_state = "[icon_base]-off"
+ switch(contents.len)
+ if(0)
+ add_overlay("[icon_base]-0-off")
+ if(1 to 3)
+ add_overlay("[icon_base]-[icon_contents]1-off")
+ if(3 to 6)
+ add_overlay("[icon_base]-[icon_contents]2-off")
+ if(6 to INFINITY)
+ add_overlay("[icon_base]-[icon_contents]3-off")
+ else
+ icon_state = icon_base
+ switch(contents.len)
+ if(0)
+ add_overlay("[icon_base]-0")
+ if(1 to 3)
+ add_overlay("[icon_base]-[icon_contents]1")
+ if(3 to 6)
+ add_overlay("[icon_base]-[icon_contents]2")
+ if(6 to INFINITY)
+ add_overlay("[icon_base]-[icon_contents]3")
/obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(O.is_screwdriver())
@@ -226,6 +233,7 @@
return TRUE
vend(item_records[index], amount)
+ update_icon()
return TRUE
return FALSE
@@ -247,12 +255,12 @@
throw_item.throw_at(target,16,3,src)
src.visible_message("[src] launches [throw_item.name] at [target.name]!")
SStgui.update_uis(src)
+ update_icon()
return TRUE
-/************************
-* Secure SmartFridges
-*************************/
-
+/*
+ * Secure Smartfridges
+ */
/obj/machinery/smartfridge/secure/tgui_act(action, params)
if(stat & (NOPOWER|BROKEN))
return TRUE
diff --git a/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm b/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm
index 8863448ca5d..222cd4f52a4 100644
--- a/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm
+++ b/code/modules/food/kitchen/smartfridge/smartfridge_vr.dm
@@ -1,3 +1,6 @@
+/*
+ * Expert Jobs
+ */
/obj/machinery/smartfridge
var/expert_job = "Chef"
/obj/machinery/smartfridge/seeds
@@ -6,14 +9,16 @@
expert_job = "Xenobiologist"
/obj/machinery/smartfridge/secure/medbay
expert_job = "Chemist"
+/obj/machinery/smartfridge/secure/chemistry
+ expert_job = "Chemist"
/obj/machinery/smartfridge/secure/virology
expert_job = "Medical Doctor" //Virologist is an alt-title unfortunately
-/obj/machinery/smartfridge/chemistry
- expert_job = "Chemist" //Unsure what this one is used for, actually
/obj/machinery/smartfridge/drinks
expert_job = "Bartender"
-// Allow thrown items into smartfridges
+/*
+ * Allow thrown items into smartfridges
+ */
/obj/machinery/smartfridge/hitby(var/atom/movable/A, speed)
. = ..()
if(accept_check(A) && A.thrower)
@@ -31,12 +36,20 @@
else if(prob(20))
stock(A)
-//Chemistry 'chemavator'
+/*
+ * Chemistry 'chemavator' (multi-z chem storage)
+ */
/obj/machinery/smartfridge/chemistry/chemvator
name = "\improper Smart Chemavator - Upper"
desc = "A refrigerated storage unit for medicine and chemical storage. Now sporting a fancy system of pulleys to lift bottles up and down."
+ expert_job = "Chemist"
var/obj/machinery/smartfridge/chemistry/chemvator/attached
+/obj/machinery/smartfridge/chemistry/chemvator/accept_check(var/obj/item/O as obj)
+ if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers) || istype(O,/obj/item/weapon/reagent_containers/glass/))
+ return 1
+ return 0
+
/obj/machinery/smartfridge/chemistry/chemvator/down/Destroy()
attached = null
return ..()
diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm
index cd6113f5051..166c5d05ed3 100644
--- a/code/modules/mining/abandonedcrates_vr.dm
+++ b/code/modules/mining/abandonedcrates_vr.dm
@@ -99,7 +99,8 @@
list(pick(/obj/item/weapon/grenade/spawnergrenade/spesscarp, /obj/item/weapon/grenade/spawnergrenade/spider, /obj/item/weapon/grenade/explosive/frag), 7) = 1,
list(/obj/item/weapon/grenade/flashbang/clusterbang, 7) = 1,
list(/obj/item/weapon/card/emag, 11) = 1,
- list(/obj/item/weapon/melee/shock_maul, 11) = 5,
+ list(/obj/item/weapon/melee/shock_maul, 11) = 3,
+ list(/obj/item/clothing/suit/storage/vest/martian_miner, 4) = 6,
list(/obj/item/weapon/storage/backpack/sport/hyd/catchemall, 11) = 1
))
var/path = choice[1]
diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm
index 7b3b1f5cce8..49962ef351c 100644
--- a/code/modules/mob/living/carbon/human/species/species_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_vr.dm
@@ -20,6 +20,7 @@
var/selects_bodytype = SELECTS_BODYTYPE_FALSE // Allows the species to choose from body types like custom species can, affecting suit fitting and etcetera as you would expect.
var/bloodsucker = FALSE // Allows safely getting nutrition from blood.
+ var/bloodsucker_controlmode = "always loud" //Allows selecting between bloodsucker control modes. Always Loud corresponds to original implementation.
var/is_weaver = FALSE
var/silk_production = FALSE
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index ddaf32787c6..94e0d2f47cd 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -389,8 +389,6 @@
set desc = "Bites prey and drains them of a significant portion of blood, feeding you in the process. You may only do this once per minute."
set category = "Abilities"
- if(last_special > world.time)
- return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
to_chat(src, "You cannot bite anyone in your current state!")
@@ -400,9 +398,27 @@
for(var/mob/living/carbon/human/M in view(1,src))
if(!istype(M,/mob/living/silicon) && Adjacent(M))
choices += M
- choices -= src
- var/mob/living/carbon/human/B = tgui_input_list(src, "Who do you wish to bite?", "Suck Blood", choices)
+
+ var/mob/living/carbon/human/B = tgui_input_list(src, "Who do you wish to bite? Select yourself to bring up configuration for privacy and bleeding. \
+ Beware! Configuration resets on new round!", "Suck Blood", choices)
+
+ if(B == src) //We are using this to minimize the amount of pop-ups or buttons.
+ var/control_options = list("always loud", "pop-up", "intents", "always subtle")
+ src.species.bloodsucker_controlmode = tgui_input_list(src,"Choose your preferred control of blood sucking. \
+ You can only cause bleeding wounds with pop up and intents modes. Choosing intents prints controls to chat.", "Configure Bloodsuck", control_options, "always loud")
+ if(src.species.bloodsucker_controlmode == "intents") //We are printing to chat for better readability
+ to_chat(src, SPAN_NOTICE("You've chosen to use intents for blood draining. \n \
+ HELP - Loud, No Bleeding \n \
+ DISARM - Subtle, Causes bleeding \n \
+ GRAB - Subtle, No Bleeding \n \
+ HARM - Loud, Causes Bleeding"))
+ return
+
+ if(last_special > world.time)
+ to_chat(src, "You cannot suck blood so quickly in a row!")
+ return
+
if(!B || !src || src.stat) return
@@ -418,12 +434,64 @@
return
last_special = world.time + 600
- src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!")
+
+ var/control_pref = src.species.bloodsucker_controlmode
+ var/noise = TRUE
+ var/bleed = FALSE
+
+ switch(control_pref)
+ if("always subtle")
+ noise = FALSE
+ if("pop-up")
+ if(tgui_alert(src, "Do you want to be subtle?", "Privacy", list("Yes", "No")) == "Yes")
+ noise = FALSE
+ if(tgui_alert(src, "Do you want your target to keep bleeding?", "Continue Bleeding", list("Yes", "No")) == "Yes" )
+ bleed = TRUE
+ if("intents")
+ /*
+ Logic is, with "Help", we are taking our time but it's pretty obvious..
+ With "disarm", we rush the act, letting it keep bleeding
+ "HURT" is self-evidently loud and bleedy
+ "Grab" is subtle because we keep our prey tight and close.
+ */
+ switch(src.a_intent)
+ //if(I_HELP) uses default values. Added as a comment for clarity
+ if(I_DISARM)
+ noise = FALSE
+ bleed = TRUE
+ if(I_GRAB)
+ noise = FALSE
+ if(I_HURT)
+ bleed =TRUE
+
+
+
+
+ if(noise)
+ src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!")
+ else
+ src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!", range = 1)
+
+ if(bleed) //Due to possibility of missing/misclick and missing the bleeding cues, we are warning the scene members of BLEEDING being on
+ to_chat(src, SPAN_WARNING("This is going to cause [B] to keep bleeding!"))
+ to_chat(B, SPAN_DANGER("You are going to keep bleeding from this bite!"))
if(do_after(src, 300, B)) //Thrirty seconds.
if(!Adjacent(B)) return
- src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!")
- B.apply_damage(5, BRUTE, BP_HEAD) //You're getting fangs pushed into your neck. What do you expect????
+ if(noise)
+ src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!")
+ else
+ src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!", range = 1)
+ if(bleed)
+ B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, soaked = 0, sharp = TRUE, edge = FALSE)
+ var/obj/item/organ/external/E = B.get_organ(BP_HEAD)
+ if(!(E.status & ORGAN_BLEEDING))
+ E.status |= ORGAN_BLEEDING //If 10 points of piercing didn't make the organ bleed, we are making it bleed.
+
+
+ else
+ B.apply_damage(5, BRUTE, BP_HEAD) //You're getting fangs pushed into your neck. What do you expect????
+
B.drip(80) //Remove enough blood to make them a bit woozy, but not take oxyloss.
adjust_nutrition(400)
sleep(50)
@@ -1386,4 +1454,4 @@
name = "tongue ball"
hitsound = 'sound/vore/sunesound/pred/schlorp.ogg'
hitsound_wall = 'sound/vore/sunesound/pred/schlorp.ogg'
- zaptype = /obj/item/projectile/beam/appendage
\ No newline at end of file
+ zaptype = /obj/item/projectile/beam/appendage
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index a8cfa95f2c0..ef0bf2915ce 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -85,6 +85,16 @@
/datum/trait/neutral/bloodsucker
name = "Bloodsucker, Obligate"
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
+ tutorial = "This trait forces you to only consume blood - you cannot have normal food anymore. Vore is, of course, an exception!
\
+ You can satisfy this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \
+ or finding a (un)willing donor for your appropriate appendage!
\
+ Controls for taking blood from your victim can be changed at will by trying to drink from yourself.
\
+ Intent-based control scheme:
\
+ HELP - Loud, No Bleeding
\
+ DISARM - Subtle, Causes bleeding
\
+ GRAB - Subtle, No Bleeding
\
+ HARM - Loud, Causes Bleeding"
+
cost = 0
custom_only = FALSE
var_changes = list("organic_food_coeff" = 0, "bloodsucker" = TRUE)
@@ -97,6 +107,15 @@
/datum/trait/neutral/bloodsucker_freeform
name = "Bloodsucker"
desc = "You get fangs that can be used to drain blood from prey."
+ tutorial = "This trait allows you to consume blood on top of normal food!
\
+ You can do this by clicking bloodbags in your hand on harm intent, drinking from glasses, blood tomatoes \
+ or finding a (un)willing donor for your appropriate appendage!
\
+ Controls for taking blood from your victim can be changed at will by trying to drink from yourself.
\
+ Intent-based control scheme:
\
+ HELP - Loud, No Bleeding
\
+ DISARM - Subtle, Causes bleeding
\
+ GRAB - Subtle, No Bleeding
\
+ HARM - Loud, Causes Bleeding"
cost = 0
custom_only = FALSE
var_changes = list("bloodsucker" = TRUE)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
index 0de5ae30974..6239f894282 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm
@@ -1,6 +1,7 @@
/datum/trait
var/name
var/desc = "Contact a developer if you see this trait."
+ var/tutorial = "This trait has no detailed tutorial yet. Suggest one at #Dev-Suggestions on the discord!" //Use
for newlines, NOT \n
var/cost = 0
var/sort = TRAIT_SORT_NORMAL // Sort order, 1 before 2 before 3 etc. Alphabetical is used for same-group traits.
@@ -32,6 +33,7 @@
S.vars[trait] = trait_prefs[trait]
if(TRAIT_VAREDIT_TARGET_MOB)
H.vars[trait] = trait_prefs[trait]
+ H.verbs |= /mob/living/carbon/human/proc/trait_tutorial
return
//Applying trait to preferences rather than just us.
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
new file mode 100644
index 00000000000..05aff46d1ff
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/traits_tutorial.dm
@@ -0,0 +1,76 @@
+/*
+A new Ability given to those human mobs that have a non-zero number of traits.
+Verb is added by /datum/trait/proc/apply() in code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm file.
+This proc gets called whenever the user is spawned, resleeved, autoresleeved and so forth.
+If there are special cases that do NOT call this var that result in a completely new body -
+I will fix it once I am informed of their existence.
+Been tested - does NOT lead to multiples of the verb thanks to the |=.
+Given the apply() proc is only called if they have verbs - this should avoid it erronously popping up for traitless people.
+
+This ability intends to retrieve all positive, neutral and negative traits chosen in the character set-up
+then retrieve their relevant vars by assuming the character's species has the full list. This should always work. Should
+
+The ability is intended to be developed both as a to_chat() and a tgui window.
+The user is given the ability to choose which they would like whenever they press the ability to better suit whatever scenario they find themselves
+thirsty for knowledge.
+
+When adding new tutorials for trait subtypes, use
rather than \n newlines
+
+TGUI backend path: code\modules\tgui\modules\trait_tutorial_tgui.dm
+TGUI frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx
+*/
+
+
+
+
+
+/mob/living/carbon/human/proc/trait_tutorial()
+ set name = "Explain Custom Traits"
+ set desc = "Click this verb to obtain a detailed tutorial on your selected traits. "
+ set category = "Abilities"
+ var/datum/tgui_module/trait_tutorial_tgui/fancy_UI
+ if(!fancy_UI)
+ fancy_UI = new /datum/tgui_module/trait_tutorial_tgui/ //Preventing a bunch of instances being spawned all over the place. Hopefully
+
+
+
+ var/list/list_of_traits = species.traits
+ if(!LAZYLEN(list_of_traits)) //Although we shouldn't show up if no traits, leaving this in case someone loses theirs after (re)spawning.
+ to_chat(usr, SPAN_NOTICE("You do not have any custom traits!"))
+ return //Dont want an empty TGUI panel and list by accident after all.
+
+
+ var/UI_choice = tgui_alert(src, "Would you like the tutorial text to be printed to chat?", "Choose preferred tutorial interface", list("TGUI","To Chat", "Cancel"))
+ if(UI_choice == "Cancel")
+ return
+
+ //Initializing associative lists
+ var/trait_names = list() //List of keys
+ var/trait_category = list() // name:category
+ var/trait_desc = list() // name:desc
+ var/trait_tutorial = list() //name:tutorial
+ for(var/trait in list_of_traits)
+ var/datum/trait/T = all_traits[trait]
+ trait_names += T.name
+ trait_desc[T.name] = T.desc
+ trait_tutorial[T.name] = T.tutorial
+ switch(T.category)
+ if(TRAIT_TYPE_NEGATIVE)
+ trait_category[T.name] = "Negative Trait"
+ if(TRAIT_TYPE_NEUTRAL)
+ trait_category[T.name] = "Neutral Trait"
+ if(TRAIT_TYPE_POSITIVE)
+ trait_category[T.name] = "Positive Trait"
+
+
+ if(UI_choice == "To Chat")
+ var/to_chat_choice = tgui_input_list(usr, "Please choose the trait to be explained", "Print to Chat", trait_names, null)
+ if(to_chat_choice)
+ to_chat(usr,SPAN_NOTICE("Name: [to_chat_choice] \n Category: [trait_category[to_chat_choice]] \n Description: [trait_desc[to_chat_choice]] \n \
+ Guide: \n [trait_tutorial[to_chat_choice]]"))
+
+
+ else if(UI_choice == "TGUI")
+
+ fancy_UI.set_vars(trait_names, trait_category, trait_desc, trait_tutorial)
+ fancy_UI.tgui_interact(usr)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
index ca99f6ec32f..fb761a167bb 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -28,6 +28,7 @@
selective_preference = client.prefs_vr.selective_preference
appendage_color = client.prefs_vr.appendage_color
appendage_alt_setting = client.prefs_vr.appendage_alt_setting
+ eating_privacy_global = client.prefs_vr.eating_privacy_global
drop_vore = client.prefs_vr.drop_vore
stumble_vore = client.prefs_vr.stumble_vore
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index 63aa9f57540..9db4b297827 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -916,4 +916,11 @@
icon_state = "zaprat"
extra_overlay = "zaprat-tips"
do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
\ No newline at end of file
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/kara //SatinIsle Fluff Item
+ name = "Pterokara horn"
+ desc = ""
+ icon = 'icons/mob/vore/ears_vr.dmi'
+ icon_state = "kara_horn"
+ ckeys_allowed = list("satinisle")
\ No newline at end of file
diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
index 85bb90c1cba..08c0d4e0152 100644
--- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm
@@ -975,3 +975,9 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_LEG, BP_L_LEG, BP_GROIN)
+/datum/sprite_accessory/marking/vr/nevrean_long
+ name = "Long Snout"
+ icon = 'icons/mob/human_races/markings_vr.dmi'
+ icon_state = "nevrean_long"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index 8e3e3f7c12a..bc29290da62 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -1337,6 +1337,12 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+/datum/sprite_accessory/tail/kara //SatinIsle fluff item
+ name = "Pterokara Tail"
+ icon = 'icons/mob/vore/tails_vr.dmi'
+ icon_state = "kara_tail"
+ ckeys_allowed = list("satinisle")
+
//LONG TAILS ARE NOT TAUR BUTTS >:O
/datum/sprite_accessory/tail/longtail
name = "You should not see this..."
diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
index aba84d495bd..94db4dee96f 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
@@ -319,3 +319,10 @@
icon_state = "sectdrone_wing"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/kara //SatinIsle Fluff Item
+ name = "Pterokara wings"
+ desc = ""
+ icon = 'icons/mob/vore/wings_vr.dmi'
+ icon_state = "feathered_kara"
+ ckeys_allowed = list("satinisle")
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 8d0002f0daf..25e9e9c9bf8 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -79,6 +79,8 @@
var/sel_mode = 1 //index of the currently selected mode
var/list/firemodes = list()
+ var/reload_time = 1 //Base reload time in seconds
+
//aiming system stuff
var/keep_aim = 1 //1 for keep shooting until aim is lowered
//0 for one bullet after tarrget moves and aim is lowered
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index cf684200457..49d53b2babf 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -14,6 +14,8 @@
var/modifystate
var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge
+ reload_time = 5 //Energy weapons are slower to reload than ballistics by default, but this is no change from current values
+
//self-recharging
var/self_recharge = 0 //if set, the weapon will recharge itself
var/use_external_power = 0 //if set, the weapon will look for an external power source to draw from, otherwise it recharges magically
@@ -113,8 +115,8 @@
if(!power_supply) return null
if(!ispath(projectile_type)) return null
if(!power_supply.checked_use(charge_cost)) return null
- var/mob/living/M = loc // TGMC Ammo HUD
- if(istype(M)) // TGMC Ammo HUD
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
M?.hud_used.update_ammo_hud(M, src)
return new projectile_type(src)
@@ -129,7 +131,7 @@
to_chat(user, "[src] already has a power cell.")
else
user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].")
- if(do_after(user, 5 * P.w_class))
+ if(do_after(user, reload_time * P.w_class))
user.remove_from_mob(P)
power_supply = P
P.loc = src
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 92ca4535fc5..4769aef9999 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -17,6 +17,8 @@
var/load_method = SINGLE_CASING|SPEEDLOADER //1 = Single shells, 2 = box or quick loader, 3 = magazine
var/obj/item/ammo_casing/chambered = null
+ reload_time = 1 //Ballistics reload fast, but not instantly
+
//For SINGLE_CASING or SPEEDLOADER guns
var/max_shells = 0 //the number of casings that will fit inside
var/ammo_type = null //the type of ammo that the gun comes preloaded with
@@ -54,9 +56,9 @@
chambered = ammo_magazine.stored_ammo[ammo_magazine.stored_ammo.len]
if(handle_casings != HOLD_CASINGS)
ammo_magazine.stored_ammo -= chambered
-
- var/mob/living/M = loc // TGMC Ammo HUD
- if(istype(M)) // TGMC Ammo HUD
+
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
M?.hud_used.update_ammo_hud(M, src)
if (chambered)
@@ -102,9 +104,9 @@
if(handle_casings != HOLD_CASINGS)
chambered = null
-
- var/mob/living/M = loc // TGMC Ammo HUD
- if(istype(M)) // TGMC Ammo HUD
+
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
M?.hud_used.update_ammo_hud(M, src)
@@ -121,12 +123,13 @@
if(ammo_magazine)
to_chat(user, "[src] already has a magazine loaded.") //already a magazine here
return
- user.remove_from_mob(AM)
- AM.loc = src
- ammo_magazine = AM
- user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].")
- user.hud_used.update_ammo_hud(user, src)
- playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
+ if(do_after(user, reload_time * AM.w_class))
+ user.remove_from_mob(AM)
+ AM.loc = src
+ ammo_magazine = AM
+ user.visible_message("[user] inserts [AM] into [src].", "You insert [AM] into [src].")
+ user.hud_used.update_ammo_hud(user, src)
+ playsound(src, 'sound/weapons/flipblade.ogg', 50, 1)
if(SPEEDLOADER)
if(loaded.len >= max_shells)
to_chat(user, "[src] is full!")
@@ -140,11 +143,12 @@
loaded += C
AM.stored_ammo -= C //should probably go inside an ammo_magazine proc, but I guess less proc calls this way...
count++
- user.hud_used.update_ammo_hud(user, src)
- if(count)
- user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].")
- user.hud_used.update_ammo_hud(user, src)
- playsound(src, 'sound/weapons/empty.ogg', 50, 1)
+ user.hud_used.update_ammo_hud(user, src)
+ if(do_after(user, reload_time * AM.w_class))
+ if(count)
+ user.visible_message("[user] reloads [src].", "You load [count] round\s into [src].")
+ user.hud_used.update_ammo_hud(user, src)
+ playsound(src, 'sound/weapons/empty.ogg', 50, 1)
AM.update_icon()
else if(istype(A, /obj/item/ammo_casing))
var/obj/item/ammo_casing/C = A
@@ -154,11 +158,12 @@
to_chat(user, "[src] is full.")
return
- user.remove_from_mob(C)
- C.loc = src
- loaded.Insert(1, C) //add to the head of the list
- user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].")
- playsound(src, 'sound/weapons/empty.ogg', 50, 1)
+ if(do_after(user, reload_time * C.w_class))
+ user.remove_from_mob(C)
+ C.loc = src
+ loaded.Insert(1, C) //add to the head of the list
+ user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].")
+ playsound(src, 'sound/weapons/empty.ogg', 50, 1)
else if(istype(A, /obj/item/weapon/storage))
var/obj/item/weapon/storage/storage = A
@@ -179,7 +184,7 @@
sleep(1 SECOND)
update_icon()
- user.hud_used.update_ammo_hud(user, src)
+ user.hud_used.update_ammo_hud(user, src)
//attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled
/obj/item/weapon/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump=1)
@@ -189,7 +194,7 @@
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
ammo_magazine.update_icon()
ammo_magazine = null
- user.hud_used.update_ammo_hud(user, src)
+ user.hud_used.update_ammo_hud(user, src)
else if(loaded.len)
//presumably, if it can be speed-loaded, it can be speed-unloaded.
if(allow_dump && (load_method & SPEEDLOADER))
@@ -208,11 +213,11 @@
user.put_in_hands(C)
user.visible_message("[user] removes \a [C] from [src].", "You remove \a [C] from [src].")
playsound(src, 'sound/weapons/empty.ogg', 50, 1)
- user.hud_used.update_ammo_hud(user, src)
+ user.hud_used.update_ammo_hud(user, src)
else
to_chat(user, "[src] is empty.")
update_icon()
- user.hud_used.update_ammo_hud(user, src)
+ user.hud_used.update_ammo_hud(user, src)
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
..()
@@ -243,7 +248,7 @@
ammo_magazine.update_icon()
ammo_magazine = null
update_icon() //make sure to do this after unsetting ammo_magazine
- user.hud_used.update_ammo_hud(user, src)
+ user.hud_used.update_ammo_hud(user, src)
/obj/item/weapon/gun/projectile/examine(mob/user)
. = ..()
@@ -320,7 +325,7 @@
for(var/obj/item/ammo_casing/bullet in ammo_magazine.stored_ammo)
if(bullet.BB)
shots_left++
-
+
if(shots_left > 0)
return shots_left
else
@@ -332,7 +337,7 @@
for(var/obj/item/ammo_casing/bullet in loaded)
if(bullet.BB) // Only increment how many shots we have left if we're loaded.
shots_left++
-
+
if(shots_left > 0)
return shots_left
else
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 2416f688266..86d298d0542 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -322,6 +322,7 @@
var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc)
src.transfer_fingerprints_to(P)
P.set_dir(dir)
+ P.target = get_ranged_target_turf(src, dir, 10) //TODO: replace this with a proc parameter or other cleaner
var/obj/structure/disposalpipe/trunk/Trunk = CP
Trunk.linked = P
diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm
index cfd8db13688..88e7c90a0fb 100644
--- a/code/modules/tgui/external.dm
+++ b/code/modules/tgui/external.dm
@@ -1,7 +1,8 @@
-/**
- * tgui external
+/*!
+ * External tgui definitions, such as src_object APIs.
*
- * Contains all external tgui declarations.
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/tgui/modules/trait_tutorial_tgui.dm b/code/modules/tgui/modules/trait_tutorial_tgui.dm
new file mode 100644
index 00000000000..68c8afe350c
--- /dev/null
+++ b/code/modules/tgui/modules/trait_tutorial_tgui.dm
@@ -0,0 +1,48 @@
+/*
+Verb/Main definition path: code\modules\mob\living\carbon\human\species\station\traits_vr\traits_tutorial.dm
+Frontend path: tgui\packages\tgui\interfaces\TraitTutorial.tsx
+*/
+
+/datum/tgui_module/trait_tutorial_tgui
+ name = "Explain Custom Traits"
+ tgui_id = "TraitTutorial"
+ var/trait_names = list()
+ var/trait_category = list() // name:category
+ var/trait_desc = list() // name:desc
+ var/trait_tutorial = list() //name:tutorial
+ var/trait_selected = ""
+
+/datum/tgui_module/trait_tutorial_tgui/proc/set_vars(list/names, list/categories, list/descriptions, list/tutorials)
+ trait_names = names
+ trait_category = categories
+ trait_desc = descriptions
+ trait_tutorial = tutorials
+
+/datum/tgui_module/trait_tutorial_tgui/tgui_interact(mob/living/carbon/human/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, tgui_id, name)
+ ui.open()
+
+/datum/tgui_module/trait_tutorial_tgui/tgui_data(mob/user)
+ var/list/data = list()
+ data["names"] = trait_names //passes a list of strings
+ data["descriptions"] = trait_desc //passes an assoc list as obj
+ data["categories"] = trait_category //passes an assoc list as obj
+ data["tutorials"] = trait_tutorial //passes an assoc list as obj
+ data["selection"] = trait_selected //passes a string
+ return data
+
+/datum/tgui_module/trait_tutorial_tgui/tgui_act(action, params)
+ . = ..()
+ if(.)
+ return
+ if(action == "select_trait")
+ var/selection = params["name"]
+ trait_selected = selection
+
+
+ . = TRUE
+
+/datum/tgui_module/trait_tutorial_tgui/tgui_state(mob/user)
+ return GLOB.tgui_always_state
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index 5a66efc090d..ab80a41bd50 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -1,6 +1,9 @@
-/**
+/*!
* Base state and helpers for states. Just does some sanity checks,
* implement a proper state for in-depth checks.
+ *
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/tgui/states/admin.dm b/code/modules/tgui/states/admin.dm
index 7009f6f8844..bfa877bc096 100644
--- a/code/modules/tgui/states/admin.dm
+++ b/code/modules/tgui/states/admin.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: admin_state
*
diff --git a/code/modules/tgui/states/always.dm b/code/modules/tgui/states/always.dm
index 30915785442..9095d043505 100644
--- a/code/modules/tgui/states/always.dm
+++ b/code/modules/tgui/states/always.dm
@@ -1,3 +1,7 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
/**
* tgui state: always_state
diff --git a/code/modules/tgui/states/conscious.dm b/code/modules/tgui/states/conscious.dm
index 6bc0c7ec031..7213a99be7f 100644
--- a/code/modules/tgui/states/conscious.dm
+++ b/code/modules/tgui/states/conscious.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: conscious_state
*
diff --git a/code/modules/tgui/states/contained.dm b/code/modules/tgui/states/contained.dm
index c2fbd0b6b06..e16159c5e54 100644
--- a/code/modules/tgui/states/contained.dm
+++ b/code/modules/tgui/states/contained.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: contained_state
*
diff --git a/code/modules/tgui/states/deep_inventory.dm b/code/modules/tgui/states/deep_inventory.dm
index 14419874538..3d0913cf82f 100644
--- a/code/modules/tgui/states/deep_inventory.dm
+++ b/code/modules/tgui/states/deep_inventory.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: deep_inventory_state
*
diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm
index 93ba1df55f7..2fe058f3e09 100644
--- a/code/modules/tgui/states/default.dm
+++ b/code/modules/tgui/states/default.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: default_state
*
diff --git a/code/modules/tgui/states/hands.dm b/code/modules/tgui/states/hands.dm
index 0981b5d6ec7..9d742a4ab0b 100644
--- a/code/modules/tgui/states/hands.dm
+++ b/code/modules/tgui/states/hands.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: hands_state
*
diff --git a/code/modules/tgui/states/human_adjacent.dm b/code/modules/tgui/states/human_adjacent.dm
index 8164d5f9cee..845459e0717 100644
--- a/code/modules/tgui/states/human_adjacent.dm
+++ b/code/modules/tgui/states/human_adjacent.dm
@@ -1,3 +1,7 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
/**
* tgui state: human_adjacent_state
diff --git a/code/modules/tgui/states/inventory.dm b/code/modules/tgui/states/inventory.dm
index 92274cc1f2e..042ca7264cc 100644
--- a/code/modules/tgui/states/inventory.dm
+++ b/code/modules/tgui/states/inventory.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: inventory_state
*
diff --git a/code/modules/tgui/states/not_incapacitated.dm b/code/modules/tgui/states/not_incapacitated.dm
index 1185b516478..49f6d0097a8 100644
--- a/code/modules/tgui/states/not_incapacitated.dm
+++ b/code/modules/tgui/states/not_incapacitated.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: not_incapacitated_state
*
diff --git a/code/modules/tgui/states/notcontained.dm b/code/modules/tgui/states/notcontained.dm
index 56b789e3c04..452d0f649bc 100644
--- a/code/modules/tgui/states/notcontained.dm
+++ b/code/modules/tgui/states/notcontained.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: notcontained_state
*
diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm
index bdfe690dbaa..f20bb1b71ff 100644
--- a/code/modules/tgui/states/observer.dm
+++ b/code/modules/tgui/states/observer.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: observer_state
*
@@ -12,4 +17,3 @@ GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new)
if(check_rights(R_ADMIN|R_EVENT, 0, src))
return STATUS_INTERACTIVE
return STATUS_CLOSE
-
diff --git a/code/modules/tgui/states/physical.dm b/code/modules/tgui/states/physical.dm
index 9712090b5da..dc7f93d2ee7 100644
--- a/code/modules/tgui/states/physical.dm
+++ b/code/modules/tgui/states/physical.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: physical_state
*
@@ -72,4 +77,4 @@ GLOBAL_DATUM_INIT(tgui_physical_state_bigscreen, /datum/tgui_state/physical_bigs
return max(STATUS_UPDATE, shared_living_tgui_distance_bigscreen(src_object)) // Silicons can always see.
/mob/living/silicon/ai/physical_can_use_tgui_topic(src_object)
- return STATUS_UPDATE // AIs are not physical.
\ No newline at end of file
+ return STATUS_UPDATE // AIs are not physical.
diff --git a/code/modules/tgui/states/self.dm b/code/modules/tgui/states/self.dm
index 109fd6ae440..064b1b0ce66 100644
--- a/code/modules/tgui/states/self.dm
+++ b/code/modules/tgui/states/self.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: self_state
*
diff --git a/code/modules/tgui/states/zlevel.dm b/code/modules/tgui/states/zlevel.dm
index a589a4b64d7..3e7d84e2621 100644
--- a/code/modules/tgui/states/zlevel.dm
+++ b/code/modules/tgui/states/zlevel.dm
@@ -1,3 +1,8 @@
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
+ */
+
/**
* tgui state: z_state
*
diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm
index 74d16a2e33d..29431c42f3b 100644
--- a/code/modules/tgui/tgui.dm
+++ b/code/modules/tgui/tgui.dm
@@ -1,7 +1,6 @@
-/**
- * tgui
- *
- * /tg/station user interface library
+/*!
+ * Copyright (c) 2020 Aleksej Komarov
+ * SPDX-License-Identifier: MIT
*/
/**
diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm
index f115fdde63c..614f9e142ec 100644
--- a/code/modules/tgui_input/text.dm
+++ b/code/modules/tgui_input/text.dm
@@ -39,6 +39,11 @@
return input(user, message, title, default) as message|null
else
return input(user, message, title, default) as text|null
+
+ //Client has TGUI input lock on; override whatever prevent_enter was specified beforehand
+ if(user.client.prefs.tgui_input_lock)
+ prevent_enter = TRUE
+
var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout, prevent_enter)
text_input.tgui_interact(user)
text_input.wait()
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 2ae59893136..02960e0a4bd 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -54,6 +54,7 @@
var/emote_active = TRUE // Are we even giving emotes out at all or not?
var/next_emote = 0 // When we're supposed to print our next emote, as a world.time
var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to?
+ var/eating_privacy_local = "default" //Overrides eating_privacy_global if not "default". Determines if attempt/success messages are subtle/loud
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
@@ -226,7 +227,8 @@
"belly_fullscreen_color",
"colorization_enabled",
"egg_type",
- "save_digest_mode"
+ "save_digest_mode",
+ "eating_privacy_local"
)
if (save_digest_mode == 1)
@@ -391,16 +393,28 @@
if(!ishuman(owner))
owner.update_icons()
+ //Determines privacy
+ var/privacy_range = world.view
+ var/privacy_volume = 100
+ switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched
+ if("default")
+ if(owner.eating_privacy_global)
+ privacy_range = 1
+ privacy_volume = 25
+ if("subtle")
+ privacy_range = 1
+ privacy_volume = 25
+
//Print notifications/sound if necessary
if(!silent && count)
- owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!")
+ owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!", range = privacy_range)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
- playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
+ playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
return count
@@ -459,16 +473,28 @@
if(!ishuman(owner))
owner.update_icons()
+ //Determines privacy
+ var/privacy_range = world.view
+ var/privacy_volume = 100
+ switch(eating_privacy_local) //Third case of if("loud") not defined, as it'd just leave privacy_range and volume untouched
+ if("default")
+ if(owner.eating_privacy_global)
+ privacy_range = 1
+ privacy_volume = 25
+ if("subtle")
+ privacy_range = 1
+ privacy_volume = 25
+
//Print notifications/sound if necessary
if(!silent)
- owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!")
+ owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!",range = privacy_range)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
- playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
+ playsound(src, soundfile, vol = privacy_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
//Should fix your view not following you out of mobs sometimes!
if(ismob(M))
var/mob/ourmob = M
@@ -1187,6 +1213,7 @@
dupe.emote_active = emote_active
dupe.selective_preference = selective_preference
dupe.save_digest_mode = save_digest_mode
+ dupe.eating_privacy_local = eating_privacy_local
//// Object-holding variables
//struggle_messages_outside - strings
diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm
index f7e9f6d9526..7a7a3ac8a85 100644
--- a/code/modules/vore/eating/leave_remains_vr.dm
+++ b/code/modules/vore/eating/leave_remains_vr.dm
@@ -26,27 +26,56 @@
skull_type = /obj/item/weapon/digestion_remains/skull/vox
/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
- if(!ishuman(M)) //Are we even humanoid?
+ if(!ishuman(M) && !isrobot(M)) //Are we even humanoid or a borg?
return
+ //Moving some vars here for both borgs and carbons to use
+ var/bones_amount = rand(2,4) //some random variety in amount of bones left
+ if(isrobot(M)) //If borg, handle differently
+ //var/mob/living/silicon/robot/R = M // Not Needed at the moment. Uncomment if you need borg stuff
+
+ var/list/borg_bones = list( //Borg bones are the same at this point. might change in the future if borgs or synths get
+ /obj/item/weapon/digestion_remains/synth, // different remains in the future.
+ /obj/item/weapon/digestion_remains/synth/variant1,
+ /obj/item/weapon/digestion_remains/synth/variant2,
+ /obj/item/weapon/digestion_remains/synth/variant3
+ )
+ for(var/i = 1, i <= bones_amount, i++) //Just fill them with bones. Borgs dont have anything special.
+ var/new_bone = pick(borg_bones)
+ new new_bone(src,owner)
+ return //Dont need to do carbon stuff after this
+
var/mob/living/carbon/human/H = M
- if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave
+ if((H.species.name in remainless_species)) //Don't leave anything if there is nothing to leave
return
- var/bones_amount = rand(2,3) //some random variety in amount of bones left
- if(prob(20)) //ribcage surviving whole is some luck
+ if(prob(20) && !H.isSynthetic()) //ribcage surviving whole is some luck //Edit: no robor
new /obj/item/weapon/digestion_remains/ribcage(src,owner)
bones_amount--
- while(bones_amount) //throw in the rest
- new /obj/item/weapon/digestion_remains(src,owner)
- bones_amount--
+ var/list/organic_bones = list( //Generic bone variation system
+ /obj/item/weapon/digestion_remains,
+ /obj/item/weapon/digestion_remains/variant1,
+ /obj/item/weapon/digestion_remains/variant2,
+ /obj/item/weapon/digestion_remains/variant3
+ )
+ var/list/synthetic_bones = list(
+ /obj/item/weapon/digestion_remains/synth,
+ /obj/item/weapon/digestion_remains/synth/variant1,
+ /obj/item/weapon/digestion_remains/synth/variant2,
+ /obj/item/weapon/digestion_remains/synth/variant3
+ )
+ for(var/i = 1, i <= bones_amount, i++) //throw in the rest
+ var/new_bone = H.isSynthetic() ? pick(synthetic_bones) : pick(organic_bones)
+ new new_bone(src,owner)
+ if(H.isSynthetic()) // Synths dont have skulls, atleast not any that survive digestion.
+ return // TODO: add synth skulls and remove this.
var/skull_amount = 1
if(H.species.skull_type)
new H.species.skull_type(src, owner)
skull_amount--
-
+
if(skull_amount && H.species.selects_bodytype)
// We still haven't found correct skull...
if(H.species.base_species == SPECIES_HUMAN)
@@ -62,7 +91,9 @@
name = "bone"
desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from."
icon = 'icons/obj/bones_vr.dmi'
- icon_state = "generic"
+ icon_state = "generic-1"
+ drop_sound = 'sound/items/drop/wooden.ogg' //sounds kinda like a bone
+ pickup_sound = 'sound/items/pickup/woodweapon.ogg'
force = 0
throwforce = 0
item_state = "bone"
@@ -70,6 +101,13 @@
var/pred_ckey
var/pred_name
+/obj/item/weapon/digestion_remains/synth
+ name = "ruined component"
+ desc = "A ruined component. It seems to have come from some sort of robotic entity, but there's no telling what kind."
+ icon_state = "synth-1"
+ drop_sound = 'sound/items/drop/device.ogg' //not organic bones, so they get different sounds
+ pickup_sound = 'sound/items/pickup/device.ogg'
+
/obj/item/weapon/digestion_remains/Initialize(var/mapload, var/mob/living/pred)
. = ..()
if(!mapload)
@@ -86,6 +124,24 @@
desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to."
icon_state = "ribcage"
+/obj/item/weapon/digestion_remains/variant1 //Generic bone variations
+ icon_state = "generic-2"
+
+/obj/item/weapon/digestion_remains/variant2
+ icon_state = "generic-3"
+
+/obj/item/weapon/digestion_remains/variant3
+ icon_state = "generic-4"
+
+/obj/item/weapon/digestion_remains/synth/variant1 //synthbones start
+ icon_state = "synth-2"
+
+/obj/item/weapon/digestion_remains/synth/variant2
+ icon_state = "synth-3"
+
+/obj/item/weapon/digestion_remains/synth/variant3
+ icon_state = "synth-4"
+
/obj/item/weapon/digestion_remains/skull
name = "skull"
desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human."
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 9e37b888cea..66739c747b6 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -50,6 +50,7 @@
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait.
var/appendage_alt_setting = FALSE // Dictates if 'long_vore' user pulls prey to them or not. 1 = user thrown towards target.
+ var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
@@ -286,6 +287,7 @@
P.slip_vore = src.slip_vore
P.throw_vore = src.throw_vore
P.stumble_vore = src.stumble_vore
+ P.eating_privacy_global = src.eating_privacy_global
P.nutrition_message_visible = src.nutrition_message_visible
P.nutrition_messages = src.nutrition_messages
@@ -335,6 +337,7 @@
slip_vore = P.slip_vore
throw_vore = P.throw_vore
stumble_vore = P.stumble_vore
+ eating_privacy_global = P.eating_privacy_global
nutrition_message_visible = P.nutrition_message_visible
nutrition_messages = P.nutrition_messages
@@ -600,6 +603,18 @@
to_chat(user, "They aren't aren't in a state to be devoured.")
return FALSE
+ //Determining vore attempt privacy
+ var/message_range = world.view
+ if(!pred.is_slipping && !prey.is_slipping) //We only care about privacy preference if it's NOT a spontaneous vore.
+ switch(belly.eating_privacy_local) //if("loud") case not added, as it would not modify message_range
+ if("default")
+ if(pred.eating_privacy_global)
+ message_range = 1
+ if("subtle")
+ message_range = 1
+
+
+
// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
// Prepare messages
if(prey.is_slipping)
@@ -616,7 +631,10 @@
success_msg = "[user] manages to make [pred] [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!"
// Announce that we start the attempt!
- user.visible_message(attempt_msg)
+
+
+ user.visible_message(attempt_msg, range = message_range)
+
// Now give the prey time to escape... return if they did
var/swallow_time
@@ -633,7 +651,7 @@
return FALSE // Prey escpaed (or user disabled) before timer expired.
// If we got this far, nom successful! Announce it!
- user.visible_message(success_msg)
+ user.visible_message(success_msg, range = message_range)
// Actually shove prey into the belly.
if(istype(prey.loc, /obj/item/weapon/holder))
@@ -1079,6 +1097,7 @@
dispvoreprefs += "Spontaneous transformation: [allow_spontaneous_tf ? "Enabled" : "Disabled"]
"
dispvoreprefs += "Can be stepped on/over: [step_mechanics_pref ? "Allowed" : "Disallowed"]
"
dispvoreprefs += "Can be picked up: [pickup_pref ? "Allowed" : "Disallowed"]
"
+ dispvoreprefs += "Global Vore Privacy is: [eating_privacy_global ? "Subtle" : "Loud"]
"
user << browse("