diff --git a/code/__defines/plants.dm b/code/__defines/plants.dm
index 928315df3f..bca340f2d3 100644
--- a/code/__defines/plants.dm
+++ b/code/__defines/plants.dm
@@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(plant_item_products, list(
/obj/item/organ/internal/brain/grey = 1,
/obj/item/organ/internal/heart/grey = 1,
/obj/item/weapon/spacecash/c1 = 3,
- /obj/item/weapon/spacecash/c10 = 1
+ /obj/item/weapon/spacecash/c5 = 1
))
GLOBAL_LIST_INIT(forbidden_plant_growth_sprites, list(
diff --git a/code/datums/supplypacks/voidsuits_vr.dm b/code/datums/supplypacks/voidsuits_vr.dm
index bfa9dc1dbf..52dfc3da47 100644
--- a/code/datums/supplypacks/voidsuits_vr.dm
+++ b/code/datums/supplypacks/voidsuits_vr.dm
@@ -1,141 +1,152 @@
-/datum/supply_pack/voidsuits/explorer
- name = "Exploration voidsuits" // YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/exploration = 2,
- /obj/item/clothing/head/helmet/space/void/exploration = 2,
- /obj/item/clothing/mask/breath = 2,
- /obj/item/clothing/shoes/magboots = 2,
- /obj/item/weapon/tank/oxygen = 2
- )
- cost = 45
- containertype = /obj/structure/closet/crate/secure
- containername = "Exploration voidsuit crate" // YW EDIT
- access = access_explorer // YW EDIT
-
-/datum/supply_pack/voidsuits/explorer_medic
- name = "Expedition Medic voidsuits" // YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/exploration = 2,
- /obj/item/clothing/head/helmet/space/void/exploration = 2,
- /obj/item/clothing/mask/breath = 2,
- /obj/item/clothing/shoes/magboots = 2,
- /obj/item/weapon/tank/oxygen = 2
- )
- cost = 45
- containertype = /obj/structure/closet/crate/secure
- containername = "Expedition Medic voidsuit crate" // YW EDIT
- access = access_explorer // YW EDIT
-
-/datum/supply_pack/voidsuits/pilot
- name = "Pilot voidsuits"
- contains = list(
- /obj/item/clothing/suit/space/void/pilot = 1,
- /obj/item/clothing/head/helmet/space/void/pilot = 1,
- /obj/item/clothing/mask/breath = 1,
- /obj/item/clothing/shoes/magboots = 1,
- /obj/item/weapon/tank/oxygen = 1
- )
- cost = 20
- containertype = /obj/structure/closet/crate/secure
- containername = "Pilot voidsuit crate"
- access = access_pilot
-
-
-// Surplus!
-/datum/supply_pack/voidsuits/com_mining
- name = "SolGov mining voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/mining/alt2,
- /obj/item/clothing/head/helmet/space/void/mining/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov mining voidsuit crate" //YW EDIT
- access = access_mining
-
-/datum/supply_pack/voidsuits/com_anomaly
- name = "SolGov anomaly suit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/anomaly/alt,
- /obj/item/clothing/head/helmet/space/anomaly/alt
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov anomaly suit crate" //YW EDIT
- access = access_xenoarch
-
-/datum/supply_pack/voidsuits/com_riot
- name = "SolGov riot voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/security/riot/alt,
- /obj/item/clothing/head/helmet/space/void/security/riot/alt
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov riot voidsuit crate" //YW EDIT
- access = access_brig
-
-/datum/supply_pack/voidsuits/com_pilot
- name = "SolGov pilot voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/pilot/alt2,
- /obj/item/clothing/head/helmet/space/void/pilot/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov pilot voidsuit crate" //YW EDIT
- access = access_pilot
-
-/datum/supply_pack/voidsuits/com_medical
- name = "SolGov medical voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/medical/alt2,
- /obj/item/clothing/head/helmet/space/void/medical/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov medical voidsuit crate" //YW EDIT
-
-/datum/supply_pack/voidsuits/com_explore
- name = "SolGov exploration voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/exploration/alt2,
- /obj/item/clothing/head/helmet/space/void/exploration/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov exploration voidsuit crate" //YW EDIT
- access = list(access_eva, access_explorer) //YW EDIT
-
-/datum/supply_pack/voidsuits/com_engineer
- name = "SolGov engineering voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/engineering/alt2,
- /obj/item/clothing/head/helmet/space/void/engineering/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov engineering voidsuit crate" //YW EDIT
- access = access_engine
-
-/datum/supply_pack/voidsuits/com_atmos
- name = "SolGov atmos voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/atmos/alt2,
- /obj/item/clothing/head/helmet/space/void/atmos/alt2
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov atmos voidsuit crate" //YW EDIT
- access = access_atmospherics
-
-/datum/supply_pack/voidsuits/com_captain
- name = "SolGov captain voidsuit" //YW EDIT
- contains = list(
- /obj/item/clothing/suit/space/void/captain/alt,
- /obj/item/clothing/head/helmet/space/void/captain/alt
- )
- cost = 150
- containertype = /obj/structure/closet/crate/secure
- name = "SolGov captain voidsuit crate" //YW EDIT
- access = access_captain
+/datum/supply_pack/voidsuits/explorer
+ name = "Exploration voidsuits" // YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/exploration = 2,
+ /obj/item/clothing/head/helmet/space/void/exploration = 2,
+ /obj/item/clothing/mask/breath = 2,
+ /obj/item/clothing/shoes/magboots = 2,
+ /obj/item/weapon/tank/oxygen = 2
+ )
+ cost = 45
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Exploration voidsuit crate" // YW EDIT
+ access = access_explorer // YW EDIT
+
+/datum/supply_pack/voidsuits/explorer_medic
+ name = "Expedition Medic voidsuits" // YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/exploration = 2,
+ /obj/item/clothing/head/helmet/space/void/exploration = 2,
+ /obj/item/clothing/mask/breath = 2,
+ /obj/item/clothing/shoes/magboots = 2,
+ /obj/item/weapon/tank/oxygen = 2
+ )
+ cost = 45
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Expedition Medic voidsuit crate" // YW EDIT
+ access = access_explorer // YW EDIT
+
+/datum/supply_pack/voidsuits/pilot
+ name = "Pilot voidsuits"
+ contains = list(
+ /obj/item/clothing/suit/space/void/pilot = 1,
+ /obj/item/clothing/head/helmet/space/void/pilot = 1,
+ /obj/item/clothing/mask/breath = 1,
+ /obj/item/clothing/shoes/magboots = 1,
+ /obj/item/weapon/tank/oxygen = 1
+ )
+ cost = 20
+ containertype = /obj/structure/closet/crate/secure
+ containername = "Pilot voidsuit crate"
+ access = access_pilot
+
+
+// Surplus!
+/datum/supply_pack/voidsuits/com_mining
+ name = "SolGov mining voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/mining/alt2,
+ /obj/item/clothing/head/helmet/space/void/mining/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov mining voidsuit crate" //YW EDIT
+ access = access_mining
+
+/datum/supply_pack/voidsuits/com_anomaly
+ name = "SolGov anomaly suit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/anomaly/alt,
+ /obj/item/clothing/head/helmet/space/anomaly/alt
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov anomaly suit crate" //YW EDIT
+ access = access_xenoarch
+
+/datum/supply_pack/voidsuits/com_riot
+ name = "SolGov riot voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/security/riot/alt,
+ /obj/item/clothing/head/helmet/space/void/security/riot/alt
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov riot voidsuit crate" //YW EDIT
+ access = access_brig
+
+/datum/supply_pack/voidsuits/com_pilot
+ name = "SolGov pilot voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/pilot/alt2,
+ /obj/item/clothing/head/helmet/space/void/pilot/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov pilot voidsuit crate" //YW EDIT
+ access = access_pilot
+
+/datum/supply_pack/voidsuits/com_medical
+ name = "SolGov medical voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/medical/alt2,
+ /obj/item/clothing/head/helmet/space/void/medical/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov medical voidsuit crate" //YW EDIT
+
+/datum/supply_pack/voidsuits/com_explore
+ name = "SolGov exploration voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/exploration/alt2,
+ /obj/item/clothing/head/helmet/space/void/exploration/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov exploration voidsuit crate" //YW EDIT
+ access = list(access_eva, access_explorer) //YW EDIT
+
+/datum/supply_pack/voidsuits/com_engineer
+ name = "SolGov engineering voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/engineering/alt2,
+ /obj/item/clothing/head/helmet/space/void/engineering/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov engineering voidsuit crate" //YW EDIT
+ access = access_engine
+
+/datum/supply_pack/voidsuits/com_atmos
+ name = "SolGov atmos voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/atmos/alt2,
+ /obj/item/clothing/head/helmet/space/void/atmos/alt2
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov atmos voidsuit crate" //YW EDIT
+ access = access_atmospherics
+
+/datum/supply_pack/voidsuits/com_captain
+ name = "SolGov captain voidsuit" //YW EDIT
+ contains = list(
+ /obj/item/clothing/suit/space/void/captain/alt,
+ /obj/item/clothing/head/helmet/space/void/captain/alt
+ )
+ cost = 150
+ containertype = /obj/structure/closet/crate/secure
+ name = "SolGov captain voidsuit crate" //YW EDIT
+ access = access_captain
+
+/datum/supply_pack/voidsuits/csc_breaker
+ name = "Shipbreaker's Industrial Suit (inc. jetpack)"
+ contains = list(
+ /obj/item/clothing/suit/space/void/salvagecorp_shipbreaker,
+ /obj/item/clothing/head/helmet/space/void/salvagecorp_shipbreaker,
+ /obj/item/weapon/tank/jetpack/breaker
+ )
+ cost = 100
+ containertype = /obj/structure/closet/crate/secure
+ name = "Coyote Salvage Corp industrial voidsuit crate"
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index 9a5eb65ba6..fcabe9f5ce 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -1,7 +1,7 @@
/obj/machinery/optable
name = "Operating Table"
desc = "Used for advanced medical procedures."
- icon = 'icons/obj/surgery.dmi'
+ icon = 'icons/obj/surgery_vr.dmi'
icon_state = "table2-idle"
density = TRUE
anchored = TRUE
@@ -100,12 +100,12 @@
if(!Adjacent(target) || !Adjacent(user))
return ..()
-
+
if(user.incapacitated() || !check_table(target, user))
return ..()
take_victim(target, user)
-
+
/obj/machinery/optable/verb/climb_on()
set name = "Climb On Table"
set category = "Object"
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index cb11dce0b5..bb0858a79e 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -239,6 +239,22 @@ update_flag
..()
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+ if(istype(W, /obj/item/weapon/weldingtool)) //Vorestart: Deconstructable Canisters
+ var/obj/item/weapon/weldingtool/WT = W
+ if(!WT.remove_fuel(0, user))
+ to_chat(user, "The welding tool must be on to complete this task.")
+ return
+ if(air_contents.return_pressure() > 1 && !destroyed) // Empty or broken cans are able to be deconstructed
+ to_chat(user, "\The [src]'s internal pressure is too high! Empty the canister before attempting to weld it apart.")
+ return
+ playsound(src, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed))
+ if(!src || !WT.isOn()) return
+ to_chat(user, "You deconstruct the [src].")
+ new /obj/item/stack/material/steel( src.loc, 10)
+ qdel(src)
+ return
+ //Voreend
if(!W.is_wrench() && !istype(W, /obj/item/weapon/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/device/pda))
visible_message("\The [user] hits \the [src] with \a [W]!")
src.health -= W.force
@@ -332,7 +348,7 @@ update_flag
pressure = 10*ONE_ATMOSPHERE
. = TRUE
else if(pressure == "input")
- pressure = tgui_input_number(usr, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure, 10*ONE_ATMOSPHERE, ONE_ATMOSPHERE/10)
+ pressure = tgui_input_number(usr, "New release pressure ([ONE_ATMOSPHERE/10]-[10*ONE_ATMOSPHERE] kPa):", name, release_pressure, 10*ONE_ATMOSPHERE, ONE_ATMOSPHERE/10)
if(!isnull(pressure) && !..())
. = TRUE
else if(text2num(pressure) != null)
@@ -452,4 +468,4 @@ update_flag
/obj/machinery/portable_atmospherics/canister/take_damage(var/damage)
src.health -= damage
- healthcheck()
\ No newline at end of file
+ healthcheck()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 67fc80168a..1e0fe3a78a 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 3d770e0dce..4058500dd2 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/equipment/tools/medigun_vr.dm b/code/game/mecha/equipment/tools/medigun_vr.dm
index 7b06a30ffd..d0518efb11 100644
--- a/code/game/mecha/equipment/tools/medigun_vr.dm
+++ b/code/game/mecha/equipment/tools/medigun_vr.dm
@@ -8,4 +8,5 @@
projectile = /obj/item/projectile/beam/medigun
fire_sound = 'sound/weapons/eluger.ogg'
equip_type = EQUIP_UTILITY
- origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6)
\ No newline at end of file
+ required_type = /obj/mecha/medical
+ origin_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_BIO = 6, TECH_POWER = 6)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index f5821b18d1..1dd50dc0bf 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/effects/decals/posters/posters.dm b/code/game/objects/effects/decals/posters/posters.dm
index 44bdb935ea..4f18d66c78 100644
--- a/code/game/objects/effects/decals/posters/posters.dm
+++ b/code/game/objects/effects/decals/posters/posters.dm
@@ -3,7 +3,7 @@
if(exact)
return decls_repository.get_decl(path)
else
- var/list/L = decls_repository.get_decls_of_type(path)
+ var/list/L = decls_repository.get_decls_of_type(path)
return L[pick(L)]
return null
@@ -27,7 +27,9 @@
src.poster_decl = get_poster_decl(poster_decl, TRUE)
else
src.poster_decl = get_poster_decl(/decl/poster, FALSE)
-
+ while (istype(src.poster_decl, /decl/poster/lewd))
+ src.poster_decl = get_poster_decl(/decl/poster, FALSE)
+
name += " - [src.poster_decl.name]"
return ..()
@@ -58,8 +60,8 @@
if (locate(/obj/structure/sign/poster) in T)
stuff_on_wall = 1
break
-
- if(stuff_on_wall)
+
+ if(stuff_on_wall)
to_chat(user, "There is already a poster there!")
return FALSE
@@ -71,7 +73,7 @@
to_chat(user, "You place the poster!")
qdel(src)
return TRUE
-
+
P.roll_and_drop(P.loc)
qdel(src)
return FALSE
@@ -101,7 +103,7 @@
var/list/options = list()
var/list/decl/poster/posters = decls_repository.get_decls_of_type(/decl/poster)
for(var/option in posters)
- options[posters[option].listing_name] = posters[option]
+ options[posters[option].name] = posters[option]
var/choice = tgui_input_list(M, "Choose a poster!", "Customize Poster", options)
if(src && choice && !M.stat && in_range(M,src))
@@ -156,7 +158,9 @@
else if(ispath(P))
src.poster_decl = get_poster_decl(P, TRUE)
else
- src.poster_decl = get_poster_decl(target_poster_decl_path, FALSE)
+ src.poster_decl = get_poster_decl(/decl/poster, FALSE)
+ while (istype(src.poster_decl, /decl/poster/lewd))
+ src.poster_decl = get_poster_decl(/decl/poster, FALSE)
name = "[initial(name)] - [poster_decl.name]"
desc = "[initial(desc)] [poster_decl.desc]"
diff --git a/code/game/objects/effects/decals/posters/voreposters_vr.dm b/code/game/objects/effects/decals/posters/voreposters_vr.dm
index 03af8416e4..335366aedc 100644
--- a/code/game/objects/effects/decals/posters/voreposters_vr.dm
+++ b/code/game/objects/effects/decals/posters/voreposters_vr.dm
@@ -1,8 +1,12 @@
+/decl/poster/lewd
+ desc = "You shouldn't see this."
+ listing_name = "N/A"
+
/decl/poster/vore_1
icon_state = "sbsposter1"
name = "Best Girl Pip"
desc = "A poster of the official NT Best Girl Mascot, Pip"
-/decl/poster/vore_2
+/decl/poster/lewd/vore_2
icon_state = "sbsposter2"
name = "AroButt"
desc = "A lewd view of KHI's cutest fops."
@@ -18,7 +22,7 @@
icon_state = "sbsposter5"
name = "The Inn"
desc = "A poster of a certain black-eyed shadekin."
-/decl/poster/vore_6
+/decl/poster/lewd/vore_6
icon_state = "sbsposter6"
name = "Mawletta"
desc = "The best view in the system."
@@ -98,7 +102,7 @@
icon_state = "sbsposter16"
name = "Borgar"
desc = "What do you want from Space McDonalds?"
-/decl/poster/vore_28
+/decl/poster/lewd/vore_28
icon_state = "sbsposter17"
name = "DiveIn"
desc = "A limited edition holographic poster that seems to feature subliminal suggestions and conditioning."
@@ -389,4 +393,4 @@
/decl/poster/vore_101
icon_state = "cafejoanposter"
name = "Cafe Risu"
- desc = "A poster depicting a familiar face readying to slurp a big mug of coffee. The face of addiction is not always unpleasant. Sometimes it takes the form of a pretty squirrel partaking of her morning treat..."
\ No newline at end of file
+ desc = "A poster depicting a familiar face readying to slurp a big mug of coffee. The face of addiction is not always unpleasant. Sometimes it takes the form of a pretty squirrel partaking of her morning treat..."
diff --git a/code/game/objects/items/stacks/nanopaste_vr.dm b/code/game/objects/items/stacks/nanopaste_vr.dm
index cd39b61fef..d0bd4e8003 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 cbfac3ae02..9f25d74a02 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 6c0b1c25a8..30f2c56d15 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 7e5f8fd079..62e6bfa978 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/picnic_blankets.dm b/code/game/objects/items/weapons/picnic_blankets.dm
new file mode 100644
index 0000000000..a5da986015
--- /dev/null
+++ b/code/game/objects/items/weapons/picnic_blankets.dm
@@ -0,0 +1,120 @@
+#define CENTER 1
+#define SIDE 2
+
+/obj/item/weapon/picnic_blankets_carried
+ name = "picnic blanket"
+ desc = "A neatly folded picnic blanket!"
+ var/unfolded_desc = "Separates your meal from the dirty floor. Or table."
+ icon = 'icons/obj/picnic_vr.dmi'
+ icon_state = "picnic_carried"
+ w_class = ITEMSIZE_NORMAL
+ attack_verb = list("flicked", "whipped", "swooshed")
+ force = 0.5
+ hitsound = 'sound/weapons/towelwhip.ogg'
+ drop_sound = 'sound/items/drop/cloth.ogg'
+ pickup_sound = 'sound/items/pickup/cloth.ogg'
+
+/obj/item/weapon/picnic_blankets_carried/verb/fold_out()
+ set name = "Fold out"
+ set desc = "Fold out the picnic blanket for use"
+ set category = "Object"
+ var/obj/structure/picnic_blanket_deployed/P = new /obj/structure/picnic_blanket_deployed(usr.loc)
+ P.name = name
+ P.desc = unfolded_desc
+ P.unfold()
+ qdel(src)
+
+/obj/structure/picnic_blanket_deployed
+ name = "picnic blanket"
+ desc = "Separates your meal from the dirty floor. Or table."
+ var/folded_desc = "A neatly folded picnic blanket!"
+ icon = 'icons/obj/picnic_vr.dmi'
+ icon_state = "picnic_central"
+ var/blanket_type = CENTER
+ layer = HIDING_LAYER - 0.01 //Stuff shouldn't be able to hide under the blanket on the ground
+ var/list/attached_blankets = list()
+
+/obj/structure/picnic_blanket_deployed/verb/fold_up()
+ set name = "Fold up"
+ set desc = "Folds the blanket up for carrying"
+ set category = "Object"
+ set src in oview(1)
+
+ for(var/obj/structure/picnic_blanket_deployed/side in attached_blankets)
+ qdel(side)
+ var/obj/item/weapon/picnic_blankets_carried/P = new /obj/item/weapon/picnic_blankets_carried(usr.loc)
+ P.name = name
+ P.desc = folded_desc
+ qdel(src)
+
+/obj/structure/picnic_blanket_deployed/proc/unfold()
+ var/dirs = alldirs
+ var/isTableTop //Controls whether to spawn things across tables, or on ground
+ var/doWeHaveTable //Helper var set to true if ANY obj is a table
+ var/anti_spam = FALSE //Helper var to avoid spamming people if they are mired in trash.
+ for(var/obj/O in get_turf(src)) //Center element determines behaviour
+ if(istype(O, /obj/structure/table))
+ isTableTop = TRUE
+ layer = TABLE_LAYER + 0.01 //We should be just a bit over tables!
+
+ populate_blankets:
+ for(var/dir in dirs)
+ var/turf/T = get_step(get_turf(src), dir)
+ doWeHaveTable = FALSE //Resetting to False each loop
+ if(T.density)
+ continue
+ if(LAZYLEN(T.contents) > 20) //Avoiding potential perf issues by not iterating over large piles of objs
+ if(!anti_spam)
+ to_chat(usr, SPAN_NOTICE("Too many items! Couldn't fully unfold the blanket!"))
+ anti_spam = TRUE
+ continue
+ for(var/obj/O in T)
+ if(O.density) //Cables & Atmos machinery dont bother us.
+ if(isTableTop && istype(O, /obj/structure/table)) //We expand to the table if the center is a table
+ doWeHaveTable = TRUE
+ break
+ else
+ continue populate_blankets
+ if(isTableTop && !doWeHaveTable) //However, if center is a table, we don't expand if we havn't found any.
+ continue //If center is on table, we only allow the rest to appear on tables as well.
+
+ //Actually spawning
+ var/obj/structure/picnic_blanket_deployed/side = new /obj/structure/picnic_blanket_deployed(T)
+ side.verbs -= /obj/structure/picnic_blanket_deployed/verb/fold_up
+ attached_blankets += side
+ side.blanket_type = SIDE
+ side.name = name //Making sure side blankets inherit our vars if they got edited at runtime
+ side.desc = desc
+ side.set_dir(dir)
+ if(isTableTop)
+ side.layer = TABLE_LAYER + 0.01 //We should be just above tables.
+ side.update_icon()
+
+/obj/structure/picnic_blanket_deployed/update_icon()
+ if(blanket_type == SIDE)
+ icon_state = "picnic_sides" //8 directional icon
+ if(blanket_type == CENTER)
+ icon_state = "picnic_central" //Adding in case anything might call update_icon on center one. Just to be safe
+ . = ..()
+
+/obj/structure/picnic_blanket_deployed/examine(mob/user)
+ . = ..()
+ if(blanket_type == CENTER)
+ . += SPAN_NOTICE("This is the center of a folded out picnic blanket. You can use this to start packing it up!")
+ if(blanket_type == SIDE)
+ . += SPAN_NOTICE("This is one of the edges. Look for the center to start packing!")
+
+//For Mapping use only.
+//If player folds it back up, it reverts to normal type so the Initialize() won't cause issues
+//Should be added last to any maps made, to ensure it initializes after all other relevant objs.
+//Set unfoldable to TRUE if want to prevent players from picking it up
+/obj/structure/picnic_blanket_deployed/for_mapping_use
+ name = "RENAME ME"
+ var/unfoldable = FALSE
+
+
+/obj/structure/picnic_blanket_deployed/for_mapping_use/Initialize()
+ . = ..()
+ unfold()
+ if(unfoldable)
+ verbs -= /obj/structure/picnic_blanket_deployed/verb/fold_up
diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm
index 1a872e99ac..80c760c3f9 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 ee28f497b6..3fdba7eaa9 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 ccafe5fa63..6f9d0a0b15 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/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm
index ba7897ba93..77da648c64 100644
--- a/code/game/objects/items/weapons/storage/belt_vr.dm
+++ b/code/game/objects/items/weapons/storage/belt_vr.dm
@@ -151,4 +151,27 @@
/obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
/obj/item/weapon/pickaxe
+ )
+
+/obj/item/weapon/storage/belt/hydro
+ name = "hydroponics belt"
+ desc = "A belt used to hold most hydroponics supplies. Suprisingly, not green."
+ icon = 'icons/inventory/belt/item_vr.dmi'
+ icon_state = "plantbelt"
+ item_state = "plantbelt"
+ storage_slots = 5
+ max_w_class = ITEMSIZE_LARGE
+ max_storage_space = ITEMSIZE_COST_NORMAL * 5
+ can_hold = list(
+ /obj/item/device/analyzer/plant_analyzer,
+ /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+ /obj/item/weapon/shovel/spade,
+ /obj/item/weapon/tool/wirecutters,
+ /obj/item/weapon/material/minihoe,
+ /obj/item/weapon/material/knife/machete/hatchet,
+ /obj/item/weapon/reagent_containers/spray/plantbgone,
+ /obj/item/weapon/plantspray,
+ /obj/item/weapon/gun/energy/floragun,
+ /obj/item/seeds
)
\ 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 13a7d7ca3d..b18180c352 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 5799c5f2d9..7d687ca195 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/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm
index 260646f1ec..de3ae21488 100644
--- a/code/game/objects/items/weapons/surgery_tools.dm
+++ b/code/game/objects/items/weapons/surgery_tools.dm
@@ -1,18 +1,22 @@
/* Surgery Tools
* Contains:
+ * Bio-Regenerator
* Retractor
* Hemostat
* Cautery
* Surgical Drill
* Scalpel
- * Circular Saw
- * Bio-Regenerator
+ * Researchable Scalpels
+ * Circular Saws
+ * Misc Tools
+ * Cyborg Tools
+ * Alien Tools
*/
/obj/item/weapon/surgical
name = "Surgical tool"
desc = "This shouldn't be here, ahelp it."
- icon = 'icons/obj/surgery.dmi'
+ icon = 'icons/obj/surgery_vr.dmi'
w_class = ITEMSIZE_SMALL
drop_sound = 'sound/items/drop/weldingtool.ogg'
pickup_sound = 'sound/items/pickup/weldingtool.ogg'
@@ -29,7 +33,6 @@
/obj/item/weapon/surgical/bioregen
name="bioregenerator"
desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended."
- icon='icons/obj/surgery_vr.dmi'
icon_state="bioregen"
drop_sound = 'sound/items/drop/scrap.ogg'
@@ -110,27 +113,27 @@
/obj/item/weapon/surgical/scalpel/laser1
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved."
- icon_state = "scalpel_laser1_on"
+ icon_state = "scalpel_laser1"
damtype = "fire"
/obj/item/weapon/surgical/scalpel/laser2
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced."
- icon_state = "scalpel_laser2_on"
+ icon_state = "scalpel_laser2"
damtype = "fire"
force = 12.0
/obj/item/weapon/surgical/scalpel/laser3
name = "laser scalpel"
desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!"
- icon_state = "scalpel_laser3_on"
+ icon_state = "scalpel_laser3"
damtype = "fire"
force = 15.0
/obj/item/weapon/surgical/scalpel/manager
name = "incision management system"
desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps."
- icon_state = "scalpel_manager_on"
+ icon_state = "scalpel_manager"
force = 7.5
/obj/item/weapon/surgical/scalpel/ripper
@@ -143,12 +146,12 @@
origin_tech = list(TECH_MATERIAL = 5, TECH_BIO = 3, TECH_ILLEGAL = 2)
/*
- * Circular Saw
+ * Circular Saws
*/
/obj/item/weapon/surgical/circular_saw
name = "circular saw"
desc = "For heavy duty cutting."
- icon_state = "saw3"
+ icon_state = "saw"
hitsound = 'sound/weapons/circsawhit.ogg'
drop_sound = 'sound/items/drop/accessory.ogg'
force = 15.0
@@ -169,13 +172,15 @@
item_state = "saw3"
hitsound = 'sound/weapons/emitter2.ogg'
damtype = SEARING
- w_class = ITEMSIZE_LARGE
+ w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_BIO = 4, TECH_MATERIAL = 6, TECH_MAGNET = 6)
- matter = list(MAT_STEEL = 12500)
+ matter = list(MAT_STEEL = 25000,MAT_GLASS = 20000)
attack_verb = list("attacked", "slashed", "seared", "cut")
toolspeed = 0.75
-//misc, formerly from code/defines/weapons.dm
+/*
+ * Misc Tools
+ */
/obj/item/weapon/surgical/bonegel
name = "bone gel"
desc = "For fixing bones."
@@ -192,7 +197,7 @@
throwforce = 1.0
origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 3)
var/usage_amount = 10
- drop_sound = 'sound/items/drop/accessory.ogg'
+ drop_sound = 'sound/items/drop/bottle.ogg'
/obj/item/weapon/surgical/bonesetter
name = "bone setter"
@@ -215,24 +220,31 @@
throw_range = 5
attack_verb = list("attacked", "hit", "bludgeoned")
-// Cyborg Tools
-
+/*
+ * Cyborg Tools
+ */
/obj/item/weapon/surgical/retractor/cyborg
+ icon_state = "cyborg_retractor"
toolspeed = 0.5
/obj/item/weapon/surgical/hemostat/cyborg
+ icon_state = "cyborg_hemostat"
toolspeed = 0.5
/obj/item/weapon/surgical/cautery/cyborg
+ icon_state = "cyborg_cautery"
toolspeed = 0.5
/obj/item/weapon/surgical/surgicaldrill/cyborg
+ icon_state = "cyborg_drill"
toolspeed = 0.5
/obj/item/weapon/surgical/scalpel/cyborg
+ icon_state = "cyborg_scalpel"
toolspeed = 0.5
/obj/item/weapon/surgical/circular_saw/cyborg
+ icon_state = "cyborg_saw"
toolspeed = 0.5
/obj/item/weapon/surgical/bonegel/cyborg
@@ -242,13 +254,16 @@
toolspeed = 0.5
/obj/item/weapon/surgical/bonesetter/cyborg
+ icon_state = "cyborg_setter"
toolspeed = 0.5
/obj/item/weapon/surgical/bioregen/cyborg //VoreStation edit: let the borgs S U C C
+ icon_state = "cyborg_bioregen"
toolspeed = 0.5
-
-// Alien Tools
+/*
+ * Alien Tools
+ */
/obj/item/weapon/surgical/retractor/alien
icon = 'icons/obj/abductor.dmi'
toolspeed = 0.25
diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm
index 3f0ed8893c..8bb5bb465b 100644
--- a/code/game/objects/items/weapons/tanks/jetpack.dm
+++ b/code/game/objects/items/weapons/tanks/jetpack.dm
@@ -104,6 +104,16 @@
. = ..()
air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+/obj/item/weapon/tank/jetpack/breaker
+ name = "CSC industrial jetpack"
+ desc = "A JetFast EVA thruster pack. A warning label clearly states \'WARNING: CONTAINS VOLATILE REACTION MASS TOXIC TO MOST LIFEFORMS. NOT TO BE USED WITH CLOSED CYCLE BREATHING SYSTEMS.\'"
+ icon_state = "jetpack-breaker"
+ item_state_slots = list(slot_r_hand_str = "jetpack", slot_l_hand_str = "jetpack")
+
+/obj/item/weapon/tank/jetpack/breaker/Initialize()
+ . = ..()
+ air_contents.adjust_gas("volatile_fuel", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C))
+
/obj/item/weapon/tank/jetpack/carbondioxide
name = "jetpack (carbon dioxide)"
desc = "A tank of compressed carbon dioxide for use as propulsion in zero-gravity areas. Painted black to indicate that it should not be used as a source for internals."
diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm
index a6bc8c7d34..56366d7cdd 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 3075c40415..732d614601 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/random/misc.dm b/code/game/objects/random/misc.dm
index 74dd4664b2..2e4b1ef269 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -276,6 +276,7 @@
/obj/random/cash/item_to_spawn()
return pick(prob(320);/obj/random/maintenance/clean,
prob(12);/obj/item/weapon/spacecash/c1,
+ prob(10);/obj/item/weapon/spacecash/c5,
prob(8);/obj/item/weapon/spacecash/c10,
prob(4);/obj/item/weapon/spacecash/c20,
prob(1);/obj/item/weapon/spacecash/c50,
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 0bc98ba341..7b119c8364 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 5f43668a55..9e550d6e53 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/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index af7092d9d6..5eec312418 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -10,13 +10,15 @@
/obj/item/device/analyzer/plant_analyzer,
/obj/item/device/radio/headset/headset_service,
/obj/item/clothing/head/greenbandana,
+ /obj/item/weapon/shovel/spade,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/material/knife/machete/hatchet,
/obj/item/weapon/reagent_containers/glass/beaker = 2,
/obj/item/weapon/tool/wirecutters/clippers/trimmers,
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro,
- /obj/item/clothing/shoes/boots/winter/hydro)
+ /obj/item/clothing/shoes/boots/winter/hydro,
+ /obj/item/weapon/storage/belt/hydro)
/obj/structure/closet/secure_closet/hydroponics/Initialize()
if(prob(50))
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 0a0065742b..a1c901d85b 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -136,6 +136,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 890a55deab..81f2911baa 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 0c43b37e09..5bf67d8eb3 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 b4b2d50f6b..7f417cce5b 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 7774afe5a9..2f4f5a22d1 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -476,6 +476,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/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index 87b91e8469..0100167a05 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -190,6 +190,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/clothing/under/harness,
/obj/item/clothing/accessory/storage/webbing,
/obj/item/weapon/spacecash/c1,
+ /obj/item/weapon/spacecash/c5,
/obj/item/weapon/spacecash/c10,
/obj/item/weapon/spacecash/c20,
/obj/item/weapon/camera_assembly,
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 48ddc2b13c..17f91016e8 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -243,6 +243,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/ai/ai_holder_targeting.dm b/code/modules/ai/ai_holder_targeting.dm
index 63424e4b9a..ef301ccf71 100644
--- a/code/modules/ai/ai_holder_targeting.dm
+++ b/code/modules/ai/ai_holder_targeting.dm
@@ -22,6 +22,8 @@
// This uses strings and not refs to allow for disguises, and to avoid needing to use weakrefs.
var/destructive = FALSE // Will target 'neutral' structures/objects and not just 'hostile' ones.
+ var/forgive_resting = TRUE //VOREStation add - If TRUE on a RETALIATE mob, then mob will drop target if it becomes hostile to you but hasn't taken damage
+
// A lot of this is based off of /TG/'s AI code.
// Step 1, find out what we can see.
@@ -140,6 +142,14 @@
//VOREStation Add End
else
return FALSE
+ //VOREStation add start
+ else if(forgive_resting && !isbelly(holder.loc)) //Doing it this way so we only think about the other conditions if the var is actually set
+ if((holder.health == holder.maxHealth) && !hostile && (L.resting || L.weakened || L.stunned)) //If our health is full, no one is fighting us, we can forgive
+ var/mob/living/simple_mob/vore/eater = holder
+ if(!eater.will_eat(L)) //We forgive people we can eat by eating them
+ set_stance(STANCE_IDLE)
+ return FALSE //Forgiven
+ //VOREStation add end
if(holder.IIsAlly(L))
return FALSE
return TRUE
diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm
index 7afc90d082..c700e2ba93 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 163ed97bb7..4479f4fd2c 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
@@ -877,13 +883,13 @@
path = /obj/item/clothing/under/fluff/foxoflightsuit/
display_name = "padded flightsuit"
ckeywhitelist = list("pandora029")
- character_name = list("Seona Young")
+ character_name = list("Shona Young")
/datum/gear/fluff/seona_big_plushie
path = /obj/item/toy/plushie/fluff/seona_mofuorb
display_name = "comically oversized fox plushie"
ckeywhitelist = list("pandora029")
- character_name = list("Seona Young")
+ character_name = list("Shona Young")
/datum/gear/fluff/lily_medal
path = /obj/item/clothing/accessory/medal/silver/unity
diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
index 378b2caedf..5ef54a4beb 100644
--- a/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
@@ -35,4 +35,12 @@
/datum/gear/shoes/flats/alt
display_name = "flats, alt"
- path = /obj/item/clothing/shoes/flats/white/color/alt
\ No newline at end of file
+ path = /obj/item/clothing/shoes/flats/white/color/alt
+
+/datum/gear/shoes/sandals_elegant
+ display_name = "sandals, elegant"
+ path = /obj/item/clothing/shoes/sandals_elegant
+
+/datum/gear/shoes/sandals_elegant/New()
+ ..()
+ gear_tweaks += gear_tweak_free_color_choice
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index ec161301ea..f3057a522c 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -315,6 +315,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 0000000000..28ca463500
--- /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 72f2163d84..e8190ec550 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 05d1fd8aa9..2487b7b205 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 0000000000..bfc675c5eb
--- /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 c3bdad4e4e..bbf0809bc4 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/miscellaneous_vr.dm b/code/modules/clothing/shoes/miscellaneous_vr.dm
index f7cd8bd097..b2f714f5d8 100644
--- a/code/modules/clothing/shoes/miscellaneous_vr.dm
+++ b/code/modules/clothing/shoes/miscellaneous_vr.dm
@@ -105,4 +105,13 @@
icon = 'icons/inventory/feet/item_vr.dmi'
icon_override = 'icons/inventory/feet/mob_vr.dmi'
icon_state = "flatsalt"
- item_state = "flatsalt"
\ No newline at end of file
+ item_state = "flatsalt"
+
+/obj/item/clothing/shoes/sandals_elegant
+ name = "elegant sandals"
+ desc = "A pair of sandals with thin straps. It emphasizes the ankles!"
+ icon_state = "sandals_elegant"
+ item_state = "sandals_elegant"
+ icon = 'icons/inventory/feet/item_vr.dmi'
+ icon_override = 'icons/inventory/feet/mob_vr.dmi'
+ addblends = "sandals_elegant_a"
diff --git a/code/modules/clothing/shoes/neoshoes.dm b/code/modules/clothing/shoes/neoshoes.dm
new file mode 100644
index 0000000000..1174827930
--- /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/spacesuits/void/event_vr.dm b/code/modules/clothing/spacesuits/void/event_vr.dm
index ca48bfcfe1..f543aa48c6 100644
--- a/code/modules/clothing/spacesuits/void/event_vr.dm
+++ b/code/modules/clothing/spacesuits/void/event_vr.dm
@@ -258,3 +258,32 @@
species_restricted = list(SPECIES_ALTEVIAN)
no_cycle = TRUE
+
+/obj/item/clothing/suit/space/void/salvagecorp_shipbreaker
+ name = "\improper CSC industrial voidsuit"
+ desc = "A heavy-duty Kirillov-Y771 voidsuit intended for use in hazardous shipbreaking, salvage, and industrial operations, manufactured (or more likely refurbished) by the Coyote Salvage Corporation. It's slow and awkward if used outside of microgravity, but it offers good protection for what is technically a civilian-legal voidsuit."
+
+ icon = 'icons/inventory/suit/item_vr.dmi'
+ default_worn_icon = 'icons/inventory/suit/mob_vr.dmi'
+ icon_state = "breaker_suit"
+
+ armor = list("melee" = 50, "bullet" = 15, "laser" = 15, "energy" = 25, "bomb" = 45, "bio" = 100, "rad" = 80)
+ slowdown = 1.5
+ breach_threshold = 14
+ allowed = list(/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+
+ sprite_sheets = ALL_VR_SPRITE_SHEETS_SUIT_MOB
+ sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_SUIT_ITEM
+
+/obj/item/clothing/head/helmet/space/void/salvagecorp_shipbreaker
+ name = "\improper CSC industrial voidsuit helmet"
+ desc = "A dome/bubble style helmet for use with the Kirillov-Y771 voidsuit. It offers surprisingly good protection and visibility, though wearers are still advised to avoid face-on collisions. Sadly, this one doesn't seem to have the (in)famous 0PTIK3WL cross-spectrum imaging visor installed..."
+
+ icon = 'icons/inventory/head/item_vr.dmi'
+ default_worn_icon = 'icons/inventory/head/mob_vr.dmi'
+ icon_state = "breaker_helmet"
+
+ armor = list("melee" = 50, "bullet" = 15, "laser" = 15, "energy" = 25, "bomb" = 45, "bio" = 100, "rad" = 80)
+
+ sprite_sheets = ALL_VR_SPRITE_SHEETS_HEAD_MOB
+ sprite_sheets_obj = ALL_VR_SPRITE_SHEETS_HEAD_ITEM
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index 663fe1b3d8..57a713962c 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -32,7 +32,7 @@
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
min_pressure_protection = 0 * ONE_ATMOSPHERE
max_pressure_protection = 10 * ONE_ATMOSPHERE
-
+ action_button_name = "Toggle Helmet"
species_restricted = list("Human", SPECIES_SKRELL, "Promethean")
sprite_sheets = VR_SPECIES_SPRITE_SHEETS_SUIT_MOB
sprite_sheets_obj = VR_SPECIES_SPRITE_SHEETS_SUIT_ITEM
@@ -47,12 +47,23 @@
var/obj/item/clothing/head/helmet/helmet = null // Deployable helmet, if any.
var/obj/item/weapon/tank/tank = null // Deployable tank, if any.
var/obj/item/device/suit_cooling_unit/cooler = null// Cooling unit, for FBPs. Cannot be installed alongside a tank.
-
+
//Cycler settings
var/no_cycle = FALSE //stop this item from being put in a cycler
+//Does it spawn with any Inbuilt devices?
+/obj/item/clothing/suit/space/void/Initialize()
+ . = ..()
+ if(boots && ispath(boots))
+ boots = new boots(src)
+ if(helmet && ispath(helmet))
+ helmet = new helmet(src)
+ if(tank && ispath(tank))
+ tank = new tank(src)
+
/obj/item/clothing/suit/space/void/examine(user)
. = ..()
+ . += to_chat(usr, "Alt-click to relase Tank/Cooling unit if installed.")
for(var/obj/item/I in list(helmet,boots,tank,cooler))
. += "It has \a [I] installed."
if(tank && in_range(src,user))
@@ -145,13 +156,18 @@
helmet.set_light_flags(helmet.light_flags & ~LIGHT_ATTACHED)
helmet = null
-/obj/item/clothing/suit/space/void/verb/toggle_helmet()
+/obj/item/clothing/suit/space/void/ui_action_click(mob/living/user, action_name)
+ if(..())
+ return TRUE
+ toggle_helmet()
+/obj/item/clothing/suit/space/void/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
set src in usr
- if(!istype(src.loc,/mob/living)) return
+ if(!isliving(loc))
+ return
if(!helmet)
to_chat(usr, "There is no helmet installed.")
@@ -159,44 +175,45 @@
var/mob/living/carbon/human/H = usr
- if(!istype(H))
- return
- if(H.stat)
- return
- if(H.wear_suit != src)
- return
+ if(!istype(H)) return
+ if(H.stat) return
+ if(H.wear_suit != src) return
+
+ if(helmet.light_on)
+ to_chat(H, SPAN_NOTICE("The helmet light shuts off as it retracts."))
+ helmet.update_flashlight(H)
if(H.head == helmet)
- to_chat(H, "You retract your suit helmet.")
+ to_chat(H, SPAN_NOTICE("You retract your suit helmet."))
helmet.canremove = TRUE
H.drop_from_inventory(helmet)
helmet.forceMove(src)
+ playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
else
if(H.head)
- to_chat(H, "You cannot deploy your helmet while wearing \the [H.head].")
+ to_chat(H, SPAN_DANGER("You cannot deploy your helmet while wearing \the [H.head]."))
return
if(H.equip_to_slot_if_possible(helmet, slot_head))
- helmet.pickup(H)
helmet.canremove = FALSE
to_chat(H, "You deploy your suit helmet, sealing you off from the world.")
-
- if(helmet.light_system == STATIC_LIGHT)
- helmet.update_light()
+ playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
+
+/obj/item/clothing/suit/space/void/AltClick(mob/living/user)
+ eject_tank()
/obj/item/clothing/suit/space/void/verb/eject_tank()
-
set name = "Eject Voidsuit Tank/Cooler"
set category = "Object"
set src in usr
if(!istype(src.loc,/mob/living)) return
- if(!tank && !cooler)
- to_chat(usr, "There is no tank or cooling unit inserted.")
- return
-
var/mob/living/carbon/human/H = usr
+ if(!tank && !cooler)
+ to_chat(H, SPAN_NOTICE("There is no tank or cooling unit inserted."))
+ return
+
if(!istype(H)) return
if(H.stat) return
if(H.wear_suit != src) return
@@ -208,7 +225,8 @@
else
removing = cooler
cooler = null
- to_chat(H, "You press the emergency release, ejecting \the [removing] from your suit.")
+ to_chat(H, SPAN_DANGER("You press the emergency release, ejecting \the [removing] from your suit."))
+ playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
removing.canremove = TRUE
H.drop_from_inventory(removing)
diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm
index e86cc5d1b0..7024d26e0c 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 0000000000..5f70441870
--- /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 868f0592bb..93bed0c9a1 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -617,3 +617,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 a49a604b0b..a001d5aa7c 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 ce928bffa1..cd2a74b435 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 0000000000..59a939987e
--- /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 82386c9769..228c22b095 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/cash.dm b/code/modules/economy/cash.dm
index e5a539f5e8..7b2d31a391 100644
--- a/code/modules/economy/cash.dm
+++ b/code/modules/economy/cash.dm
@@ -3,7 +3,7 @@
var/initial_name = "Thaler"
desc = "It's worth 0 Thalers."
gender = PLURAL
- icon = 'icons/obj/items.dmi'
+ icon = 'icons/obj/economy.dmi'
icon_state = "spacecash1"
opacity = 0
density = FALSE
@@ -38,24 +38,24 @@
/obj/item/weapon/spacecash/update_icon()
cut_overlays()
name = "[worth] [initial_name]\s"
- if(worth in list(1000,500,200,100,50,20,10,1))
+ if(worth in list(1000,500,200,100,50,20,10,5,1))
icon_state = "spacecash[worth]"
desc = "It's worth [worth] [initial_name]s."
return
var/sum = src.worth
var/num = 0
- for(var/i in list(1000,500,200,100,50,20,10,1))
+ for(var/i in list(1000,500,200,100,50,20,10,5,1))
while(sum >= i && num < 50)
sum -= i
num++
- var/image/banknote = image('icons/obj/items.dmi', "spacecash[i]")
+ var/image/banknote = image('icons/obj/economy.dmi', "spacecash[i]")
var/matrix/M = matrix()
M.Translate(rand(-6, 6), rand(-4, 8))
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
banknote.transform = M
add_overlay(banknote)
if(num == 0) // Less than one thaler, let's just make it look like 1 for ease
- var/image/banknote = image('icons/obj/items.dmi', "spacecash1")
+ var/image/banknote = image('icons/obj/economy.dmi', "spacecash1")
var/matrix/M = matrix()
M.Translate(rand(-6, 6), rand(-4, 8))
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
@@ -96,9 +96,15 @@
/obj/item/weapon/spacecash/c1
name = "1 Thaler"
icon_state = "spacecash1"
- desc = "It's worth 1 credit."
+ desc = "It's worth 1 Thaler."
worth = 1
+/obj/item/weapon/spacecash/c5
+ name = "5 Thaler"
+ icon_state = "spacecash5"
+ desc = "It's worth 5 Thalers."
+ worth = 5
+
/obj/item/weapon/spacecash/c10
name = "10 Thaler"
icon_state = "spacecash10"
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index 213e01305b..0471788413 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"
@@ -1189,11 +1189,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
@@ -1215,6 +1217,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,
@@ -1241,6 +1267,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,
@@ -1269,6 +1297,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,
@@ -1294,6 +1339,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,
@@ -1313,6 +1362,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
@@ -1330,6 +1381,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.
@@ -1356,6 +1409,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,
@@ -1378,6 +1437,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
)
@@ -1428,6 +1491,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
@@ -1448,6 +1515,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
)
@@ -1466,6 +1535,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
@@ -1484,6 +1556,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,
@@ -1520,6 +1605,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,
@@ -1547,6 +1635,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,
@@ -1567,6 +1657,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 f559176722..73dcab7895 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"
@@ -1149,6 +1166,7 @@
/obj/item/weapon/storage/pill_bottle/dice = 5,
/obj/item/weapon/storage/pill_bottle/dice_nerd = 5,
/obj/item/weapon/melee/umbrella/random = 10,
+ /obj/item/weapon/picnic_blankets_carried = 10,
/obj/item/weapon/deck/schnapsen = 5,
/obj/item/weapon/deck/egy = 5)
prices = list(/obj/item/weapon/cane = 100,
@@ -1162,6 +1180,7 @@
/obj/item/weapon/storage/pill_bottle/dice = 100,
/obj/item/weapon/storage/pill_bottle/dice_nerd = 100,
/obj/item/weapon/melee/umbrella/random = 100,
+ /obj/item/weapon/picnic_blankets_carried = 100,
/obj/item/weapon/deck/schnapsen = 100,
/obj/item/weapon/deck/egy = 100)
premium = list(/obj/item/toy/bosunwhistle = 1)
diff --git a/code/modules/fishing/fishing.dm b/code/modules/fishing/fishing.dm
index 802faf2d6b..4b77912ef8 100644
--- a/code/modules/fishing/fishing.dm
+++ b/code/modules/fishing/fishing.dm
@@ -35,7 +35,8 @@ GLOBAL_LIST_INIT(generic_fishing_pool_list, list(
/obj/random/junk = 80,
/obj/random/trash = 80,
/obj/item/weapon/spacecash/c1 = 10,
- /obj/item/weapon/spacecash/c10 = 5,
+ /obj/item/weapon/spacecash/c5 = 3,
+ /obj/item/weapon/spacecash/c10 = 2,
/obj/item/weapon/spacecash/c100 = 1
))
diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm
index c55cf89469..ff5768559d 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 2e31edf34c..721f5040da 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 b174906816..f7a5ea9bb5 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 0000000000..eaab3c635b
--- /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 93afa67b19..8d0485cd19 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 a929c8eda8..c683bf9a60 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 8863448ca5..222cd4f52a 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/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm
index cf8fd8d581..6d6693aca5 100644
--- a/code/modules/hydroponics/trays/tray_tools.dm
+++ b/code/modules/hydroponics/trays/tray_tools.dm
@@ -3,6 +3,8 @@
/obj/item/weapon/tool/wirecutters/clippers
name = "plant clippers"
desc = "A tool used to take samples from plants."
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "clippers"
/obj/item/weapon/tool/wirecutters/clippers/trimmers
name = "hedgetrimmers"
diff --git a/code/modules/mining/abandonedcrates_vr.dm b/code/modules/mining/abandonedcrates_vr.dm
index cd6113f505..166c5d05ed 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 7b3b1f5cce..49962ef351 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 ddaf32787c..94e0d2f47c 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 9877992b53..d51860b815 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
@@ -148,6 +148,16 @@ YW change end */
/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)
@@ -160,6 +170,15 @@ YW change end */
/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 0de5ae3097..6239f89428 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 0000000000..05aff46d1f
--- /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/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 7ac301e895..eeb8accba9 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -264,12 +264,14 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
head.eye_icon = initial(headtypepath.eye_icon)
head.eye_icon_location = initial(headtypepath.eye_icon_location)
icon_key += "[head.eye_icon]"
+ var/wholeicontransparent = TRUE
for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = organs_by_name[organ_tag]
if(isnull(part) || part.is_stump() || part.is_hidden_by_sprite_accessory()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
icon_key += "0"
continue
if(part)
+ wholeicontransparent &&= part.transparent //VORESTATION EDIT: transparent instead of nonsolid
icon_key += "[part.species.get_race_key(part.owner)]"
icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
icon_key += "[part.s_tone]"
@@ -315,7 +317,10 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
else
//BEGIN CACHED ICON GENERATION.
var/obj/item/organ/external/chest = get_organ(BP_TORSO)
- base_icon = chest.get_icon()
+ base_icon = chest.get_icon(skeleton, !wholeicontransparent)
+
+ var/apply_extra_transparency_leg = organs_by_name[BP_L_LEG] && organs_by_name[BP_R_LEG]
+ var/apply_extra_transparency_foot = organs_by_name[BP_L_FOOT] && organs_by_name[BP_R_FOOT]
var/icon/Cutter = null
@@ -331,9 +336,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
Cutter.Blend("#000000", ICON_MULTIPLY) // Black again.
for(var/obj/item/organ/external/part in organs)
- if(isnull(part) || part.is_stump() || part.is_hidden_by_sprite_accessory()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
+ if(isnull(part) || part.is_stump() || part == chest || part.is_hidden_by_sprite_accessory()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff.
continue
- var/icon/temp = part.get_icon(skeleton)
+ var/icon/temp = part.get_icon(skeleton, !wholeicontransparent)
if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter)
temp.Blend(Cutter, ICON_AND, x = -16)
@@ -349,16 +354,26 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(!(part.icon_position & RIGHT))
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
base_icon.Blend(temp2, ICON_OVERLAY)
+ temp2.Insert(temp2,"blank",dir=NORTH) //faaaaairly certain this is more efficient than reloading temp2, doing this so we don't blend the icons twice (it matters more in transparent limbs)
+ temp2.Insert(temp2,"blank",dir=SOUTH)
+ temp2.Insert(temp2,"blank",dir=EAST)
+ temp2.Insert(temp2,"blank",dir=WEST)
if(part.icon_position & LEFT)
temp2.Insert(new/icon(temp,dir=EAST),dir=EAST)
if(part.icon_position & RIGHT)
temp2.Insert(new/icon(temp,dir=WEST),dir=WEST)
+ if (part.transparent && !wholeicontransparent) //apply a little (a lot) extra transparency to make it look better //VORESTATION EDIT: transparent instead of nonsolid
+ if ((istype(part, /obj/item/organ/external/leg) && apply_extra_transparency_leg) || (istype(part, /obj/item/organ/external/foot) && apply_extra_transparency_foot)) //maybe
+ temp2 += rgb(,,,30)
base_icon.Blend(temp2, ICON_UNDERLAY)
else if(part.icon_position & UNDER)
base_icon.Blend(temp, ICON_UNDERLAY)
else
base_icon.Blend(temp, ICON_OVERLAY)
+ if (wholeicontransparent) //because, I mean. It's basically never gonna happen that you'll have just one non-transparent limb but if you do your icon will look meh. Still good but meh, will have some areas with higher transparencies unless you're literally just a torso and a head
+ base_icon += rgb(,,,180)
+
if(!skeleton)
if(husk)
base_icon.ColorTone(husk_color_mod)
@@ -384,7 +399,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
update_tail_showing()
update_wing_showing()
-
/mob/living/carbon/human/proc/update_skin()
if(QDESTROYING(src))
return
@@ -493,10 +507,13 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
face_standing.Blend(hair_s, ICON_OVERLAY)
- if(head_organ.transparent) //VOREStation Edit: Prometheans are not ALWAYS transparent
- face_standing += rgb(,,,120)
-
var/icon/ears_s = get_ears_overlay()
+
+ if(head_organ.transparent) //VORESTATION EDIT: transparent instead of nonsolid
+ face_standing += rgb(,,,120)
+ if (ears_s)
+ ears_s += rgb(,,,180)
+
var/image/em_block_ears
if(ears_s)
if(ears_s.Height() > face_standing.Height()) // Tol ears
@@ -563,6 +580,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
// Convert to emissive at some point
+ if (head_organ.transparent) //VOREStation Edit: transparent instead of nonsolid
+ eyes_icon += rgb(,,,180)
+
var/image/eyes_image = image(eyes_icon)
eyes_image.plane = PLANE_LIGHTING_ABOVE
eyes_image.appearance_flags = appearance_flags
@@ -987,9 +1007,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_alt && tail_layer == TAIL_UPPER_LAYER)
tail_layer = TAIL_UPPER_LAYER_ALT
+ var/obj/item/organ/external/chest = organs_by_name[BP_TORSO]
+
var/image/tail_image = get_tail_image()
if(tail_image)
tail_image.layer = BODY_LAYER+tail_layer
+ tail_image.alpha = chest?.transparent ? 180 : 255 //VORESTATION EDIT: transparent instead of nonsolid
overlays_standing[tail_layer] = tail_image
apply_layer(tail_layer)
return
@@ -999,7 +1022,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//This one is actually not that bad I guess.
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
var/icon/tail_s = get_tail_icon()
- overlays_standing[tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+tail_layer)
+ tail_image = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+tail_layer)
+ tail_image.alpha = chest?.transparent ? 180 : 255 //VORESTATION EDIT: transparent instead of nonsolid
+ overlays_standing[tail_layer] = tail_image
animate_tail_reset()
//TODO: Is this the appropriate place for this, and not on species...?
@@ -1102,8 +1127,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
remove_layer(WING_LOWER_LAYER)
var/image/wing_image = get_wing_image(FALSE)
+
+ var/obj/item/organ/external/chest = organs_by_name[BP_TORSO]
+
if(wing_image)
wing_image.layer = BODY_LAYER+WING_LAYER
+ wing_image.alpha = chest?.transparent ? 180 : 255 //VORESTATION EDIT: transparent instead of nonsolid
overlays_standing[WING_LAYER] = wing_image
if(wing_style && wing_style.multi_dir)
wing_image = get_wing_image(TRUE)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
index 4c0a2f8be7..d3d3ba0ce6 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm
@@ -350,7 +350,8 @@
sprites = list(
"Traumahound" = "traumavale",
"Drake" = "draketrauma",
- "Borgi" = "borgi-trauma"
+ "Borgi" = "borgi-trauma",
+ "Raptor V-4" = "traumaraptor"
)
/obj/item/weapon/robot_module/robot/medical/traumahound/New(var/mob/living/silicon/robot/R)
@@ -483,7 +484,8 @@
"Janihound model V-2" = "J9",
"Borgi" = "borgi-jani",
"Otieborg" = "otiej",
- "Drake" = "drakejanit"
+ "Drake" = "drakejanit",
+ "Raptor V-4" = "janiraptor"
)
can_be_pushed = 0
@@ -654,7 +656,8 @@
"V2 Engidog" = "thottbot",
"EngiHound" = "engihound",
"EngiHoundDark" = "engihounddark",
- "Drake" = "drakeeng"
+ "Drake" = "drakeeng",
+ "Raptor V-4" = "engiraptor"
)
can_be_pushed = 0
@@ -874,7 +877,9 @@
"Pinkhound" = "k69",
"ServicehoundV2" = "serve2",
"ServicehoundV2 Darkmode" = "servedark",
- "Drake" = "drakemine"
+ "Drake" = "drakemine",
+ "Raptor V-4" = "serviraptor",
+ "Raptor V-4000" = "fancyraptor"
)
can_be_pushed = 0
@@ -948,7 +953,8 @@
"KMine" = "kmine",
"CargoHound" = "cargohound",
"CargoHoundDark" = "cargohounddark",
- "Drake" = "drakemine"
+ "Drake" = "drakemine",
+ "Raptor V-4" = "mineraptor"
)
can_be_pushed = 0
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 577438cb58..50223021d7 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -140,7 +140,7 @@
if(wideborg == TRUE)
if(icontype == "Drake") // Why, Why can't we have normal nice things
icon = 'icons/mob/drakeborg/drakeborg_vr.dmi'
- else if(icontype == "Raptor V-4") //Added for raptor sprites
+ else if(icontype == "Raptor V-4" || icontype == "Raptor V-4000") //Added for raptor sprites
icon = 'icons/mob/raptorborg/raptor.dmi'
/*YW EDIT
else
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 ca99f6ec32..fb761a167b 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 15141bc6b1..168908ee34 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 85bb90c1cb..08c0d4e015 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 8e3e3f7c12..bc29290da6 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 aba84d495b..94db4dee96 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/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index e67cc567c4..f008b6f0f9 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -79,7 +79,7 @@ var/global/list/limb_icon_cache = list()
return res
-/obj/item/organ/external/proc/get_icon(var/skeletal)
+/obj/item/organ/external/proc/get_icon(var/skeletal, var/can_apply_transparency = TRUE)
for(var/M in markings)
var/datum/sprite_accessory/marking/mark = markings[M]["datum"]
@@ -107,6 +107,8 @@ var/global/list/limb_icon_cache = list()
if(owner && owner.gender == FEMALE)
gender = "f"
+ var/should_apply_transparency = FALSE
+
if(!force_icon_key)
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
else
@@ -131,9 +133,11 @@ var/global/list/limb_icon_cache = list()
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else if (robotic >= ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
+ should_apply_transparency = TRUE
apply_colouration(mob_icon)
else
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
+ should_apply_transparency = TRUE
apply_colouration(mob_icon)
//Body markings, actually does not include head this time. Done separately above.
@@ -165,6 +169,7 @@ var/global/list/limb_icon_cache = list()
if(model)
icon_cache_key += "_model_[model]"
+ should_apply_transparency = TRUE
apply_colouration(mob_icon)
if(owner && owner.synth_markings)
for(var/M in markings)
@@ -184,6 +189,9 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit ends here
+ if (transparent && !istype(src,/obj/item/organ/external/head) && can_apply_transparency && should_apply_transparency) //VORESTATION EDIT: transparent instead of nonsolid
+ mob_icon += rgb(,,,180) //do it here so any markings become transparent as well
+
dir = EAST
icon = mob_icon
return mob_icon
@@ -218,9 +226,6 @@ var/global/list/limb_icon_cache = list()
icon_cache_key += "_color_[s_col[1]]_[s_col[2]]_[s_col[3]]_[ICON_ADD]"
//VOREStation Edit End
- // Translucency.
- if(transparent) applying += rgb(,,,180) // SO INTUITIVE TY BYOND //VOREStation Edit
-
return applying
/obj/item/organ/external/var/icon_cache_key
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
index 7567aad0ca..c819920610 100644
--- a/code/modules/organs/subtypes/standard.dm
+++ b/code/modules/organs/subtypes/standard.dm
@@ -339,7 +339,7 @@
"You make \the [I] kiss \the [src]!.")
return ..()
-/obj/item/organ/external/head/get_icon()
+/obj/item/organ/external/head/get_icon(var/skeletal, var/can_apply_transparency = TRUE)
..()
//The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item
@@ -400,6 +400,9 @@
add_overlay(get_hair_icon())
+ if (transparent && can_apply_transparency) //VOREStation Edit: transparent instead of nonsolid
+ mob_icon += rgb(,,,180) //do it here so any markings become transparent as well
+
return mob_icon
/obj/item/organ/external/head/skrell
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index b600bb8ce0..5fa957d0a1 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -281,4 +281,4 @@
/obj/item/ammo_magazine/ammo_box/examine(mob/user)
. = ..()
- . += to_chat(usr, "Alt-click to extract contents")
\ No newline at end of file
+ . += to_chat(usr, "Alt-click to extract contents.")
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 0cc7147e1f..6ead13c300 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -80,6 +80,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 cf68420045..49d53b2bab 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 92ca4535fc..4769aef999 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/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 9e4fb5f4cd..797e7c701d 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -297,7 +297,7 @@
- var/syringestab_amount_transferred = rand(0, (reagents.total_volume - 5)) //nerfed by popular demand
+ var/syringestab_amount_transferred = rand(max(reagents.total_volume - 10, 0), (reagents.total_volume - 5)) //nerfed by popular demand
var/contained = reagents.get_reagents()
var/trans = reagents.trans_to_mob(target, syringestab_amount_transferred, CHEM_BLOOD)
if(isnull(trans)) trans = 0
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index eea8568773..b25f838256 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 cfd8db1368..88e7c90a0f 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 0000000000..68c8afe350
--- /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 5a66efc090..ab80a41bd5 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 7009f6f884..bfa877bc09 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 3091578544..9095d04350 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 6bc0c7ec03..7213a99be7 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 c2fbd0b6b0..e16159c5e5 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 1441987453..3d0913cf82 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 93ba1df55f..2fe058f3e0 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 0981b5d6ec..9d742a4ab0 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 8164d5f9ce..845459e071 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 92274cc1f2..042ca7264c 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 1185b51647..49f6d0097a 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 56b789e3c0..452d0f649b 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 bdfe690dba..f20bb1b71f 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 9712090b5d..dc7f93d2ee 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 109fd6ae44..064b1b0ce6 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 a589a4b64d..3e7d84e262 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 74d16a2e33..39835cc8c7 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
*/
/**
@@ -38,6 +37,8 @@
var/datum/tgui_state/state = null
/// Rate limit client refreshes to prevent DoS.
COOLDOWN_DECLARE(refresh_cooldown)
+ /// Are byond mouse events beyond the window passed in to the ui
+ var/mouse_hooked = FALSE
/// The map z-level to display.
var/map_z_level = 1
/// The Parent UI
@@ -109,6 +110,8 @@
window.send_message("update", get_payload(
with_data = TRUE,
with_static_data = TRUE))
+ if(mouse_hooked)
+ window.set_mouse_macro()
SStgui.on_open(src)
/**
@@ -148,6 +151,17 @@
/datum/tgui/proc/set_autoupdate(autoupdate)
src.autoupdate = autoupdate
+/**
+ * public
+ *
+ * Enable/disable passing through byond mouse events to the window
+ *
+ * required value bool Enable/disable hooking.
+ */
+/datum/tgui/proc/set_mouse_hook(value)
+ src.mouse_hooked = value
+ //Handle unhooking/hooking on already open windows ?
+
/**
* public
*
@@ -329,7 +343,7 @@
if(initialized)
send_full_update()
initialized = TRUE
- if("pingReply")
+ if("ping/reply")
initialized = TRUE
if("suspend")
close(can_be_suspended = TRUE)
diff --git a/code/modules/tgui/tgui_window.dm b/code/modules/tgui/tgui_window.dm
index 43e4204127..180e18a518 100644
--- a/code/modules/tgui/tgui_window.dm
+++ b/code/modules/tgui/tgui_window.dm
@@ -24,6 +24,7 @@
var/initial_inline_html
var/initial_inline_js
var/initial_inline_css
+ var/mouse_event_macro_set = FALSE
/**
* public
@@ -215,6 +216,8 @@
/datum/tgui_window/proc/close(can_be_suspended = TRUE, logout = FALSE)
if(!client)
return
+ if(mouse_event_macro_set)
+ remove_mouse_macro()
if(can_be_suspended && can_be_suspended())
#ifdef TGUI_DEBUGGING
log_tgui(client, "[id]/close: suspending")
@@ -364,7 +367,7 @@
// If not locked, handle these message types
switch(type)
if("ping")
- send_message("pingReply", payload)
+ send_message("ping/reply", payload)
if("suspend")
close(can_be_suspended = TRUE)
if("close")
@@ -377,3 +380,44 @@
// Resend the assets
for(var/asset in sent_assets)
send_asset(asset)
+
+/datum/tgui_window/vv_edit_var(var_name, var_value)
+ return var_name != NAMEOF(src, id) && ..()
+
+
+/datum/tgui_window/proc/set_mouse_macro()
+ if(mouse_event_macro_set)
+ return
+
+ var/list/byondToTguiEventMap = list(
+ "MouseDown" = "byond/mousedown",
+ "MouseUp" = "byond/mouseup"
+ )
+
+ for(var/mouseMacro in byondToTguiEventMap)
+ var/command_template = ".output CONTROL PAYLOAD"
+ var/event_message = TGUI_CREATE_MESSAGE(byondToTguiEventMap[mouseMacro], null)
+ var target_control = is_browser \
+ ? "[id]:update" \
+ : "[id].browser:update"
+ var/with_id = replacetext(command_template, "CONTROL", target_control)
+ var/full_command = replacetext(with_id, "PAYLOAD", event_message)
+
+ var/list/params = list()
+ params["parent"] = "default" //Technically this is external to tgui but whatever
+ params["name"] = mouseMacro
+ params["command"] = full_command
+
+ winset(client, "[mouseMacro]Window[id]Macro", params)
+ mouse_event_macro_set = TRUE
+
+/datum/tgui_window/proc/remove_mouse_macro()
+ if(!mouse_event_macro_set)
+ stack_trace("Unsetting mouse macro on tgui window that has none")
+ var/list/byondToTguiEventMap = list(
+ "MouseDown" = "byond/mousedown",
+ "MouseUp" = "byond/mouseup"
+ )
+ for(var/mouseMacro in byondToTguiEventMap)
+ winset(client, null, "[mouseMacro]Window[id]Macro.parent=null")
+ mouse_event_macro_set = FALSE
diff --git a/code/modules/tgui_input/checkboxes.dm b/code/modules/tgui_input/checkboxes.dm
new file mode 100644
index 0000000000..0b1d653955
--- /dev/null
+++ b/code/modules/tgui_input/checkboxes.dm
@@ -0,0 +1,136 @@
+/**
+ * ### tgui_input_checkbox
+ * Opens a window with a list of checkboxes and returns a list of selected choices.
+ *
+ * user - The mob to display the window to
+ * message - The message inside the window
+ * title - The title of the window
+ * list/items - The list of items to display
+ * min_checked - The minimum number of checkboxes that must be checked (defaults to 1)
+ * max_checked - The maximum number of checkboxes that can be checked (optional)
+ * timeout - The timeout for the input (optional)
+ */
+/proc/tgui_input_checkboxes(mob/user, message, title = "Select", list/items, min_checked = 1, max_checked = 50, timeout = 0, ui_state = GLOB.tgui_always_state)
+ if (!user)
+ user = usr
+ if(!length(items))
+ return
+ if (!istype(user))
+ if (istype(user, /client))
+ var/client/client = user
+ user = client.mob
+ else
+ return
+ if(!user.client.prefs.tgui_input_mode)
+ return input(user, message, title) as null|anything in items
+ var/datum/tgui_checkbox_input/input = new(user, message, title, items, min_checked, max_checked, timeout, ui_state)
+ input.tgui_interact(user)
+ input.wait()
+ if (input)
+ . = input.choices
+ qdel(input)
+
+/// Window for tgui_input_checkboxes
+/datum/tgui_checkbox_input
+ /// Title of the window
+ var/title
+ /// Message to display
+ var/message
+ /// List of items to display
+ var/list/items
+ /// List of selected items
+ var/list/choices
+ /// Time when the input was created
+ var/start_time
+ /// Timeout for the input
+ var/timeout
+ /// Whether the input was closed
+ var/closed
+ /// Minimum number of checkboxes that must be checked
+ var/min_checked
+ /// Maximum number of checkboxes that can be checked
+ var/max_checked
+ /// The TGUI UI state that will be returned in ui_state(). Default: always_state
+ var/datum/tgui_state/state
+
+/datum/tgui_checkbox_input/New(mob/user, message, title, list/items, min_checked, max_checked, timeout, ui_state)
+ src.title = title
+ src.message = message
+ src.items = items.Copy()
+ src.min_checked = min_checked
+ src.max_checked = max_checked
+ src.state = ui_state
+
+ if (timeout)
+ src.timeout = timeout
+ start_time = world.time
+ QDEL_IN(src, timeout)
+
+/datum/tgui_checkbox_input/Destroy(force, ...)
+ SStgui.close_uis(src)
+ state = null
+ QDEL_NULL(items)
+
+ return ..()
+
+/datum/tgui_checkbox_input/proc/wait()
+ while (!closed && !QDELETED(src))
+ stoplag(1)
+
+/datum/tgui_checkbox_input/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "CheckboxInput")
+ ui.open()
+
+/datum/tgui_checkbox_input/tgui_close(mob/user)
+ . = ..()
+ closed = TRUE
+
+/datum/tgui_checkbox_input/tgui_state(mob/user)
+ return state
+
+/datum/tgui_checkbox_input/tgui_data(mob/user)
+ var/list/data = list()
+
+ if(timeout)
+ data["timeout"] = CLAMP01((timeout - (world.time - start_time) - 1 SECONDS) / (timeout - 1 SECONDS))
+
+ return data
+
+/datum/tgui_checkbox_input/tgui_static_data(mob/user)
+ var/list/data = list()
+
+ data["items"] = items
+ data["min_checked"] = min_checked
+ data["max_checked"] = max_checked
+ data["large_buttons"] = user.client.prefs.tgui_large_buttons
+ data["message"] = message
+ data["swapped_buttons"] = !user.client.prefs.tgui_swapped_buttons
+ data["title"] = title
+
+ return data
+
+/datum/tgui_checkbox_input/tgui_act(action, list/params)
+ . = ..()
+ if (.)
+ return
+
+ switch(action)
+ if("submit")
+ var/list/selections = params["entry"]
+ if(length(selections) >= min_checked && length(selections) <= max_checked)
+ set_choices(selections)
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+
+ if("cancel")
+ closed = TRUE
+ SStgui.close_uis(src)
+ return TRUE
+
+ return FALSE
+
+/datum/tgui_checkbox_input/proc/set_choices(list/selections)
+ src.choices = selections.Copy()
diff --git a/code/modules/tgui_input/text.dm b/code/modules/tgui_input/text.dm
index f115fdde63..614f9e142e 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 2ae5989313..02960e0a4b 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 f7e9f6d952..7a7a3ac8a8 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 9e37b888ce..66739c747b 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("