diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm
index f5b76d1ba9..d41fbc69e1 100644
--- a/_maps/map_files/BoxStation/BoxStation.dmm
+++ b/_maps/map_files/BoxStation/BoxStation.dmm
@@ -58026,10 +58026,10 @@
},
/obj/item/clothing/head/russobluecamohat,
/obj/item/clothing/head/russobluecamohat,
-/obj/item/clothing/head/russofurhat,
-/obj/item/clothing/head/russofurhat,
-/obj/item/clothing/head/russofurhat,
-/obj/item/clothing/head/russofurhat,
+/obj/item/clothing/head/helmet/rus_ushanka,
+/obj/item/clothing/head/helmet/rus_ushanka,
+/obj/item/clothing/head/helmet/rus_ushanka,
+/obj/item/clothing/head/helmet/rus_ushanka,
/obj/item/clothing/under/mw2_russian_para,
/obj/item/clothing/under/mw2_russian_para,
/obj/item/clothing/under/mw2_russian_para,
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index a0467cde6c..905b2cdb1b 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -506,6 +506,7 @@
"bx" = (
/obj/structure/table,
/obj/machinery/readybutton,
+/obj/item/storage/lockbox/dueling/hugbox/stamina,
/turf/open/floor/holofloor/basalt,
/area/holodeck/rec_center/thunderdome)
"by" = (
@@ -522,6 +523,7 @@
/area/holodeck/rec_center/thunderdome)
"bA" = (
/obj/machinery/readybutton,
+/obj/item/storage/lockbox/dueling/hugbox/stamina,
/obj/effect/turf_decal/tile/red{
dir = 1
},
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 3acd1443af..c6be8318fd 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -87,5 +87,5 @@
#define MAX_KEYPRESS_COMMANDLENGTH 16
///Max amount of keypress messages per second over two seconds before client is autokicked
#define MAX_KEYPRESS_AUTOKICK 100
-///Length of held key rolling buffer
-#define HELD_KEY_BUFFER_LENGTH 15
+///Length of max held keys
+#define MAX_HELD_KEYS 15
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 2a59558bcd..52d2fe45cd 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -239,7 +239,6 @@ SUBSYSTEM_DEF(air)
if (MC_TICK_CHECK)
return
-
/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T)
active_turfs -= T
SSair_turfs.currentrun -= T
@@ -257,7 +256,7 @@ SUBSYSTEM_DEF(air)
#ifdef VISUALIZE_ACTIVE_TURFS
T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY)
#endif
- T.excited = 1
+ T.excited = TRUE
active_turfs |= T
SSair_turfs.currentrun |= T
if(blockchanges && T.excited_group)
diff --git a/code/controllers/subsystem/air_turfs.dm b/code/controllers/subsystem/air_turfs.dm
index 2902940bf9..9dd41aede5 100644
--- a/code/controllers/subsystem/air_turfs.dm
+++ b/code/controllers/subsystem/air_turfs.dm
@@ -11,7 +11,6 @@ SUBSYSTEM_DEF(air_turfs)
/datum/controller/subsystem/air_turfs/fire(resumed = 0)
var/fire_count = times_fired
- //cache for sanic speed
if (!resumed)
src.currentrun = SSair.active_turfs.Copy()
//cache for sanic speed (lists are references anyways)
diff --git a/code/controllers/subsystem/fail2topic.dm b/code/controllers/subsystem/fail2topic.dm
index d17cce70f9..b358cc2c5f 100644
--- a/code/controllers/subsystem/fail2topic.dm
+++ b/code/controllers/subsystem/fail2topic.dm
@@ -34,7 +34,6 @@ SUBSYSTEM_DEF(fail2topic)
for(var/i in 1 to length(rate_limiting))
var/ip = rate_limiting[i]
var/last_attempt = rate_limiting[ip]
-
if (world.time - last_attempt > rate_limit)
rate_limiting -= ip
fail_counts -= ip
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index cc09ca816e..0970b23a16 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -114,6 +114,6 @@ SUBSYSTEM_DEF(input)
/datum/controller/subsystem/input/fire()
var/list/clients = GLOB.clients // Let's sing the list cache song
- for(var/i in 1 to clients.len)
+ for(var/i in 1 to length(clients))
var/client/C = clients[i]
C.keyLoop()
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 8c8ad2d337..4850a67646 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -37,6 +37,8 @@ SUBSYSTEM_DEF(mapping)
var/datum/space_level/empty_space
var/num_of_res_levels = 1
+ var/stat_map_name = "Loading..."
+
//dlete dis once #39770 is resolved
/datum/controller/subsystem/mapping/proc/HACK_LoadMapConfig()
if(!config)
@@ -45,6 +47,7 @@ SUBSYSTEM_DEF(mapping)
#else
config = load_map_config(error_if_missing = FALSE)
#endif
+ stat_map_name = config.map_name
/datum/controller/subsystem/mapping/Initialize(timeofday)
HACK_LoadMapConfig()
@@ -330,7 +333,10 @@ GLOBAL_LIST_EMPTY(the_station_areas)
return
next_map_config = VM
- return TRUE
+
+ . = TRUE
+
+ stat_map_name = "[config.map_name] (Next: [next_map_config.map_name])"
/datum/controller/subsystem/mapping/proc/preloadTemplates(path = "_maps/templates/") //see master controller setup
var/list/filelist = flist(path)
diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm
index b406a8ccad..4d9eefae5b 100644
--- a/code/controllers/subsystem/shuttle.dm
+++ b/code/controllers/subsystem/shuttle.dm
@@ -30,6 +30,7 @@ SUBSYSTEM_DEF(shuttle)
var/list/hostileEnvironments = list() //Things blocking escape shuttle from leaving
var/list/tradeBlockade = list() //Things blocking cargo from leaving.
var/supplyBlocked = FALSE
+ var/emergency_shuttle_stat_text
//supply shuttle stuff
var/obj/docking_port/mobile/supply/supply
@@ -118,6 +119,9 @@ SUBSYSTEM_DEF(shuttle)
points += point_gain
//Cargo stuff end
+ var/esETA = emergency?.getModeStr()
+ emergency_shuttle_stat_text = "[esETA? "[esETA] [emergency.getTimerStr()]" : ""]"
+
if(!SSmapping.clearing_reserved_turfs)
while(transit_requesters.len)
var/requester = popleft(transit_requesters)
diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm
index 3b19ae31cd..779b186d08 100644
--- a/code/controllers/subsystem/time_track.dm
+++ b/code/controllers/subsystem/time_track.dm
@@ -1,6 +1,6 @@
SUBSYSTEM_DEF(time_track)
name = "Time Tracking"
- wait = 600
+ wait = 1 SECONDS
flags = SS_NO_INIT|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
@@ -16,23 +16,33 @@ SUBSYSTEM_DEF(time_track)
var/last_tick_byond_time = 0
var/last_tick_tickcount = 0
+ var/last_measurement = 0
+ var/measurement_delay = 60
+
+ var/stat_time_text
+ var/time_dilation_text
+
/datum/controller/subsystem/time_track/fire()
+ stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [WORLDTIME2TEXT("hh:mm:ss")]\n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]\n\n[time_dilation_text]"
- var/current_realtime = REALTIMEOFDAY
- var/current_byondtime = world.time
- var/current_tickcount = world.time/world.tick_lag
+ if(++last_measurement == measurement_delay)
+ last_measurement = 0
+ var/current_realtime = REALTIMEOFDAY
+ var/current_byondtime = world.time
+ var/current_tickcount = world.time/world.tick_lag
- if (!first_run)
- var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag))
+ if (!first_run)
+ var/tick_drift = max(0, (((current_realtime - last_tick_realtime) - (current_byondtime - last_tick_byond_time)) / world.tick_lag))
- time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100
+ time_dilation_current = tick_drift / (current_tickcount - last_tick_tickcount) * 100
- time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current)
- time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast)
- time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg)
- else
- first_run = FALSE
- last_tick_realtime = current_realtime
- last_tick_byond_time = current_byondtime
- last_tick_tickcount = current_tickcount
- SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]")))
+ time_dilation_avg_fast = MC_AVERAGE_FAST(time_dilation_avg_fast, time_dilation_current)
+ time_dilation_avg = MC_AVERAGE(time_dilation_avg, time_dilation_avg_fast)
+ time_dilation_avg_slow = MC_AVERAGE_SLOW(time_dilation_avg_slow, time_dilation_avg)
+ else
+ first_run = FALSE
+ last_tick_realtime = current_realtime
+ last_tick_byond_time = current_byondtime
+ last_tick_tickcount = current_tickcount
+ SSblackbox.record_feedback("associative", "time_dilation_current", 1, list("[SQLtime()]" = list("current" = "[time_dilation_current]", "avg_fast" = "[time_dilation_avg_fast]", "avg" = "[time_dilation_avg]", "avg_slow" = "[time_dilation_avg_slow]")))
+ time_dilation_text = "Time Dilation: [round(time_dilation_current,1)]% AVG:([round(time_dilation_avg_fast,1)]%, [round(time_dilation_avg,1)]%, [round(time_dilation_avg_slow,1)]%)"
diff --git a/code/game/gamemodes/gangs/gang_items.dm b/code/game/gamemodes/gangs/gang_items.dm
index 688af3beea..4dba8dae93 100644
--- a/code/game/gamemodes/gangs/gang_items.dm
+++ b/code/game/gamemodes/gangs/gang_items.dm
@@ -290,12 +290,6 @@ datum/gang_item/clothing/shades //Addition: Why not have cool shades on a gang m
cost = 5
item_path = /obj/item/grenade/syndieminibomb/concussion/frag
-/datum/gang_item/equipment/stimpack
- name = "Black Market Stimulants"
- id = "stimpack"
- cost = 12
- item_path = /obj/item/reagent_containers/syringe/stimulants
-
/datum/gang_item/equipment/implant_breaker
name = "Implant Breaker"
id = "implant_breaker"
diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm
index 07028ba2d3..884c2bb37d 100644
--- a/code/game/machinery/telecomms/computers/message.dm
+++ b/code/game/machinery/telecomms/computers/message.dm
@@ -421,7 +421,7 @@
"name" = "[customsender]",
"job" = "[customjob]",
"message" = custommessage,
- "emoji_message" = emoji_parse(custommessage),
+ "emojis" = TRUE,
"targets" = list("[customrecepient.owner] ([customrecepient.ownjob])")
))
// this will log the signal and transmit it to the target
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index 0cf356ad3d..1960080856 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -106,11 +106,10 @@
return "Everyone"
return data["targets"][1]
-/datum/signal/subspace/pda/proc/format_message(emojify = FALSE)
- var/message = emojify ? data["emoji_message"] : data["message"]
+/datum/signal/subspace/pda/proc/format_message()
if (logged && data["photo"])
- return "\"[message]\" (Photo)"
- return "\"[message]\""
+ return "\"[data["message"]]\" (Photo)"
+ return "\"[data["message"]]\""
/datum/signal/subspace/pda/broadcast()
if (!logged) // Can only go through if a message server logs it
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 51d8a88df8..abab4af770 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -76,6 +76,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/hidden = FALSE // Is the PDA hidden from the PDA list?
var/emped = FALSE
var/equipped = FALSE //used here to determine if this is the first time its been picked up
+ var/allow_emojis = TRUE //if the pda can send emojis and actually have them parsed as such
var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both.
var/ownjob = null //related to above
@@ -254,10 +255,14 @@ GLOBAL_LIST_EMPTY(PDAs)
var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda)
assets.send(user)
+ var/datum/asset/spritesheet/emoji_s = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ emoji_s.send(user) //Already sent by chat but no harm doing this
+
user.set_machine(src)
var/dat = "
Personal Data Assistant"
dat += assets.css_tag()
+ dat += emoji_s.css_tag()
dat += "[PDAIMG(refresh)]Refresh"
@@ -337,6 +342,8 @@ GLOBAL_LIST_EMPTY(PDAs)
dat += "
"
+ emoji_table = collate.Join()
+
+ menu += " To use an emoji in a pda message, refer to the guide and add \":\" around the emoji. Your PDA supports the following emoji: "
+ menu += emoji_table
+
if (99) //Newscaster message permission error
menu = "
ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"]
"
@@ -679,6 +695,11 @@ Code:
return
playsound(src, 'sound/machines/terminal_select.ogg', 50, 1)
+ //emoji previews
+ if(href_list["emoji"])
+ var/parse = emoji_parse(":[href_list["emoji"]]:")
+ to_chat(usr, parse)
+
//Bot control section! Viciously ripped from radios for being laggy and terrible.
if(href_list["op"])
switch(href_list["op"])
diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
index e0cf903465..ce4aba6ab7 100644
--- a/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
+++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/manifold.dm
@@ -1,5 +1,6 @@
//3-Way Manifold
/obj/machinery/atmospherics/pipe/heat_exchanging/manifold
+ icon = 'icons/obj/atmospherics/pipes/he-manifold.dmi'
icon_state = "manifold-2"
name = "pipe manifold"
@@ -15,7 +16,7 @@
var/mutable_appearance/center
-/obj/machinery/atmospherics/pipe/manifold/Initialize()
+/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/Initialize()
icon_state = ""
center = mutable_appearance(icon, "manifold_center")
return ..()
diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm
index 8ceef76a06..3562350473 100644
--- a/code/modules/awaymissions/capture_the_flag.dm
+++ b/code/modules/awaymissions/capture_the_flag.dm
@@ -264,6 +264,8 @@
M.key = new_team_member.key
M.faction += team
M.equipOutfit(ctf_gear)
+ M.dna.species.punchdamagehigh = 25
+ M.dna.species.punchdamagelow = 25
spawned_mobs += M
/obj/machinery/capture_the_flag/Topic(href, href_list)
@@ -368,6 +370,10 @@
CTF.ctf_gear = initial(ctf_gear)
CTF.respawn_cooldown = DEFAULT_RESPAWN
+/proc/ctf_floor_vanish(atom/target)
+ if(isturf(target.loc))
+ qdel(target)
+
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf
desc = "This looks like it could really hurt in melee."
force = 75
@@ -375,11 +381,7 @@
/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
-
-/obj/item/gun/ballistic/automatic/pistol/deagle/ctf/proc/floor_vanish()
- if(isturf(loc))
- qdel(src)
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1)
/obj/item/ammo_box/magazine/m50/ctf
ammo_type = /obj/item/ammo_casing/a50/ctf
@@ -402,22 +404,14 @@
/obj/item/gun/ballistic/automatic/laser/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
-
-/obj/item/gun/ballistic/automatic/laser/ctf/proc/floor_vanish()
- if(isturf(loc))
- qdel(src)
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1)
/obj/item/ammo_box/magazine/recharge/ctf
ammo_type = /obj/item/ammo_casing/caseless/laser/ctf
/obj/item/ammo_box/magazine/recharge/ctf/dropped()
. = ..()
- addtimer(CALLBACK(src, .proc/floor_vanish), 1)
-
-/obj/item/ammo_box/magazine/recharge/ctf/proc/floor_vanish()
- if(isturf(loc))
- qdel(src)
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1)
/obj/item/ammo_casing/caseless/laser/ctf
projectile_type = /obj/item/projectile/beam/ctf
@@ -470,6 +464,19 @@
icon_state = "bluelaser"
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
+// MELEE GANG
+/obj/item/claymore/ctf
+ slot_flags = SLOT_BACK
+
+/obj/item/claymore/ctf/pre_attack(atom/target, mob/user, params)
+ if(!is_ctf_target(target))
+ return FALSE
+ return ..()
+
+/obj/item/claymore/ctf/dropped()
+ . = ..()
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/ctf_floor_vanish, src), 1)
+
/datum/outfit/ctf
name = "CTF"
ears = /obj/item/radio/headset
@@ -483,6 +490,7 @@
l_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_pocket = /obj/item/ammo_box/magazine/recharge/ctf
r_hand = /obj/item/gun/ballistic/automatic/laser/ctf
+ back = /obj/item/claymore/ctf
/datum/outfit/ctf/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source)
if(visualsOnly)
diff --git a/code/modules/cargo/exports/gear.dm b/code/modules/cargo/exports/gear.dm
index 77b57466d9..d15fc18b6e 100644
--- a/code/modules/cargo/exports/gear.dm
+++ b/code/modules/cargo/exports/gear.dm
@@ -229,12 +229,12 @@
/datum/export/gear/magboots
cost = 50
unit_name = "magboots"
- export_types = list(/obj/item/clothing/shoes/magboots, /obj/item/clothing/shoes/magboots/atmos)
+ export_types = list(/obj/item/clothing/shoes/magboots)
/datum/export/gear/nosellboots
cost = -5000 //We DONT want scew antags
unit_name = "error shipment stolen"
- export_types = list(/obj/item/clothing/shoes/magboots/advance, /obj/item/clothing/shoes/magboots/deathsquad)
+ export_types = list(/obj/item/clothing/shoes/magboots/advance)
/datum/export/gear/syndamagboots
cost = 250
@@ -279,7 +279,7 @@
/datum/export/gear/magicboots //Magic as in Antag - Wiz/Cults
cost = 450
unit_name = "magic shoes"
- export_types = list(/obj/item/clothing/shoes/sandal/marisa, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/shoes/cult, /obj/item/clothing/shoes/clockwork, /obj/item/clothing/shoes/clown_shoes/taeclowndo, /obj/item/clothing/shoes/sandal/slippers)
+ export_types = list(/obj/item/clothing/shoes/sandal/marisa, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/shoes/cult, /obj/item/clothing/shoes/clockwork, /obj/item/clothing/shoes/clown_shoes/taeclowndo)
include_subtypes = TRUE
//Headsets/Ears
@@ -585,8 +585,7 @@ datum/export/gear/glasses //glasses are not worth selling
export_types = list(/obj/item/clothing/under/scratch, /obj/item/clothing/under/sl_suit, /obj/item/clothing/under/rank/vice, /obj/item/clothing/under/suit_jacket, \
/obj/item/clothing/under/burial, /obj/item/clothing/under/skirt/black, /obj/item/clothing/under/captainparade, /obj/item/clothing/under/hosparademale, \
/obj/item/clothing/under/hosparadefem, /obj/item/clothing/under/assistantformal, /obj/item/clothing/under/stripeddress, /obj/item/clothing/under/redeveninggown, \
- /obj/item/clothing/under/plaid_skirt, /obj/item/clothing/under/geisha, /obj/item/clothing/under/trek, /obj/item/clothing/under/wedding, /obj/item/clothing/under/aviatoruniform,\
- /obj/item/clothing/under/mega, /obj/item/clothing/under/cia, /obj/item/clothing/under/casualwear, /obj/item/clothing/under/rank)
+ /obj/item/clothing/under/plaid_skirt, /obj/item/clothing/under/geisha, /obj/item/clothing/under/trek, /obj/item/clothing/under/rank)
include_subtypes = TRUE
/datum/export/gear/armored_jumpsuit
diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm
index b53b7761e5..deac656109 100644
--- a/code/modules/cargo/packs/misc.dm
+++ b/code/modules/cargo/packs/misc.dm
@@ -204,6 +204,35 @@
for(var/i in 1 to 9)
new /obj/item/coin/silver(.)
+/datum/supply_pack/misc/dueling_stam
+ name = "Dueling Pistols"
+ desc = "Resolve all your quarrels with some nonlethal fun."
+ cost = 2000
+ contains = list(/obj/item/storage/lockbox/dueling/hugbox/stamina,
+ /obj/item/storage/lockbox/dueling/hugbox/stamina,
+ /obj/item/storage/lockbox/dueling/hugbox/stamina,
+ /obj/item/storage/lockbox/dueling/hugbox/stamina,
+ /obj/item/storage/lockbox/dueling/hugbox/stamina)
+ crate_name = "dueling pistols"
+
+/datum/supply_pack/misc/dueling_lethal
+ name = "Lethal Dueling Pistols"
+ desc = "Settle your differences the true spaceman way."
+ cost = 3000
+ contraband = TRUE
+ contains = list(/obj/item/storage/lockbox/dueling/hugbox,
+ /obj/item/storage/lockbox/dueling/hugbox,
+ /obj/item/storage/lockbox/dueling/hugbox)
+ crate_name = "dueling pistols (lethal)"
+
+/datum/supply_pack/misc/dueling_death
+ name = "Elimination Dueling Pistols"
+ desc = "It's high noon."
+ cost = 5000
+ hidden = TRUE
+ contains = list(/obj/item/storage/lockbox/dueling)
+ crate_name = "dueling pistols (elimination)"
+
/datum/supply_pack/misc/dirtymags
name = "Dirty Magazines"
desc = "Get your mind out of the gutter operative, you have work to do. Three items per order. Possible Results: .357 Speedloaders, Kitchen Gun Mags, Stetchkin Mags."
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 7dc233d20f..46473c3437 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -448,7 +448,8 @@ GLOBAL_LIST_EMPTY(asset_datums)
"scanner" = 'icons/pda_icons/pda_scanner.png',
"signaler" = 'icons/pda_icons/pda_signaler.png',
"status" = 'icons/pda_icons/pda_status.png',
- "dronephone" = 'icons/pda_icons/pda_dronephone.png'
+ "dronephone" = 'icons/pda_icons/pda_dronephone.png',
+ "emoji" = 'icons/pda_icons/pda_emoji.png'
)
/datum/asset/spritesheet/simple/paper
diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm
index de19d0d52c..02c5b5a7fd 100644
--- a/code/modules/client/verbs/ping.dm
+++ b/code/modules/client/verbs/ping.dm
@@ -14,9 +14,9 @@
/client/verb/display_ping(time as num)
set instant = TRUE
set name = ".display_ping"
- to_chat(src, "Round trip ping took [round(pingfromtime(time),1)]ms")
+ to_chat(src, "Round trip ping took [round(pingfromtime(time),1)]ms (Avg: [round(avgping, 1)]ms])")
/client/verb/ping()
set name = "Ping"
set category = "OOC"
- winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]")
\ No newline at end of file
+ winset(src, null, "command=.display_ping+[world.time+world.tick_lag*TICK_USAGE_REAL/100]")
diff --git a/code/modules/clothing/glasses/vg_glasses.dm b/code/modules/clothing/glasses/vg_glasses.dm
deleted file mode 100644
index a51a03242c..0000000000
--- a/code/modules/clothing/glasses/vg_glasses.dm
+++ /dev/null
@@ -1,41 +0,0 @@
-
-//VG rip
-
-/obj/item/clothing/glasses/sunglasses/purple
- desc = "Strangely ancient technology used to help provide rudimentary eye cover. Enhanced shielding blocks many flashes, and the colored lenses let you see the world in purple."
- name = "purple sunglasses"
- icon_state = "sun_purple"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/glasses/sunglasses/star
- name = "star-shaped sunglasses"
- desc = "Novelty sunglasses, both lenses are in the shape of a star."
- icon_state = "sun_star"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/glasses/sunglasses/rockstar
- name = "red star-shaped sunglasses"
- desc = "Novelty sunglasses with a fancy silver frame and two red-tinted star-shaped lenses. You should probably stomp on them and get a pair of normal ones."
- icon_state = "sun_star_silver"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/glasses/gglasses
- name = "Green Glasses"
- desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
- icon_state = "gglasses"
- item_state = "gglasses"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/glasses/welding/superior
- name = "superior welding goggles"
- desc = "Welding goggles made from more expensive materials, strangely smells like potatoes. Allows for better vision than normal goggles.."
- icon_state = "rwelding-g"
- item_state = "rwelding-g"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- actions_types = list(/datum/action/item_action/toggle)
- flash_protect = 2
- tint = 1
- visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT
- flags_cover = GLASSESCOVERSEYES
- visor_flags_inv = HIDEEYES
- glass_colour_type = /datum/client_colour/glass_colour/green
\ No newline at end of file
diff --git a/code/modules/clothing/gloves/vg_gloves.dm b/code/modules/clothing/gloves/vg_gloves.dm
deleted file mode 100644
index 6d7e775314..0000000000
--- a/code/modules/clothing/gloves/vg_gloves.dm
+++ /dev/null
@@ -1,70 +0,0 @@
-
-/obj/item/clothing/gloves/batmangloves
- desc = "Used for handling all things bat related."
- name = "batgloves"
- icon_state = "bmgloves"
- item_state = "bmgloves"
- item_color = "bmgloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-obj/item/clothing/gloves/bikergloves
- name = "Biker's Gloves"
- icon_state = "biker-gloves"
- item_state = "biker-gloves"
- item_color = "bikergloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/megagloves
- desc = "Uncomfortably bulky armored gloves."
- name = "DRN-001 Gloves"
- icon_state = "megagloves"
- item_state = "megagloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/protogloves
- desc = "Funcionally identical to the DRN-001 model's, but in red!"
- name = "Prototype Gloves"
- icon_state = "protogloves"
- item_state = "protogloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/megaxgloves
- desc = "An upgrade to the DRN-001's gauntlets, retains the uncomfortable armor, but comes with white gloves!"
- name = "Maverick Hunter gloves"
- icon_state = "megaxgloves"
- item_state = "megaxgloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/joegloves
- desc = "Large grey gloves, very similar to the Prototype's."
- name = "Sniper Gloves"
- icon_state = "joegloves"
- item_state = "joegloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/doomguy
- desc = ""
- name = "Doomguy's gloves"
- icon_state = "doom"
- item_state = "doom"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/anchor_arms
- name = "Anchor Arms"
- desc = "When you're a jerk, everybody loves you."
- icon_state = "anchorarms"
- item_state = "anchorarms"
-
-/obj/item/clothing/gloves/neorussian
- name = "neo-Russian gloves"
- desc = "Utilizes a non-slip technology that allows you to never drop your precious bottles of vodka."
- icon_state = "nr_gloves"
- item_state = "nr_gloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/gloves/neorussian/fingerless
- name = "neo-Russian fingerless gloves"
- desc = "For these tense combat situations when you just have to pick your nose."
- icon_state = "nr_fgloves"
- item_state = "nr_fgloves"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 696ff1346c..189fb46e46 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -423,3 +423,15 @@
desc = "A security cowboy hat, perfect for any true lawman"
icon_state = "cowboyhat_sec"
item_state= "cowboyhat_sec"
+
+/obj/item/clothing/head/squatter_hat
+ name = "slav squatter hat"
+ icon_state = "squatter_hat"
+ item_state = "squatter_hat"
+ desc = "Cyka blyat."
+
+/obj/item/clothing/head/russobluecamohat
+ name = "russian blue camo beret"
+ desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food."
+ icon_state = "russobluecamohat"
+ item_state = "russobluecamohat"
diff --git a/code/modules/clothing/head/vg_hats.dm b/code/modules/clothing/head/vg_hats.dm
deleted file mode 100644
index 87f64baf13..0000000000
--- a/code/modules/clothing/head/vg_hats.dm
+++ /dev/null
@@ -1,155 +0,0 @@
-/obj/item/clothing/head/helmet/dredd
- name = "Judge Helmet"
- desc = "Judge, Jury, and Executioner."
- icon_state = "dredd-helmet"
- item_state = "dredd-helmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- armor = list(melee = 40, bullet = 30, laser = 30,energy = 30, bomb = 50, bio = 90, rad = 20, fire = 50, acid = 50)
- cold_protection = HEAD
- min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
- heat_protection = HEAD
- max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
- strip_delay = 80
- dog_fashion = null
-
-/obj/item/clothing/head/helmet/aviatorhelmet
- name = "Aviator Helmet"
- desc = "Help the Bombardier!"
- armor = list(melee = 25, bullet = 0, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0)
- item_state = "aviator_helmet"
- icon_state = "aviator_helmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/biker
- name = "Biker's Helmet"
- desc = "This helmet should protect you from russians and masked vigilantes."
- armor = list(melee = 25, bullet = 15, laser = 20, energy = 10, bomb = 10, bio = 0, rad = 0)
- icon_state = "biker_helmet"
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
-
-/obj/item/clothing/head/helmet/richard
- name = "Richard"
- desc = "Do you like hurting people?"
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
- icon_state = "richard"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
-
-/obj/item/clothing/head/helmet/megahelmet
- name = "DRN-001 Helmet"
- desc = "The helmet of the DRN-001 model. A simple, sturdy blue helmet."
- icon_state = "megahelmet"
- item_state = "megahelmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- siemens_coefficient = 1
-
-/obj/item/clothing/head/helmet/protohelmet
- name = "Prototype Helmet"
- desc = "Shiny red helmet with white accents and a built in shaded visor that does absolutely nothing, nothing but look rad as hell."
- icon_state = "protohelmet"
- item_state = "protohelmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- siemens_coefficient = 1
-
-/obj/item/clothing/head/helmet/megaxhelmet
- name = "Maverick Hunter Helmet"
- desc = "Heavily armored upgrade to the DRN-001 model's helmet, now comes with a pointless red crystal thing!"
- icon_state = "megaxhelmet"
- item_state = "megaxhelmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/joehelmet
- name = "Sniper Helmet"
- desc = "Helmet belonging to one of the many mass produced 'Joe' type robots."
- icon_state = "joehelmet"
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
- item_state = "joehelmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/doomguy
- name = "Doomguy's helmet"
- desc = ""
- icon_state = "doom"
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR
- item_state = "doom"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- armor = list(melee = 50, bullet = 40, laser = 40,energy = 40, bomb = 5, bio = 0, rad = 0)
-
-/obj/item/clothing/head/helmet/neorussian
- name = "neo-Russian helmet"
- desc = "This piece of equipment can double as a pillow, a bowl, an emergency toilet, and sometimes as a helmet."
- icon_state = "nr_helmet"
- item_state = "nr_helmet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/panzer
- name = "Panzer Cap"
- desc = "Command any mech in style."
- icon_state = "panzercap"
- item_state = "panzercap"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/russobluecamohat
- name = "russian blue camo beret"
- desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food."
- icon_state = "russobluecamohat"
- item_state = "russobluecamohat"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/russofurhat
- name = "russian fur hat"
- desc = "Russian winter got you down? Maybe your enemy, but not you!"
- icon_state = "russofurhat"
- item_state = "russofurhat"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/squatter_hat
- name = "slav squatter hat"
- icon_state = "squatter_hat"
- item_state = "squatter_hat"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- desc = "Cyka blyat."
-
-/obj/item/clothing/head/snake
- name = "snake head"
- desc = "Reenact acts of violence against reptiles, or sneak into a swamp unnoticed."
- icon_state = "snakehead"
- item_state = "snakehead"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-/obj/item/clothing/head/mummy_rags
- name = "mummy rags"
- desc = "Ancient rags taken off from some mummy."
- icon_state = "mummy"
- item_state = "mummy"
- item_color = "mummy"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
-
-/obj/item/clothing/head/clownpiece
- name = "Clownpiece's jester hat"
- desc = "A purple polka-dotted jester's hat with yellow pompons."
- icon_state = "clownpiece"
- item_state = "clownpiece"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/mitre
- name = "mitre"
- desc = "A funny hat worn by extremely boring people."
- icon_state = "mitre"
- item_state = "mitre"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/tinfoil
- name = "tinfoil hat"
- desc = "There's no evidence that the security staff is NOT out to get you."
- icon_state = "foilhat"
- item_state = "paper"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- siemens_coefficient = 2
-
-/obj/item/clothing/head/celtic
- name = "\improper Celtic crown"
- desc = "According to legend, Celtic kings would use crowns like this one to shield their subjects from harsh winters back on Earth."
- icon_state = "celtic_crown"
- item_state = "celtic_crown"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
diff --git a/code/modules/clothing/masks/vg_masks.dm b/code/modules/clothing/masks/vg_masks.dm
deleted file mode 100644
index 29b65a6b8e..0000000000
--- a/code/modules/clothing/masks/vg_masks.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/obj/item/clothing/mask/gas/clown_hat/wiz
- name = "purple clown wig and mask"
- desc = "Some pranksters are truly magical."
- icon_state = "wizzclown"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/mask/chapmask
- name = "venetian mask"
- desc = "A plain porcelain mask that covers the entire face. Standard attire for particularly unspeakable religions. The eyes are wide shut."
- icon_state = "chapmask"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/mask/neorussian
- name = "neo-Russian mask"
- desc = "Somehow, it makes you act and look way more polite than usual."
- icon_state = "nr_mask"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
diff --git a/code/modules/clothing/shoes/vg_shoes.dm b/code/modules/clothing/shoes/vg_shoes.dm
deleted file mode 100644
index 53b093dc72..0000000000
--- a/code/modules/clothing/shoes/vg_shoes.dm
+++ /dev/null
@@ -1,124 +0,0 @@
-
-/obj/item/clothing/shoes/leather
- name = "leather shoes"
- desc = "A sturdy pair of leather shoes."
- icon_state = "leather"
- item_color = "leather"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/magboots/deathsquad
- desc = "Very expensive and advanced magnetic boots, used only by the elite during extravehicular activity to ensure the user remains safely attached to the vehicle."
- name = "deathsquad magboots"
- icon_state = "DS-magboots0"
- magboot_state = "DS-magboots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/magboots/atmos
- desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. These are painted in the colors of an atmospheric technician."
- name = "atmospherics magboots"
- icon_state = "atmosmagboots0"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- magboot_state = "atmosmagboots"
- resistance_flags = FIRE_PROOF
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/simonshoes
- name = "Simon's Shoes"
- desc = "Simon's Shoes."
- icon_state = "simonshoes"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/kneesocks
- name = "kneesocks"
- desc = "A pair of girly knee-high socks."
- icon_state = "kneesock"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/jestershoes
- name = "Jester Shoes"
- desc = "As worn by the clowns of old."
- icon_state = "jestershoes"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/aviatorboots
- name = "Aviator Boots"
- desc = "Boots suitable for just about any occasion."
- icon_state = "aviator_boots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/libertyshoes
- name = "Liberty Shoes"
- desc = "Freedom isn't free, neither were these shoes."
- icon_state = "libertyshoes"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/megaboots
- name = "DRN-001 Boots"
- desc = "Large armored boots, very weak to large spikes."
- icon_state = "megaboots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/protoboots
- name = "Prototype Boots"
- desc = "Functionally identical to the DRN-001 model's boots, but in red."
- icon_state = "protoboots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/megaxboots
- name = "Maverick Hunter boots"
- desc = "Regardless of how much stronger these boots are than the DRN-001 model's, they're still extremely easy to pierce with a large spike."
- icon_state = "megaxboots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/joeboots
- name = "Sniper Boots"
- desc = "Nearly identical to the Prototype's boots, except in black."
- icon_state = "joeboots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/doomguy
- name = "Doomguy's boots"
- desc = "If you look closely, you might see skull fragments still buried in these boots."
- icon_state = "doom"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/rottenshoes
- name = "rotten shoes"
- desc = "These shoes seem perfect for sneaking around."
- icon_state = "rottenshoes"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/sandal/slippers
- name = "magic slippers"
- icon_state = "slippers"
- desc = "For the wizard that puts comfort first. Who's going to laugh?"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/slippers_worn
- name = "worn bunny slippers"
- desc = "Fluffy..."
- icon_state = "slippers_worn"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/shoes/jackboots/neorussian
- name = "neo-Russian boots"
- desc = "Tovarish, no one will realize you stepped on a pile of shit if your pair already looks like shit."
- icon_state = "nr_boots"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index c9753b3053..703fe26287 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -693,6 +693,29 @@
listeningTo = null
return ..()
+/obj/item/clothing/head/helmet/space/hardsuit/soviet
+ name = "soviet hardhelmet"
+ desc = "Crafted with the pride of the proletariat. The vengeful gaze of the visor roots out all fascists and capitalists."
+ item_state = "rig0-soviet"
+ item_color = "soviet"
+ icon_state = "rig0-soviet"
+ armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75)
+ mutantrace_variation = NONE
+
+/obj/item/clothing/suit/space/hardsuit/soviet
+ name = "soviet hardsuit"
+ desc = "Crafted with the pride of the proletariat. The last thing the enemy sees is the bottom of this armor's boot."
+ item_state = "rig-soviet"
+ icon_state = "rig-soviet"
+ slowdown = 0.8
+ armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 15, "bomb" = 35, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 75)
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet
+ mutantrace_variation = NONE
+
+/obj/item/clothing/suit/space/hardsuit/soviet/Initialize()
+ . = ..()
+ allowed = GLOB.security_hardsuit_allowed
+
/////////////SHIELDED//////////////////////////////////
/obj/item/clothing/suit/space/hardsuit/shielded
diff --git a/code/modules/clothing/spacesuits/vg_spess.dm b/code/modules/clothing/spacesuits/vg_spess.dm
deleted file mode 100644
index 517539f3af..0000000000
--- a/code/modules/clothing/spacesuits/vg_spess.dm
+++ /dev/null
@@ -1,120 +0,0 @@
-
- //VG Ports
-
-/obj/item/clothing/head/helmet/space/hardsuit/soviet
- name = "soviet hardhelmet"
- desc = "Crafted with the pride of the proletariat. The vengeful gaze of the visor roots out all fascists and capitalists."
- item_state = "hardsuit0-soviet"
- icon_state = "hardsuit0-soviet"
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
- item_color = "soviet"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/suit/space/hardsuit/soviet
- name = "soviet hardsuit"
- desc = "Crafted with the pride of the proletariat. The last thing the enemy sees is the bottom of this armor's boot."
- item_state = "hardsuit-soviet"
- icon_state = "hardsuit-soviet"
- slowdown = 1
- armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
- allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/soviet
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/space/hardsuit/knight
- name = "Space-Knight helm"
- desc = "A well polished helmet belonging to a Space-Knight. Favored by space-jousters for its ability to stay on tight after being launched from a mass driver."
- icon_state = "hardsuit0-knight"
- item_state = "hardsuit0-knight"
- armor = list(melee = 60, bullet = 40, laser = 40,energy = 30, bomb = 50, bio = 100, rad = 60)
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- item_color="knight"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/suit/space/hardsuit/knight
- name = "Space-Knight armour"
- desc = "A well polished set of armour belonging to a Space-Knight. Maidens Rescued in Space: 100, Maidens who have slept with me in Space: 0."
- icon_state = "hardsuit-knight"
- item_state = "hardsuit-knight"
- slowdown = 1
- allowed = list(/obj/item/gun,/obj/item/melee/baton,/obj/item/tank,/obj/item/shield/energy,/obj/item/claymore)
- armor = list(melee = 60, bullet = 40, laser = 40,energy = 30, bomb = 50, bio = 100, rad = 60)
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- siemens_coefficient = 0.5
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/knight
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/space/hardsuit/knight/black
- name = "Black Knight's helm"
- desc = "An ominous black helmet with a gold trim. The small viewports create an intimidating look, while also making it nearly impossible to see anything."
- icon_state = "hardsuit0-blackknight"
- item_state = "hardsuit0-blackknight"
- armor = list(melee = 70, bullet = 65, laser = 50,energy = 25, bomb = 60, bio = 100, rad = 60)
- item_color="blackknight"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/suit/space/hardsuit/knight/black
- name = "Black Knight's armour"
- desc = "An ominous black suit of armour with a gold trim. Surprisingly good at preventing accidental loss of limbs."
- icon_state = "hardsuit-blackknight"
- item_state = "hardsuit-blackknight"
- armor = list(melee = 70, bullet = 65, laser = 50,energy = 25, bomb = 60, bio = 100, rad = 60)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/knight/black
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/space/hardsuit/knight/solaire
- name = "Solar helm"
- desc = "A simple helmet. 'Made in Astora' is inscribed on the back."
- icon_state = "hardsuit0-solaire"
- item_state = "hardsuit0-solaire"
- armor = list(melee = 60, bullet = 65, laser = 90,energy = 30, bomb = 60, bio = 100, rad = 100)
- item_color="solaire"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/suit/space/hardsuit/knight/solaire
- name = "Solar armour"
- desc = "A solar powered hardsuit with a fancy insignia on the chest. Perfect for stargazers and adventurers alike."
- icon_state = "hardsuit-solaire"
- item_state = "hardsuit-solaire"
- armor = list(melee = 60, bullet = 65, laser = 90,energy = 30, bomb = 60, bio = 100, rad = 100)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/knight/solaire
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/head/helmet/space/hardsuit/t51b
- name = "T-51b Power Armor"
- desc = "Relic of a bygone era, the T-51b is powered by a TX-28 MicroFusion Pack, which holds enough fuel to power its internal hydraulics for a century!"
- icon_state = "hardsuit0-t51b"
- item_state = "hardsuit0-t51b"
- armor = list(melee = 35, bullet = 35, laser = 40, energy = 40, bomb = 80, bio = 100, rad = 100)
- item_color="t51b"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-/obj/item/clothing/suit/space/hardsuit/t51b
- name = "T-51b Power Armor"
- desc = "Relic of a bygone era, the T-51b is powered by a TX-28 MicroFusion Pack, which holds enough fuel to power its internal hydraulics for a century!"
- icon_state = "hardsuit-t51b"
- item_state = "hardsuit-t51b"
- armor = list(melee = 35, bullet = 35, laser = 40, energy = 40, bomb = 80, bio = 100, rad = 100)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/t51b
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-
-/obj/item/clothing/head/helmet/space/bomberman
- name = "Bomberman head"
- desc = "Terrorism has never looked so adorable."
- icon_state = "bomberman"
- item_state = "bomberman"
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
- siemens_coefficient = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
-
-obj/item/clothing/suit/space/bomberman
- name = "Bomberman's suit"
- desc = "Doesn't actually make you immune to bombs!"
- icon_state = "bomberman"
- item_state = "bomberman"
- slowdown = 0
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
- siemens_coefficient = 0
- max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
\ No newline at end of file
diff --git a/code/modules/clothing/suits/vg_suits.dm b/code/modules/clothing/suits/vg_suits.dm
deleted file mode 100644
index be6cd9938e..0000000000
--- a/code/modules/clothing/suits/vg_suits.dm
+++ /dev/null
@@ -1,138 +0,0 @@
-
-/obj/item/clothing/suit/armor/xcomsquaddie
- name = "Squaddie Armor"
- desc = "A suit of armor with heavy padding to protect against projectile and laser attacks. Distributed to shadow organization squaddies."
- icon_state = "xcomarmor2"
- item_state = "xcomarmor2"
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 30, bomb = 60, bio = 30, rad = 20)
- siemens_coefficient = 0.5
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/armor/xcomsquaddie/dredd
- name = "Judge Armor"
- desc = "A large suit of heavy armor, fit for a Judge."
- icon_state = "dredd-suit"
- item_state = "dredd-suit"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-
-/obj/item/clothing/suit/armor/xcomarmor
- name = "Mysterious Armor"
- desc = "A suit of armor with heavy plating to protect against melee attacks. Distributed to shadow organization squaddies."
- icon_state = "xcomarmor1"
- item_state = "xcomarmor1"
- body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
- armor = list(melee = 50, bullet = 50, laser = 50, energy = 30, bomb = 60, bio = 30, rad = 20)
- slowdown = 1
- siemens_coefficient = 0.5
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/armor/vest/neorussian
- name = "neo-Russian vest"
- desc = "The narkotiki camo pattern will come useful for botany raids."
- icon_state = "nr_vest"
- item_state = "nr_vest"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/armor/doomguy
- name = "Doomguy's armor"
- desc = ""
- icon_state = "doom"
- item_state = "doom"
- body_parts_covered = CHEST|GROIN
- slowdown = 0
- armor = list(melee = 50, bullet = 30, laser = 20, energy = 20, bomb = 30, bio = 0, rad = 0)
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-
-/obj/item/clothing/suit/kaminacape
- name = "Kamina's Cape"
- desc = "Don't believe in yourself, dumbass. Believe in me. Believe in the Kamina who believes in you."
- icon_state = "kaminacape"
- body_parts_covered = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/officercoat
- name = "Officer's Coat"
- desc = "Ein Mantel gemacht, um die Juden zu bestrafen."
- icon_state = "officersuit"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/soldiercoat
- name = "Soldier's Coat"
- desc = "Und das heißt: Erika."
- icon_state = "soldiersuit"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/russofurcoat
- name = "russian fur coat"
- desc = "Let the land do the fighting for you."
- icon_state = "russofurcoat"
- allowed = list(/obj/item/gun)
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/doshjacket
- name = "Plasterer's Jacket"
- desc = "Perfect for doing up the house."
- icon_state = "doshjacket"
- body_parts_covered = CHEST|GROIN|ARMS
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/maidapron
- name = "Apron"
- desc = "Simple white apron."
- icon_state = "maidapron"
- body_parts_covered = CHEST|GROIN
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/clownpiece
- name = "small fairy wings"
- desc = "Some small and translucid insect-like wings."
- icon_state = "clownpiece"
- body_parts_covered = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/clownpiece/flying
- name = "small fairy wings"
- desc = "Some small and translucid insect-like wings. Looks like these are the real deal!"
- icon_state = "clownpiece-fly"
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/suit/raincoat
- name = "Raincoat"
- desc = "Do you like Huey Lewis and the News?"
- icon_state = "raincoat"
- body_parts_covered =CHEST|GROIN|LEGS|ARMS|HANDS
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/suit.dmi'
- mutantrace_variation = NONE
-
-
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index a4b8c920d3..251ff50173 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -1000,4 +1000,89 @@
item_state = "cheongr"
body_parts_covered = CHEST|GROIN
can_adjust = FALSE
- mutantrace_variation = NONE
\ No newline at end of file
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/squatter_outfit
+ name = "slav squatter tracksuit"
+ desc = "Cyka blyat."
+ icon_state = "squatteroutfit"
+ item_state = "squatteroutfit"
+ item_color = "squatteroutfit"
+ can_adjust = FALSE
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/russobluecamooutfit
+ name = "russian blue camo"
+ desc = "Drop and give me dvadtsat!"
+ icon_state = "russobluecamo"
+ item_state = "russobluecamo"
+ item_color = "russobluecamo"
+ can_adjust = FALSE
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/keyholesweater
+ name = "keyhole sweater"
+ desc = "What is the point of this, anyway?"
+ icon_state = "keyholesweater"
+ item_state = "keyholesweater"
+ item_color = "keyholesweater"
+ can_adjust = FALSE
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/stripper_pink
+ name = "pink stripper outfit"
+ icon_state = "stripper_p"
+ item_state = "stripper_p"
+ item_color = "stripper_p"
+
+/obj/item/clothing/under/stripper_green
+ name = "green stripper outfit"
+ icon_state = "stripper_g"
+ item_state = "stripper_g"
+ item_color = "stripper_g"
+ can_adjust = FALSE
+
+/obj/item/clothing/under/mankini
+ name = "pink mankini"
+ icon_state = "mankini"
+ item_state = "mankini"
+ item_color = "mankini"
+ can_adjust = FALSE
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/wedding
+ name = "white wedding dress"
+ desc = "A white wedding gown made from the finest silk."
+ icon_state = "bride_white"
+ item_state = "bride_white"
+ item_color = "bride_white"
+ can_adjust = FALSE
+ mutantrace_variation = NONE
+
+/obj/item/clothing/under/wedding/orange
+ name = "orange wedding dress"
+ desc = "A big and puffy orange dress."
+ icon_state = "bride_orange"
+ item_state = "bride_orange"
+ item_color = "bride_orange"
+
+/obj/item/clothing/under/wedding/purple
+ name = "purple wedding dress"
+ desc = "A big and puffy purple dress."
+ icon_state = "bride_purple"
+ item_state = "bride_purple"
+ item_color = "bride_purple"
+
+/obj/item/clothing/under/wedding/blue
+ name = "blue wedding dress"
+ desc = "A big and puffy blue dress."
+ icon_state = "bride_blue"
+ item_state = "bride_blue"
+ item_color = "bride_blue"
+
+/obj/item/clothing/under/wedding/red
+ name = "red wedding dress"
+ desc = "A big and puffy red dress."
+ icon_state = "bride_red"
+ item_state = "bride_red"
+ item_color = "bride_red"
diff --git a/code/modules/clothing/under/vg_under.dm b/code/modules/clothing/under/vg_under.dm
deleted file mode 100644
index 555ed3b795..0000000000
--- a/code/modules/clothing/under/vg_under.dm
+++ /dev/null
@@ -1,436 +0,0 @@
-// Fixed to work with Citadel code. Apparently none of them had NO_MUTANTRACE flags.
-// I was pissy when I realised how to fix this because it's so fucking easy and nobody apparently had done it.
-
-/obj/item/clothing/under/stripper_pink
- name = "pink stripper outfit"
- icon_state = "stripper_p"
- item_state = "stripper_p"
- item_color = "stripper_p"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/stripper_green
- name = "green stripper outfit"
- icon_state = "stripper_g"
- item_state = "stripper_g"
- item_color = "stripper_g"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/wedding/bride_orange
- name = "orange wedding dress"
- desc = "A big and puffy orange dress."
- icon_state = "bride_orange"
- item_state = "bride_orange"
- item_color = "bride_orange"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/wedding/bride_purple
- name = "purple wedding dress"
- desc = "A big and puffy purple dress."
- icon_state = "bride_purple"
- item_state = "bride_purple"
- item_color = "bride_purple"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/wedding/bride_blue
- name = "blue wedding dress"
- desc = "A big and puffy blue dress."
- icon_state = "bride_blue"
- item_state = "bride_blue"
- item_color = "bride_blue"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/wedding/bride_red
- name = "red wedding dress"
- desc = "A big and puffy red dress."
- icon_state = "bride_red"
- item_state = "bride_red"
- item_color = "bride_red"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/wedding/bride_white
- name = "white wedding dress"
- desc = "A white wedding gown made from the finest silk."
- icon_state = "bride_white"
- item_state = "bride_white"
- item_color = "bride_white"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/mankini
- name = "pink mankini"
- icon_state = "mankini"
- item_state = "mankini"
- item_color = "mankini"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-/*
-
-/obj/item/clothing/under/psysuit
- name = "dark undersuit"
- desc = "A thick, layered grey undersuit lined with power cables. Feels a little like wearing an electrical storm."
- icon_state = "psysuit"
- item_state = "psysuit"
- item_color = "psysuit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
-/obj/item/clothing/under/officeruniform
- name = "officer's uniform"
- desc = "Bestraft die Juden fur ihre Verbrechen."
- icon_state = "officeruniform"
- item_state = "officeruniform"
- item_color = "officeruniform"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
-/obj/item/clothing/under/soldieruniform
- name = "soldier's uniform"
- desc = "Bestraft die Verbundeten fur ihren Widerstand."
- icon_state = "soldieruniform"
- item_state = "soldieruniform"
- item_color = "soldieruniform"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-*/
-/obj/item/clothing/under/squatter_outfit
- name = "slav squatter tracksuit"
- desc = "Cyka blyat."
- icon_state = "squatteroutfit"
- item_state = "squatteroutfit"
- item_color = "squatteroutfit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/russobluecamooutfit
- name = "russian blue camo"
- desc = "Drop and give me dvadtsat!"
- icon_state = "russobluecamo"
- item_state = "russobluecamo"
- item_color = "russobluecamo"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/stilsuit
- name = "stillsuit"
- desc = "Designed to preserve bodymoisture."
- icon_state = "stilsuit"
- item_state = "stilsuit"
- item_color = "stilsuit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/aviatoruniform
- name = "aviator uniform"
- desc = "Now you can look absolutely dashing!"
- icon_state = "aviator_uniform"
- item_state = "aviator_uniform"
- item_color = "aviator_uniform"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/bikersuit
- name = "biker's outfit"
- icon_state = "biker"
- item_state = "biker"
- item_color = "biker"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/jacketsuit
- name = "richard's outfit"
- desc = "Do you know what time it is?"
- icon_state = "jacket"
- item_state = "jacket"
- item_color = "jacket"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-obj/item/clothing/under/mega
- name = "\improper DRN-001 suit"
- desc = "The original. Simple, yet very adaptable."
- icon_state = "mega"
- item_state = "mega"
- item_color = "mega"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/proto
- name = "The Prototype Suit"
- desc = "Even robots know scarves are the perfect accessory for a brooding rival."
- icon_state = "proto"
- item_state = "proto"
- item_color = "proto"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/megax
- name = "\improper Maverick Hunter regalia"
- desc = "The best outfit for taking out rogue borgs."
- icon_state = "megax"
- item_state = "megax"
- item_color = "megax"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/joe
- name = "The Sniper Suit"
- desc = "Mass produced combat robots with a rather unfitting name."
- icon_state = "joe"
- item_state = "joe"
- item_color = "joe"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/roll
- name = "\improper DRN-002 Dress"
- desc = "A simple red dress, the good doctor's second robot wasn't quite as exciting as the first."
- icon_state = "roll"
- item_state = "roll"
- item_color = "roll"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/gokugidown
- name = "turtle hermit undershirt"
- desc = "Something seems oddly familiar about this outfit..."
- icon_state = "gokugidown"
- item_state = "gokugidown"
- item_color = "gokugidown"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/gokugi
- name = "turtle hermit outfit"
- desc = "An outfit from one trained by the great Turtle Hermit."
- icon_state = "gokugi"
- item_state = "gokugi"
- item_color = "gokugi"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/doomguy
- name = "\improper Doomguy's pants"
- desc = ""
- icon_state = "doom"
- item_state = "doom"
- item_color = "doom"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/vault13
- name = "vault 13 Jumpsuit"
- desc = "Oddly similar to the station's usual jumpsuits, but with a rustic charm to it. Has a large thirteen emblazened on the back."
- icon_state = "v13-jumpsuit"
- item_state = "v13-jumpsuit"
- item_color = "v13-jumpsuit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/vault
- name = "vault jumpsuit"
- desc = "Oddly similar to the station's usual jumpsuits, but with a rustic charm to it."
- icon_state = "v-jumpsuit"
- item_state = "v-jumpsuit"
- item_color = "v-jumpsuit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/clownpiece
- name = "Clownpiece's Pierrot suit"
- desc = "A female-sized set of leggings and shirt with a pattern similar to the American flag, featuring a frilled collar."
- icon_state = "clownpiece"
- item_state = "clownpiece"
- item_color = "clownpiece"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/cia
- name = "casual IAA outfit"
- desc = "Just looking at this makes you feel in charge."
- icon_state = "cia"
- item_state = "cia"
- item_color = "cia"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/greaser
- name = "greaser outfit"
- desc = "The one that you want!"
- icon_state = "greaser_default"
- item_state = "greaser_default"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/greaser/New()
- var/greaser_colour = "default"
- switch(rand(1,4))
- if(1)
- greaser_colour = "default"
- if(2)
- greaser_colour = "cult"
- if(3)
- greaser_colour = "spider"
- if(4)
- greaser_colour = "snakes"
- desc = "Tunnel Snakes Rule!"
- icon_state = "greaser_[greaser_colour]"
- item_state = "greaser_[greaser_colour]"
- item_color = "greaser_[greaser_colour]"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-
-/obj/item/clothing/under/wintercasualwear
- name = "winter casualwear"
- desc = "Perfect for winter!"
- icon_state = "shizunewinter"
- item_state = "shizunewinter"
- item_color = "shizunewinter"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/casualwear
- name = "spring casualwear"
- desc = "Perfect for spring!"
- icon_state = "shizunenormal"
- item_state = "shizunenormal"
- item_color = "shizunenormal"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/keyholesweater
- name = "keyhole sweater"
- desc = "What is the point of this, anyway?"
- icon_state = "keyholesweater"
- item_state = "keyholesweater"
- item_color = "keyholesweater"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/casualhoodie
- name = "casual hoodie"
- desc = "Pefect for lounging about in."
- icon_state = "hoodiejeans"
- item_state = "hoodiejeans"
- item_color = "hoodiejeans"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
-/obj/item/clothing/under/casualhoodie/skirt
- icon_state = "hoodieskirt"
- item_state = "hoodieskirt"
- item_color = "hoodieskirt"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- mutantrace_variation = NONE
-
-/*
-/obj/item/clothing/under/mummy_rags
- name = "mummy rags"
- desc = "Ancient rags taken off from some mummy."
- icon_state = "mummy"
- item_state = "mummy"
- item_color = "mummy"
- can_adjust = 0
- has_sensor = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-
-
-/obj/item/clothing/under/neorussian
- name = "neo-Russian uniform"
- desc = "Employs a special toshnit pattern, will render you invisible when you eat a potato on an empty stomach."
- icon_state = "nr_uniform"
- item_state = "nr_uniform"
- item_color = "nr_uniform"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
-*/
-
-/obj/item/clothing/under/rottensuit
- name = "rotten suit"
- desc = "This suit seems perfect for wearing underneath a disguise."
- icon_state = "rottensuit"
- item_state = "rottensuit"
- item_color = "rottensuit"
- can_adjust = 0
- icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
- alternate_worn_icon = 'modular_citadel/icons/mob/citadel/uniforms.dmi'
- mutantrace_variation = NONE
-
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
index 2f4a84c646..db46ca09ca 100644
--- a/code/modules/emoji/emoji_parse.dm
+++ b/code/modules/emoji/emoji_parse.dm
@@ -1,4 +1,4 @@
-/proc/emoji_parse(text)
+/proc/emoji_parse(text) //turns :ai: into an emoji in text.
. = text
if(!CONFIG_GET(flag/emojis))
return
@@ -30,3 +30,24 @@
break
return parsed
+/proc/emoji_sanitize(text) //cuts any text that would not be parsed as an emoji
+ . = text
+ if(!CONFIG_GET(flag/emojis))
+ return
+ var/static/list/emojis = icon_states(icon('icons/emoji.dmi'))
+ var/final = "" //only tags are added to this
+ var/pos = 1
+ var/search = 0
+ while(1)
+ search = findtext(text, ":", pos)
+ if(search)
+ pos = search
+ search = findtext(text, ":", pos+1)
+ if(search)
+ var/word = lowertext(copytext(text, pos+1, search))
+ if(word in emojis)
+ final += lowertext(copytext(text, pos, search+1))
+ pos = search + 1
+ continue
+ break
+ return final
diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm
index 4aac76bd67..5f3e879237 100644
--- a/code/modules/keybindings/bindings_atom.dm
+++ b/code/modules/keybindings/bindings_atom.dm
@@ -15,4 +15,4 @@
movement_dir &= ~(NORTH|SOUTH)
if((movement_dir & EAST) && (movement_dir & WEST))
movement_dir &= ~(EAST|WEST)
- user.Move(get_step(src, movement_dir), movement_dir)
\ No newline at end of file
+ user.Move(get_step(src, movement_dir), movement_dir)
diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm
index dec5c25eb9..6030362a61 100644
--- a/code/modules/keybindings/bindings_client.dm
+++ b/code/modules/keybindings/bindings_client.dm
@@ -5,7 +5,7 @@
set hidden = TRUE
client_keysend_amount += 1
-
+
var/cache = client_keysend_amount
if(keysend_tripped && next_keysend_trip_reset <= world.time)
@@ -20,7 +20,7 @@
//don't want to kick people if a lag spike results in a huge flood of commands being sent
if(cache >= MAX_KEYPRESS_AUTOKICK)
if(!keysend_tripped)
- keysend_tripped = TRUE
+ keysend_tripped = TRUE
next_keysend_trip_reset = world.time + (2 SECONDS)
else
log_admin("Client [ckey] was just autokicked for flooding keysends; likely abuse but potentially lagspike.")
@@ -35,11 +35,10 @@
message_admins("Client [ckey] just attempted to send an invalid keypress. Keymessage was over [MAX_KEYPRESS_COMMANDLENGTH] characters, autokicking due to likely abuse.")
QDEL_IN(src, 1)
return
- //offset by 1 because the buffer address is 0 indexed because the math was simpler
- keys_held[current_key_address + 1] = _key
- //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking
- keys_held[_key] = world.time
- current_key_address = ((current_key_address + 1) % HELD_KEY_BUFFER_LENGTH)
+
+ if(length(keys_held) > MAX_HELD_KEYS)
+ keys_held.Cut(1,2)
+ keys_held[_key] = TRUE
var/movement = SSinput.movement_keys[_key]
if(!(next_move_dir_sub & movement) && !keys_held["Ctrl"])
next_move_dir_add |= movement
@@ -70,11 +69,7 @@
set instant = TRUE
set hidden = TRUE
- //Can't just do a remove because it would alter the length of the rolling buffer, instead search for the key then null it out if it exists
- for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
- if(keys_held[i] == _key)
- keys_held[i] = null
- break
+ keys_held -= _key
var/movement = SSinput.movement_keys[_key]
if(!(next_move_dir_add & movement))
next_move_dir_sub |= movement
diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm
index 8433c9bf5a..9a13bfb11c 100644
--- a/code/modules/keybindings/setup.dm
+++ b/code/modules/keybindings/setup.dm
@@ -1,8 +1,6 @@
/client
- /// A rolling buffer of any keys held currently
+ /// Keys currently held
var/list/keys_held = list()
- ///used to keep track of the current rolling buffer position
- var/current_key_address = 0
/// These next two vars are to apply movement for keypresses and releases made while move delayed.
/// Because discarding that input makes the game less responsive.
/// On next move, add this dir to the move that would otherwise be done
@@ -36,10 +34,7 @@
/client/proc/set_macros()
set waitfor = FALSE
- //Reset and populate the rolling buffer
keys_held.Cut()
- for(var/i in 1 to HELD_KEY_BUFFER_LENGTH)
- keys_held += null
erase_all_macros()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 33cc2c6e20..333a7826d2 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -571,29 +571,23 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
M.show_inv(user)
/mob/proc/is_muzzled()
- return 0
+ return FALSE
/mob/Stat()
..()
- if(statpanel("Status"))
- if (client)
- stat(null, "Ping: [round(client.lastping, 1)]ms (Average: [round(client.avgping, 1)]ms)")
- stat(null, "Map: [SSmapping.config?.map_name || "Loading..."]")
- var/datum/map_config/cached = SSmapping.next_map_config
- if(cached)
- stat(null, "Next Map: [cached.map_name]")
- stat(null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]")
- stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]")
- stat(null, "Round Time: [WORLDTIME2TEXT("hh:mm:ss")]")
- stat(null, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]")
- stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
- if(SSshuttle.emergency)
- var/ETA = SSshuttle.emergency.getModeStr()
- if(ETA)
- stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]")
+ //This is only called from client/Stat(), let's assume client exists.
- if(client && client.holder)
+ if(statpanel("Status"))
+ var/list/L = list()
+ L += "Ping: [round(client.lastping,1)]ms (Avg: [round(client.avgping,1)]ms)"
+ L += SSmapping.stat_map_name
+ L += "Round ID: [GLOB.round_id || "NULL"]"
+ L += SStime_track.stat_time_text
+ L += SSshuttle.emergency_shuttle_stat_text
+ stat(null, "[L.Join("\n\n")]")
+
+ if(client.holder)
if(statpanel("MC"))
var/turf/T = get_turf(client.eye)
stat("Location:", COORD(T))
@@ -643,8 +637,6 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
if(A.IsObscured())
continue
statpanel(listed_turf.name, null, A)
-
-
if(mind)
add_spells_to_statpanel(mind.spell_list)
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index a1feb899c6..b11d1632c8 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -9,37 +9,36 @@
mob.dropItemToGround(mob.get_active_held_item())
return
-/client/proc/Move_object(direct)
+/client/proc/Move_object(direction)
if(mob && mob.control_object)
if(mob.control_object.density)
- step(mob.control_object,direct)
+ step(mob.control_object,direction)
if(!mob.control_object)
return
- mob.control_object.setDir(direct)
+ mob.control_object.setDir(direction)
else
- mob.control_object.forceMove(get_step(mob.control_object,direct))
+ mob.control_object.forceMove(get_step(mob.control_object,direction))
#define MOVEMENT_DELAY_BUFFER 0.75
#define MOVEMENT_DELAY_BUFFER_DELTA 1.25
-/client/Move(n, direct)
+/client/Move(n, direction)
if(world.time < move_delay) //do not move anything ahead of this check please
return FALSE
else
- next_move_dir_add = 0
- next_move_dir_sub = 0
+ next_move_dir_add = next_move_dir_sub = NONE
var/old_move_delay = move_delay
move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick
- if(!mob || !mob.loc)
- return FALSE
- if(!n || !direct)
+ if(!n || !direction || !mob?.loc)
return FALSE
+ //GET RID OF THIS SOON AS MOBILITY FLAGS IS DONE
if(mob.notransform)
- return FALSE //This is sota the goto stop mobs from moving var
+ return FALSE
+
if(mob.control_object)
- return Move_object(direct)
+ return Move_object(direction)
if(!isliving(mob))
- return mob.Move(n, direct)
+ return mob.Move(n, direction)
if(mob.stat == DEAD)
mob.ghostize()
return FALSE
@@ -48,29 +47,29 @@
var/mob/living/L = mob //Already checked for isliving earlier
if(L.incorporeal_move) //Move though walls
- Process_Incorpmove(direct)
+ Process_Incorpmove(direction)
return FALSE
if(mob.remote_control) //we're controlling something, our movement is relayed to it
- return mob.remote_control.relaymove(mob, direct)
+ return mob.remote_control.relaymove(mob, direction)
if(isAI(mob))
- return AIMove(n,direct,mob)
+ return AIMove(n,direction,mob)
if(Process_Grab()) //are we restrained by someone's grip?
return
if(mob.buckled) //if we're buckled to something, tell it we moved.
- return mob.buckled.relaymove(mob, direct)
+ return mob.buckled.relaymove(mob, direction)
if(!mob.canmove)
return FALSE
if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved
var/atom/O = mob.loc
- return O.relaymove(mob, direct)
+ return O.relaymove(mob, direction)
- if(!mob.Process_Spacemove(direct))
+ if(!mob.Process_Spacemove(direction))
return FALSE
//We are now going to move
var/add_delay = mob.movement_delay()
@@ -85,16 +84,16 @@
if(L.confused > 40)
newdir = pick(GLOB.alldirs)
else if(prob(L.confused * 1.5))
- newdir = angle2dir(dir2angle(direct) + pick(90, -90))
+ newdir = angle2dir(dir2angle(direction) + pick(90, -90))
else if(prob(L.confused * 3))
- newdir = angle2dir(dir2angle(direct) + pick(45, -45))
+ newdir = angle2dir(dir2angle(direction) + pick(45, -45))
if(newdir)
- direct = newdir
- n = get_step(L, direct)
+ direction = newdir
+ n = get_step(L, direction)
. = ..()
- if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully
+ if((direction & (direction - 1)) && mob.loc == n) //moved diagonally successfully
add_delay *= 2
move_delay += add_delay
if(.) // If mob is null here, we deserve the runtime
@@ -102,7 +101,7 @@
mob.throwing.finalize(FALSE)
for(var/obj/O in mob.user_movement_hooks)
- O.intercept_user_move(direct, mob, n, oldloc)
+ O.intercept_user_move(direction, mob, n, oldloc)
var/atom/movable/P = mob.pulling
if(P && !ismob(P) && P.density)
@@ -126,22 +125,22 @@
///Process_Incorpmove
///Called by client/Move()
///Allows mobs to run though walls
-/client/proc/Process_Incorpmove(direct)
+/client/proc/Process_Incorpmove(direction)
var/turf/mobloc = get_turf(mob)
if(!isliving(mob))
return
var/mob/living/L = mob
switch(L.incorporeal_move)
if(INCORPOREAL_MOVE_BASIC)
- var/T = get_step(L,direct)
+ var/T = get_step(L,direction)
if(T)
L.forceMove(T)
- L.setDir(direct)
+ L.setDir(direction)
if(INCORPOREAL_MOVE_SHADOW)
if(prob(50))
var/locx
var/locy
- switch(direct)
+ switch(direction)
if(NORTH)
locx = mobloc.x
locy = (mobloc.y+2)
@@ -175,12 +174,12 @@
break
else
new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir)
- var/T = get_step(L,direct)
+ var/T = get_step(L,direction)
if(T)
L.forceMove(T)
- L.setDir(direct)
+ L.setDir(direction)
if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles.
- var/turf/open/floor/stepTurf = get_step(L, direct)
+ var/turf/open/floor/stepTurf = get_step(L, direction)
if(stepTurf)
for(var/obj/effect/decal/cleanable/salt/S in stepTurf)
to_chat(L, "[S] bars your passage!")
@@ -197,7 +196,7 @@
return
L.forceMove(stepTurf)
- L.setDir(direct)
+ L.setDir(direction)
return TRUE
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 531c6082b0..fe5c4a1bbf 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -237,7 +237,7 @@
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread), 1)
else //Smart spread
sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1)
-
+ before_firing(target,user)
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
firing_burst = FALSE
@@ -281,6 +281,7 @@
else
if(chambered)
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
+ before_firing(target,user)
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
return
@@ -466,6 +467,10 @@
qdel(pin)
pin = new /obj/item/firing_pin
+//Happens before the actual projectile creation
+/obj/item/gun/proc/before_firing(atom/target,mob/user)
+ return
+
/////////////
// ZOOMING //
/////////////
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
new file mode 100644
index 0000000000..b1d7ab7166
--- /dev/null
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -0,0 +1,375 @@
+#define DUEL_IDLE 1
+#define DUEL_PREPARATION 2
+#define DUEL_READY 3
+#define DUEL_COUNTDOWN 4
+#define DUEL_FIRING 5
+
+//paper rock scissors
+#define DUEL_SETTING_A "wide"
+#define DUEL_SETTING_B "cone"
+#define DUEL_SETTING_C "pinpoint"
+
+#define DUEL_HUGBOX_NONE 0 //dismember head
+#define DUEL_HUGBOX_LETHAL 1 //200 damage to chest
+#define DUEL_HUGBOX_NONLETHAL 2 //stamcrit
+
+/datum/duel
+ var/obj/item/gun/energy/dueling/gun_A
+ var/obj/item/gun/energy/dueling/gun_B
+ var/state = DUEL_IDLE
+ var/required_distance = 5
+ var/list/confirmations = list()
+ var/list/fired = list()
+ var/countdown_length = 10
+ var/countdown_step = 0
+
+/datum/duel/proc/try_begin()
+ //Check if both guns are held and if so begin.
+ var/mob/living/A = get_duelist(gun_A)
+ var/mob/living/B = get_duelist(gun_B)
+ if(!A || !B)
+ message_duelists("To begin the duel, both participants need to be holding paired dueling pistols.")
+ return
+ begin()
+
+/datum/duel/proc/begin()
+ state = DUEL_PREPARATION
+ confirmations.Cut()
+ fired.Cut()
+ countdown_step = countdown_length
+
+ message_duelists("Set your gun setting and move [required_distance] steps away from your opponent.")
+
+ START_PROCESSING(SSobj,src)
+
+/datum/duel/proc/get_duelist(obj/gun)
+ var/mob/living/G = gun.loc
+ if(!istype(G) || !G.is_holding(gun))
+ return null
+ return G
+
+/datum/duel/proc/message_duelists(message)
+ var/mob/living/LA = get_duelist(gun_A)
+ if(LA)
+ to_chat(LA,message)
+ var/mob/living/LB = get_duelist(gun_B)
+ if(LB)
+ to_chat(LB,message)
+
+/datum/duel/proc/other_gun(obj/item/gun/energy/dueling/G)
+ return G == gun_A ? gun_B : gun_A
+
+/datum/duel/proc/end()
+ message_duelists("Duel finished. Re-engaging safety.")
+ STOP_PROCESSING(SSobj,src)
+ state = DUEL_IDLE
+
+/datum/duel/process()
+ switch(state)
+ if(DUEL_PREPARATION)
+ if(check_positioning())
+ confirm_positioning()
+ else if (!get_duelist(gun_A) && !get_duelist(gun_B))
+ end()
+ if(DUEL_READY)
+ if(!check_positioning())
+ back_to_prep()
+ else if(confirmations.len == 2)
+ confirm_ready()
+ if(DUEL_COUNTDOWN)
+ if(!check_positioning())
+ back_to_prep()
+ else
+ countdown_step()
+ if(DUEL_FIRING)
+ if(check_fired())
+ end()
+
+/datum/duel/proc/back_to_prep()
+ message_duelists("Positions invalid. Please move to valid positions [required_distance] steps aways from each other to continue.")
+ state = DUEL_PREPARATION
+ confirmations.Cut()
+ countdown_step = countdown_length
+
+/datum/duel/proc/confirm_positioning()
+ message_duelists("Position confirmed. Confirm readiness by pulling the trigger once.")
+ state = DUEL_READY
+
+/datum/duel/proc/confirm_ready()
+ message_duelists("Readiness confirmed. Starting countdown. Commence firing at zero mark.")
+ state = DUEL_COUNTDOWN
+
+/datum/duel/proc/countdown_step()
+ countdown_step--
+ if(countdown_step == 0)
+ state = DUEL_FIRING
+ message_duelists("Fire!")
+ else
+ message_duelists("[countdown_step]!")
+
+/datum/duel/proc/check_fired()
+ if(fired.len == 2)
+ return TRUE
+ //Let's say if gun was dropped/stowed the user is finished
+ if(!get_duelist(gun_A))
+ return TRUE
+ if(!get_duelist(gun_B))
+ return TRUE
+ return FALSE
+
+/datum/duel/proc/check_positioning()
+ var/mob/living/A = get_duelist(gun_A)
+ var/mob/living/B = get_duelist(gun_B)
+ if(!A || !B)
+ return FALSE
+ if(!isturf(A.loc) || !isturf(B.loc))
+ return FALSE
+ if(get_dist(A,B) != required_distance)
+ return FALSE
+ for(var/turf/T in getline(get_turf(A),get_turf(B)))
+ if(is_blocked_turf(T,TRUE))
+ return FALSE
+ return TRUE
+
+/obj/item/gun/energy/dueling
+ name = "dueling pistol"
+ desc = "High-tech dueling pistol. Launches chaff and projectile according to preset settings."
+ icon_state = "dueling_pistol"
+ item_state = "gun"
+ ammo_x_offset = 2
+ w_class = WEIGHT_CLASS_SMALL
+ ammo_type = list(/obj/item/ammo_casing/energy/duel)
+ automatic_charge_overlays = FALSE
+ var/unlocked = FALSE
+ var/setting = DUEL_SETTING_A
+ var/datum/duel/duel
+ var/mutable_appearance/setting_overlay
+ var/hugbox = DUEL_HUGBOX_NONE
+
+/obj/item/gun/energy/dueling/hugbox
+ hugbox = DUEL_HUGBOX_LETHAL
+
+/obj/item/gun/energy/dueling/hugbox/stamina
+ hugbox = DUEL_HUGBOX_NONLETHAL
+
+/obj/item/gun/energy/dueling/Initialize()
+ . = ..()
+ setting_overlay = mutable_appearance(icon,setting_iconstate())
+ add_overlay(setting_overlay)
+
+/obj/item/gun/energy/dueling/proc/setting_iconstate()
+ switch(setting)
+ if(DUEL_SETTING_A)
+ return "duel_red"
+ if(DUEL_SETTING_B)
+ return "duel_green"
+ if(DUEL_SETTING_C)
+ return "duel_blue"
+ return "duel_red"
+
+/obj/item/gun/energy/dueling/attack_self(mob/living/user)
+ . = ..()
+ if(duel.state == DUEL_IDLE)
+ duel.try_begin()
+ else
+ toggle_setting(user)
+
+/obj/item/gun/energy/dueling/proc/toggle_setting(mob/living/user)
+ switch(setting)
+ if(DUEL_SETTING_A)
+ setting = DUEL_SETTING_B
+ if(DUEL_SETTING_B)
+ setting = DUEL_SETTING_C
+ if(DUEL_SETTING_C)
+ setting = DUEL_SETTING_A
+ to_chat(user,"You switch [src] setting to [setting] mode.")
+ update_icon()
+
+/obj/item/gun/energy/dueling/update_icon(force_update)
+ . = ..()
+ if(setting_overlay)
+ cut_overlay(setting_overlay)
+ setting_overlay.icon_state = setting_iconstate()
+ add_overlay(setting_overlay)
+
+/obj/item/gun/energy/dueling/Destroy()
+ . = ..()
+ if(duel.gun_A == src)
+ duel.gun_A = null
+ if(duel.gun_B == src)
+ duel.gun_B = null
+ duel = null
+
+/obj/item/gun/energy/dueling/can_trigger_gun(mob/living/user)
+ . = ..()
+ switch(duel.state)
+ if(DUEL_FIRING)
+ return . && !duel.fired[src]
+ if(DUEL_READY)
+ return .
+ else
+ to_chat(user,"[src] is locked. Wait for FIRE signal before shooting.")
+ return FALSE
+
+/obj/item/gun/energy/dueling/proc/is_duelist(mob/living/L)
+ if(!istype(L))
+ return FALSE
+ if(!L.is_holding(duel.other_gun(src)))
+ return FALSE
+ return TRUE
+
+/obj/item/gun/energy/dueling/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread)
+ if(duel.state == DUEL_READY)
+ duel.confirmations[src] = TRUE
+ to_chat(user,"You confirm your readiness.")
+ return
+ else if(!is_duelist(target)) //I kinda want to leave this out just to see someone shoot a bystander or missing.
+ to_chat(user,"[src] safety system prevents shooting anyone but your designated opponent.")
+ return
+ else
+ duel.fired[src] = TRUE
+ . = ..()
+
+/obj/item/gun/energy/dueling/before_firing(target,user)
+ var/obj/item/ammo_casing/energy/duel/D = chambered
+ D.setting = setting
+ D.hugbox = hugbox
+
+/obj/effect/temp_visual/dueling_chaff
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shield-old"
+ duration = 30
+ var/setting
+
+/obj/effect/temp_visual/dueling_chaff/update_icon()
+ . = ..()
+ switch(setting)
+ if(DUEL_SETTING_A)
+ color = "red"
+ if(DUEL_SETTING_B)
+ color = "green"
+ if(DUEL_SETTING_C)
+ color = "blue"
+
+//Casing
+
+/obj/item/ammo_casing/energy/duel
+ e_cost = 0
+ projectile_type = /obj/item/projectile/energy/duel
+ var/setting
+ var/hugbox = DUEL_HUGBOX_NONE
+
+/obj/item/ammo_casing/energy/duel/ready_proj(atom/target, mob/living/user, quiet, zone_override)
+ . = ..()
+ var/obj/item/projectile/energy/duel/D = BB
+ D.setting = setting
+ D.hugbox = hugbox
+ D.update_icon()
+
+/obj/item/ammo_casing/energy/duel/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
+ . = ..()
+ var/obj/effect/temp_visual/dueling_chaff/C = new(get_turf(user))
+ C.setting = setting
+ C.update_icon()
+
+//Projectile
+
+/obj/item/projectile/energy/duel
+ name = "dueling beam"
+ icon_state = "declone"
+ is_reflectable = FALSE
+ homing = TRUE
+ var/setting
+ var/hugbox = DUEL_HUGBOX_NONE
+
+/obj/item/projectile/energy/duel/update_icon()
+ . = ..()
+ switch(setting)
+ if(DUEL_SETTING_A)
+ color = "red"
+ if(DUEL_SETTING_B)
+ color = "green"
+ if(DUEL_SETTING_C)
+ color = "blue"
+
+/obj/item/projectile/energy/duel/on_hit(atom/target, blocked)
+ . = ..()
+ var/turf/T = get_turf(target)
+ var/obj/effect/temp_visual/dueling_chaff/C = locate() in T
+ if(C)
+ var/counter_setting
+ switch(setting)
+ if(DUEL_SETTING_A)
+ counter_setting = DUEL_SETTING_B
+ if(DUEL_SETTING_B)
+ counter_setting = DUEL_SETTING_C
+ if(DUEL_SETTING_C)
+ counter_setting = DUEL_SETTING_A
+ if(C.setting == counter_setting)
+ return BULLET_ACT_BLOCK
+
+ var/mob/living/L = target
+ if(!istype(target))
+ return BULLET_ACT_BLOCK
+
+ switch(hugbox)
+ if(DUEL_HUGBOX_NONE)
+ var/obj/item/bodypart/B = L.get_bodypart(BODY_ZONE_HEAD)
+ B.dismember()
+ qdel(B)
+ if(DUEL_HUGBOX_LETHAL)
+ L.adjustBruteLoss(180)
+ L.death() //Die, powergamers.
+ if(DUEL_HUGBOX_NONLETHAL)
+ L.adjustStaminaLoss(200, forced = TRUE) //Die, powergamers x 2
+ L.Knockdown(100, override_hardstun = 100) //For good measure.
+
+//Storage case.
+/obj/item/storage/lockbox/dueling
+ name = "dueling pistol case"
+ desc = "Let's solve this like gentlespacemen."
+ icon_state = "medalbox+l"
+ item_state = "syringe_kit"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ w_class = WEIGHT_CLASS_NORMAL
+ req_access = list(ACCESS_CAPTAIN)
+ icon_locked = "medalbox+l"
+ icon_closed = "medalbox"
+ icon_broken = "medalbox+b"
+ var/gun_type = /obj/item/gun/energy/dueling
+
+/obj/item/storage/lockbox/dueling/ComponentInitialize()
+ . = ..()
+ var/datum/component/storage/STR = GetComponent(/datum/component/storage)
+ STR.max_w_class = WEIGHT_CLASS_SMALL
+ STR.max_items = 2
+ STR.can_hold = typecacheof(/obj/item/gun/energy/dueling)
+
+/obj/item/storage/lockbox/dueling/update_icon()
+ cut_overlays()
+ var/locked = SEND_SIGNAL(src, COMSIG_IS_STORAGE_LOCKED)
+ if(locked)
+ icon_state = "medalbox+l"
+ else
+ icon_state = "medalbox"
+ if(open)
+ icon_state += "open"
+ if(broken)
+ icon_state += "+b"
+
+/obj/item/storage/lockbox/dueling/PopulateContents()
+ . = ..()
+ var/obj/item/gun/energy/dueling/gun_A = new gun_type(src)
+ var/obj/item/gun/energy/dueling/gun_B = new gun_type(src)
+ var/datum/duel/D = new
+ gun_A.duel = D
+ gun_B.duel = D
+ D.gun_A = gun_A
+ D.gun_B = gun_B
+
+/obj/item/storage/lockbox/dueling/hugbox
+ gun_type = /obj/item/gun/energy/dueling/hugbox
+
+/obj/item/storage/lockbox/dueling/hugbox/stamina
+ gun_type = /obj/item/gun/energy/dueling/hugbox/stamina
diff --git a/code/modules/vending/sovietvend.dm b/code/modules/vending/sovietvend.dm
index 086b37e4ee..5157f68410 100644
--- a/code/modules/vending/sovietvend.dm
+++ b/code/modules/vending/sovietvend.dm
@@ -15,10 +15,9 @@
/obj/item/clothing/head/russobluecamohat = 20
)
contraband = list(
- /obj/item/clothing/under/syndicate/tacticool = 4,
+ /obj/item/clothing/suit/armor/vest/russian_coat = 4,
/obj/item/clothing/mask/balaclava = 4,
- /obj/item/clothing/suit/russofurcoat = 4,
- /obj/item/clothing/head/russofurhat = 4,
+ /obj/item/clothing/head/helmet/rus_ushanka = 4,
/obj/item/clothing/suit/space/hardsuit/soviet = 3,
/obj/item/gun/energy/laser/LaserAK = 4
)
diff --git a/html/changelogs/AutoChangeLog-pr-10746.yml b/html/changelogs/AutoChangeLog-pr-10746.yml
new file mode 100644
index 0000000000..232c7a26b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10746.yml
@@ -0,0 +1,4 @@
+author: "kevinz000"
+delete-after: True
+changes:
+ - rscadd: "CTF CLAYMORES"
diff --git a/html/changelogs/AutoChangeLog-pr-10749.yml b/html/changelogs/AutoChangeLog-pr-10749.yml
new file mode 100644
index 0000000000..a3ed5989d1
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10749.yml
@@ -0,0 +1,4 @@
+author: "AnturK ported by kevinz000"
+delete-after: True
+changes:
+ - rscadd: "Dueling pistols have been added."
diff --git a/html/changelogs/AutoChangeLog-pr-10773.yml b/html/changelogs/AutoChangeLog-pr-10773.yml
new file mode 100644
index 0000000000..64ab5ce124
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10773.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Hypno prefs work better."
diff --git a/html/changelogs/AutoChangeLog-pr-9860.yml b/html/changelogs/AutoChangeLog-pr-9860.yml
new file mode 100644
index 0000000000..c9d75aa7b9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-9860.yml
@@ -0,0 +1,5 @@
+author: "tralezab, bandit, Skoglol"
+delete-after: True
+changes:
+ - rscadd: "The mime's PDA messages are silent now!"
+ - rscadd: "30 new emoji have been added. Mime buff, mime now OP."
diff --git a/icons/emoji.dmi b/icons/emoji.dmi
index 925b072a5f..931cb7a916 100644
Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index b0ea63611d..69d8966329 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi
index 3b86511013..0b8c495c5a 100644
Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 901adb905d..ce458a1de3 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index bba3efc951..c30e8aa6bd 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/pda_icons/pda_emoji.png b/icons/pda_icons/pda_emoji.png
new file mode 100644
index 0000000000..39f789f520
Binary files /dev/null and b/icons/pda_icons/pda_emoji.png differ
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 89086ab1e5..82f4fbf1d9 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -211,10 +211,10 @@
/mob/living/verb/toggle_hypno()
set category = "IC"
- set name = "Toggle Lewd MKUltra"
- set desc = "Allows you to toggle if you'd like lewd flavour messages for MKUltra."
+ set name = "Toggle Lewd Hypno"
+ set desc = "Allows you to toggle if you'd like lewd flavour messages for hypno features, such as MKUltra."
client.prefs.cit_toggles ^= HYPNO
- to_chat(usr, "You [((client.prefs.cit_toggles & HYPNO) ?"will":"no longer")] receive lewd flavour messages for MKUltra.")
+ to_chat(usr, "You [((client.prefs.cit_toggles & HYPNO) ?"will":"no longer")] receive lewd flavour messages for hypno.")
/datum/status_effect/chem/enthrall
id = "enthrall"
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 8b5e8f6522..92a1b26f01 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -488,3 +488,9 @@ datum/gear/darksabresheath
category = SLOT_SHOES
path = /obj/item/clothing/shoes/sneakers/mikuleggings
ckeywhitelist = list("grandvegeta")
+
+/datum/gear/cosmos
+ name = "cosmic space bedsheet"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/bedsheet/cosmos
+ ckeywhitelist = list("grunnyyy")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 86325faa91..f935fc5092 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -333,6 +333,8 @@ Creating a chem with a low purity will make you permanently fall in love with so
..()
/datum/reagent/fermi/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
+ if(Lover.client?.prefs.cit_toggles & NEVER_HYPNO)
+ return // doesn't even give a message, it's just ignored
if(Lover.has_status_effect(STATUS_EFFECT_INLOVE))
to_chat(Lover, "You are already fully devoted to someone else!")
return
diff --git a/modular_citadel/icons/mob/citadel/uniforms.dmi b/modular_citadel/icons/mob/citadel/uniforms.dmi
index 855872e9ab..717999c9f0 100644
Binary files a/modular_citadel/icons/mob/citadel/uniforms.dmi and b/modular_citadel/icons/mob/citadel/uniforms.dmi differ
diff --git a/modular_citadel/icons/obj/clothing/vg_clothes.dmi b/modular_citadel/icons/obj/clothing/vg_clothes.dmi
deleted file mode 100644
index a1d25aebf5..0000000000
Binary files a/modular_citadel/icons/obj/clothing/vg_clothes.dmi and /dev/null differ
diff --git a/tgstation.dme b/tgstation.dme
index 5a8549e27f..ee457b102e 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1631,12 +1631,10 @@
#include "code\modules\clothing\glasses\engine_goggles.dm"
#include "code\modules\clothing\glasses\hud.dm"
#include "code\modules\clothing\glasses\phantomthief.dm"
-#include "code\modules\clothing\glasses\vg_glasses.dm"
#include "code\modules\clothing\gloves\_gloves.dm"
#include "code\modules\clothing\gloves\boxing.dm"
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
-#include "code\modules\clothing\gloves\vg_gloves.dm"
#include "code\modules\clothing\head\_head.dm"
#include "code\modules\clothing\head\beanie.dm"
#include "code\modules\clothing\head\cit_hats.dm"
@@ -1647,14 +1645,12 @@
#include "code\modules\clothing\head\misc.dm"
#include "code\modules\clothing\head\misc_special.dm"
#include "code\modules\clothing\head\soft_caps.dm"
-#include "code\modules\clothing\head\vg_hats.dm"
#include "code\modules\clothing\masks\_masks.dm"
#include "code\modules\clothing\masks\boxing.dm"
#include "code\modules\clothing\masks\breath.dm"
#include "code\modules\clothing\masks\gasmask.dm"
#include "code\modules\clothing\masks\hailer.dm"
#include "code\modules\clothing\masks\miscellaneous.dm"
-#include "code\modules\clothing\masks\vg_masks.dm"
#include "code\modules\clothing\neck\_neck.dm"
#include "code\modules\clothing\outfits\ert.dm"
#include "code\modules\clothing\outfits\event.dm"
@@ -1668,14 +1664,12 @@
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
#include "code\modules\clothing\shoes\taeclowndo.dm"
-#include "code\modules\clothing\shoes\vg_shoes.dm"
#include "code\modules\clothing\spacesuits\_spacesuits.dm"
#include "code\modules\clothing\spacesuits\chronosuit.dm"
#include "code\modules\clothing\spacesuits\hardsuit.dm"
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\plasmamen.dm"
#include "code\modules\clothing\spacesuits\syndi.dm"
-#include "code\modules\clothing\spacesuits\vg_spess.dm"
#include "code\modules\clothing\suits\_suits.dm"
#include "code\modules\clothing\suits\armor.dm"
#include "code\modules\clothing\suits\bio.dm"
@@ -1686,7 +1680,6 @@
#include "code\modules\clothing\suits\reactive_armour.dm"
#include "code\modules\clothing\suits\toggles.dm"
#include "code\modules\clothing\suits\utility.dm"
-#include "code\modules\clothing\suits\vg_suits.dm"
#include "code\modules\clothing\suits\wiz_robe.dm"
#include "code\modules\clothing\under\_under.dm"
#include "code\modules\clothing\under\accessories.dm"
@@ -1697,7 +1690,6 @@
#include "code\modules\clothing\under\shorts.dm"
#include "code\modules\clothing\under\syndicate.dm"
#include "code\modules\clothing\under\trek.dm"
-#include "code\modules\clothing\under\vg_under.dm"
#include "code\modules\clothing\under\jobs\civilian.dm"
#include "code\modules\clothing\under\jobs\engineering.dm"
#include "code\modules\clothing\under\jobs\medsci.dm"
@@ -2629,6 +2621,7 @@
#include "code\modules\projectiles\guns\ballistic\revolver.dm"
#include "code\modules\projectiles\guns\ballistic\shotgun.dm"
#include "code\modules\projectiles\guns\ballistic\toy.dm"
+#include "code\modules\projectiles\guns\energy\dueling.dm"
#include "code\modules\projectiles\guns\energy\energy_gun.dm"
#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"