diff --git a/baystation12.dme b/baystation12.dme
index ca75948dfff..9d315198985 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -759,6 +759,7 @@
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
+#include "code\game\objects\structures\fireaxe_cabinet.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\grille.dm"
@@ -791,7 +792,6 @@
#include "code\game\objects\structures\crates_lockers\largecrate.dm"
#include "code\game\objects\structures\crates_lockers\closets\coffin.dm"
#include "code\game\objects\structures\crates_lockers\closets\crittercrate.dm"
-#include "code\game\objects\structures\crates_lockers\closets\fireaxe.dm"
#include "code\game\objects\structures\crates_lockers\closets\fitness.dm"
#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm"
#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm"
@@ -994,6 +994,7 @@
#include "code\modules\client\preference_setup\skills\skills.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
+#include "code\modules\clothing\clothing_accessories.dm"
#include "code\modules\clothing\ears\skrell.dm"
#include "code\modules\clothing\glasses\glasses.dm"
#include "code\modules\clothing\glasses\hud.dm"
diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm
index 6fc2b923dd1..26740301ff1 100644
--- a/code/ATMOSPHERICS/_atmospherics_helpers.dm
+++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm
@@ -15,7 +15,7 @@
/obj/machinery/atmospherics/var/debug = 0
-/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in view())
+/client/proc/atmos_toggle_debug(var/obj/machinery/atmospherics/M in range(world.view))
set name = "Toggle Debug Messages"
set category = "Debug"
M.debug = !M.debug
diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 827737cf92a..7e2f316cc07 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -83,7 +83,7 @@ var/list/be_special_flags = list(
#define MODE_MALFUNCTION "malf"
#define MODE_TRAITOR "traitor"
-#define DEFAULT_TELECRYSTAL_AMOUNT 12
+#define DEFAULT_TELECRYSTAL_AMOUNT 25
/////////////////
////WIZARD //////
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index d138d581987..2a3c845bb71 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -128,8 +128,19 @@
#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6)
#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3)
+#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6)
+#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3)
+
+// Incapacitation flags, used by the mob/proc/incapacitated() proc
+#define INCAPACITATION_RESTRAINED 1
+#define INCAPACITATION_BUCKLED_PARTIALLY 2
+#define INCAPACITATION_BUCKLED_FULLY 4
+
+#define INCAPACITATION_DEFAULT (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY)
+#define INCAPACITATION_ALL (INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY)
#define MOB_PULL_NONE 0
#define MOB_PULL_SMALLER 1
#define MOB_PULL_SAME 2
-#define MOB_PULL_LARGER 3
\ No newline at end of file
+#define MOB_PULL_LARGER 3
+
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 9dec281ed86..fb00b9e9e68 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -6,6 +6,8 @@ var/list/gamemode_cache = list()
var/nudge_script_path = "nudge.py" // where the nudge.py script is located
+ var/list/lobby_screens = list("title") // Which lobby screens are available
+
var/log_ooc = 0 // log OOC channel
var/log_access = 0 // log login/logout
var/log_say = 0 // log client say
@@ -699,6 +701,9 @@ var/list/gamemode_cache = list()
if(values.len > 0)
language_prefixes = values
+ if ("lobby_screens")
+ config.lobby_screens = text2list(value, ";")
+
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 14f032ab9ad..eba0fe047ce 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -170,8 +170,8 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/toolbox/emergency,
/obj/item/clothing/suit/storage/hazardvest,
/obj/item/clothing/suit/storage/hazardvest,
- /obj/item/clothing/suit/storage/vest,
- /obj/item/clothing/suit/storage/vest,
+ /obj/item/clothing/suit/armor/vest,
+ /obj/item/clothing/suit/armor/vest,
/obj/item/weapon/tank/emergency_oxygen/engi,
/obj/item/weapon/tank/emergency_oxygen/engi,
/obj/item/weapon/tank/emergency_oxygen/engi,
@@ -717,7 +717,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/gun/projectile/sec,
/obj/item/weapon/gun/projectile/sec,
/obj/item/weapon/storage/box/flashbangs,
- /obj/item/weapon/storage/box/flashbangs)
+ /obj/item/weapon/storage/box/teargas)
cost = 40
containertype = /obj/structure/closet/crate/secure/weapon
containername = "Weapons crate"
@@ -752,17 +752,14 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/datum/supply_packs/randomised/armor
num_contained = 5
- contains = list(/obj/item/clothing/suit/storage/vest,
- /obj/item/clothing/suit/storage/vest/officer,
- /obj/item/clothing/suit/storage/vest/warden,
+ contains = list(/obj/item/clothing/suit/armor/vest,
+ /obj/item/clothing/suit/armor/vest/security,
+ /obj/item/clothing/suit/armor/vest/detective,
/obj/item/clothing/suit/storage/vest/hos,
/obj/item/clothing/suit/storage/vest/pcrc,
- /obj/item/clothing/suit/storage/vest/detective,
- /obj/item/clothing/suit/storage/vest/heavy,
- /obj/item/clothing/suit/storage/vest/heavy/officer,
- /obj/item/clothing/suit/storage/vest/heavy/warden,
- /obj/item/clothing/suit/storage/vest/heavy/hos,
- /obj/item/clothing/suit/storage/vest/heavy/pcrc)
+ /obj/item/clothing/suit/storage/vest/warden,
+ /obj/item/clothing/suit/storage/vest/officer,
+ /obj/item/clothing/suit/storage/vest)
name = "Armor crate"
cost = 40
@@ -790,6 +787,7 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/suit/armor/riot,
/obj/item/weapon/storage/box/flashbangs,
+ /obj/item/weapon/storage/box/teargas,
/obj/item/weapon/storage/box/beanbags,
/obj/item/weapon/storage/box/handcuffs)
cost = 60
@@ -1286,14 +1284,6 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
group = "Security"
access = access_armory
contains = list(/obj/item/clothing/under/tactical,
- /obj/item/clothing/suit/armor/tactical,
- /obj/item/clothing/head/helmet/tactical,
- /obj/item/clothing/mask/balaclava/tactical,
- /obj/item/clothing/glasses/sunglasses/sechud/tactical,
- /obj/item/weapon/storage/belt/security/tactical,
- /obj/item/clothing/shoes/jackboots,
- /obj/item/clothing/gloves/black,
- /obj/item/clothing/under/tactical,
/obj/item/clothing/suit/armor/tactical,
/obj/item/clothing/head/helmet/tactical,
/obj/item/clothing/mask/balaclava/tactical,
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index 7315eb418ff..2460345a34d 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -45,7 +45,7 @@ var/datum/antagonist/mercenary/mercs
player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack)
if (player.mind == leader)
- var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, 40)
+ var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT * 4)
player.put_in_hands(U)
player.update_icons()
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index f4b06aff1c1..04c4ecc5013 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -12,12 +12,12 @@ var/global/list/minor_air_alarms = list()
icon_screen = "alert:0"
light_color = "#e6ffff"
-/obj/machinery/computer/atmos_alert/New()
+/obj/machinery/computer/atmos_alert/initialize()
..()
- atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon)
+ if(atmosphere_alarm) atmosphere_alarm.register(src, /obj/machinery/computer/station_alert/update_icon)
/obj/machinery/computer/atmos_alert/Destroy()
- atmosphere_alarm.unregister(src)
+ if(atmosphere_alarm) atmosphere_alarm.unregister(src)
..()
/obj/machinery/computer/atmos_alert/attack_hand(mob/user)
diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm
index 9267f1edbeb..7298b62abf9 100644
--- a/code/game/machinery/floor_light.dm
+++ b/code/game/machinery/floor_light.dm
@@ -19,6 +19,9 @@ var/list/floor_light_cache = list()
var/default_light_power = 2
var/default_light_colour = "#FFFFFF"
+/obj/machinery/floor_light/prebuilt
+ anchored = 1
+
/obj/machinery/floor_light/attackby(var/obj/item/W, var/mob/user)
if(istype(W, /obj/item/weapon/screwdriver))
anchored = !anchored
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index 5f57174074a..d7c037839d8 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -146,22 +146,15 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
/obj/machinery/hologram/holopad/process()
for (var/mob/living/silicon/ai/master in masters)
- var/active_ai = (master && !master.stat && master.client && master.eyeobj)//If there is an AI attached, it's not incapacitated, it has a client, and the client eye is centered on the projector.
+ var/active_ai = (master && !master.incapacitated() && master.client && master.eyeobj)//If there is an AI with an eye attached, it's not incapacitated, and it has a client
if((stat & NOPOWER) || !active_ai)
clear_holo(master)
continue
- if((HOLOPAD_MODE == RANGE_BASED && (get_dist(master.eyeobj, src) > holo_range)))
+ if(!(masters[master] in view(src)))
clear_holo(master)
continue
- if(HOLOPAD_MODE == AREA_BASED)
- var/area/holo_area = get_area(src)
- var/area/eye_area = get_area(master.eyeobj)
- if(eye_area != holo_area)
- clear_holo(master)
- continue
-
use_power(power_per_hologram)
return 1
@@ -169,8 +162,21 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
if(masters[user])
step_to(masters[user], user.eyeobj) // So it turns.
var/obj/effect/overlay/H = masters[user]
- H.loc = get_turf(user.eyeobj)
+ H.forceMove(get_turf(user.eyeobj))
masters[user] = H
+
+ if(!(H in view(src)))
+ clear_holo(user)
+ return 0
+
+ if((HOLOPAD_MODE == RANGE_BASED && (get_dist(user.eyeobj, src) > holo_range)))
+ clear_holo(user)
+
+ if(HOLOPAD_MODE == AREA_BASED)
+ var/area/holo_area = get_area(src)
+ var/area/hologram_area = get_area(H)
+ if(hologram_area != holo_area)
+ clear_holo(user)
return 1
/*
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index ef72e18f0ff..1a686c27d3b 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -828,7 +828,7 @@
icon_state = "sec"
icon_deny = "sec-deny"
req_access = list(access_security)
- products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash = 5,
+ products = list(/obj/item/weapon/handcuffs = 8,/obj/item/weapon/grenade/flashbang = 4,/obj/item/weapon/grenade/chem_grenade/teargas = 4,/obj/item/device/flash = 5,
/obj/item/weapon/reagent_containers/food/snacks/donut/normal = 12,/obj/item/weapon/storage/box/evidence = 6)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/box/donut = 2)
diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm
index 2d3034573a4..efcd660b615 100644
--- a/code/game/mecha/combat/durand.dm
+++ b/code/game/mecha/combat/durand.dm
@@ -12,7 +12,7 @@
infra_luminosity = 8
force = 40
var/defence = 0
- var/defence_deflect = 35
+ var/def_boost = 15
wreckage = /obj/effect/decal/mecha_wreckage/durand
/*
@@ -43,10 +43,10 @@
return
defence = !defence
if(defence)
- deflect_chance = defence_deflect
+ deflect_chance += def_boost
src.occupant_message("You enable [src] defence mode.")
else
- deflect_chance = initial(deflect_chance)
+ deflect_chance -= def_boost
src.occupant_message("You disable [src] defence mode.")
src.log_message("Toggled defence mode.")
return
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index eadc96aadd1..ae383d00c47 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -42,15 +42,8 @@
ME.attach(src)
return
-/obj/mecha/combat/gygax/dark/add_cell(var/obj/item/weapon/cell/C=null)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new(src)
- cell.charge = 30000
- cell.maxcharge = 30000
-
+/obj/mecha/combat/gygax/dark/add_cell()
+ cell = new /obj/item/weapon/cell/hyper(src)
/obj/mecha/combat/gygax/verb/overload()
set category = "Exosuit Interface"
@@ -72,7 +65,7 @@
src.log_message("Toggled leg actuators overload.")
return
-/obj/mecha/combat/gygax/dyndomove(direction)
+/obj/mecha/combat/gygax/do_move(direction)
if(!..()) return
if(overload)
health--
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 5b456e09005..ffbd913b3d5 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -51,7 +51,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src)
ME.attach(src)
src.smoke_system.set_up(3, 0, src)
src.smoke_system.attach(src)
@@ -62,7 +62,7 @@
var/obj/item/mecha_parts/mecha_equipment/ME
if(equipment.len)//Now to remove it and equip anew.
for(ME in equipment)
- equipment -= ME
+ ME.detach(src)
qdel(ME)
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
ME.attach(src)
@@ -72,7 +72,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
ME.attach(src)
- ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
+ ME = new /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster(src)
ME.attach(src)
return
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index db1cb3d004f..c9974cb76df 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -17,11 +17,11 @@
/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(target=1)
- sleep(equip_cooldown)
- set_ready_state(1)
- if(target && chassis)
- return 1
- return 0
+ spawn(equip_cooldown)
+ set_ready_state(1)
+ if(target && chassis)
+ return 1
+ return 0
/obj/item/mecha_parts/mecha_equipment/New()
diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm
index 7139a52cb39..1695638721f 100644
--- a/code/game/mecha/equipment/tools/tools.dm
+++ b/code/game/mecha/equipment/tools/tools.dm
@@ -495,123 +495,93 @@
return
-/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
+/obj/item/mecha_parts/mecha_equipment/armor_booster
+ name = "armor booster"
+ desc = "Powered armor-enhancing mech equipment."
+ icon_state = "mecha_abooster_proj"
+ equip_cooldown = 10
+ energy_drain = 50
+ range = 0
+ var/deflect_coeff = 1
+ var/damage_coeff = 1
+ var/melee
+
+ attach(obj/mecha/M as obj)
+ ..()
+ activate_boost()
+ return
+
+ detach()
+ if(equip_ready)
+ deactivate_boost()
+ ..()
+ return
+
+ get_equip_info()
+ if(!chassis) return
+ return "* [src.name]"
+
+ proc/activate_boost()
+ if(!src.chassis)
+ return 0
+ return 1
+
+ proc/deactivate_boost()
+ if(!src.chassis)
+ return 0
+ return 1
+
+ set_ready_state(state)
+ if(state && !equip_ready)
+ activate_boost()
+ else if(equip_ready)
+ deactivate_boost()
+ ..()
+
+
+/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster //what is that noise? A BAWWW from TK mutants.
name = "\improper CCW armor booster"
desc = "Close-combat armor booster. Boosts exosuit armor against armed melee attacks. Requires energy to operate."
icon_state = "mecha_abooster_ccw"
origin_tech = list(TECH_MATERIAL = 3)
- equip_cooldown = 10
- energy_drain = 50
- range = 0
- var/deflect_coeff = 1.15
- var/damage_coeff = 0.8
+ deflect_coeff = 1.15
+ damage_coeff = 0.8
+ melee = 1
- can_attach(obj/mecha/M as obj)
+ activate_boost()
if(..())
- if(!M.proc_res["dynattackby"])
- return 1
- return 0
-
- attach(obj/mecha/M as obj)
- ..()
- chassis.proc_res["dynattackby"] = src
- return
-
- detach()
- chassis.proc_res["dynattackby"] = null
- ..()
- return
-
- get_equip_info()
- if(!chassis) return
- return "* [src.name]"
-
- proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
- if(!action_checks(user))
- return chassis.dynattackby(W,user)
- chassis.log_message("Attacked by [W]. Attacker - [user]")
- if(prob(chassis.deflect_chance*deflect_coeff))
- user << "\The [W] bounces off [chassis] armor."
- chassis.log_append_to_last("Armor saved.")
- else
- chassis.occupant_message("\The [user] hits [chassis] with [W].")
- user.visible_message("\The [user] hits [chassis] with [W].", "You hit [src] with [W].")
- chassis.take_damage(round(W.force*damage_coeff),W.damtype)
- chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- set_ready_state(0)
- chassis.use_power(energy_drain)
- do_after_cooldown()
- return
+ chassis.m_deflect_coeff *= deflect_coeff
+ chassis.m_damage_coeff *= damage_coeff
+ chassis.mhit_power_use += energy_drain
-/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
+ deactivate_boost()
+ if(..())
+ chassis.m_deflect_coeff /= deflect_coeff
+ chassis.m_damage_coeff /= damage_coeff
+ chassis.mhit_power_use -= energy_drain
+
+
+/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster
name = "\improper RW armor booster"
desc = "Ranged-weaponry armor booster. Boosts exosuit armor against ranged attacks. Completely blocks taser shots, but requires energy to operate."
icon_state = "mecha_abooster_proj"
origin_tech = list(TECH_MATERIAL = 4)
- equip_cooldown = 10
- energy_drain = 50
- range = 0
- var/deflect_coeff = 1.15
- var/damage_coeff = 0.8
+ deflect_coeff = 1.15
+ damage_coeff = 0.8
+ melee = 0
- can_attach(obj/mecha/M as obj)
+ activate_boost()
if(..())
- if(!M.proc_res["dynbulletdamage"] && !M.proc_res["dynhitby"])
- return 1
- return 0
+ chassis.r_deflect_coeff *= deflect_coeff
+ chassis.r_damage_coeff *= damage_coeff
+ chassis.rhit_power_use += energy_drain
- attach(obj/mecha/M as obj)
- ..()
- chassis.proc_res["dynbulletdamage"] = src
- chassis.proc_res["dynhitby"] = src
- return
-
- detach()
- chassis.proc_res["dynbulletdamage"] = null
- chassis.proc_res["dynhitby"] = null
- ..()
- return
-
- get_equip_info()
- if(!chassis) return
- return "* [src.name]"
-
- proc/dynbulletdamage(var/obj/item/projectile/Proj)
- if(!action_checks(src))
- return chassis.dynbulletdamage(Proj)
- if(prob(chassis.deflect_chance*deflect_coeff))
- chassis.occupant_message("The armor deflects incoming projectile.")
- chassis.visible_message("The [chassis.name] armor deflects the projectile")
- chassis.log_append_to_last("Armor saved.")
- else
- chassis.take_damage(round(Proj.damage*src.damage_coeff),Proj.check_armour)
- chassis.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- Proj.on_hit(chassis)
- set_ready_state(0)
- chassis.use_power(energy_drain)
- do_after_cooldown()
- return
-
- proc/dynhitby(atom/movable/A)
- if(!action_checks(A))
- return chassis.dynhitby(A)
- if(prob(chassis.deflect_chance*deflect_coeff) || istype(A, /mob/living) || istype(A, /obj/item/mecha_parts/mecha_tracking))
- chassis.occupant_message("The [A] bounces off the armor.")
- chassis.visible_message("The [A] bounces off the [chassis] armor")
- chassis.log_append_to_last("Armor saved.")
- if(istype(A, /mob/living))
- var/mob/living/M = A
- M.take_organ_damage(10)
- else if(istype(A, /obj))
- var/obj/O = A
- if(O.throwforce)
- chassis.take_damage(round(O.throwforce*damage_coeff))
- chassis.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- set_ready_state(0)
- chassis.use_power(energy_drain)
- do_after_cooldown()
- return
+ deactivate_boost()
+ if(..())
+ chassis.r_deflect_coeff /= deflect_coeff
+ chassis.r_damage_coeff /= damage_coeff
+ chassis.rhit_power_use -= energy_drain
/obj/item/mecha_parts/mecha_equipment/repair_droid
@@ -733,35 +703,13 @@
detach()
pr_energy_relay.stop()
-// chassis.proc_res["dynusepower"] = null
- chassis.proc_res["dyngetcharge"] = null
..()
return
attach(obj/mecha/M)
..()
- chassis.proc_res["dyngetcharge"] = src
-// chassis.proc_res["dynusepower"] = src
return
- can_attach(obj/mecha/M)
- if(..())
- if(!M.proc_res["dyngetcharge"])// && !M.proc_res["dynusepower"])
- return 1
- return 0
-
- proc/dyngetcharge()
- if(equip_ready) //disabled
- return chassis.dyngetcharge()
- var/area/A = get_area(chassis)
- var/pow_chan = get_power_channel(A)
- var/charge = 0
- if(pow_chan)
- charge = 1000 //making magic
- else
- return chassis.dyngetcharge()
- return charge
-
proc/get_power_channel(var/area/A)
var/pow_chan
if(A)
@@ -786,15 +734,6 @@
if(!chassis) return
return "* [src.name] - [pr_energy_relay.active()?"Dea":"A"]ctivate"
-/* proc/dynusepower(amount)
- if(!equip_ready) //enabled
- var/area/A = get_area(chassis)
- var/pow_chan = get_power_channel(A)
- if(pow_chan)
- A.master.use_power(amount*coeff, pow_chan)
- return 1
- return chassis.dynusepower(amount)*/
-
/datum/global_iterator/mecha_energy_relay
process(var/obj/item/mecha_parts/mecha_equipment/tesla_energy_relay/ER)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index a5f07808e83..ebce14fd5e8 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -25,7 +25,15 @@
var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South.
var/step_energy_drain = 10
var/health = 300 //health is health
- var/deflect_chance = 10 //chance to deflect the incoming projectiles, hits, or lesser the effect of ex_act.
+ var/deflect_chance = 10 //chance to deflect incoming projectiles, hits, or lesser the effect of ex_act.
+ var/r_deflect_coeff = 1
+ var/m_deflect_coeff = 1
+ //ranged and melee damage multipliers
+ var/r_damage_coeff = 1
+ var/m_damage_coeff = 1
+ var/rhit_power_use = 0
+ var/mhit_power_use = 0
+
//the values in this list show how much damage will pass through, not how much will be absorbed.
var/list/damage_absorption = list("brute"=0.8,"fire"=1.2,"bullet"=0.9,"laser"=1,"energy"=1,"bomb"=1)
var/obj/item/weapon/cell/cell
@@ -35,7 +43,6 @@
var/add_req_access = 1
var/maint_access = 1
var/dna //dna-locking the mech
- var/list/proc_res = list() //stores proc owners, like proc_res["functionname"] = owner reference
var/datum/effect/effect/system/spark_spread/spark_system = new
var/lights = 0
var/lights_power = 6
@@ -86,9 +93,7 @@
icon_state += "-open"
add_radio()
add_cabin()
- if(!add_airtank()) //we check this here in case mecha does not have an internal tank available by default - WIP
- removeVerb(/obj/mecha/verb/connect_to_port)
- removeVerb(/obj/mecha/verb/toggle_internal_tank)
+ add_airtank() //All mecha currently have airtanks. No need to check unless changes are made.
spark_system.set_up(2, 0, src)
spark_system.attach(src)
add_cell()
@@ -166,15 +171,8 @@
internal_tank = new /obj/machinery/portable_atmospherics/canister/air(src)
return internal_tank
-/obj/mecha/proc/add_cell(var/obj/item/weapon/cell/C=null)
- if(C)
- C.forceMove(src)
- cell = C
- return
- cell = new(src)
- cell.name = "high-capacity power cell"
- cell.charge = 15000
- cell.maxcharge = 15000
+/obj/mecha/proc/add_cell()
+ cell = new /obj/item/weapon/cell/mecha(src)
/obj/mecha/proc/add_cabin()
cabin_air = new
@@ -192,7 +190,7 @@
/obj/mecha/proc/add_iterators()
pr_int_temp_processor = new /datum/global_iterator/mecha_preserve_temp(list(src))
- pr_inertial_movement = new /datum/global_iterator/mecha_intertial_movement(null,0)
+ pr_inertial_movement = new /datum/global_iterator/mecha_inertial_movement(null,0)
pr_give_air = new /datum/global_iterator/mecha_tank_give_air(list(src))
pr_internal_damage = new /datum/global_iterator/mecha_internal_damage(list(src),0)
@@ -281,12 +279,12 @@
if(!src.occupant || src.occupant != user ) return
if(user.stat) return
if(state)
- occupant_message("Maintenance protocols in effect")
+ occupant_message("Maintenance protocols in effect.")
return
if(!get_charge()) return
if(src == target) return
var/dir_to_target = get_dir(src,target)
- if(dir_to_target && !(dir_to_target & src.dir))//wrong direction
+ if(dir_to_target && !(dir_to_target & src.dir))
return
if(hasInternalDamage(MECHA_INT_CONTROL_LOST))
target = safepick(view(3,target))
@@ -352,18 +350,15 @@
return 0
if(connected_port)
if(world.time - last_message > 20)
- src.occupant_message("Unable to move while connected to the air system port")
+ src.occupant_message("Unable to move while connected to the air system port.")
last_message = world.time
return 0
if(state)
- occupant_message("Maintenance protocols in effect")
+ occupant_message("Maintenance protocols in effect.")
return
- return domove(direction)
+ return do_move(direction)
-/obj/mecha/proc/domove(direction)
- return call((proc_res["dyndomove"]||src), "dyndomove")(direction)
-
-/obj/mecha/proc/dyndomove(direction)
+/obj/mecha/proc/do_move(direction)
if(!can_move)
return 0
if(src.pr_inertial_movement.active())
@@ -479,21 +474,74 @@
/obj/mecha/proc/take_damage(amount, type="brute")
if(amount)
- var/damage = absorbDamage(amount,type)
+ var/damage = absorb_damage(amount,type)
health -= damage
update_health()
log_append_to_last("Took [damage] points of damage. Damage type: \"[type]\".",1)
return
-/obj/mecha/proc/absorbDamage(damage,damage_type)
- return call((proc_res["dynabsorbdamage"]||src), "dynabsorbdamage")(damage,damage_type)
-
-/obj/mecha/proc/dynabsorbdamage(damage,damage_type)
+/obj/mecha/proc/absorb_damage(damage,damage_type)
return damage*(listgetindex(damage_absorption,damage_type) || 1)
+/obj/mecha/proc/hit_damage(damage, type="brute", is_melee=0)
+
+ var/power_to_use
+ var/damage_coeff_to_use
+
+ if(is_melee)
+ power_to_use = mhit_power_use
+ damage_coeff_to_use = m_damage_coeff
+ else
+ power_to_use = rhit_power_use
+ damage_coeff_to_use = r_damage_coeff
+
+ if(power_to_use && use_power(power_to_use))
+ take_damage(round(damage*damage_coeff_to_use), type)
+ start_booster_cooldown(is_melee)
+ return
+ else
+ start_booster_cooldown(is_melee)
+ take_damage(round(damage*damage_coeff_to_use), type)
+
+ return
+
+/obj/mecha/proc/deflect_hit(is_melee=0)
+
+ var/power_to_use
+ var/deflect_coeff_to_use
+
+ if(is_melee)
+ power_to_use = mhit_power_use
+ deflect_coeff_to_use = m_damage_coeff
+ else
+ power_to_use = rhit_power_use
+ deflect_coeff_to_use = r_damage_coeff
+
+ if(power_to_use)
+ if(prob(src.deflect_chance*deflect_coeff_to_use))
+ use_power(power_to_use)
+ start_booster_cooldown(is_melee)
+ return 1
+ else
+ return 0
+
+ else
+ start_booster_cooldown(is_melee)
+ if(prob(src.deflect_chance*deflect_coeff_to_use))
+ return 1
+
+ return 0
+
+/obj/mecha/proc/start_booster_cooldown(is_melee)
+
+ for(var/obj/item/mecha_parts/mecha_equipment/armor_booster/B in equipment) //Ideally this would be done by the armor booster itself; attempts weren't great for performance.
+ if(B.melee == is_melee && B.equip_ready)
+ B.set_ready_state(0)
+ B.do_after_cooldown()
+
/obj/mecha/airlock_crush(var/crush_damage)
..()
- take_damage(crush_damage)
+ hit_damage(crush_damage, is_melee=1)
check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return 1
@@ -505,14 +553,13 @@
return
/obj/mecha/attack_hand(mob/user as mob)
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
src.log_message("Attack by hand/paw. Attacker - [user].",1)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
if(H.species.can_shred(user))
- if(!prob(src.deflect_chance))
- src.take_damage(15)
+ if(!deflect_hit(is_melee=1))
+ src.hit_damage(damage=15, is_melee=1)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1)
user << "You slash at the armored suit!"
@@ -527,8 +574,8 @@
user.visible_message("\The [user] hits \the [src]. Nothing happensm","You hit \the [src] with no visible effect.")
src.log_append_to_last("Armor saved.")
return
- else if ((HULK in user.mutations) && !prob(src.deflect_chance))
- src.take_damage(15)
+ else if ((HULK in user.mutations) && !deflect_hit(is_melee=1))
+ src.hit_damage(damage=15, is_melee=1)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.")
else
@@ -536,20 +583,16 @@
src.log_append_to_last("Armor saved.")
return
-/obj/mecha/hitby(atom/movable/A as mob|obj) //wrapper
+/obj/mecha/hitby(atom/movable/A as mob|obj)
..()
src.log_message("Hit by [A].",1)
- call((proc_res["dynhitby"]||src), "dynhitby")(A)
- return
-
-/obj/mecha/proc/dynhitby(atom/movable/A)
if(istype(A, /obj/item/mecha_parts/mecha_tracking))
A.forceMove(src)
src.visible_message("The [A] fastens firmly to [src].")
return
- if(prob(src.deflect_chance) || istype(A, /mob))
+ if(deflect_hit(is_melee=0) || istype(A, /mob))
src.occupant_message("\The [A] bounces off the armor.")
- src.visible_message("\The [A] bounces off \the [src] armor")
+ src.visible_message("\The [A] bounces off \the [src] armor.")
src.log_append_to_last("Armor saved.")
if(istype(A, /mob/living))
var/mob/living/M = A
@@ -557,32 +600,26 @@
else if(istype(A, /obj))
var/obj/O = A
if(O.throwforce)
- src.take_damage(O.throwforce)
+ src.hit_damage(O.throwforce, is_melee=0)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
return
+/obj/mecha/bullet_act(var/obj/item/projectile/Proj)
+ if(Proj.damage_type == HALLOSS && !(src.r_deflect_coeff > 1))
+ use_power(Proj.agony * 5)
-/obj/mecha/bullet_act(var/obj/item/projectile/Proj) //wrapper
src.log_message("Hit by projectile. Type: [Proj.name]([Proj.check_armour]).",1)
- call((proc_res["dynbulletdamage"]||src), "dynbulletdamage")(Proj) //calls equipment
- ..()
- return
-
-/obj/mecha/proc/dynbulletdamage(var/obj/item/projectile/Proj)
- if(prob(src.deflect_chance))
+ if(deflect_hit(is_melee=0))
src.occupant_message("The armor deflects incoming projectile.")
- src.visible_message("The [src.name] armor deflects the projectile")
+ src.visible_message("The [src.name] armor deflects the projectile.")
src.log_append_to_last("Armor saved.")
return
- if(Proj.damage_type == HALLOSS)
- use_power(Proj.agony * 5)
-
if(!(Proj.nodamage))
var/ignore_threshold
if(istype(Proj, /obj/item/projectile/beam/pulse))
ignore_threshold = 1
- src.take_damage(Proj.damage, Proj.check_armour)
+ src.hit_damage(Proj.damage, Proj.check_armour, is_melee=0)
if(prob(25)) spark_system.start()
src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold)
@@ -603,6 +640,7 @@
break //give a chance to exit early
Proj.on_hit(src) //on_hit just returns if it's argument is not a living mob so does this actually do anything?
+ ..()
return
/obj/mecha/ex_act(severity)
@@ -650,8 +688,7 @@
*/
/obj/mecha/emp_act(severity)
- if(get_charge())
- use_power((cell.charge/2)/severity)
+ if(use_power((cell.charge/2)/severity))
take_damage(50 / severity,"energy")
src.log_message("EMP detected",1)
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
@@ -664,23 +701,6 @@
src.check_for_internal_damage(list(MECHA_INT_FIRE, MECHA_INT_TEMP_CONTROL))
return
-/obj/mecha/proc/dynattackby(obj/item/weapon/W as obj, mob/user as mob)
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- src.log_message("Attacked by [W]. Attacker - [user]")
- if(prob(src.deflect_chance))
- user << "\The [W] bounces off [src.name]."
- src.log_append_to_last("Armor saved.")
-/*
- for (var/mob/V in viewers(src))
- if(V.client && !(V.blinded))
- V.show_message("The [W] bounces off [src.name] armor.", 1)
-*/
- else
- src.occupant_message("[user] hits [src] with [W].")
- user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
- src.take_damage(W.force,W.damtype)
- src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
- return
//////////////////////
////// AttackBy //////
@@ -747,10 +767,10 @@
src.cell = null
state = 4
user << "You unscrew and pry out the powercell."
- src.log_message("Powercell removed")
+ src.log_message("Powercell removed.")
else if(state==4 && src.cell)
state=3
- user << "You screw the cell in place"
+ user << "You screw the cell in place."
return
else if(istype(W, /obj/item/device/multitool))
@@ -799,27 +819,19 @@
return
else
- call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
-/*
src.log_message("Attacked by [W]. Attacker - [user]")
- if(prob(src.deflect_chance))
- user << "\The [W] bounces off [src.name] armor."
+
+ if(deflect_hit(is_melee=1))
+ user << "\The [W] bounces off [src.name]."
src.log_append_to_last("Armor saved.")
-/*
- for (var/mob/V in viewers(src))
- if(V.client && !(V.blinded))
- V.show_message("The [W] bounces off [src.name] armor.", 1)
-*/
else
src.occupant_message("[user] hits [src] with [W].")
user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].")
- src.take_damage(W.force,W.damtype)
+ src.hit_damage(W.force, W.damtype, is_melee=1)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
-*/
+
return
-
-
/*
/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob)
if(!istype(user, /mob/living/silicon/ai))
@@ -1247,7 +1259,7 @@
var/integrity = health/initial(health)*100
var/cell_charge = get_charge()
var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None"
- var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown"
+ var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown" //Results in type mismatch if there is no tank.
var/cabin_pressure = round(return_pressure(),0.01)
var/output = {"[report_internal_damage()]
[integrity<30?"DAMAGE LEVEL CRITICAL
":null]
@@ -1655,16 +1667,11 @@
return (get_charge()>=amount)
/obj/mecha/proc/get_charge()
- return call((proc_res["dyngetcharge"]||src), "dyngetcharge")()
-
-/obj/mecha/proc/dyngetcharge()//returns null if no powercell, else returns cell.charge
- if(!src.cell) return
+ if(!src.cell)
+ return
return max(0, src.cell.charge)
/obj/mecha/proc/use_power(amount)
- return call((proc_res["dynusepower"]||src), "dynusepower")(amount)
-
-/obj/mecha/proc/dynusepower(amount)
if(get_charge())
cell.use(amount)
return 1
@@ -1685,15 +1692,14 @@
/obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message)
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(!damage)
return 0
src.log_message("Attacked. Attacker - [user].",1)
user.do_attack_animation(src)
- if(!prob(src.deflect_chance))
- src.take_damage(damage)
+ if(!deflect_hit(is_melee=1))
+ src.hit_damage(damage, is_melee=1)
src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST))
visible_message("[user] [attack_message] [src]!")
user.attack_log += text("\[[time_stamp()]\] attacked [src.name]")
@@ -1711,7 +1717,7 @@
//////////////////////////////////////////
-/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsium
+/datum/global_iterator/mecha_preserve_temp //normalizing cabin air temperature to 20 degrees celsius
delay = 20
process(var/obj/mecha/mecha)
@@ -1753,7 +1759,7 @@
return stop()
return
-/datum/global_iterator/mecha_intertial_movement //inertial movement in space
+/datum/global_iterator/mecha_inertial_movement //inertial movement in space
delay = 7
process(var/obj/mecha/mecha as obj,direction)
diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm
index cddd87879df..ea9b7802bd1 100644
--- a/code/game/objects/items/devices/uplink_items.dm
+++ b/code/game/objects/items/devices/uplink_items.dm
@@ -39,8 +39,6 @@ var/datum/uplink/uplink = new()
..()
antag_roles = list()
-
-
/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user)
var/extra_args = extra_args(user)
if(!extra_args)
@@ -144,44 +142,45 @@ datum/uplink_item/dd_SortValue()
* Ammunition *
*************/
/datum/uplink_item/item/ammo
- item_cost = 2
+ item_cost = 4
category = /datum/uplink_category/ammunition
-/datum/uplink_item/item/ammo/a357
- name = ".357"
- path = /obj/item/ammo_magazine/a357
-
/datum/uplink_item/item/ammo/mc9mm
name = "9mm"
+ item_cost = 1
path = /obj/item/ammo_magazine/mc9mm
-/datum/uplink_item/item/ammo/darts
- name = "Darts"
- path = /obj/item/ammo_magazine/chemdart
-
-/datum/uplink_item/item/ammo/sniperammo
- name = "14.5mm"
- path = /obj/item/weapon/storage/box/sniperammo
-
/datum/uplink_item/item/ammo/a10mm
name = "10mm"
+ item_cost = 1
path = /obj/item/ammo_magazine/a10mm
+/datum/uplink_item/item/ammo/darts
+ name = "Darts"
+ item_cost = 1
+ path = /obj/item/ammo_magazine/chemdart
+
+/datum/uplink_item/item/ammo/a357
+ name = ".357"
+ item_cost = 2
+ path = /obj/item/ammo_magazine/a357
+
/datum/uplink_item/item/ammo/a762
name = "7.62mm"
+ item_cost = 3
path = /obj/item/ammo_magazine/a762
+/datum/uplink_item/item/ammo/sniperammo
+ name = "14.5mm"
+ item_cost = 4
+ path = /obj/item/weapon/storage/box/sniperammo
+
/***************************************
* Highly Visible and Dangerous Weapons *
***************************************/
/datum/uplink_item/item/visible_weapons
category = /datum/uplink_category/visible_weapons
-/datum/uplink_item/item/visible_weapons/energy_sword
- name = "Energy Sword"
- item_cost = 4
- path = /obj/item/weapon/melee/energy/sword
-
/datum/uplink_item/item/visible_weapons/dartgun
name = "Dart Gun"
item_cost = 5
@@ -189,40 +188,45 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/visible_weapons/crossbow
name = "Energy Crossbow"
- item_cost = 5
+ item_cost = 6
path = /obj/item/weapon/gun/energy/crossbow
+/datum/uplink_item/item/visible_weapons/energy_sword
+ name = "Energy Sword"
+ item_cost = 8
+ path = /obj/item/weapon/melee/energy/sword
+
/datum/uplink_item/item/visible_weapons/g9mm
name = "Silenced 9mm"
- item_cost = 5
+ item_cost = 8
path = /obj/item/weapon/storage/box/syndie_kit/g9mm
/datum/uplink_item/item/visible_weapons/riggedlaser
- name = "Exosuit Rigged Laser"
- item_cost = 6
+ name = "Exosuit (APLU) Rigged Laser"
+ item_cost = 8
path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
/datum/uplink_item/item/visible_weapons/revolver
name = "Revolver"
- item_cost = 6
+ item_cost = 12
path = /obj/item/weapon/gun/projectile/revolver
+//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
+/datum/uplink_item/item/visible_weapons/submachinegun
+ name = "Submachine Gun"
+ item_cost = 12
+ path = /obj/item/weapon/gun/projectile/automatic/c20r
+
+/datum/uplink_item/item/visible_weapons/assaultrifle
+ name = "Assault Rifle"
+ item_cost = 14
+ path = /obj/item/weapon/gun/projectile/automatic/sts35
+
/datum/uplink_item/item/visible_weapons/heavysniper
name = "Anti-materiel Rifle"
item_cost = DEFAULT_TELECRYSTAL_AMOUNT
path = /obj/item/weapon/gun/projectile/heavysniper
-//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
-/datum/uplink_item/item/visible_weapons/submachinegun
- name = "Submachine Gun"
- item_cost = 6
- path = /obj/item/weapon/gun/projectile/automatic/c20r
-
-/datum/uplink_item/item/visible_weapons/assaultrifle
- name = "Assault Rifle"
- item_cost = 7
- path = /obj/item/weapon/gun/projectile/automatic/sts35
-
/*************************************
* Stealthy and Inconspicuous Weapons *
*************************************/
@@ -234,45 +238,40 @@ datum/uplink_item/dd_SortValue()
item_cost = 1
path = /obj/item/weapon/soap/syndie
+/datum/uplink_item/item/stealthy_weapons/cigarette_kit
+ name = "Cigarette Kit"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/syndie_kit/cigarette
+
/datum/uplink_item/item/stealthy_weapons/concealed_cane
name = "Concealed Cane Sword"
- item_cost = 1
+ item_cost = 2
path = /obj/item/weapon/cane/concealed
+/datum/uplink_item/item/stealthy_weapons/random_toxin
+ name = "Random Toxin - Beaker"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/syndie_kit/toxin
+
/datum/uplink_item/item/stealthy_weapons/detomatix
name = "Detomatix PDA Cartridge"
- item_cost = 3
+ item_cost = 4
path = /obj/item/weapon/cartridge/syndicate
/datum/uplink_item/item/stealthy_weapons/parapen
name = "Paralysis Pen"
- item_cost = 3
+ item_cost = 6
path = /obj/item/weapon/pen/reagent/paralysis
-/datum/uplink_item/item/stealthy_weapons/cigarette_kit
- name = "Cigarette Kit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/cigarette
-
-/datum/uplink_item/item/stealthy_weapons/random_toxin
- name = "Random Toxin - Beaker"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/toxin
-
/*******************************
* Stealth and Camouflage Items *
*******************************/
/datum/uplink_item/item/stealth_items
category = /datum/uplink_category/stealth_items
-/datum/uplink_item/item/stealth_items/id
- name = "Agent ID card"
- item_cost = 2
- path = /obj/item/weapon/card/id/syndicate
-
/datum/uplink_item/item/stealth_items/syndigaloshes
name = "No-Slip Shoes"
- item_cost = 2
+ item_cost = 1
path = /obj/item/clothing/shoes/syndigaloshes
/datum/uplink_item/item/stealth_items/spy
@@ -280,24 +279,19 @@ datum/uplink_item/dd_SortValue()
item_cost = 2
path = /obj/item/weapon/storage/box/syndie_kit/spy
+/datum/uplink_item/item/stealth_items/id
+ name = "Agent ID card"
+ item_cost = 3
+ path = /obj/item/weapon/card/id/syndicate
+
/datum/uplink_item/item/stealth_items/chameleon_kit
name = "Chameleon Kit"
- item_cost = 3
+ item_cost = 5
path = /obj/item/weapon/storage/box/syndie_kit/chameleon
-/datum/uplink_item/item/stealth_items/chameleon_projector
- name = "Chameleon-Projector"
- item_cost = 4
- path = /obj/item/device/chameleon
-
-/datum/uplink_item/item/stealth_items/chameleon_projector
- name = "Chameleon-Projector"
- item_cost = 4
- path = /obj/item/device/chameleon
-
/datum/uplink_item/item/stealth_items/voice
name = "Voice Changer"
- item_cost = 4
+ item_cost = 5
path = /obj/item/clothing/mask/gas/voice
/datum/uplink_item/item/stealth_items/camera_floppy
@@ -305,6 +299,11 @@ datum/uplink_item/dd_SortValue()
item_cost = 6
path = /obj/item/weapon/disk/file/cameras/syndicate
+/datum/uplink_item/item/stealth_items/chameleon_projector
+ name = "Chameleon-Projector"
+ item_cost = 8
+ path = /obj/item/device/chameleon
+
/********************
* Devices and Tools *
********************/
@@ -313,78 +312,78 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/tools/toolbox
name = "Fully Loaded Toolbox"
- item_cost = 1
+ item_cost = 2
path = /obj/item/weapon/storage/toolbox/syndicate
-/datum/uplink_item/item/tools/plastique
- name = "C-4 (Destroys walls)"
+/datum/uplink_item/item/tools/money
+ name = "Operations Funding"
item_cost = 2
- path = /obj/item/weapon/plastique
-
-/datum/uplink_item/item/tools/encryptionkey_radio
- name = "Encrypted Radio Channel Key"
- item_cost = 2
- path = /obj/item/device/encryptionkey/syndicate
-
-/datum/uplink_item/item/tools/encryptionkey_binary
- name = "Binary Translator Key"
- item_cost = 3
- path = /obj/item/device/encryptionkey/binary
-
-/datum/uplink_item/item/tools/emag
- name = "Cryptographic Sequencer"
- item_cost = 3
- path = /obj/item/weapon/card/emag
+ path = /obj/item/weapon/storage/secure/briefcase/money
+ desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
/datum/uplink_item/item/tools/clerical
name = "Morphic Clerical Kit"
item_cost = 3
path = /obj/item/weapon/storage/box/syndie_kit/clerical
-/datum/uplink_item/item/tools/space_suit
- name = "Space Suit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/space
-
-/datum/uplink_item/item/tools/thermal
- name = "Thermal Imaging Glasses"
- item_cost = 3
- path = /obj/item/clothing/glasses/thermal/syndi
+/datum/uplink_item/item/tools/plastique
+ name = "C-4 (Destroys walls)"
+ item_cost = 4
+ path = /obj/item/weapon/plastique
/datum/uplink_item/item/tools/heavy_vest
name = "Heavy Armor Vest"
item_cost = 4
- path = /obj/item/clothing/suit/storage/vest/heavy/merc
+ path = /obj/item/clothing/suit/storage/vest/merc
+
+/datum/uplink_item/item/tools/encryptionkey_radio
+ name = "Encrypted Radio Channel Key"
+ item_cost = 4
+ path = /obj/item/device/encryptionkey/syndicate
+
+/datum/uplink_item/item/tools/encryptionkey_binary
+ name = "Binary Translator Key"
+ item_cost = 5
+ path = /obj/item/device/encryptionkey/binary
+
+/datum/uplink_item/item/tools/emag
+ name = "Cryptographic Sequencer"
+ item_cost = 6
+ path = /obj/item/weapon/card/emag
+
+/datum/uplink_item/item/tools/space_suit
+ name = "Space Suit"
+ item_cost = 6
+ path = /obj/item/weapon/storage/box/syndie_kit/space
+
+/datum/uplink_item/item/tools/thermal
+ name = "Thermal Imaging Glasses"
+ item_cost = 6
+ path = /obj/item/clothing/glasses/thermal/syndi
/datum/uplink_item/item/tools/powersink
name = "Powersink (DANGER!)"
- item_cost = 5
+ item_cost = 10
path = /obj/item/device/powersink
-/datum/uplink_item/item/tools/ai_module
- name = "Hacked AI Upload Module"
- item_cost = 7
- path = /obj/item/weapon/aiModule/syndicate
-
-/datum/uplink_item/item/tools/supply_beacon
- name = "Hacked Supply Beacon (DANGER!)"
- item_cost = 7
- path = /obj/item/supply_beacon
-
/datum/uplink_item/item/tools/teleporter
name = "Teleporter Circuit Board"
- item_cost = 20
+ item_cost = 10
path = /obj/item/weapon/circuitboard/teleporter
/datum/uplink_item/item/tools/teleporter/New()
..()
antag_roles = list(MODE_MERCENARY)
-/datum/uplink_item/item/tools/money
- name = "Operations Funding"
- item_cost = 3
- path = /obj/item/weapon/storage/secure/briefcase/money
- desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
+/datum/uplink_item/item/tools/ai_module
+ name = "Hacked AI Upload Module"
+ item_cost = 14
+ path = /obj/item/weapon/aiModule/syndicate
+
+/datum/uplink_item/item/tools/supply_beacon
+ name = "Hacked Supply Beacon (DANGER!)"
+ item_cost = 14
+ path = /obj/item/supply_beacon
/***********
* Implants *
@@ -394,24 +393,28 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/implants/imp_freedom
name = "Freedom Implant"
- item_cost = 3
+ item_cost = 6
path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
/datum/uplink_item/item/implants/imp_compress
name = "Compressed Matter Implant"
- item_cost = 4
+ item_cost = 8
path = /obj/item/weapon/storage/box/syndie_kit/imp_compress
/datum/uplink_item/item/implants/imp_explosive
name = "Explosive Implant (DANGER!)"
- item_cost = 6
+ item_cost = 10
path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
/datum/uplink_item/item/implants/imp_uplink
- name = "Uplink Implant (Contains 5 Telecrystals)"
- item_cost = 10
+ name = "Uplink Implant"
path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
+/datum/uplink_item/item/implants/imp_uplink/New()
+ ..()
+ item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2)
+ desc = "Contains [round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8)] Telecrystal\s"
+
/**********
* Medical *
**********/
@@ -420,17 +423,17 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/medical/sinpockets
name = "Box of Sin-Pockets"
- item_cost = 1
+ item_cost = 2
path = /obj/item/weapon/storage/box/sinpockets
/datum/uplink_item/item/medical/surgery
name = "Surgery kit"
- item_cost = 6
+ item_cost = 10
path = /obj/item/weapon/storage/firstaid/surgery
/datum/uplink_item/item/medical/combat
name = "Combat medical kit"
- item_cost = 6
+ item_cost = 12
path = /obj/item/weapon/storage/firstaid/combat
/*******************
@@ -441,37 +444,37 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/hardsuit_modules/thermal
name = "Thermal Scanner"
- item_cost = 2
+ item_cost = 4
path = /obj/item/rig_module/vision/thermal
/datum/uplink_item/item/hardsuit_modules/energy_net
name = "Net Projector"
- item_cost = 3
+ item_cost = 5
path = /obj/item/rig_module/fabricator/energy_net
/datum/uplink_item/item/ewar_voice
name = "Electrowarfare Suite and Voice Synthesiser"
- item_cost = 4
+ item_cost = 6
path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice
/datum/uplink_item/item/hardsuit_modules/maneuvering_jets
name = "Maneuvering Jets"
- item_cost = 4
+ item_cost = 8
path = /obj/item/rig_module/maneuvering_jets
/datum/uplink_item/item/hardsuit_modules/egun
name = "Mounted Energy Gun"
- item_cost = 6
+ item_cost = 12
path = /obj/item/rig_module/mounted/egun
/datum/uplink_item/item/hardsuit_modules/power_sink
name = "Power Sink"
- item_cost = 6
+ item_cost = 12
path = /obj/item/rig_module/power_sink
/datum/uplink_item/item/hardsuit_modules/laser_canon
name = "Mounted Laser Cannon"
- item_cost = 8
+ item_cost = 16
path = /obj/item/rig_module/mounted
/***********
@@ -482,19 +485,19 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/grenades/anti_photon
name = "5xPhoton Disruption Grenades"
- item_cost = 2
+ item_cost = 4
path = /obj/item/weapon/storage/box/anti_photons
-/datum/uplink_item/item/grenades/emp
- name = "5xEMP Grenades"
- item_cost = 3
- path = /obj/item/weapon/storage/box/emps
-
/datum/uplink_item/item/grenades/smoke
name = "5xSmoke Grenades"
- item_cost = 2
+ item_cost = 4
path = /obj/item/weapon/storage/box/smokes
+/datum/uplink_item/item/grenades/emp
+ name = "5xEMP Grenades"
+ item_cost = 6
+ path = /obj/item/weapon/storage/box/emps
+
/************
* Badassery *
************/
@@ -550,8 +553,8 @@ datum/uplink_item/dd_SortValue()
****************/
/datum/uplink_item/item/badassery/surplus
name = "Surplus Crate"
- item_cost = 40
- var/item_worth = 60
+ item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4
+ var/item_worth = DEFAULT_TELECRYSTAL_AMOUNT * 6
var/icon
/datum/uplink_item/item/badassery/surplus/New()
@@ -598,14 +601,11 @@ var/image/default_abstract_uplink_icon
if(.)
log_and_message_admins("has triggered a falsified [src]", user)
-/datum/uplink_item/abstract/announcements/fake_centcom
- item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2
-
/datum/uplink_item/abstract/announcements/fake_centcom/New()
..()
name = "[command_name()] Update Announcement"
+ item_cost = round(DEFAULT_TELECRYSTAL_AMOUNT / 2)
desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data."
- antag_roles = list(MODE_MERCENARY)
/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
command_announcement.Announce(args.["message"], args.["title"])
@@ -614,7 +614,7 @@ var/image/default_abstract_uplink_icon
/datum/uplink_item/abstract/announcements/fake_crew_arrival
name = "Crew Arrival Announcement/Records"
desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
- item_cost = 4
+ item_cost = 8
/datum/uplink_item/abstract/announcements/fake_crew_arrival/New()
..()
@@ -676,7 +676,7 @@ var/image/default_abstract_uplink_icon
/datum/uplink_item/abstract/announcements/fake_ion_storm
name = "Ion Storm Announcement"
desc = "Interferes with the station's ion sensors. Triggers immediately upon investment."
- item_cost = 1
+ item_cost = 2
/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc)
ion_storm_announcement()
@@ -685,7 +685,7 @@ var/image/default_abstract_uplink_icon
/datum/uplink_item/abstract/announcements/fake_radiation
name = "Radiation Storm Announcement"
desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment."
- item_cost = 3
+ item_cost = 6
/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc)
var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0)
diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm
index f86489c1000..48fb63edadb 100644
--- a/code/game/objects/items/weapons/cards_ids_syndicate.dm
+++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm
@@ -1,30 +1,19 @@
-var/global/list/syndicate_ids = list()
-
/obj/item/weapon/card/id/syndicate
name = "agent card"
icon_state = "syndicate"
assignment = "Agent"
origin_tech = list(TECH_ILLEGAL = 3)
var/electronic_warfare = 1
- var/registered_user = null
+ var/mob/registered_user = null
/obj/item/weapon/card/id/syndicate/New(mob/user as mob)
- syndicate_ids += src
..()
access = syndicate_access.Copy()
/obj/item/weapon/card/id/syndicate/Destroy()
- syndicate_ids -= src
registered_user = null
return ..()
-// On mob destruction, ensure any references are cleared
-/mob/Destroy()
- for(var/obj/item/weapon/card/id/syndicate/SID in syndicate_ids)
- if(SID.registered_user == src)
- SID.registered_user = null
- return ..()
-
/obj/item/weapon/card/id/syndicate/prevent_tracking()
return electronic_warfare
@@ -33,13 +22,12 @@ var/global/list/syndicate_ids = list()
if(istype(O, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/I = O
src.access |= I.access
- if(player_is_antag(user))
+ if(player_is_antag(user.mind))
user << "The microscanner activates as you pass it over the ID, copying its access."
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
- if(!registered_user)
- registered_user = user
- user.set_id_info(src)
+ // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked.
+ if(!registered_user && !registered_name && register_user(user))
user << "The microscanner marks you as its owner, preventing others from accessing its internals."
if(registered_user == user)
switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show"))
@@ -72,6 +60,21 @@ var/global/list/syndicate_ids = list()
ui.set_initial_data(data)
ui.open()
+/obj/item/weapon/card/id/syndicate/proc/register_user(var/mob/user)
+ if(!istype(user) || user == registered_user)
+ return FALSE
+ unset_registered_user()
+ registered_user = user
+ user.set_id_info(src)
+ user.register(OBSERVER_EVENT_DESTROY, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user)
+ return TRUE
+
+/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user)
+ if(!registered_user || (user && user != registered_user))
+ return
+ registered_user.unregister(OBSERVER_EVENT_DESTROY, src)
+ registered_user = null
+
/obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user)
if(user != registered_user)
return STATUS_CLOSE
@@ -172,7 +175,7 @@ var/global/list/syndicate_ids = list()
icon_state = initial(icon_state)
name = initial(name)
registered_name = initial(registered_name)
- registered_user = null
+ unset_registered_user()
sex = initial(sex)
user << "All information has been deleted from \the [src]."
. = 1
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 610536f4d08..909df93d132 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -278,3 +278,27 @@
beakers += B1
beakers += B2
icon_state = initial(icon_state) +"_locked"
+
+/obj/item/weapon/grenade/chem_grenade/teargas
+ name = "tear gas grenade"
+ desc = "Concentrated Capsaicin. Contents under pressure. Use with caution."
+ stage = 2
+ path = 1
+
+ New()
+ ..()
+ var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
+
+ B1.reagents.add_reagent("phosphorus", 40)
+ B1.reagents.add_reagent("potassium", 40)
+ B1.reagents.add_reagent("condensedcapsaicin", 40)
+ B2.reagents.add_reagent("sugar", 40)
+ B2.reagents.add_reagent("condensedcapsaicin", 80)
+
+ detonator = new/obj/item/device/assembly_holder/timer_igniter(src)
+
+ beakers += B1
+ beakers += B2
+ icon_state = initial(icon_state) +"_locked"
+
diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm
index 0469cd56d5c..9e30764119a 100644
--- a/code/game/objects/items/weapons/implants/implantuplink.dm
+++ b/code/game/objects/items/weapons/implants/implantuplink.dm
@@ -6,7 +6,7 @@
/obj/item/weapon/implant/uplink/New()
activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
hidden_uplink = new(src)
- hidden_uplink.uses = 5
+ hidden_uplink.uses = round((DEFAULT_TELECRYSTAL_AMOUNT / 2) * 0.8)
..()
return
@@ -14,6 +14,7 @@
activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ hidden_uplink.uplink_owner = source.mind
return 1
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index e61875f5ecb..d55e0305cb0 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -71,6 +71,13 @@
maxcharge = 10000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
+/obj/item/weapon/cell/mecha
+ name = "exosuit-grade power cell"
+ origin_tech = list(TECH_POWER = 3)
+ icon_state = "hcell"
+ maxcharge = 15000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 70)
+
/obj/item/weapon/cell/high/empty/New()
..()
charge = 0
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index f37cdb4dc2c..1372270bb91 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -271,8 +271,8 @@
new /obj/item/ammo_casing/a145(src)
/obj/item/weapon/storage/box/flashbangs
- name = "box of flashbangs (WARNING)"
- desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
+ name = "box of flashbangs"
+ desc = "A box containing 7 antipersonnel flashbang grenades.
WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
icon_state = "flashbang"
New()
@@ -285,6 +285,22 @@
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/grenade/flashbang(src)
+/obj/item/weapon/storage/box/teargas
+ name = "box of pepperspray grenades"
+ desc = "A box containing 7 tear gas grenades. A gas mask is printed on the label.
WARNING: Exposure carries risk of serious injury or death. Keep away from persons with lung conditions."
+ icon_state = "flashbang"
+
+ New()
+ ..()
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
+
+
+
/obj/item/weapon/storage/box/emps
name = "box of emp grenades"
desc = "A box containing 5 military grade EMP grenades.
WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur."
@@ -624,7 +640,7 @@
desc = "This box is shaped on the inside so that only light tubes and bulbs fit."
item_state = "syringe_kit"
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
-
+
/obj/item/weapon/storage/box/lights/New()
..()
make_exact_fit()
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 11c2d6a8539..02ce84f0726 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -72,11 +72,10 @@
New()
..()
- var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
+ new /obj/item/clothing/gloves/yellow(src)
new /obj/item/weapon/screwdriver(src)
new /obj/item/weapon/wrench(src)
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
- new /obj/item/stack/cable_coil(src,30,color)
new /obj/item/weapon/wirecutters(src)
new /obj/item/device/multitool(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
deleted file mode 100644
index e93721c53f2..00000000000
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ /dev/null
@@ -1,210 +0,0 @@
-//I still dont think this should be a closet but whatever
-/obj/structure/closet/fireaxecabinet
- name = "fire axe cabinet"
- desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
- var/obj/item/weapon/material/twohanded/fireaxe/fireaxe
- icon_state = "fireaxe1000"
- icon_closed = "fireaxe1000"
- icon_opened = "fireaxe1100"
- anchored = 1
- density = 0
- var/localopened = 0 //Setting this to keep it from behaviouring like a normal closet and obstructing movement in the map. -Agouri
- opened = 1
- var/hitstaken = 0
- var/locked = 1
- var/smashed = 0
-
- New()
- ..()
- fireaxe = new /obj/item/weapon/material/twohanded/fireaxe(src)
-
- attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
- //..() //That's very useful, Erro
-
- var/hasaxe = 0 //gonna come in handy later~
- if(fireaxe)
- hasaxe = 1
-
- if (isrobot(usr) || src.locked)
- if(istype(O, /obj/item/device/multitool))
- user << "Resetting circuitry..."
- playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
- if(do_after(user, 20))
- src.locked = 0
- user << " You disable the locking modules."
- update_icon()
- return
- else if(istype(O, /obj/item/weapon))
- var/obj/item/weapon/W = O
- if(src.smashed || src.localopened)
- if(localopened)
- localopened = 0
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- return
- else
- playsound(user, 'sound/effects/Glasshit.ogg', 100, 1) //We don't want this playing every time
- if(W.force < 15)
- user << "The cabinet's protective glass glances off the hit."
- else
- src.hitstaken++
- if(src.hitstaken == 4)
- playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) //Break cabinet, receive goodies. Cabinet's fucked for life after that.
- src.smashed = 1
- src.locked = 0
- src.localopened = 1
- update_icon()
- return
- if (istype(O, /obj/item/weapon/material/twohanded/fireaxe) && src.localopened)
- if(!fireaxe)
- if(O:wielded)
- user << "Unwield the axe first."
- return
- fireaxe = O
- user.remove_from_mob(O)
- src.contents += O
- user << "You place the fire axe back in the [src.name]."
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- if(src.smashed)
- return
- if(istype(O, /obj/item/device/multitool))
- if(localopened)
- localopened = 0
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- return
- else
- user << "Resetting circuitry..."
- sleep(50)
- src.locked = 1
- user << "You re-enable the locking modules."
- playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
- if(do_after(user,20))
- src.locked = 1
- user << " You re-enable the locking modules."
- return
- else
- localopened = !localopened
- if(localopened)
- icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
-
-
-
- attack_hand(mob/user as mob)
-
- var/hasaxe = 0
- if(fireaxe)
- hasaxe = 1
-
- if(src.locked)
- user <<"The cabinet won't budge!"
- return
- if(localopened)
- if(fireaxe)
- user.put_in_hands(fireaxe)
- fireaxe = null
- user << "You take the fire axe from the [name]."
- src.add_fingerprint(user)
- update_icon()
- else
- if(src.smashed)
- return
- else
- localopened = !localopened
- if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- else
- localopened = !localopened //I'm pretty sure we don't need an if(src.smashed) in here. In case I'm wrong and it fucks up teh cabinet, **MARKER**. -Agouri
- if(localopened)
- src.icon_state = text("fireaxe[][][][]opening",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
- else
- src.icon_state = text("fireaxe[][][][]closing",hasaxe,src.localopened,src.hitstaken,src.smashed)
- spawn(10) update_icon()
-
- attack_tk(mob/user as mob)
- if(localopened && fireaxe)
- fireaxe.forceMove(loc)
- user << "You telekinetically remove the fire axe."
- fireaxe = null
- update_icon()
- return
- attack_hand(user)
-
- verb/toggle_openness() //nice name, huh? HUH?! -Erro //YEAH -Agouri
- set name = "Open/Close"
- set category = "Object"
-
- if (isrobot(usr) || src.locked || src.smashed)
- if(src.locked)
- usr << "The cabinet won't budge!"
- else if(src.smashed)
- usr << "The protective glass is broken!"
- return
-
- localopened = !localopened
- update_icon()
-
- verb/remove_fire_axe()
- set name = "Remove Fire Axe"
- set category = "Object"
-
- if (isrobot(usr))
- return
-
- if (localopened)
- if(fireaxe)
- usr.put_in_hands(fireaxe)
- fireaxe = null
- usr << "You take the Fire axe from the [name]."
- else
- usr << "The [src.name] is empty."
- else
- usr << "The [src.name] is closed."
- update_icon()
-
- attack_ai(mob/user as mob)
- if(src.smashed)
- user << "The security of the cabinet is compromised."
- return
- else
- locked = !locked
- if(locked)
- user << "Cabinet locked."
- else
- user << "Cabinet unlocked."
- return
-
- update_icon() //Template: fireaxe[has fireaxe][is opened][hits taken][is smashed]. If you want the opening or closing animations, add "opening" or "closing" right after the numbers
- var/hasaxe = 0
- if(fireaxe)
- hasaxe = 1
- icon_state = text("fireaxe[][][][]",hasaxe,src.localopened,src.hitstaken,src.smashed)
-
- open()
- return
-
- close()
- return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 2348fc434b1..5d76ccc38e9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -18,9 +18,9 @@
new /obj/item/clothing/suit/captunic/capjacket(src)
new /obj/item/clothing/head/caphat/cap(src)
new /obj/item/clothing/under/rank/captain(src)
- new /obj/item/clothing/suit/storage/vest(src)
+ new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/weapon/cartridge/captain(src)
- new /obj/item/clothing/head/helmet/swat(src)
+ new /obj/item/clothing/head/helmet(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/clothing/gloves/captain(src)
@@ -47,13 +47,12 @@
New()
..()
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/suit/storage/vest(src)
+ new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/clothing/head/helmet(src)
new /obj/item/weapon/cartridge/hop(src)
new /obj/item/device/radio/headset/heads/hop(src)
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/weapon/storage/box/ids( src )
- new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/gun/projectile/sec/flash(src)
new /obj/item/device/flash(src)
return
@@ -104,6 +103,7 @@
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
new /obj/item/clothing/head/HoS(src)
+ new /obj/item/clothing/suit/armor/vest/security(src)
new /obj/item/clothing/suit/storage/vest/hos(src)
new /obj/item/clothing/under/rank/head_of_security/jensen(src)
new /obj/item/clothing/under/rank/head_of_security/corp(src)
@@ -123,6 +123,7 @@
new /obj/item/clothing/accessory/holster/waist(src)
new /obj/item/weapon/melee/telebaton(src)
new /obj/item/clothing/head/beret/sec/corporate/hos(src)
+ new /obj/item/clothing/accessory/badge/hos(src)
return
@@ -144,6 +145,7 @@
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/clothing/suit/armor/vest/security(src)
new /obj/item/clothing/suit/storage/vest/warden(src)
new /obj/item/clothing/under/rank/warden(src)
new /obj/item/clothing/under/rank/warden/corp(src)
@@ -154,12 +156,14 @@
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/storage/box/flashbangs(src)
+ new /obj/item/weapon/storage/box/teargas(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/weapon/gun/energy/gun(src)
new /obj/item/weapon/storage/box/holobadge(src)
new /obj/item/clothing/head/beret/sec/corporate/warden(src)
+ new /obj/item/clothing/accessory/badge/warden(src)
return
@@ -180,14 +184,14 @@
new /obj/item/weapon/storage/backpack/security(src)
else
new /obj/item/weapon/storage/backpack/satchel_sec(src)
- new /obj/item/clothing/suit/storage/vest/officer(src)
+ new /obj/item/clothing/suit/armor/vest/security(src)
new /obj/item/clothing/head/helmet(src)
// new /obj/item/weapon/cartridge/security(src)
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/weapon/storage/belt/security(src)
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
- new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/grenade/chem_grenade/teargas(src)
new /obj/item/weapon/melee/baton/loaded(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
@@ -195,7 +199,6 @@
new /obj/item/clothing/accessory/storage/black_vest(src)
new /obj/item/clothing/head/soft/sec/corp(src)
new /obj/item/clothing/under/rank/security/corp(src)
- new /obj/item/ammo_magazine/c45m/rubber(src)
new /obj/item/weapon/gun/energy/taser(src)
return
@@ -258,9 +261,8 @@
new /obj/item/clothing/shoes/laceup(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
- new /obj/item/clothing/suit/storage/vest/detective(src)
- new /obj/item/ammo_magazine/c45m/rubber(src)
- new /obj/item/ammo_magazine/c45m/rubber(src)
+ new /obj/item/clothing/suit/armor/vest/detective(src)
+ new /obj/item/ammo_magazine/c45m/flash(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/projectile/colt/detective(src)
new /obj/item/clothing/accessory/holster/armpit(src)
diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm
new file mode 100644
index 00000000000..a19693f5ab9
--- /dev/null
+++ b/code/game/objects/structures/fireaxe_cabinet.dm
@@ -0,0 +1,135 @@
+/obj/structure/fireaxecabinet
+ name = "fire axe cabinet"
+ desc = "There is small label that reads \"For Emergency use only\" along with details for safe use of the axe. As if."
+ icon_state = "fireaxe"
+ anchored = 1
+ density = 0
+
+ var/damage_threshold = 15
+ var/open
+ var/unlocked
+ var/shattered
+ var/obj/item/weapon/material/twohanded/fireaxe/fireaxe
+
+/obj/structure/fireaxecabinet/attack_generic(var/mob/user, var/damage, var/attack_verb, var/wallbreaker)
+ user.do_attack_animation(src)
+ playsound(user, 'sound/effects/Glasshit.ogg', 50, 1)
+ visible_message("[user] [attack_verb] \the [src]!")
+ if(damage_threshold > damage)
+ user << "Your strike is deflected by the reinforced glass!"
+ return
+ if(shattered)
+ return
+ shattered = 1
+ unlocked = 1
+ open = 1
+ playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1)
+ update_icon()
+
+/obj/structure/fireaxecabinet/update_icon()
+ overlays.Cut()
+ if(fireaxe)
+ overlays += image(icon, "fireaxe_item")
+ if(shattered)
+ overlays += image(icon, "fireaxe_window_broken")
+ else if(!open)
+ overlays += image(icon, "fireaxe_window")
+
+/obj/structure/fireaxecabinet/New()
+ ..()
+ fireaxe = new(src)
+ update_icon()
+
+/obj/structure/fireaxecabinet/attack_ai(var/mob/user)
+ toggle_lock(user)
+
+/obj/structure/fireaxecabinet/attack_hand(var/mob/user)
+ if(!unlocked)
+ user << "\The [src] is locked."
+ return
+ toggle_open(user)
+
+/obj/structure/fireaxecabinet/MouseDrop(over_object, src_location, over_location)
+ if(over_object == usr)
+ var/mob/user = over_object
+ if(!istype(user))
+ return
+
+ if(!open)
+ user << "\The [src] is closed."
+ return
+
+ if(!fireaxe)
+ user << "\The [src] is empty."
+ return
+
+ fireaxe.forceMove(get_turf(user))
+ user.put_in_hands(fireaxe)
+ fireaxe = null
+ update_icon()
+
+ return
+
+/obj/structure/fireaxecabinet/Destroy()
+ if(fireaxe)
+ fireaxe.forceMove(get_turf(src))
+ fireaxe = null
+ return ..()
+
+/obj/structure/fireaxecabinet/attackby(var/obj/item/O, var/mob/user)
+
+ if(istype(O, /obj/item/device/multitool))
+ toggle_lock(user)
+ return
+
+ if(istype(O, /obj/item/weapon/material/twohanded/fireaxe))
+ if(open)
+ if(fireaxe)
+ user << "There is already \a [fireaxe] inside \the [src]."
+ else if(user.unEquip(O))
+ O.forceMove(src)
+ fireaxe = O
+ user << "You place \the [fireaxe] into \the [src]."
+ update_icon()
+ return
+
+ if(O.force)
+ user.setClickCooldown(10)
+ attack_generic(user, O.force, "bashes")
+ return
+
+ return ..()
+
+/obj/structure/fireaxecabinet/proc/toggle_open(var/mob/user)
+ if(shattered)
+ open = 1
+ unlocked = 1
+ else
+ user.setClickCooldown(10)
+ open = !open
+ user << "You [open ? "open" : "close"] \the [src]."
+ update_icon()
+
+/obj/structure/fireaxecabinet/proc/toggle_lock(var/mob/user)
+
+
+ if(open)
+ return
+
+ if(shattered)
+ open = 1
+ unlocked = 1
+ else
+ user.setClickCooldown(10)
+ user << "You begin [unlocked ? "enabling" : "disabling"] \the [src]'s maglock."
+
+ if(!do_after(user, 20))
+ return
+
+ if(shattered) return
+
+ unlocked = !unlocked
+ playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
+ user << "You [unlocked ? "disable" : "enable"] the maglock."
+
+ update_icon()
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index 7989442c902..484491e7d68 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -39,6 +39,7 @@ var/list/floor_decals = list()
if(T.decals && T.decals.len)
T.decals.Cut()
T.update_icon()
+ qdel(src)
return
/obj/effect/floor_decal/corner
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 595c239ee49..3eb48aa0e79 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -140,7 +140,7 @@ var/const/enterloopsanity = 100
..()
var/objects = 0
if(A && (A.flags & PROXMOVE))
- for(var/atom/thing as mob|obj|turf|area in range(1))
+ for(var/atom/movable/thing in range(1))
if(objects > enterloopsanity) break
objects++
spawn(0)
diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm
index c5cff737ee1..9bc1c91ef3f 100644
--- a/code/modules/admin/admin_report.dm
+++ b/code/modules/admin/admin_report.dm
@@ -118,7 +118,7 @@ client/proc/display_admin_reports()
usr << browse(output, "window=news;size=600x400")
-client/proc/Report(mob/M as mob in world)
+client/proc/Report(mob/M as mob in mob_list)
set category = "Admin"
if(!src.holder)
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 977e79bd28d..71654c31d25 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -640,7 +640,7 @@ var/list/admin_verbs_mentor = list(
log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].")
message_admins("\blue [key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1)
-/client/proc/make_sound(var/obj/O in world) // -- TLE
+/client/proc/make_sound(var/obj/O in range(world.view)) // -- TLE
set category = "Special Verbs"
set name = "Make Sound"
set desc = "Display a message to everyone who can hear the target"
diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm
index 9b3da2b92fe..41b8998c30a 100644
--- a/code/modules/admin/callproc/callproc.dm
+++ b/code/modules/admin/callproc/callproc.dm
@@ -33,7 +33,7 @@
callproc_targetpicked(targetselected, target)
-/client/proc/callproc_target(atom/A in world)
+/client/proc/callproc_target(atom/A in range(world.view))
set category = "Debug"
set name = "Advanced ProcCall Target"
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index e579ca15444..a8d98beaf0d 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -21,7 +21,7 @@
else
alert("Admin jumping disabled")
-/client/proc/jumptoturf(var/turf/T in world)
+/client/proc/jumptoturf(var/turf/T in turfs)
set name = "Jump to Turf"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG))
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 9154badcc6b..7c4a74d65d6 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -119,7 +119,7 @@
alert("Invalid mob")
/*
-/client/proc/cmd_admin_monkeyize(var/mob/M in world)
+/client/proc/cmd_admin_monkeyize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Monkey"
@@ -134,7 +134,7 @@
else
alert("Invalid mob")
-/client/proc/cmd_admin_changelinginize(var/mob/M in world)
+/client/proc/cmd_admin_changelinginize(var/mob/M in mob_list)
set category = "Fun"
set name = "Make Changeling"
@@ -152,7 +152,7 @@
alert("Invalid mob")
*/
/*
-/client/proc/cmd_admin_abominize(var/mob/M in world)
+/client/proc/cmd_admin_abominize(var/mob/M in mob_list)
set category = null
set name = "Make Abomination"
@@ -169,7 +169,7 @@
*/
/*
-/client/proc/make_cultist(var/mob/M in world) // -- TLE, modified by Urist
+/client/proc/make_cultist(var/mob/M in mob_list) // -- TLE, modified by Urist
set category = "Fun"
set name = "Make Cultist"
set desc = "Makes target a cultist"
diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm
index 50ddc81f41b..713b8f6a51d 100644
--- a/code/modules/admin/verbs/modifyvariables.dm
+++ b/code/modules/admin/verbs/modifyvariables.dm
@@ -9,7 +9,7 @@ var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays")
var/list/VVckey_edit = list("key", "ckey")
/*
-/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world)
+/client/proc/cmd_modify_object_variables(obj/O as obj|mob|turf|area in world) // Acceptable 'in world', as VV would be incredibly hampered otherwise
set category = "Debug"
set name = "Edit Variables"
set desc="(target) Edit a target item's variables"
diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm
index 6de30853ce6..a9787261004 100644
--- a/code/modules/admin/verbs/possess.dm
+++ b/code/modules/admin/verbs/possess.dm
@@ -1,4 +1,4 @@
-/proc/possess(obj/O as obj in world)
+/proc/possess(obj/O as obj in range(world.view))
set name = "Possess Obj"
set category = "Object"
@@ -26,7 +26,7 @@
usr.control_object = O
feedback_add_details("admin_verb","PO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/proc/release(obj/O as obj in world)
+/proc/release(obj/O as obj in range(world.view))
set name = "Release Obj"
set category = "Object"
//usr.loc = get_turf(usr)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index ba00a930b39..6924b2b716f 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -536,7 +536,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has created a command report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view())
+/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in range(world.view))
set category = "Admin"
set name = "Delete"
@@ -562,7 +562,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
src << "[job.title]: [job.total_positions]"
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
+/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in range(world.view))
set category = "Special Verbs"
set name = "Explosion"
@@ -590,7 +590,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
return
-/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
+/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in range(world.view))
set category = "Special Verbs"
set name = "EM Pulse"
diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm
index e624d2df05a..09505ac5771 100644
--- a/code/modules/admin/view_variables/view_variables.dm
+++ b/code/modules/admin/view_variables/view_variables.dm
@@ -6,6 +6,7 @@
// Variables not to expand the lists of. Vars is pointless to expand, and overlays/underlays cannot be expanded.
/var/list/view_variables_dont_expand = list("overlays", "underlays", "vars")
+// Acceptable 'in world', as VV would be incredibly hampered otherwise
/client/proc/debug_variables(datum/D in world)
set category = "Debug"
set name = "View Variables"
diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm
index b03c148026c..f448ce35a11 100644
--- a/code/modules/assembly/infrared.dm
+++ b/code/modules/assembly/infrared.dm
@@ -187,13 +187,10 @@
return
/obj/effect/beam/i_beam/process()
- //world << "i_beam \ref[src] : process"
- if((loc.density || !(master)))
- // world << "beam hit loc [loc] or no master [master], deleting"
+ if((loc && loc.density) || !master)
qdel(src)
return
- //world << "proccess: [src.left] left"
if(left > 0)
left--
diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm
index cfc46a86a5c..2b71743416e 100644
--- a/code/modules/assembly/proximity.dm
+++ b/code/modules/assembly/proximity.dm
@@ -40,6 +40,9 @@
HasProximity(atom/movable/AM as mob|obj)
+ if(!istype(AM))
+ log_debug("DEBUG: HasProximity called with [AM] on [src] ([usr]).")
+ return
if (istype(AM, /obj/effect/beam)) return
if (AM.move_speed < 12) sense()
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 681b33d6892..81d9bc4a8c7 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -6,6 +6,10 @@
var/list/species_restricted = null //Only these species can wear this kit.
var/gunshot_residue //Used by forensics.
+ var/list/accessories = list()
+ var/list/valid_accessory_slots
+ var/list/restricted_accessory_slots
+
/*
Sprites used when the clothing item is refit. This is done by setting icon_override.
For best results, if this is set then sprite_sheets should be null and vice versa, but that is by no means necessary.
@@ -509,7 +513,6 @@ BLIND // can't see anything
2 = Report detailed damages
3 = Report location
*/
- var/list/accessories = list()
var/displays_id = 1
var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled
sprite_sheets = list(
@@ -520,6 +523,15 @@ BLIND // can't see anything
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
var/worn_state = null
+ valid_accessory_slots = list("utility","armband","decor")
+ restricted_accessory_slots = list("utility", "armband")
+
+
+/obj/item/clothing/under/attack_hand(var/mob/user)
+ if(accessories && accessories.len)
+ ..()
+ if ((ishuman(usr) || issmall(usr)) && src.loc == user)
+ return
/obj/item/clothing/under/New()
..()
@@ -563,69 +575,6 @@ BLIND // can't see anything
var/mob/M = src.loc
M.update_inv_w_uniform()
-/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A)
- if(istype(A))
- .=1
- else
- return 0
- if(accessories.len && (A.slot in list("utility","armband")))
- for(var/obj/item/clothing/accessory/AC in accessories)
- if (AC.slot == A.slot)
- return 0
-
-/obj/item/clothing/under/attackby(obj/item/I, mob/user)
- if(istype(I, /obj/item/clothing/accessory))
- var/obj/item/clothing/accessory/A = I
- if(can_attach_accessory(A))
- user.drop_item()
- accessories += A
- A.on_attached(src, user)
-
- if(istype(loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = loc
- H.update_inv_w_uniform()
-
- return
- else
- user << "You cannot attach more accessories of this type to [src]."
-
- if(accessories.len)
- for(var/obj/item/clothing/accessory/A in accessories)
- A.attackby(I, user)
- return
-
- ..()
-
-/obj/item/clothing/under/attack_hand(mob/user as mob)
- //only forward to the attached accessory if the clothing is equipped (not in a storage)
- if(accessories.len && src.loc == user)
- for(var/obj/item/clothing/accessory/A in accessories)
- A.attack_hand(user)
- return
-
- if ((ishuman(usr) || issmall(usr)) && src.loc == user) //make it harder to accidentally undress yourself
- return
-
- ..()
-
-/obj/item/clothing/under/MouseDrop(obj/over_object as obj)
- if (ishuman(usr) || issmall(usr))
- //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
- if (!(src.loc == usr))
- return
-
- if (( usr.restrained() ) || ( usr.stat ))
- return
-
- if (!usr.unEquip(src))
- return
-
- switch(over_object.name)
- if("r_hand")
- usr.put_in_r_hand(src)
- if("l_hand")
- usr.put_in_l_hand(src)
- src.add_fingerprint(usr)
/obj/item/clothing/under/examine(mob/user)
..(user)
@@ -638,9 +587,6 @@ BLIND // can't see anything
user << "Its vital tracker appears to be enabled."
if(3)
user << "Its vital tracker and tracking beacon appear to be enabled."
- if(accessories.len)
- for(var/obj/item/clothing/accessory/A in accessories)
- user << "\A [A] is attached to it."
/obj/item/clothing/under/proc/set_sensors(mob/usr as mob)
var/mob/M = usr
@@ -713,34 +659,7 @@ BLIND // can't see anything
item_state_slots[slot_w_uniform_str] = "[worn_state]"
update_clothing_icon()
-/obj/item/clothing/under/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
- if(!(A in accessories))
- return
-
- A.on_removed(user)
- accessories -= A
- update_clothing_icon()
-
-/obj/item/clothing/under/verb/removetie()
- set name = "Remove Accessory"
- set category = "Object"
- set src in usr
- if(!istype(usr, /mob/living)) return
- if(usr.stat) return
- if(!accessories.len) return
- var/obj/item/clothing/accessory/A
- if(accessories.len > 1)
- A = input("Select an accessory to remove from [src]") as null|anything in accessories
- else
- A = accessories[1]
- src.remove_accessory(usr,A)
/obj/item/clothing/under/rank/New()
sensor_mode = pick(0,1,2,3)
..()
-
-/obj/item/clothing/under/emp_act(severity)
- if(accessories.len)
- for(var/obj/item/clothing/accessory/A in accessories)
- A.emp_act(severity)
- ..()
\ No newline at end of file
diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm
new file mode 100644
index 00000000000..57e22d6ba04
--- /dev/null
+++ b/code/modules/clothing/clothing_accessories.dm
@@ -0,0 +1,100 @@
+/obj/item/clothing/proc/can_attach_accessory(obj/item/clothing/accessory/A)
+ if(valid_accessory_slots && istype(A) && (A.slot in valid_accessory_slots))
+ .=1
+ else
+ return 0
+ if(accessories.len && restricted_accessory_slots && (A.slot in restricted_accessory_slots))
+ for(var/obj/item/clothing/accessory/AC in accessories)
+ if (AC.slot == A.slot)
+ return 0
+
+/obj/item/clothing/attackby(var/obj/item/I, var/mob/user)
+ if(istype(I, /obj/item/clothing/accessory))
+
+ if(!valid_accessory_slots || !valid_accessory_slots.len)
+ usr << "You cannot attach accessories of any kind to \the [src]."
+ return
+
+ var/obj/item/clothing/accessory/A = I
+ if(can_attach_accessory(A))
+ user.drop_item()
+ accessories += A
+ A.on_attached(src, user)
+ src.verbs |= /obj/item/clothing/proc/removetie_verb
+ if(istype(loc, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = loc
+ H.update_inv_w_uniform()
+ return
+ else
+ user << "You cannot attach more accessories of this type to [src]."
+ return
+
+ if(accessories.len)
+ for(var/obj/item/clothing/accessory/A in accessories)
+ A.attackby(I, user)
+ return
+
+ ..()
+
+/obj/item/clothing/attack_hand(var/mob/user)
+ //only forward to the attached accessory if the clothing is equipped (not in a storage)
+ if(accessories.len && src.loc == user)
+ for(var/obj/item/clothing/accessory/A in accessories)
+ A.attack_hand(user)
+ return
+ return ..()
+
+/obj/item/clothing/MouseDrop(var/obj/over_object)
+ if (ishuman(usr) || issmall(usr))
+ //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away.
+ if (!(src.loc == usr))
+ return
+
+ if (( usr.restrained() ) || ( usr.stat ))
+ return
+
+ if (!usr.unEquip(src))
+ return
+
+ switch(over_object.name)
+ if("r_hand")
+ usr.put_in_r_hand(src)
+ if("l_hand")
+ usr.put_in_l_hand(src)
+ src.add_fingerprint(usr)
+
+/obj/item/clothing/examine(var/mob/user)
+ ..(user)
+ if(accessories.len)
+ for(var/obj/item/clothing/accessory/A in accessories)
+ user << "\A [A] is attached to it."
+
+/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
+ if(!(A in accessories))
+ return
+
+ A.on_removed(user)
+ accessories -= A
+ update_clothing_icon()
+
+/obj/item/clothing/proc/removetie_verb()
+ set name = "Remove Accessory"
+ set category = "Object"
+ set src in usr
+ if(!istype(usr, /mob/living)) return
+ if(usr.stat) return
+ if(!accessories.len) return
+ var/obj/item/clothing/accessory/A
+ if(accessories.len > 1)
+ A = input("Select an accessory to remove from [src]") as null|anything in accessories
+ else
+ A = accessories[1]
+ src.remove_accessory(usr,A)
+ if(!accessories.len)
+ src.verbs -= /obj/item/clothing/proc/removetie_verb
+
+/obj/item/clothing/emp_act(severity)
+ if(accessories.len)
+ for(var/obj/item/clothing/accessory/A in accessories)
+ A.emp_act(severity)
+ ..()
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
index b8244a0a8a2..9c516009525 100644
--- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm
@@ -169,6 +169,10 @@
interface_name = "dead man's switch"
interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button."
+ var/list/explosion_values = list(1,2,4,5)
+
+/obj/item/rig_module/self_destruct/small
+ explosion_values = list(0,0,3,4)
/obj/item/rig_module/self_destruct/activate()
return
@@ -184,17 +188,12 @@
//OH SHIT.
if(holder.wearer.stat == 2)
- engage()
+ engage(1)
-/obj/item/rig_module/self_destruct/engage()
- explosion(get_turf(src), 1, 2, 4, 5)
- if(holder && holder.wearer)
- holder.wearer.drop_from_inventory(src)
- qdel(holder)
- qdel(src)
-
-/obj/item/rig_module/self_destruct/small/engage()
- explosion(get_turf(src), 0, 0, 3, 4)
+/obj/item/rig_module/self_destruct/engage(var/skip_check)
+ if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No")
+ return
+ explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4])
if(holder && holder.wearer)
holder.wearer.drop_from_inventory(src)
qdel(holder)
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 13d48df5cce..ba3c9f58b28 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -560,8 +560,8 @@
M.visible_message("[M] starts putting on \the [src]...", "You start putting on \the [src]...")
if(!do_after(M,seal_delay))
if(M && M.back == src)
- M.back = null
- M.drop_from_inventory(src)
+ if(!M.unEquip(src))
+ return
src.forceMove(get_turf(src))
return
@@ -632,12 +632,9 @@
use_obj.forceMove(src)
if(check_slot)
H << "You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way."
+ return
else
- use_obj.forceMove(H)
- if(!H.equip_to_slot_if_possible(use_obj, equip_to, 0))
- use_obj.forceMove(src)
- else
- H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly."
+ H << "Your [use_obj.name] [use_obj.gender == PLURAL ? "deploy" : "deploys"] swiftly."
if(piece == "helmet" && helmet)
helmet.update_light(H)
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index 8faff35a296..c9526f16261 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -56,7 +56,7 @@
user << "\The [src] already has a tank installed."
return
- user.drop_from_inventory(W)
+ if(!user.unEquip(W)) return
air_supply = W
W.forceMove(src)
user << "You slot [W] into [src] and tighten the connecting valve."
@@ -84,8 +84,8 @@
return
if(!user || !W)
return
+ if(!user.unEquip(mod)) return
user << "You install \the [mod] into \the [src]."
- user.drop_from_inventory(mod)
installed_modules |= mod
mod.forceMove(src)
mod.installed(src)
@@ -94,8 +94,8 @@
else if(!cell && istype(W,/obj/item/weapon/cell))
+ if(!user.unEquip(W)) return
user << "You jack \the [W] into \the [src]'s battery mount."
- user.drop_from_inventory(W)
W.forceMove(src)
src.cell = W
return
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index 2c6d761a7a6..86edeca84dd 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -186,8 +186,11 @@
if(!istype(user,/mob/living)) return
+ if(istype(W,/obj/item/clothing/accessory) || istype(W, /obj/item/weapon/hand_labeler))
+ return ..()
+
if(istype(src.loc,/mob/living))
- user << "How do you propose to modify a voidsuit while it is being worn?"
+ user << "You cannot modify \the [src] while it is being worn."
return
if(istype(W,/obj/item/weapon/screwdriver))
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 300422bc731..49e01de7293 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/suit/armor
- allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/device/radio,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
item_flags = THICKMATERIAL
@@ -66,7 +66,7 @@
/obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam))
var/obj/item/projectile/P = damage_source
-
+
var/reflectchance = 40 - round(damage/3)
if(!(def_zone in list("chest", "groin")))
reflectchance /= 2
@@ -146,12 +146,12 @@
if(!turfs.len) turfs += pick(/turf in orange(6))
var/turf/picked = pick(turfs)
if(!isturf(picked)) return
-
+
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(user.loc, "sparks", 50, 1)
-
+
user.loc = picked
return PROJECTILE_FORCE_MISS
return 0
@@ -244,102 +244,58 @@
icon_state = "ertarmor_med"
//New Vests
-/obj/item/clothing/suit/storage/vest
+/obj/item/clothing/suit/armor/vest
name = "armor vest"
- desc = "A simple kevlar plate carrier."
+ desc = "An armor vest made of synthetic fibers."
icon_state = "kvest"
- item_state = "kvest"
+ item_state = "armor"
armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
- allowed = list(/obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
+
+/obj/item/clothing/suit/armor/vest/security
+ name = "security vest"
+ desc = "A synthetic armor vest. This one is marked with the crest of NanoTrasen."
+ icon_state = "secvest"
+
+/obj/item/clothing/suit/armor/vest/detective
+ name = "detective armor vest"
+ desc = "An synthetic armor vest colored in a vintage brown."
+ icon_state = "detvest"
+
+/obj/item/clothing/suit/storage/vest
+ name = "webbed armor vest"
+ desc = "A synthetic armor vest. This one has added webbing and ballistic plates."
+ icon_state = "webvest"
+ armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)
+ allowed = list(/obj/item/weapon/gun/energy,/obj/item/device/radio,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
/obj/item/clothing/suit/storage/vest/officer
- name = "officer armor vest"
- desc = "A simple kevlar plate carrier. This one has a security holobadge clipped to the chest."
- icon_state = "officervest_nobadge"
- item_state = "officervest_nobadge"
- icon_badge = "officervest_badge"
- icon_nobadge = "officervest_nobadge"
+ name = "security armor vest"
+ desc = "A synthetic armor vest with SECURITY printed in red lettering on the chest. This one has added webbing and ballistic plates."
+ icon_state = "officervest"
/obj/item/clothing/suit/storage/vest/warden
name = "warden armor vest"
- desc = "A simple kevlar plate carrier. This one has a silver badge clipped to the chest."
- icon_state = "wardenvest_nobadge"
- item_state = "wardenvest_nobadge"
- icon_badge = "wardenvest_badge"
- icon_nobadge = "wardenvest_nobadge"
+ desc = "A synthetic armor vest with WARDEN printed in silver lettering on the chest. This one has added webbing and ballistic plates."
+ icon_state = "wardenvest"
/obj/item/clothing/suit/storage/vest/hos
name = "commander armor vest"
- desc = "A simple kevlar plate carrier. This one has a gold badge clipped to the chest."
- icon_state = "hosvest_nobadge"
- item_state = "hosvest_nobadge"
- icon_badge = "hosvest_badge"
- icon_nobadge = "hosvest_nobadge"
+ desc = "A synthetic armor vest with COMMANDER printed in gold lettering on the chest. This one has added webbing and ballistic plates."
+ icon_state = "hosvest"
/obj/item/clothing/suit/storage/vest/pcrc
name = "PCRC armor vest"
- desc = "A simple kevlar plate carrier belonging to Proxima Centauri Risk Control. This one has a PCRC crest clipped to the chest."
- icon_state = "pcrcvest_nobadge"
- item_state = "pcrcvest_nobadge"
- icon_badge = "pcrcvest_badge"
- icon_nobadge = "pcrcvest_nobadge"
-
-/obj/item/clothing/suit/storage/vest/detective
- name = "detective armor vest"
- desc = "A simple kevlar plate carrier in a vintage brown, it has a badge clipped to the chest that reads, 'Private investigator'."
- icon_state = "detectivevest_nobadge"
- item_state = "detectivevest_nobadge"
- icon_badge = "detectivevest_badge"
- icon_nobadge = "detectivevest_nobadge"
-
-/obj/item/clothing/suit/storage/vest/heavy
- name = "heavy armor vest"
- desc = "A heavy kevlar plate carrier with webbing attached."
- icon_state = "webvest"
- item_state = "webvest"
- armor = list(melee = 50, bullet = 40, laser = 50, energy = 25, bomb = 30, bio = 0, rad = 0)
- slowdown = 1
-
-/obj/item/clothing/suit/storage/vest/heavy/officer
- name = "officer heavy armor vest"
- desc = "A heavy kevlar plate carrier with webbing attached. This one has a security holobadge clipped to the chest."
- icon_state = "officerwebvest_nobadge"
- item_state = "officerwebvest_nobadge"
- icon_badge = "officerwebvest_badge"
- icon_nobadge = "officerwebvest_nobadge"
-
-/obj/item/clothing/suit/storage/vest/heavy/warden
- name = "warden heavy armor vest"
- desc = "A heavy kevlar plate carrier with webbing attached. This one has a silver badge clipped to the chest."
- icon_state = "wardenwebvest_nobadge"
- item_state = "wardenwebvest_nobadge"
- icon_badge = "wardenwebvest_badge"
- icon_nobadge = "wardenwebvest_nobadge"
-
-/obj/item/clothing/suit/storage/vest/heavy/hos
- name = "commander heavy armor vest"
- desc = "A heavy kevlar plate carrier with webbing attached. This one has a gold badge clipped to the chest."
- icon_state = "hoswebvest_nobadge"
- item_state = "hoswebvest_nobadge"
- icon_badge = "hoswebvest_badge"
- icon_nobadge = "hoswebvest_nobadge"
-
-/obj/item/clothing/suit/storage/vest/heavy/pcrc
- name = "PCRC heavy armor vest"
- desc = "A heavy kevlar plate carrier belonging to Proxima Centauri Risk Control with webbing attached. This one has a PCRC crest clipped to the chest."
- icon_state = "pcrcwebvest_nobadge"
- item_state = "pcrcwebvest_nobadge"
- icon_badge = "pcrcwebvest_badge"
- icon_nobadge = "pcrcwebvest_nobadge"
+ desc = "A synthetic armor vest with SECURITY printed in cyan lettering on the chest. This one has added webbing and ballistic plates."
+ icon_state = "pcrcvest"
//Provides the protection of a merc voidsuit, but only covers the chest/groin, and also takes up a suit slot. In exchange it has no slowdown and provides storage.
-/obj/item/clothing/suit/storage/vest/heavy/merc
+/obj/item/clothing/suit/storage/vest/merc
name = "heavy armor vest"
- desc = "A high-quality heavy kevlar plate carrier in a fetching tan. The vest is surprisingly flexible, and possibly made of an advanced material."
+ desc = "A high-quality armor vest in a fetching tan. It is surprisingly flexible and light, even with the added webbing and armor plating."
icon_state = "mercwebvest"
item_state = "mercwebvest"
armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0)
- slowdown = 0
+
//All of the armor below is mostly unused
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 36ece959bfc..eca8fd34ef8 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -52,32 +52,10 @@
update_clothing_icon() //so our overlays update
-//New Vest 4 pocket storage and badge toggles, until suit accessories are a thing.
-/obj/item/clothing/suit/storage/vest/heavy/New()
+/obj/item/clothing/suit/storage/vest/merc/New()
..()
pockets = new/obj/item/weapon/storage/internal(src)
pockets.storage_slots = 4
pockets.max_w_class = 2
pockets.max_storage_space = 8
-/obj/item/clothing/suit/storage/vest
- var/icon_badge
- var/icon_nobadge
- verb/toggle()
- set name ="Adjust Badge"
- set category = "Object"
- set src in usr
- if(!usr.canmove || usr.stat || usr.restrained())
- return 0
-
- if(icon_state == icon_badge)
- icon_state = icon_nobadge
- usr << "You conceal \the [src]'s badge."
- else if(icon_state == icon_nobadge)
- icon_state = icon_badge
- usr << "You reveal \the [src]'s badge."
- else
- usr << "\The [src] does not have a vest badge."
- return
- update_clothing_icon()
-
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index bdc9f33a2e9..0f4ec46c941 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -7,16 +7,20 @@
slot_flags = SLOT_TIE
w_class = 2.0
var/slot = "decor"
- var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
+ var/obj/item/clothing/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
var/image/mob_overlay = null
var/overlay_state = null
+/obj/item/clothing/accessory/Destroy()
+ on_removed()
+ return ..()
+
/obj/item/clothing/accessory/proc/get_inv_overlay()
if(!inv_overlay)
if(!mob_overlay)
get_mob_overlay()
-
+
var/tmp_icon_state = "[overlay_state? "[overlay_state]" : "[icon_state]"]"
if(icon_override)
if("[tmp_icon_state]_tie" in icon_states(icon_override))
@@ -36,23 +40,26 @@
return mob_overlay
//when user attached an accessory to S
-/obj/item/clothing/accessory/proc/on_attached(obj/item/clothing/under/S, mob/user as mob)
+/obj/item/clothing/accessory/proc/on_attached(var/obj/item/clothing/S, var/mob/user)
if(!istype(S))
return
has_suit = S
loc = has_suit
has_suit.overlays += get_inv_overlay()
- user << "You attach [src] to [has_suit]."
+ user << "You attach \the [src] to \the [has_suit]."
src.add_fingerprint(user)
-/obj/item/clothing/accessory/proc/on_removed(mob/user as mob)
+/obj/item/clothing/accessory/proc/on_removed(var/mob/user)
if(!has_suit)
return
has_suit.overlays -= get_inv_overlay()
has_suit = null
- usr.put_in_hands(src)
- src.add_fingerprint(user)
+ if(user)
+ usr.put_in_hands(src)
+ src.add_fingerprint(user)
+ else
+ src.forceMove(get_turf(src))
//default attackby behaviour
/obj/item/clothing/accessory/attackby(obj/item/I, mob/user)
diff --git a/code/modules/clothing/under/accessories/badges.dm b/code/modules/clothing/under/accessories/badges.dm
index 6b875ce5c8f..c04c899c369 100644
--- a/code/modules/clothing/under/accessories/badges.dm
+++ b/code/modules/clothing/under/accessories/badges.dm
@@ -6,8 +6,9 @@
/obj/item/clothing/accessory/badge
name = "detective's badge"
- desc = "Security Department detective's badge, made from gold."
+ desc = "A corporate security badge, made from gold and set on false leather."
icon_state = "badge"
+ item_state = "marshalbadge"
slot_flags = SLOT_BELT | SLOT_TIE
var/stored_name
@@ -25,7 +26,7 @@
/obj/item/clothing/accessory/badge/attack_self(mob/user as mob)
if(!stored_name)
- user << "You polish your old badge fondly, shining up the surface."
+ user << "You polish your badge fondly, shining up the surface."
set_name(user.real_name)
return
@@ -38,14 +39,13 @@
/obj/item/clothing/accessory/badge/attack(mob/living/carbon/human/M, mob/living/user)
if(isliving(user))
user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face insistently.","You invade [M]'s personal space, thrusting [src] into their face insistently.")
- user.do_attack_animation(M)
- user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
//.Holobadges.
/obj/item/clothing/accessory/badge/holo
name = "holobadge"
- desc = "This glowing blue badge marks the holder as THE LAW."
+ desc = "This glowing blue badge marks the holder as a member of corporate security."
icon_state = "holobadge"
+ item_state = "holobadge"
var/emagged //Emagging removes Sec check.
/obj/item/clothing/accessory/badge/holo/cord
@@ -98,3 +98,24 @@
new /obj/item/clothing/accessory/badge/holo/cord(src)
..()
return
+
+
+/obj/item/clothing/accessory/badge/warden
+ name = "warden's badge"
+ desc = "A silver corporate security badge. Stamped with the words 'Brig Officer.'"
+ icon_state = "silverbadge"
+ slot_flags = SLOT_TIE
+
+
+/obj/item/clothing/accessory/badge/hos
+ name = "commander's badge"
+ desc = "An immaculately polished gold security badge. Labeled 'Commander.'"
+ icon_state = "goldbadge"
+ slot_flags = SLOT_TIE
+
+/obj/item/clothing/accessory/badge/marshal
+ name = "marshal's badge"
+ desc = "A leather-backed gold badge displaying the crest of the Colonial Marshals."
+ icon_state = "marshalbadge"
+ badge_string = "Colonial Marshal Bureau"
+
diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm
index 93fda30055e..461f3451379 100644
--- a/code/modules/mob/freelook/ai/eye.dm
+++ b/code/modules/mob/freelook/ai/eye.dm
@@ -18,7 +18,7 @@
ai.ai_cancel_tracking()
//Holopad
- if(ai.holo)
+ if(ai.holo && ai.hologram_follow)
ai.holo.move_hologram(ai)
return 1
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 9140428d790..dcd7e06f235 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -770,6 +770,12 @@ var/global/list/damage_icon_parts = list()
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
+ // Accessories - copied from uniform, BOILERPLATE because fuck this system.
+ var/obj/item/clothing/suit/suit = wear_suit
+ if(istype(suit) && suit.accessories.len)
+ for(var/obj/item/clothing/accessory/A in suit.accessories)
+ standing.overlays |= A.get_mob_overlay()
+
overlays_standing[SUIT_LAYER] = standing
update_tail_showing(0)
diff --git a/code/modules/mob/living/carbon/resist.dm b/code/modules/mob/living/carbon/resist.dm
index a5b4cd20925..7ddbe6bc6eb 100644
--- a/code/modules/mob/living/carbon/resist.dm
+++ b/code/modules/mob/living/carbon/resist.dm
@@ -29,8 +29,8 @@
/mob/living/carbon/proc/escape_handcuffs()
//if(!(last_special <= world.time)) return
- //These two lines represent a significant buff to grabs...
- if(!canClick()) return
+ //This line represent a significant buff to grabs...
+ // We don't have to check the click cooldown because /mob/living/verb/resist() has done it for us, we can simply set the delay
setClickCooldown(100)
if(can_break_cuffs()) //Don't want to do a lot of logic gating here.
@@ -53,7 +53,7 @@
displaytime /= 2
visible_message(
- "[src] attempts to remove \the [HC]!",
+ "\The [src] attempts to remove \the [HC]!",
"You attempt to remove \the [HC]. (This will take around [displaytime] minutes and you need to stand still)"
)
@@ -61,7 +61,7 @@
if(!handcuffed || buckled)
return
visible_message(
- "[src] manages to remove \the [handcuffed]!",
+ "\The [src] manages to remove \the [handcuffed]!",
"You successfully remove \the [handcuffed]."
)
drop_from_inventory(handcuffed)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 5d3cf1a74c7..72ee2ce2318 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -23,7 +23,8 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/proc/sensor_mode,
/mob/living/silicon/ai/proc/show_laws_verb,
/mob/living/silicon/ai/proc/toggle_acceleration,
- /mob/living/silicon/ai/proc/toggle_camera_light
+ /mob/living/silicon/ai/proc/toggle_camera_light,
+ /mob/living/silicon/ai/proc/toggle_hologram_movement
)
//Not sure why this is necessary...
@@ -61,6 +62,7 @@ var/list/ai_verbs_default = list(
var/control_disabled = 0
var/datum/announcement/priority/announcement
var/obj/machinery/ai_powersupply/psupply = null // Backwards reference to AI's powersupply object.
+ var/hologram_follow = 1 //This is used for the AI eye, to determine if a holopad's hologram should follow it or not
//NEWMALF VARIABLES
var/malfunctioning = 0 // Master var that determines if AI is malfunctioning.
@@ -203,6 +205,7 @@ var/list/ai_verbs_default = list(
/mob/living/silicon/ai/Destroy()
ai_list -= src
qdel(eyeobj)
+ eyeobj = null
..()
/mob/living/silicon/ai/proc/setup_icon()
@@ -644,6 +647,14 @@ var/list/ai_verbs_default = list(
set desc = "Augment visual feed with internal sensor overlays"
toggle_sensor_mode()
+/mob/living/silicon/ai/proc/toggle_hologram_movement()
+ set name = "Toggle Hologram Movement"
+ set category = "AI Commands"
+ set desc = "Toggles hologram movement based on moving with your virtual eye."
+
+ hologram_follow = !hologram_follow
+ usr << "Your hologram will now [hologram_follow ? "follow" : "no longer follow"] you."
+
/mob/living/silicon/ai/proc/check_unable(var/flags = 0, var/feedback = 1)
if(stat == DEAD)
if(feedback) src << "You are dead!"
diff --git a/code/modules/mob/living/silicon/pai/admin.dm b/code/modules/mob/living/silicon/pai/admin.dm
index 069c5d2c684..da136c78f14 100644
--- a/code/modules/mob/living/silicon/pai/admin.dm
+++ b/code/modules/mob/living/silicon/pai/admin.dm
@@ -1,5 +1,5 @@
// Originally a debug verb, made it a proper adminverb for ~fun~
-/client/proc/makePAI(turf/t in view(), name as text, pai_key as null|text)
+/client/proc/makePAI(turf/t in range(world.view), name as text, pai_key as null|text)
set name = "Make pAI"
set category = "Admin"
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a9805e78997..b3eb428c43e 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -85,8 +85,7 @@
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
/mob/visible_message(var/message, var/self_message, var/blind_message)
-
- var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null)
+ var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(world.view,src)
for(var/I in see)
if(isobj(I))
@@ -152,8 +151,33 @@
//handle_typing_indicator() //You said the typing indicator would be fine. The test determined that was a lie.
return
-/mob/proc/incapacitated()
- return (stat || paralysis || stunned || weakened || restrained())
+#define UNBUCKLED 0
+#define PARTIALLY_BUCKLED 1
+#define FULLY_BUCKLED 2
+/mob/proc/buckled()
+ // Preliminary work for a future buckle rewrite,
+ // where one might be fully restrained (like an elecrical chair), or merely secured (shuttle chair, keeping you safe but not otherwise restrained from acting)
+ return buckled ? FULLY_BUCKLED : UNBUCKLED
+
+/mob/proc/incapacitated(var/incapacitation_flags = INCAPACITATION_DEFAULT)
+ if (stat || paralysis || stunned || weakened || resting || sleeping || (status_flags & FAKEDEATH))
+ return 1
+
+ if((incapacitation_flags & INCAPACITATION_RESTRAINED) && restrained())
+ return 1
+
+ if((incapacitation_flags & (INCAPACITATION_BUCKLED_PARTIALLY|INCAPACITATION_BUCKLED_FULLY)))
+ var/buckling = buckled()
+ if(buckling >= PARTIALLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_PARTIALLY))
+ return 1
+ if(buckling == FULLY_BUCKLED && (incapacitation_flags & INCAPACITATION_BUCKLED_FULLY))
+ return 1
+
+ return 0
+
+#undef UNBUCKLED
+#undef PARTIALLY_BUCKLED
+#undef FULLY_BUCKLED
/mob/proc/restrained()
return
@@ -699,7 +723,7 @@
return 0
/mob/proc/cannot_stand()
- return incapacitated() || restrained() || resting || sleeping || (status_flags & FAKEDEATH)
+ return incapacitated(INCAPACITATION_DEFAULT & (~INCAPACITATION_RESTRAINED))
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
/mob/proc/update_canmove()
diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm
index da27c1102f7..1686416bcce 100644
--- a/code/modules/mob/new_player/login.dm
+++ b/code/modules/mob/new_player/login.dm
@@ -1,5 +1,22 @@
+/var/obj/effect/lobby_image = new/obj/effect/lobby_image()
-/var/atom/movable/lobby_image = new /atom/movable{icon = 'icons/misc/title.dmi'; icon_state = "title"; screen_loc = "1,1"; name = "Baystation12"}
+/obj/effect/lobby_image
+ name = "Baystation12"
+ desc = "This shouldn't be read"
+ icon = 'icons/misc/title.dmi'
+ screen_loc = "WEST,SOUTH"
+
+/obj/effect/lobby_image/initialize()
+ var/list/known_icon_states = icon_states(icon)
+ for(var/lobby_screen in config.lobby_screens)
+ if(!(lobby_screen in known_icon_states))
+ error("Lobby screen '[lobby_screen]' did not exist in the icon set [icon].")
+ config.lobby_screens -= lobby_screen
+
+ if(config.lobby_screens.len)
+ icon_state = pick(config.lobby_screens)
+ else
+ icon_state = known_icon_states[1]
/mob/new_player
var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 52e2bd97dd4..e046422b1bf 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -7,7 +7,6 @@ var/global/datum/robolimb/basic_robolimb
for(var/limb_type in typesof(/datum/robolimb))
var/datum/robolimb/R = new limb_type()
all_robolimbs[R.company] = R
- world << "Adding [R.company] as [R], [R.type]"
if(!R.unavailable_at_chargen)
chargen_robolimbs[R.company] = R
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index fd4b684f5be..6eaf220e059 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -9,7 +9,7 @@
load_method = MAGAZINE
/obj/item/weapon/gun/projectile/colt/detective
- magazine_type = /obj/item/ammo_magazine/c45m/rubber
+ magazine_type = /obj/item/ammo_magazine/c45m/flash
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
set name = "Name Gun"
@@ -33,7 +33,7 @@
name = ".45 pistol"
desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds."
icon_state = "secguncomp"
- magazine_type = /obj/item/ammo_magazine/c45m/rubber
+ magazine_type = /obj/item/ammo_magazine/c45m/flash
caliber = ".45"
origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
fire_sound = 'sound/weapons/Gunshot_light.ogg'
@@ -41,7 +41,6 @@
/obj/item/weapon/gun/projectile/sec/flash
name = ".45 signal pistol"
- magazine_type = /obj/item/ammo_magazine/c45m/flash
/obj/item/weapon/gun/projectile/sec/wood
desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds."
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 0bfc339ce0b..6705f667c1f 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -86,17 +86,17 @@
var/total_pellets = get_pellets(distance)
var/spread = max(base_spread - (spread_step*distance), 0)
-
+
//shrapnel explosions miss prone mobs with a chance that increases with distance
var/prone_chance = 0
if(!base_spread)
prone_chance = max(spread_step*(distance - 2), 0)
-
+
var/hits = 0
for (var/i in 1 to total_pellets)
if(target_mob.lying && target_mob != original && prob(prone_chance))
continue
-
+
//pellet hits spread out across different zones, but 'aim at' the targeted zone with higher probability
//whether the pellet actually hits the def_zone or a different zone should still be determined by the parent using get_zone_with_miss_chance().
var/old_zone = def_zone
@@ -115,7 +115,7 @@
/obj/item/projectile/bullet/pellet/Move()
. = ..()
-
+
//If this is a shrapnel explosion, allow mobs that are prone to get hit, too
if(. && !base_spread && isturf(loc))
for(var/mob/living/M in loc)
@@ -137,8 +137,8 @@
/obj/item/projectile/bullet/pistol/rubber //"rubber" bullets
name = "rubber bullet"
check_armour = "melee"
- damage = 10
- agony = 40
+ damage = 5
+ agony = 25
embed = 0
sharp = 0
@@ -236,4 +236,4 @@
/obj/item/projectile/bullet/pistol/cap/process()
loc = null
- qdel(src)
+ qdel(src)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index b7a22b560f8..26cdf112810 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -11,6 +11,7 @@
name = "chemical shell"
icon_state = "bullet"
damage = 5
+ agony = 10
kill_count = 15 //if the shell hasn't hit anything after travelling this far it just explodes.
var/flash_range = 0
var/brightness = 7
diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm
index df35b7e22d2..94510529c9f 100644
--- a/code/modules/random_map/drop/drop_types.dm
+++ b/code/modules/random_map/drop/drop_types.dm
@@ -115,10 +115,10 @@ var/global/list/datum/supply_drop_loot/supply_drop
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/suit/armor/riot,
+ /obj/item/clothing/suit/armor/vest,
+ /obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/storage/vest,
/obj/item/clothing/suit/storage/vest,
- /obj/item/clothing/suit/storage/vest/heavy,
- /obj/item/clothing/suit/storage/vest/heavy,
/obj/item/clothing/suit/armor/laserproof,
/obj/item/clothing/suit/armor/bulletproof)
diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm
index a5e3377f99a..eb5b7c3e17f 100644
--- a/code/modules/random_map/drop/droppod_doors.dm
+++ b/code/modules/random_map/drop/droppod_doors.dm
@@ -39,7 +39,7 @@
playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5)
// This is shit but it will do for the sake of testing.
- for(var/obj/structure/droppod_door/D in range(5,src))
+ for(var/obj/structure/droppod_door/D in orange(1,src))
if(D.deployed)
continue
D.deploy()
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index e83774468c5..9d9e10d8f5b 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -561,14 +561,14 @@
id = "mech_ccw_armor"
req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 4)
materials = list(DEFAULT_WALL_MATERIAL = 20000, "silver" = 5000)
- build_path = /obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster
+ build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster
/datum/design/item/mecha/proj_armor
desc = "Exosuit projectile armor booster."
id = "mech_proj_armor"
req_tech = list(TECH_MATERIAL = 5, TECH_COMBAT = 5, TECH_ENGINEERING = 3)
materials = list(DEFAULT_WALL_MATERIAL = 20000, "gold" = 5000)
- build_path = /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster
+ build_path = /obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster
/datum/design/item/mecha/diamond_drill
name = "Diamond drill"
diff --git a/config/example/config.txt b/config/example/config.txt
index 96015272210..01e684a4a67 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -385,3 +385,7 @@ STARLIGHT 0
## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and -
# DEFAULT_LANGUAGE_PREFIXES , # -
+
+## A ; separated list of lobby screens to randomly pick from. The listed screens must exist as icon states in '/icons/misc/title.dmi'.
+## Defaults to 'title' if left unset.
+# LOBBY_SCREENS title
diff --git a/html/changelogs/PsiOmegaDelta-HoloMovement.yml b/html/changelogs/PsiOmegaDelta-HoloMovement.yml
new file mode 100644
index 00000000000..69d18448c0b
--- /dev/null
+++ b/html/changelogs/PsiOmegaDelta-HoloMovement.yml
@@ -0,0 +1,4 @@
+author: Neerti
+delete-after: True
+changes:
+ - rscadd: "The AI can now toggle whether its hologram will move towards the center of its view using the 'Toggle Hologram Movement' verb."
diff --git a/html/changelogs/Raptor1628-Dev.yml b/html/changelogs/Raptor1628-Dev.yml
new file mode 100644
index 00000000000..fafd8519f73
--- /dev/null
+++ b/html/changelogs/Raptor1628-Dev.yml
@@ -0,0 +1,5 @@
+author: Raptor1628
+delete-after: True
+changes:
+ - tweak: "Armory layout changed, weapons returned to static amounts."
+ - rscadd: "New security armor and helmet sprites added."
diff --git a/html/changelogs/Zuhayr-accessorizing.yml b/html/changelogs/Zuhayr-accessorizing.yml
new file mode 100644
index 00000000000..88048209879
--- /dev/null
+++ b/html/changelogs/Zuhayr-accessorizing.yml
@@ -0,0 +1,5 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - tweak: "Backend change: allowed accessories to be placed on any clothing item with the appropriate variables set."
+
diff --git a/html/changelogs/Zuhayr-fireaxes.yml b/html/changelogs/Zuhayr-fireaxes.yml
new file mode 100644
index 00000000000..3bb84e570e0
--- /dev/null
+++ b/html/changelogs/Zuhayr-fireaxes.yml
@@ -0,0 +1,4 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - tweak: "Rewrote fireaxe cabinets. Click with a multitool to unlock or loc, click with a hand to open or close, smash with anything that does damage, and drag onto your icon to remove the fireaxe."
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 2d06f4e9888..ca4de96eba0 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 3eec523b480..951be8509a8 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 907bc80c5ea..e708a972c21 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index a4d3c386126..6cf5ce80a7d 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/closet.dmi b/icons/obj/closet.dmi
index e42f9d97ab9..68fc22f81d1 100644
Binary files a/icons/obj/closet.dmi and b/icons/obj/closet.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index a4093d4ec79..7c61f30d4e9 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index cf854494697..04fe8a3b823 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 7ea52eaf5d8..1eeb8896961 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 214428603e3..3f4d1406dac 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index ff8893e80bd..ab9fbd2062c 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -52,11 +52,11 @@
"aaZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/range)
"aba" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"abb" = (/turf/simulated/wall,/area/maintenance/security_starboard)
-"abc" = (/obj/structure/closet/wardrobe/tactical,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"abc" = (/obj/structure/lattice,/turf/space{icon_state = "black"},/area/space)
"abd" = (/turf/simulated/wall/r_wall,/area/maintenance/foresolar)
"abe" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port)
"abf" = (/turf/simulated/wall,/area/maintenance/security_port)
-"abg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/machinery/camera/network/security{c_tag = "Armoury - Tactical Equipment"},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"abg" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/obj/item/clothing/suit/storage/vest/officer,/turf/simulated/floor/tiled/dark,/area/security/tactical)
"abh" = (/turf/simulated/wall/r_wall,/area/security/tactical)
"abi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range)
"abj" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/security/range)
@@ -71,13 +71,13 @@
"abs" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"abt" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port)
"abu" = (/obj/machinery/power/terminal{dir = 4},/obj/machinery/light/small{dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/foresolar)
-"abv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"abv" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Ammunition locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/turf/simulated/floor/tiled/dark,/area/security/tactical)
"abw" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/foresolar)
-"abx" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled/dark,/area/security/tactical)
-"aby" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"abx" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/camera/network/security{c_tag = "Armoury - Tactical Equipment"},/obj/item/weapon/gun/projectile/shotgun/pump,/obj/item/weapon/gun/projectile/shotgun/pump,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"aby" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/tactical)
"abz" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "brig_solar_inner"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"abA" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/security/tactical)
-"abB" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"abB" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/tactical)
"abC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/security/range)
"abD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/range)
"abE" = (/obj/machinery/camera/network/security{c_tag = "Security - Medical Station"; dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/security/range)
@@ -108,7 +108,7 @@
"acd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/main)
"ace" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/airless,/area/solar/fore)
"acf" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; layer = 3.3; master_tag = "brig_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(11,13)},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless,/area/solar/fore)
-"acg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/tactical)
+"acg" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/tactical)
"ach" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main)
"aci" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "brig_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "brig_solar_airlock"; layer = 3.3; pixel_x = 0; pixel_y = -25; req_access = list(13); tag_airpump = "brig_solar_pump"; tag_chamber_sensor = "brig_solar_sensor"; tag_exterior_door = "brig_solar_outer"; tag_interior_door = "brig_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "brig_solar_sensor"; layer = 3.3; pixel_x = 12; pixel_y = -25},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/full,/turf/simulated/floor/plating,/area/maintenance/foresolar)
"acj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_port)
@@ -123,20 +123,20 @@
"acs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"act" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"acu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore Access"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port)
-"acv" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/highsecurity{name = "Tactical Equipment"; req_access = list(3)},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/tactical)
+"acv" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acw" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_security{name = "Firing Range"; req_access = list(1)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/main)
"acx" = (/turf/simulated/floor/plating,/area/maintenance/foresolar)
"acy" = (/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless,/area/solar/fore)
"acz" = (/obj/structure/cable,/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/camera/network/engineering{c_tag = "Solar Maintenance Fore"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar)
-"acA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/tactical)
+"acA" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acB" = (/obj/machinery/power/solar_control{id = "auxsolarnorth"; name = "Fore Solar Control"; track = 0},/obj/structure/cable/yellow,/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"acC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/foresolar)
"acD" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
-"acE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/random/projectile,/obj/random/projectile,/obj/random/projectile,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"acF" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/random/energy,/obj/random/energy,/obj/random/energy,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"acE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/obj/item/weapon/gun/projectile/sec,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"acF" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acG" = (/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
-"acH" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 1},/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/stunshells,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/weapon/storage/box/practiceshells,/obj/item/weapon/storage/box/practiceshells,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"acI" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/ionrifle,/obj/machinery/door/window/brigdoor/southleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"acH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"acI" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/grey,/obj/item/weapon/storage/box/teargas{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"acL" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/security/main)
@@ -178,11 +178,11 @@
"adv" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"adw" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/item/clothing/suit/armor/riot,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/shield/riot,/obj/item/clothing/head/helmet/riot,/obj/machinery/light{dir = 8},/obj/machinery/camera/network/security{c_tag = "Armoury - Secure"; dir = 4},/obj/machinery/door/window/brigdoor/eastleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"adx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/main)
-"ady" = (/obj/structure/table/standard,/obj/machinery/recharger,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"ady" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"adz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"adA" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/storage/box/emps{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"adA" = (/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"adB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
-"adC" = (/obj/structure/table/rack,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"adC" = (/obj/machinery/flasher/portable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"adD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port)
"adE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_port)
"adF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/armoury)
@@ -197,7 +197,7 @@
"adO" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access = list(32)},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"adP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/security/main)
"adQ" = (/obj/structure/grille/broken,/obj/item/weapon/material/shard,/turf/simulated/floor/plating,/area/maintenance/security_port)
-"adR" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral,/turf/simulated/floor/plating,/area/maintenance/security_port)
+"adR" = (/obj/structure/closet/crate/secure{name = "FOR DISPOSAL"; req_access = list(58)},/obj/item/clothing/glasses/sunglasses/blindfold,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/muzzle,/obj/item/weapon/reagent_containers/syringe/ld50_syringe/choral,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/security_port)
"adS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main)
"adT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/security_port)
"adU" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/main)
@@ -214,8 +214,8 @@
"aef" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/suit/armor/laserproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/laserproof{pixel_x = -2; pixel_y = -2},/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aeg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_port)
"aeh" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/suit/armor/bulletproof{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/armor/bulletproof{pixel_x = -2; pixel_y = -2},/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(3)},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"aei" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
-"aej" = (/obj/machinery/flasher/portable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
+"aei" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/security/warden)
+"aej" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/turf/simulated/floor/tiled,/area/security/main)
"aek" = (/obj/machinery/light,/obj/machinery/flasher/portable,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury)
"ael" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/security/armoury)
"aem" = (/obj/machinery/button/remote/blast_door{id = "Armoury"; name = "Emergency Access"; pixel_x = -28; pixel_y = 4; req_access = list(3)},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/security/main)
@@ -247,7 +247,7 @@
"aeM" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/warden)
"aeN" = (/obj/structure/closet/l3closet/security,/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden)
"aeO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/warden)
-"aeP" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/bombclosetsecurity,/obj/machinery/firealarm{pixel_y = 27},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden)
+"aeP" = (/obj/structure/table/rack{pixel_y = 6},/obj/machinery/door/window/brigdoor/eastleft{name = "Sub-Armory Storage"; req_access = list(2)},/obj/machinery/door/window/brigdoor/westleft{name = "Sub-Armory Storage"; req_access = list(3)},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/obj/machinery/door/blast/shutters{dir = 2; id = "subarmory"; name = "Sub-Armory Storage"},/turf/simulated/floor/tiled/red,/area/security/warden)
"aeQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aeR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aeS" = (/turf/simulated/wall/r_wall,/area/maintenance/security_starboard)
@@ -256,7 +256,7 @@
"aeV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/security_port)
"aeW" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/security_port)
"aeX" = (/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main)
-"aeY" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main)
+"aeY" = (/obj/machinery/button/remote/blast_door{id = "subarmory"; name = "Sub-Armory Storage control"; pixel_x = 24; pixel_y = 24; req_access = list(3)},/turf/simulated/floor/tiled,/area/security/warden)
"aeZ" = (/obj/structure/disposalpipe/segment,/obj/structure/closet/secure_closet/security,/obj/item/device/flashlight/flare,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/security/main)
"afa" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main)
"afb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/security/main)
@@ -267,15 +267,15 @@
"afg" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/warden)
"afh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/security/warden)
"afi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/security/warden)
-"afj" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/security/warden)
+"afj" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/main)
"afk" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"afl" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"afm" = (/obj/structure/grille/broken,/obj/structure/lattice,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/space,/area/space)
"afn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main)
-"afo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/camera/network/security{c_tag = "Security - Equipment North"; dir = 4},/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/main)
+"afo" = (/obj/structure/table/rack,/obj/item/weapon/secbot_assembly,/turf/simulated/floor/plating,/area/maintenance/security_port)
"afp" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main)
"afq" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/maintenance/security_port)
-"afr" = (/obj/structure/table/rack,/obj/item/weapon/secbot_assembly,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/plating,/area/maintenance/security_port)
+"afr" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/security{name = "Sub-Armory"; req_access = list(3)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/security/warden)
"afs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"aft" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Security"; sortType = "Security"},/obj/effect/floor_decal/corner/red{dir = 10},/turf/simulated/floor/tiled,/area/security/main)
"afu" = (/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main)
@@ -292,7 +292,7 @@
"afF" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/security/warden)
"afG" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/warden)
"afH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/security/warden)
-"afI" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/security{name = "Armoury"; req_access = list(2)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/security/warden)
+"afI" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden)
"afJ" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"afK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/red,/area/security/main)
"afL" = (/obj/machinery/light/small{dir = 1},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
@@ -328,13 +328,13 @@
"agp" = (/turf/simulated/wall,/area/crew_quarters/heads/hos)
"agq" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_berth_hatch"; locked = 1; name = "Escape Pod"; req_access = list(13)},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"agr" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_3_hatch"; locked = 1; name = "Escape Pod Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod3/station)
-"ags" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden)
-"agt" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/security/warden)
+"ags" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/rack,/obj/item/weapon/storage/box/teargas{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled,/area/security/warden)
+"agt" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/tiled,/area/security/warden)
"agu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plating,/area/maintenance/security_port)
"agv" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/hos)
"agw" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/security_starboard)
-"agx" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/warden)
-"agy" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/random/handgun,/obj/machinery/door/window/brigdoor/northleft{name = "Weapons locker"; req_access = list(2)},/turf/simulated/floor/tiled,/area/security/warden)
+"agx" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/device/radio/intercom/department/security{dir = 4; pixel_x = 22},/turf/simulated/floor/tiled,/area/security/warden)
+"agy" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/security{c_tag = "Security - Equipment South"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/obj/item/device/radio/intercom{dir = 8; pixel_x = -22},/turf/simulated/floor/tiled,/area/security/main)
"agz" = (/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/main)
"agA" = (/obj/structure/disposalpipe/segment,/obj/item/trash/raisins,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/security_starboard)
"agB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/security_port)
@@ -483,7 +483,7 @@
"ajo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main)
"ajp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig)
"ajq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig)
-"ajr" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/camera/network/security{c_tag = "Security - Equipment South"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 8},/turf/simulated/floor/tiled,/area/security/main)
+"ajr" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/obj/item/weapon/handcuffs,/turf/simulated/floor/lino,/area/security/detectives_office)
"ajs" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/security/brig)
"ajt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/main)
"aju" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig)
@@ -546,7 +546,7 @@
"akz" = (/obj/machinery/light{dir = 1},/obj/machinery/firealarm{pixel_y = 24},/obj/effect/floor_decal/corner/red{dir = 5},/turf/simulated/floor/tiled,/area/security/brig)
"akA" = (/obj/structure/table/rack,/obj/item/weapon/storage/briefcase{pixel_x = -2; pixel_y = -5},/obj/item/weapon/storage/briefcase{pixel_x = 3; pixel_y = 0},/turf/simulated/floor/lino,/area/security/detectives_office)
"akB" = (/obj/structure/noticeboard{pixel_y = 30},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/papershredder,/turf/simulated/floor/lino,/area/security/detectives_office)
-"akC" = (/obj/structure/disposalpipe/segment,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/lino,/area/security/detectives_office)
+"akC" = (/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office)
"akD" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/lino,/area/security/detectives_office)
"akE" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/camera/network/security{c_tag = "Security - Forensic Office Fore"; dir = 2},/turf/simulated/floor/lino,/area/security/detectives_office)
"akF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/turf/simulated/floor/lino,/area/security/detectives_office)
@@ -593,7 +593,7 @@
"alu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/security/brig)
"alv" = (/obj/machinery/light{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/brig)
"alw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/brig)
-"alx" = (/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/weapon/handcuffs,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office)
+"alx" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/carpet,/area/security/detectives_office)
"aly" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/brig)
"alz" = (/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/tiled,/area/security/brig)
"alA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/brig)
@@ -641,7 +641,7 @@
"amq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/security/detectives_office)
"amr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby)
"ams" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool/padded,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"amt" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/carpet,/area/security/detectives_office)
+"amt" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/turf/simulated/floor/carpet,/area/security/detectives_office)
"amu" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/brig)
"amv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red{dir = 4},/obj/item/device/radio/intercom{dir = 4; pixel_x = 22},/turf/simulated/floor/tiled,/area/security/lobby)
"amw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/security)
@@ -662,8 +662,7 @@
"amL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/solar/auxport)
"amM" = (/obj/machinery/atmospherics/valve{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor,/area/security/brig)
"amN" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/camera/network/security{c_tag = "Security - Brig Toxin Control"; dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor,/area/security/brig)
-"amO" = (/obj/structure/table/woodentable,/obj/item/weapon/material/ashtray/bronze,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/device/flash,/obj/item/weapon/handcuffs,/turf/simulated/floor/carpet,/area/security/detectives_office)
-"amP" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/carpet,/area/security/detectives_office)
+"amO" = (/obj/structure/disposalpipe/segment,/obj/structure/table/woodentable,/obj/machinery/button/remote/airlock{id = "detdoor"; name = "Office Door"},/obj/item/clothing/glasses/sunglasses,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/carpet,/area/security/detectives_office)
"amQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/prison)
"amR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/security/prison)
"amS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/brig)
@@ -2647,7 +2646,7 @@
"aYU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/bridge)
"aYV" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/newscaster{pixel_y = -28},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
"aYW" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
-"aYX" = (/obj/structure/closet/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/command{c_tag = "Bridge Center"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
+"aYX" = (/obj/structure/fireaxecabinet{pixel_y = -32},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/camera/network/command{c_tag = "Bridge Center"; dir = 1},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
"aYY" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -30},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
"aYZ" = (/obj/machinery/light,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
"aZa" = (/obj/machinery/button/remote/blast_door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 6; pixel_y = -24; req_access = list(19)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/light_switch{pixel_x = -5; pixel_y = -23},/obj/effect/floor_decal/corner/blue{dir = 10},/turf/simulated/floor/tiled,/area/bridge)
@@ -4704,7 +4703,7 @@
"bMx" = (/obj/effect/landmark/start{name = "Paramedic"},/obj/item/weapon/stool/padded,/obj/item/device/radio/intercom{dir = 2; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bMy" = (/obj/structure/closet/secure_closet/medical1,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/device/flashlight,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/random/medical,/obj/item/device/radio/intercom/department/medbay{pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bMz" = (/obj/machinery/button/remote/blast_door{id = "acutesep"; name = "Acute Separation Shutters"; pixel_y = -25; req_access = list(5)},/obj/effect/landmark/start{name = "Paramedic"},/obj/machinery/camera/network/medbay{c_tag = "Medbay EMT Storage"; dir = 1},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/medical/sleeper)
-"bMA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
+"bMA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/fireaxecabinet{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bMB" = (/obj/item/device/radio/intercom{dir = 4; pixel_x = 22},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/medbay)
"bMC" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
"bMD" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo)
@@ -5696,6 +5695,7 @@
"cfB" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cfC" = (/obj/machinery/airlock_sensor/airlock_interior{id_tag = "eng_al_int_snsr"; master_tag = "engine_room_airlock"; pixel_y = 22; req_access = list(10)},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
"cfD" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction)
+"cfE" = (/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cfF" = (/obj/structure/sign/pods,/turf/simulated/wall/r_wall,/area/engineering/engine_eva)
"cfG" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/construction)
"cfH" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/atmos_control)
@@ -6201,7 +6201,6 @@
"cpK" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpL" = (/obj/structure/dispenser,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpM" = (/obj/item/weapon/wrench,/obj/structure/sign/atmosplaque{pixel_x = 0; pixel_y = 32},/obj/machinery/cell_charger,/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northeast"},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"cpN" = (/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpO" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpP" = (/obj/machinery/newscaster{pixel_y = 30},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/engineering/atmos)
"cpQ" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -7379,31 +7378,31 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaaaaaaaaaaaaaalaakaaoaataafaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaaaaaaaauaaaaaaaaaaauaaaaaaaaaaaaaaaaauaaaaaaaaaaauaaaaaaaauaaaaaaaaaaaaaaaaamaaaaasaaraavaaaaasaaraavaaaaasaaraavaafaafaamaaaaaaaaaaaaaaaaafaafaahaaxaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaayaayaayaayaayaayaayaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaauaauaauaauaaaaaaaaaaacaaaaamaaaaasaawaavaaaaasaawaavaaaaasaawaavaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaafaaAaaBaaaaaaaaaaaaaaaaaaaaaaaaaaaaayaazaaDaaCaaDaaCaaDaaEaayaayaaGaaHaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaIaafaasaawaavaaaaasaawaavaafaasaawaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaKaapaafaayaaFaaLaaLaaLaaLaaLaaMaaOaaNaaQaaPaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaasaawaavaafaasaawaavaaaaasaawaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaabhabhabhabhabhabhabhaafaaaaayaaRaaUaaCaaUaaCaaUaaVaaXaaWaaZaaYaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaaaasaawaavaafaasaawaavaaaaasaawaavaafaaaaaaaacaaaaafaafabaabdabdabdabdabeabfaaaaaaabhabcabcabgabcabcabhaaaaafaayabiabjaaXabjaaXabjaaXaayabkaaZablaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabmaafaafaafabmaafaaaaafabmaafaaaaaaaaaaaaaaaabqabpabsabrabuaaiabwabtabfaafaaaabhabxabvabAabyabBabhaaaaaaabDabCabFabEabIabHabFabJabLabKabPabMabGabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafabQabWabUacaacaacaacaacaacaacaacaacaacaacaacaaceabWabWacfabXaciabzabZabYabVacbacjacpacpacpabhabhacgacvacAabhabhacdaccachackaclacmacnacmacoackackackacwacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaapaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafacyaafaaaaafacyaafaaaaafacyaafaaaaaaaaaaaaaaaabqabpacCacBacxaczabdacuacpacpacFacEacIacHacKacJacpacpacNacLacPacOacRacQacMacSacVacUacXacWacZacYacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaaIaafaasaawaavaaaaasaawaavaafaasaawaavaafaaaaaaaafaafaaJaaaaaaaaaaaaaafaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaapaafaayaaFaaLaaLaaLaaLaaLaaMaaOaaNaaQaaPaayaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaauaauaauaauaaaaaaaaaaaaaaaaafaaaaasaawaavaafaasaawaavaaaaasaawaavaaaaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaafaaaaafabcabhabhabhabhabhaafaafaaaaayaaRaaUaaCaaUaaCaaUaaVaaXaaWaaZaaYaayabbabbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaaaaasaawaavaafaasaawaavaaaaasaawaavaafaaaaaaaacaaaaafaafabaabdabdabdabdabeabfaaaaaaaaaabhabgabxabvabhaafaaaaafaayabiabjaaXabjaaXabjaaXaayabkaaZablaayabnaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafabmaafaafaafabmaafaaaaafabmaafaaaaaaaaaaaaaaaabqabpabsabrabuaaiabwabtabfaafaaaaaaabhabyabAabBabhaaKaaaaaaabDabCabFabEabIabHabFabJabLabKabPabMabGabNabOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaIaafabQabWabUacaacaacaacaacaacaacaacaacaacaacaacaaceabWabWacfabXaciabzabZabYabVacbacjacpacpacpabhabhabhacgabhabhabhacdaccachackaclacmacnacmacoackackackacwacqacracsactaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaaafaapaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaaaaafaaaaafaafacyaafaaaaafacyaafaaaaafacyaafaaaaaaaaaaaaaaaabqabpacCacBacxaczabdacuacpacpacAacvacFacEacKacJacpacpacNacLacPacOacRacQacMacSacVacUacXacWacZacYacracsabbabbabbabbabbabbaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaamaamaaIaafaafaasadaaavaaaaasadaaavaaaaasadaaavaafaaaaaaaaaaaaaafaafadbabdabdabdabdadeacpadcaddaddaddaddacKaddadgadfadkadhadnadmadpadoacMadqadhadhadhadhadtadrackacDadjabbadvaduadsabbaapaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaasadaaavaafaasadaaavaaaaasadaaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfadeacpadwadzadyadCadAadGadFadHadfadkadhadnadmadpadIadxadJadhadKadKadKadpadLacradBadladOadladladladOaapaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaasadaaavaafaasadaaavaaaaasadaaavaaaaaaaaaaafaaaaafaafaaaaaaaaaaaaabfadeacpadwadzacHadyacIadGadFadHadfadkadhadnadmadpadIadxadJadhadKadKadKadpadLacradBadladOadladladladOaapaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaaaaasadaaavaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaadDadeacpadMaddaddaddaddacKaddadNadfadkadhadnadPadUadSadWadVadYadXadXadXaebadZacradBadlabbaaSacGadiabbaapaapaafaaaaafaaaaapaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaafaasadaaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadeacpacpaehaefaejaeiaelaekacpacpaemadhadnaenadpaeoaeaadJadYadXaenadXaeqaepacradBaeeabbabbabbabbabbaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaIaafaasadaaavaaaaasadaaavaafaasadaaavaafaafaafaaaaafaafaaaaaaaaaaaaaaaadTadeacpacpaehaefadCadAaelaekacpacpaemadhadnaenadpaeoaeaadJadYadXaenadXaeqaepacradBaeeabbabbabbabbabbaapaaaaaaaaaaaaaaaaaaaafaafaafaaaaaaaafaafaapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaqaafaasaeraavaaaaasaeraavaaaaasaeraavaafaaaaafaafaafaaaaaaaaaaaaaaaaaaadTaegacpacpacpacpacpacpaesacpacpacpaeuaetaezaevaeBaeAaeDaeCaeGaeEaeHaeEaeKaeIacradBaeRabbaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadeadQaeyadRaaTaeMaeLaeOaeNaePaeFaeYaeXaeZaeXadpaeoaeJafaafbafbafcafbafeafdaexaeQaflabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafmaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadeaeUaeVafyaaTafgaeMafiafhafjaeFafoafnaftafpadpafuaffafvadhadhafwadhafzafxacrafkafAabbafLafBafCafCafDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadeagbafraedaaTafFafEafHafGafGafIafMafKafNafKagdafOadxageagfaeoaggagfagjagiagkafJaglagqadlagragmaghafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUaeTaeWagBafZafZafZafZafZafZafZafqagnagnaguaaTagtagsaeOagxagyaeFagEagzagLagHagOagMagoagpahaagKagPahbahkagpagvagwafsabbadlagRafCafCagSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaaaaaaafaafaafaaaaaaaafaafaaaaaaaafaafaaaaaaaaaaaaaaaaafaaaaewadeadQaeyadRaaTaeMaeLaeOaeNaeiaeFaejaeXaeZaeXadpaeoaeJafaafbafbafcafbafeafdaexaeQaflabbaeSaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIafmaamaamaamaamaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaafabfadeaeUaeVafyaaTafgaeMafiafhaeYaePafjafnaftafpadpafuaffafvadhadhafwadhafzafxacrafkafAabbafLafBafCafCafDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaacaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabfabfabfabfabfabfabfabfadeagbafoaedaaTafFafEafHafGafGafrafMafKafNafKagdafOadxageagfaeoaggagfagjagiagkafJaglagqadlagragmaghafPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRafSabfafTafUaeTaeWagBafZafZafZafZafZafZafZafqagnagnaguaaTagsafIaeOagtagxaeFagEagzagLagHagOagMagoagpahaagKagPahbahkagpagvagwafsabbadlagRafCafCagSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaabfafVagBafZafZafZafZafZafZafWagDagDagDagDagDagDagDagDagDagDahmaaTagFagGagXagIagJaeFagZagYagYagYadpahcagNahdaheaheahfaheaheahhagvagTadlabbabbaeSaeSaeSaeSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauaauaauaauaauaauaauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagUadEagWagWagWagWagWagWagWagDahiahlahjagWahnahpahoahqahrahsahgahuahtahwahvahCahzahFahDahDahDadpahGahMahHahJahIahNahLahQahOagvahxafXaboaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPaaaaaaahPaaaaaaaaaahPaaaaaaaaaaaaaaaahPaaaaaaaaaahPaaaaaaahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfafQafRahAabfaiDadEagWahSahRahEahTahVahUagDahjahWahTahYahXahXahXaiaahZaimaibaigaigaihaigaikaiiadhadhadhaenadpailaioainaipaiRairaiqaitaisagvahxadlabOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaaaaahPahPahPahPahPahPahPaaaaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaeaaeaaeaaeaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadDaidaieaiuabfaixadEagWaiwaivaijaiyaiAaizagDahjahWaiEagWaiFahXaiHaiIahXaimaiJaiKaigaiLaigaigaiMaiNadhadhadhadpaiOajdaiPaheaiQajfaiQaheaiSagvahxafYactaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiUaiTaiGaiVaiWahTagDaiXaiZaiYagWajaajeajbajgajiaqxajhajkajjaihajmajnaeFajrajoajxajtajJajIajcajKajMajLajOajNajQajPagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaewagbagbaiDabfagbadEagWaiUaiTaiGaiVaiWahTagDaiXaiZaiYagWajaajeajbajgajiaqxajhajkajjaihajmajnaeFagyajoajxajtajJajIajcajKajMajLajOajNajQajPagvahxabbabbabbabbaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPaaaaaaahPahPahPahPahPahPahPahPahPaaaaaaahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfajAabfabfagbajlagWagWakbagWagWakkagWagWagWakxagWagWajpajsajRantajSajuagWajvajwajTajyajqagWagWajzajVajUagWagWagWagpajCagpagpagpagpagpagvahxabbajDajEaboaaaaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafZagaafZagcajHakWajWajYajXakaajZakcajZakeakdakgakfakiakhaklakjakiakmaklaklaksaknaknaktakvakuaifakwakzakyajzakAakCakBakEakDakGakFakoakpalfakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafakHaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWakIakKakJakLakJakNakMakPakOakJakQakSakRakVakJakXakJakJakYalbalaaldalcalgalealialhalaaljallalkakTakUalFalxalCalmakoagAabbalnaloactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaalpaaaaaaaaaaaIaaIaamaamaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalragCagQalPagWalvalyahXalAalzagWacTalBacTagWaecalHajGagWalJalOalNalQagDaltalualRalwalSagWabTabSabSabRagWalTamsalDalEamtalGalUakoagVanQamxanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaalVaafaafaaaaafaafaaaaaaaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafalXaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEamyahKahKahBahyaiBaicalyahXamaalzagWambameamcalWamfamhamgamjahXamkahXammamdamnamnamrampamvamiamCamBamEamDakoamFamPamOamqalDalDamGakoadBanQamHamIamwaaaaaaaapaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafamJamJamJamJamJaafamKaafamJamJamJamJamJaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfagBafZagaafZagcajHakWajWajYajXakaajZakcajZakeakdakgakfakiakhaklakjakiakmaklaklaksaknaknaktakvakuaifakwakzakyajzakAajrakBakEakDakGakFakoakpalfakZakqabOaaaaaaaaaaaaaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafakHaafaaIaaaaaaaaaaaaaaaaaaaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaamaamaaIaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWagWagWagWagWagWakIakKakJakLakJakNakMakPakOakJakQakSakRakVakJakXakJakJakYalbalaaldalcalgalealialhalaaljallalkakTakUalFakCalCalmakoagAabbalnaloactaaaaaaaaaaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaIaaIaaIaaIaaaaaaaaaalpaaaaaaaaaaaIaaIaamaamaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWalragCagQalPagWalvalyahXalAalzagWacTalBacTagWaecalHajGagWalJalOalNalQagDaltalualRalwalSagWabTabSabSabRagWalTamsalDalEalxalGalUakoagVanQamxanQanQaaaaaaaafaafaaaaaaaaaaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaaaaaaafaafaafaaaaaaalVaafaafaaaaafaafaaaaaaaamaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafalXaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafabfadEamyahKahKahBahyaiBaicalyahXamaalzagWambameamcalWamfamhamgamjahXamkahXammamdamnamnamrampamvamiamCamBamEamDakoamFamOamtamqalDalDamGakoadBanQamHamIamwaaaaaaaapaaaaaaaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafamJamJamJamJamJaafamKaafamJamJamJamJamJaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaamaaIaaIaaaaaaaaaamLaaaaaaaaaaaIaaIaamaamaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfadEagWamNamMajBaiCagWamSalyalzamUamTagWamVamXamWalWamYanaamZancanbanfaneaniamlampampanjampanlaoWannanmanpanoakoanqanWalDamqalDalDanrakoansandanuaocangaafaapaafaafaapaafaafaafakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanBanwanwanwanwanCamKanDanEanEanEanEanFaafaaIaaaaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafaaaaaaaaaanHaafaafaaaaafaafaaaaaaaamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfanvagWagWagWagWagWagWanIanJagWagWagWagWaobanKaobalWapDanLaqralWaojaosaomanzanAampampanjanManNamianPanOanpanTanGanVaoeaodaogaofaokaohanGaolaoCaonanRanSaaaaaaaafaaaaafaapaafaacakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafaooaooaooaooaooaafamKaafaooaooaooaooaooaafaaIaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafaopaopaopaopaopaafaoqaafaopaopaopaopaopaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanXanYajFamoagDaoMalqagWaoraotalKaovaouaoiaowaoyaoxaozaozaoAaozaoDaoBaoFaoEaoOaoLampampaoQaoPaoRamiaoTaoSanpaoUanGaoVaoYaoXapdaoZapfapeanGapganQanQanQanQaoIaoJaoHaphalsaaaaafaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafamKaaaaaaaaaaafaaaaaaaaaaamaaaahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPahPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7484,7 +7483,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmDcmjcgEcmtcmDcEgcgEcmtcmDcEgcgEaaaaafcmQcgUcgUchfchfcmscejcmvcmucmxbRqcmAcmycmBcmBcmEcmCcmBcmFcIycbFcmIcmHcmKcmJcjrcmLcmLcmMclrcmNcmPcmOcmOciAcibcmScoybRRciGcmUciScmVcmXcmWciGcmYcnacmZciUcnbcndcnccjccneciUclLclMclNcnlcnfcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnhcnjcnicdScdScnHcntcnNcdScdScdScdScoucntcnNcdScdScnvcnocnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbOaafaafaafaaaaafcnxaafcnxaafcKAaafcpfaafcKAaafcpfaafaafaaacejcnqcnpchfchfcnrcnDcowcovcnycnmcnscnzcnzcnAcnzcnGcnBcoxcnGcnJcnFcnCcnIcnMcnOcnOcnOcnOcnLcnKcnRcnRcnRcgscgscgscgsbSgciGcnQcnScmVcnUcnTciGcmYcnacnWciUcnYcnZcnccoccoaciUclLclMclNcoecodcofclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacdOcogcojcohcwlcokconcolcomcoocoqcopcdOaapaafaafaafaafaaaaaaaaabSYaaaaaaaaaaafcoscqscosaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcptcpBcpAcpGcpCcpIcpHcpGcpScpZcpHcqtcqdcqxcqwcnycnycnycnycnycnycnycnycozcotcoBcoAcoCcqycoEcoDcJkcnGcoHcoGcoIcnGcoKcoJcoLcnOcoNcoMcoPcoOcoRcoQcpjcpbcpbcpkcpncpncpjcrvciGciGcpccoSciGciGciGcoTcnacoUciUciUciUcoVcphciUciUclLcpiclNcoXcoWcoXclNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafcdOcoYcoZcoYcpdcpacpgcpecomcomcplcomcdOcdOaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacpmaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcpFcpLcpKcpNcpMcpPcpOcpRcpQcpUcpTcpVcqLcpXcpWcpYcqNcqbcqacqccqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcqDcppcpocprcpqcpucpscpwcpvcpycpxcpDcpzcpEcpucpJcpFcpLcpKcfEcpMcpPcpOcpRcpQcpUcpTcpVcqLcpXcpWcpYcqNcqbcqacqccqOcoKcqecqfcnOcoRcoRcoRcoRcoRcqgcpjcqPcqPcqPcpncpncpjbTFbPxciGcqicqhcqkcqjciGcqlcnacqmciUcqncqpcqocqqciUclMclLcpiclNcqucqrcqzclNaaaaaaaaaaaaaaaaaacqvcqRcrkcrgcqvaafaaaaaaaaaaaacdOcoYcoYcoYcoicqAcqCcqBcqFcqEcqHcqGcqIcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacqJaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcrUcqMcqKcqScqQcpucqTcpucqUcqMcqTcpucqUcqMcpucpucpucpucpucqVcpucpucpucqXcqWcqZcqYcracqLcrccrbcrdcrVcrfcrecrhcsgcoKcqecricnOcrjcoRcoRcrlcoRcrmcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrocrncrrcrpcrtcrscrwcrucrycrxcrAcrzcrBciUcrEcrFcrGcrHcqvcrCcqvcrHaaaaaaaafaaaaaaaaacqvcrDcrNcrMcqvaafaafaaaaaaaaacdOcomcomcomcomcrOcpgcrQcrQcrQcnjcrQcrRcdOaaaaaaaaaaaaaaacrPcrPcrPcbOaafaafaafaafcrSaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcqDcpucqYcpucqYcpucqTcpucrTcrXcrWcrXcrZcrXcrXcsbcsacpucpucsdcsccsccsccsfcsecshcshcsicqLcskcsjcsmcnGcsocsncspcnGcsscsrcstcsqcsvcsucszcswcoRcsAcpjcsxcrKcsycrKcsBcpjbTFcfxciGcsDcsCcsFcsEciGcfYcufcfYciUcsGcsJcsHcsKbTkcsIcrGcrGcqvcsMcsLcsNcqvcqvcqvcqvcqvcqvcqvcqvcsOcsQcsPcqvcqvcqvcrHaaaaaacdOcogcojcohcslcsRcqCcrQcrQcrQcnjcrQcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaacsTaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacqDcpucqYcpucsUcsWcsVcsZcsYctacrWcrXctbcrXcrXctdctcctfctecticthctkctjctjctlcqYcqYctmctgctnctocnzcnGctscnGcnGcnGctucttcstcvnctxcvtctBctycoRctCcpjcvOcrKcsycrKcvRcpjctvctwciGciGctDciGciGciGciBclMbTlciUciUciUctEciUciUcsIcrGaaacqvctHctGctIctFctKctJctMctLctOctNcqvcuVctPcuVcqvctQctRcqvaafaafcdOcoYcoYcoYctScpactUctTctWctVctXcrQctZcdOcdOcdOcdOaaaaaacrPaaacuacuacuacuacuaaafcsTaafcuacuacuacuacuaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm
index 0d4dae316b1..b2923d9e4b4 100644
--- a/maps/exodus-2.dmm
+++ b/maps/exodus-2.dmm
@@ -884,7 +884,7 @@
"qZ" = (/obj/structure/table/standard,/obj/structure/closet/secure_closet/medical_wall{pixel_y = 32; req_access = list(150)},/obj/item/bodybag,/obj/item/weapon/reagent_containers/glass/bottle/antitoxin{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline{pixel_x = 4; pixel_y = 7},/obj/item/weapon/reagent_containers/syringe,/obj/machinery/light{dir = 4},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start)
"ra" = (/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
"rb" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 4; start_pressure = 740.5},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start)
-"rc" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/heavy/merc{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership)
+"rc" = (/obj/structure/table/rack,/obj/item/clothing/suit/storage/vest/merc{pixel_x = 2; pixel_y = 2},/obj/item/clothing/suit/storage/vest/merc,/obj/item/clothing/suit/storage/vest/merc{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "dark"},/area/space)
"rd" = (/obj/structure/table/standard,/obj/item/roller{pixel_y = 8},/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/blood/OMinus,/obj/item/weapon/reagent_containers/syringe/antiviral,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start)
"re" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/living)
"rf" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/living)
@@ -1092,7 +1092,7 @@
"uZ" = (/obj/machinery/door/window/northleft,/obj/structure/bed/chair,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"va" = (/obj/structure/table/woodentable,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/carpet{dir = 8},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"vb" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
-"vc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
+"vc" = (/obj/structure/table/reinforced,/obj/item/mecha_parts/mecha_equipment/weapon/energy/ion,/obj/item/mecha_parts/mecha_equipment/weapon/energy/taser,/obj/item/mecha_parts/mecha_equipment/armor_booster/anticcw_armor_booster,/obj/item/mecha_parts/mecha_equipment/armor_booster/antiproj_armor_booster,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"vd" = (/obj/structure/table/rack,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/head/beret/centcom/officer,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/mask/balaclava,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/obj/item/clothing/accessory/holster/waist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"ve" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)
"vf" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops)