diff --git a/baystation12.dme b/baystation12.dme
index 884ad691a88..5d4b167fef7 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -785,6 +785,7 @@
#include "code\game\objects\structures\inflatable.dm"
#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
+#include "code\game\objects\structures\lamarr_cage.dm"
#include "code\game\objects\structures\lattice.dm"
#include "code\game\objects\structures\mirror.dm"
#include "code\game\objects\structures\mop_bucket.dm"
diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm
index 44dd7e64c52..5f0812f52b7 100644
--- a/code/datums/uplink/ammunition.dm
+++ b/code/datums/uplink/ammunition.dm
@@ -10,10 +10,15 @@
item_cost = 1
path = /obj/item/ammo_magazine/mc9mm
-/datum/uplink_item/item/ammo/a10mm
- name = "10mm"
- item_cost = 1
- path = /obj/item/ammo_magazine/a10mm
+/datum/uplink_item/item/ammo/tommygunmag
+ name = "Tommygun Magazine (.45)"
+ item_cost = 2
+ path = /obj/item/ammo_magazine/tommymag
+
+/datum/uplink_item/item/ammo/tommygundrum
+ name = "Tommygun Drum Magazine (.45)"
+ item_cost = 4
+ path = /obj/item/ammo_magazine/tommydrum
/datum/uplink_item/item/ammo/darts
name = "Darts"
@@ -25,11 +30,6 @@
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
diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm
index 6c9fcdfb48d..503be66246e 100644
--- a/code/datums/uplink/grenades.dm
+++ b/code/datums/uplink/grenades.dm
@@ -18,3 +18,8 @@
name = "5xEMP Grenades"
item_cost = 6
path = /obj/item/weapon/storage/box/emps
+
+/datum/uplink_item/item/grenades/manhack
+ name = "Manhack Delivery Grenade"
+ item_cost = 3
+ path = /obj/item/weapon/grenade/spawnergrenade/manhacks
diff --git a/code/datums/uplink/highly visible and dangerous weapons.dm b/code/datums/uplink/highly visible and dangerous weapons.dm
index cee8965f649..2858cebad44 100644
--- a/code/datums/uplink/highly visible and dangerous weapons.dm
+++ b/code/datums/uplink/highly visible and dangerous weapons.dm
@@ -14,6 +14,11 @@
item_cost = 6
path = /obj/item/weapon/gun/energy/crossbow
+/datum/uplink_item/item/visible_weapons/forcegloves
+ name = "Force Gloves"
+ item_cost = 8
+ path = /obj/item/clothing/gloves/force/syndicate
+
/datum/uplink_item/item/visible_weapons/energy_sword
name = "Energy Sword"
item_cost = 8
@@ -34,16 +39,10 @@
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"
+ name = "Tommy Gun"
item_cost = 14
- path = /obj/item/weapon/gun/projectile/automatic/rifle/sts35
+ path = /obj/item/weapon/gun/projectile/automatic/tommygun
/datum/uplink_item/item/visible_weapons/heavysniper
name = "Anti-materiel Rifle"
diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm
index 265c163309e..588f4bb7bd5 100644
--- a/code/datums/uplink/medical.dm
+++ b/code/datums/uplink/medical.dm
@@ -18,3 +18,8 @@
name = "Combat medical kit"
item_cost = 12
path = /obj/item/weapon/storage/firstaid/combat
+
+/datum/uplink_item/item/medical/combathypo
+ name = "Combat hypospray"
+ item_cost = 6
+ path = /obj/item/weapon/reagent_containers/hypospray/combat
\ No newline at end of file
diff --git a/code/datums/uplink/stealthy and inconspicuous weapons.dm b/code/datums/uplink/stealthy and inconspicuous weapons.dm
index bf9bd060236..f800487dad4 100644
--- a/code/datums/uplink/stealthy and inconspicuous weapons.dm
+++ b/code/datums/uplink/stealthy and inconspicuous weapons.dm
@@ -16,7 +16,7 @@
/datum/uplink_item/item/stealthy_weapons/concealed_cane
name = "Concealed Cane Sword"
- item_cost = 2
+ item_cost = 9
path = /obj/item/weapon/cane/concealed
/datum/uplink_item/item/stealthy_weapons/random_toxin
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 9e5b01e3eab..2129d00e617 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -122,16 +122,6 @@
else
..()
-/obj/item/weapon/cane/concealed/update_icon()
- if(concealed_blade)
- name = initial(name)
- icon_state = initial(icon_state)
- item_state = initial(icon_state)
- else
- name = "cane shaft"
- icon_state = "nullrod"
- item_state = "foldcane"
-
/obj/item/weapon/disk
name = "disk"
icon = 'icons/obj/items.dmi'
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index b47dd1d48dc..a26fd25052e 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -328,6 +328,7 @@
/obj/item/weapon/storage/backpack/duffel/tox
name = "scientist's duffel bag"
desc = "Handy when it comes to storing volatile materials of the anomalous persuasion."
+ icon_state = "duffel-toxins"
/obj/item/weapon/storage/backpack/duffel/sec
name = "security duffel bag"
diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm
new file mode 100644
index 00000000000..ade6807dcb3
--- /dev/null
+++ b/code/game/objects/structures/lamarr_cage.dm
@@ -0,0 +1,262 @@
+/obj/structure/lamarr
+ name = "lab cage"
+ icon = 'icons/obj/stationobjs.dmi'
+ icon_state = "labcage1"
+ desc = "A glass lab container for storing interesting creatures."
+ density = 1
+ anchored = 1
+ unacidable = 1//Dissolving the case would also delete Lamarr
+ var/health = 30
+ var/occupied = 1
+ var/destroyed = 0
+
+/obj/structure/lamarr/ex_act(severity)
+ switch(severity)
+ if (1)
+ new /obj/item/weapon/material/shard( src.loc )
+ Break()
+ qdel(src)
+ if (2)
+ if (prob(50))
+ src.health -= 15
+ src.healthcheck()
+ if (3)
+ if (prob(50))
+ src.health -= 5
+ src.healthcheck()
+
+
+/obj/structure/lamarr/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ ..()
+ src.healthcheck()
+ return
+
+/obj/structure/lamarr/proc/healthcheck()
+ if (src.health <= 0)
+ if (!( src.destroyed ))
+ src.density = 0
+ src.destroyed = 1
+ new /obj/item/weapon/material/shard( src.loc )
+ playsound(src, "shatter", 70, 1)
+ Break()
+ else
+ playsound(src.loc, 'sound/effects/Glasshit.ogg', 75, 1)
+ return
+
+/obj/structure/lamarr/update_icon()
+ if(src.destroyed)
+ src.icon_state = "labcageb[src.occupied]"
+ else
+ src.icon_state = "labcage[src.occupied]"
+ return
+
+
+/obj/structure/lamarr/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ src.health -= W.force
+ src.healthcheck()
+ ..()
+ return
+
+/obj/structure/lamarr/attack_hand(mob/user as mob)
+ if (src.destroyed)
+ return
+ else
+ usr << "You kick the lab cage."
+ for(var/mob/O in oviewers())
+ if ((O.client && !( O.blinded )))
+ O << "[] kicks the lab cage."
+
+ src.health -= 2
+ healthcheck()
+ return
+
+/obj/structure/lamarr/proc/Break()
+ if(occupied)
+ new /obj/item/clothing/mask/lamarr(src.loc)
+ occupied = 0
+ update_icon()
+ return
+
+var/const/MIN_ACTIVE_TIME = 200 //time between being dropped and going idle
+var/const/MAX_ACTIVE_TIME = 400
+
+/obj/item/clothing/mask/lamarr
+ name = "Lamarr"
+ desc = "The worst she might do is attempt to... couple with your head."//hope we don't get sued over a harmless reference, rite?
+ gender = FEMALE
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "facehugger"
+ item_state = "facehugger"
+ w_class = 3 //note: can be picked up by aliens unlike most other items of w_class below 4
+ flags = PROXMOVE
+ body_parts_covered = FACE|EYES
+ throw_range = 5
+
+ var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case
+ var/strength = 5
+ var/attached = 0
+ var/sterile = 1
+
+/obj/item/clothing/mask/lamarr/New()//to prevent deleting it if aliums are disabled
+ return
+
+/obj/item/clothing/mask/lamarr/attack_hand(user as mob)
+
+ if((stat == CONSCIOUS))
+ if(Attach(user))
+ return
+
+ ..()
+
+/obj/item/clothing/mask/lamarr/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
+ . = ..()
+ user.drop_from_inventory(src)
+ if(hit_zone == "head")
+ Attach(target)
+
+
+/obj/item/clothing/mask/lamarr/examine(mob/user)
+ ..(user)
+ switch(stat)
+ if(DEAD,UNCONSCIOUS)
+ user << "[src] is not moving."
+ if(CONSCIOUS)
+ user << "[src] seems to be active."
+ if (sterile)
+ user << " It looks like the proboscis has been removed."
+ return
+
+/obj/item/clothing/mask/lamarr/attackby(obj/item/I, mob/user)
+ if(I.force)
+ user.do_attack_animation(src)
+ Die()
+ return
+
+/obj/item/clothing/mask/lamarr/bullet_act()
+ Die()
+ return
+
+/obj/item/clothing/mask/lamarr/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
+ if(exposed_temperature > T0C+80)
+ Die()
+ return
+
+/obj/item/clothing/mask/lamarr/equipped(mob/M)
+ ..()
+ Attach(M)
+
+/obj/item/clothing/mask/lamarr/Crossed(atom/target)
+ HasProximity(target)
+ return
+
+/obj/item/clothing/mask/lamarr/on_found(mob/finder as mob)
+ if(stat == CONSCIOUS)
+ HasProximity(finder)
+ return 1
+ return
+
+/obj/item/clothing/mask/lamarr/HasProximity(atom/movable/AM as mob|obj)
+ if(CanHug(AM))
+ Attach(AM)
+
+/obj/item/clothing/mask/lamarr/throw_at(atom/target, range, speed)
+ ..()
+ if(stat == CONSCIOUS)
+ icon_state = "[initial(icon_state)]_thrown"
+ spawn(15)
+ if(icon_state == "[initial(icon_state)]_thrown")
+ icon_state = "[initial(icon_state)]"
+
+/obj/item/clothing/mask/lamarr/proc/Attach(M as mob)
+
+ if((!iscarbon(M)))
+ return
+
+ if(attached)
+ return
+
+ var/mob/living/L = M //just so I don't need to use :
+
+ if(loc == L) return
+ if(stat != CONSCIOUS) return
+ if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
+
+ L.visible_message("\[src] leaps at [L]'s face!")
+
+
+ if(ishuman(L))
+ var/mob/living/carbon/human/H = L
+ if(H.head && H.head.flags & AIRTIGHT)
+ H.visible_message("\The [src] smashes against [H]'s [H.head]!")
+ Die()
+ return
+
+
+ if(iscarbon(M))
+ var/mob/living/carbon/target = L
+
+ if(target.wear_mask)
+ if(prob(20)) return
+ var/obj/item/clothing/W = target.wear_mask
+ if(!W.canremove) return
+ target.drop_from_inventory(W)
+
+ target.visible_message("\The [src] tears [W] off of [target]'s face!")
+
+ target.equip_to_slot(src, slot_wear_mask)
+ target.contents += src // Monkey sanity check - Snapshot
+
+ GoIdle() //so it doesn't jump the people that tear it off
+
+ return
+
+/obj/item/clothing/mask/lamarr/proc/GoActive()
+ if(stat == DEAD || stat == CONSCIOUS)
+ return
+
+ stat = CONSCIOUS
+ icon_state = "[initial(icon_state)]"
+
+ return
+
+/obj/item/clothing/mask/lamarr/proc/GoIdle(var/min_time=MIN_ACTIVE_TIME, var/max_time=MAX_ACTIVE_TIME)
+ if(stat == DEAD || stat == UNCONSCIOUS)
+ return
+
+/* RemoveActiveIndicators() */
+
+ stat = UNCONSCIOUS
+ icon_state = "[initial(icon_state)]_inactive"
+
+ spawn(rand(min_time,max_time))
+ GoActive()
+ return
+
+/obj/item/clothing/mask/lamarr/proc/Die()
+ if(stat == DEAD)
+ return
+
+/* RemoveActiveIndicators() */
+
+ icon_state = "[initial(icon_state)]_dead"
+ stat = DEAD
+
+ src.visible_message("\The [src] curls up into a ball!")
+
+ return
+
+/proc/CanHug(var/mob/M)
+
+ if(!iscarbon(M))
+ return 0
+
+ var/mob/living/carbon/C = M
+ if(istype(C) && locate(/obj/item/organ/xenos/hivenode) in C.internal_organs)
+ return 0
+
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ if(H.head && (H.head.body_parts_covered & FACE) && !(H.head.item_flags & FLEXIBLEMATERIAL))
+ return 0
+ return 1
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 5974e08c743..7d9c6848c33 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -389,6 +389,7 @@ var/global/list/gear_datums = list()
path = /obj/item/clothing/under/color/blackf
slot = slot_w_uniform
cost = 1
+
/datum/gear/blackfjumpsuit
display_name = "jumpsuit, rainbow"
path = /obj/item/clothing/under/rainbow
@@ -419,13 +420,6 @@ var/global/list/gear_datums = list()
slot = slot_w_uniform
cost = 1
-/datum/gear/roboticist_skirt
- display_name = "skirt, roboticist"
- path = /obj/item/clothing/under/rank/roboticist/skirt
- slot = slot_w_uniform
- cost = 1
- allowed_roles = list("Roboticist")
-
/datum/gear/amishsuit
display_name = "suit, amish"
path = /obj/item/clothing/under/sl_suit
@@ -611,46 +605,6 @@ var/global/list/gear_datums = list()
cost = 1
allowed_roles = list("Scientist","Chief Medical Officer","Medical Doctor","Geneticist","Paramedic","Nursing Intern","Xenobiologist","Roboticist","Research Director","Detective",)
-// Resomi junk
-/datum/gear/resomi_grey
- display_name = "Resomi uniform, grey"
- path = /obj/item/clothing/under/resomi
- cost = 1
- slot = slot_w_uniform
-
-/datum/gear/resomi_rainbow
- display_name = "Resomi uniform, rainbow"
- path = /obj/item/clothing/under/resomi/rainbow
- cost = 1
- slot = slot_w_uniform
-
-/datum/gear/resomi_white
- display_name = "Resomi uniform, white"
- path = /obj/item/clothing/under/resomi/white
- cost = 1
- slot = slot_w_uniform
-
-/datum/gear/resomi_eng
- display_name = "Resomi uniform, Engineering"
- path = /obj/item/clothing/under/resomi/yellow
- cost = 1
- slot = slot_w_uniform
- allowed_roles = list("Chief Engineer","Station Engineer","Atmospherics Technician")
-
-/datum/gear/resomi_sec
- display_name = "Resomi uniform, Security"
- path = /obj/item/clothing/under/resomi/red
- cost = 1
- slot = slot_w_uniform
- allowed_roles = list("Security Officer","Head of Security","Warden")
-
-
-/datum/gear/resomi_med
- display_name = "Resomi uniform, Medical"
- path = /obj/item/clothing/under/resomi/medical
- cost = 1
- slot = slot_w_uniform
-
// Attachments
/datum/gear/armband_cargo
display_name = "armband, cargo"
@@ -1272,7 +1226,6 @@ var/global/list/gear_datums = list()
sort_category = "utility"
cost = 2
-
/datum/gear/wallet
display_name = "wallet"
path = /obj/item/weapon/storage/wallet
@@ -1418,7 +1371,6 @@ var/global/list/gear_datums = list()
sort_category = "misc"
cost = 1
-
/datum/gear/cape
display_name = "tunnel cloak"
path = /obj/item/weapon/storage/backpack/cloak
@@ -1437,11 +1389,6 @@ var/global/list/gear_datums = list()
sort_category = "misc"
cost = 1
-/*/datum/gear/combitool
- display_name = "combi-tool"
- path = /obj/item/weapon/combitool
- cost = 3*/
-
// Stuff worn on the ears. Items here go in the "ears" sort_category but they must not use
// the slot_r_ear or slot_l_ear as the slot, or else players will spawn with no headset.
/datum/gear/earmuffs
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 16ff63fc0ce..3adece20525 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -420,7 +420,7 @@ BLIND // can't see anything
/obj/item/clothing/shoes/proc/draw_knife()
set name = "Draw Boot Knife"
set desc = "Pull out your boot knife."
- set category = "IC"
+ set category = "Object"
set src in usr
if(usr.stat || usr.restrained() || usr.incapacitated())
@@ -443,10 +443,7 @@ BLIND // can't see anything
/obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user)
- if(can_hold_knife && istype(I, /obj/item/weapon/material/shard) || \
- istype(I, /obj/item/weapon/material/butterfly) || \
- istype(I, /obj/item/weapon/material/kitchen/utensil) || \
- istype(I, /obj/item/weapon/material/hatchet/tacknife))
+ if(can_hold_knife && is_type_in_list(I, list(/obj/item/weapon/material/shard, /obj/item/weapon/material/butterfly, /obj/item/weapon/material/kitchen/utensil, /obj/item/weapon/material/hatchet/tacknife, /obj/item/weapon/material/sword/trench)))
if(holding)
user << "\The [src] is already holding \a [holding]."
return
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 415c3debf09..3036e7b8c29 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -21,7 +21,8 @@
force = 3
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
item_flags = NOSLIP
- siemens_coefficient = 0.6
+ siemens_coefficient = 0.5
+ can_hold_knife = 1
/obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes.
name = "combat boots"
@@ -30,7 +31,8 @@
force = 5
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
item_flags = NOSLIP
- siemens_coefficient = 0.6
+ siemens_coefficient = 0.5
+ can_hold_knife = 1
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index dbc824be5b5..29ae696d86e 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -656,11 +656,7 @@ var/global/list/robot_modules = list(
LANGUAGE_SKRELLIAN = 0,
LANGUAGE_GUTTER = 1
)
- sprites = list(
- "Dread" = "securityrobot",
- )
- var/id
-
+
/obj/item/weapon/robot_module/syndicate/New(var/mob/living/silicon/robot/R)
loc = R
src.modules += new /obj/item/device/flash(src)
@@ -689,7 +685,7 @@ var/global/list/robot_modules = list(
id = null
return ..()
*/
-/obj/item/weapon/robot_module/security/combat
+/obj/item/weapon/robot_module/combat
name = "combat robot module"
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index 1a3ef67b9b1..1327cd68029 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -608,4 +608,123 @@
build_type = MECHFAB
materials = list(DEFAULT_WALL_MATERIAL = 750, "glass" = 750)
build_path = /obj/item/device/flash/synthetic
- category = "Misc"
\ No newline at end of file
+ category = "Misc"
+
+//hardsuits modules
+
+/datum/design/hardsuitmodules
+ build_type = MECHFAB
+ category = "Hardsuit Modules"
+ time = 10
+
+/datum/design/hardsuitmodules/iss_module
+ name = "IIS module"
+ desc = "An integrated intelligence system module suitable for most hardsuits."
+ id = "iis_module"
+ req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 3)
+ materials = list("glass" = 7500, DEFAULT_WALL_MATERIAL = 5000)
+ build_path = /obj/item/rig_module/ai_container
+
+/datum/design/hardsuitmodules/sink_module
+ name = "hardsuit power sink"
+ desc = "An heavy-duty power sink suitable for hardsuits."
+ id = "power_sink_module"
+ req_tech = list(TECH_POWER = 4, TECH_MATERIAL = 3, TECH_ENGINEERING = 4, TECH_ILLEGAL = 3)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold"= 2000, "silver"= 3000, "glass"= 2000)
+ build_path = /obj/item/rig_module/power_sink
+
+/datum/design/hardsuitmodules/meson_module
+ name = "hardsuit meson scanner"
+ desc = "A layered, translucent visor system for a hardsuit."
+ id = "meson_module"
+ req_tech = list(TECH_MAGNET = 4, TECH_MATERIAL = 2, TECH_ENGINEERING = 3)
+ materials = list("glass"= 5000, DEFAULT_WALL_MATERIAL= 1500)
+ build_path = /obj/item/rig_module/vision/meson
+
+/datum/design/hardsuitmodules/sechud_module
+ name = "hardsuit meson scanner"
+ desc = "A simple tactical information system for a hardsuit."
+ id = "sechud_module"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 2, TECH_MAGNET = 3)
+ materials = list("glass" = 5000, DEFAULT_WALL_MATERIAL =1500)
+ build_path = /obj/item/rig_module/vision/sechud
+
+/datum/design/hardsuitmodules/medhud_module
+ name = "hardsuit medical hud"
+ desc = "A simple medical status indicator for a hardsuit."
+ id = "medhu_module"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 2, TECH_MAGNET = 3)
+ materials = list("glass"= 5000, DEFAULT_WALL_MATERIAL =1500)
+ build_path = /obj/item/rig_module/vision/medhud
+
+/datum/design/hardsuitmodules/nvg_module
+ name = "hardsuit night vision interface"
+ desc = "A multi input night vision system for a hardsuit."
+ id = "nvg_module"
+ req_tech = list(TECH_BIO = 4, TECH_MATERIAL = 3, TECH_MAGNET = 4)
+ materials = list("glass" = 5000, DEFAULT_WALL_MATERIAL = 1500, "uranium" = 5000)
+ build_path = /obj/item/rig_module/vision/nvg
+
+/datum/design/hardsuitmodules/healthscanner_module
+ name = "hardsuit night vision interface"
+ desc = "A hardsuit-mounted health scanner."
+ id = "healthscanner_module"
+ req_tech = list(TECH_BIO = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2)
+ materials = list("glass" = 5250, DEFAULT_WALL_MATERIAL = 2500)
+ build_path = /obj/item/rig_module/device/healthscanner
+
+/datum/design/hardsuitmodules/chem_module
+ name = "mounted chemical injector"
+ desc = "A complex web of tubing and a large needle suitable for hardsuit use."
+ id = "chem_module"
+ req_tech = list(TECH_BIO = 5, TECH_MATERIAL = 4, TECH_DATA = 3, TECH_PHORON = 2)
+ materials = list("glass" = 9250, DEFAULT_WALL_MATERIAL = 10000, "gold" = 2500, "silver" = 4250, "phoron" = 5500)
+ build_path = /obj/item/rig_module/chem_dispenser/injector
+
+/datum/design/hardsuitmodules/plasmacutter_module
+ name = "hardsuit plasma cutter"
+ desc = "A self-sustaining plasma arc capable of cutting through walls."
+ id = "plasmacutter_module"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_PHORON = 4)
+ materials = list("glass" = 5250, DEFAULT_WALL_MATERIAL = 30000, "silver" = 5250, "phoron" = 7250)
+ build_path = /obj/item/rig_module/device/plasmacutter
+
+/datum/design/hardsuitmodules/jet_module
+ name = "hardsuit maneuvering jets"
+ desc = "A compact gas thruster system for a hardsuit."
+ id = "jet_module"
+ req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_POWER = 2)
+ materials = list("glass" = 4250, DEFAULT_WALL_MATERIAL = 15000, "silver" = 4250,"uranium" = 5250)
+ build_path = /obj/item/rig_module/maneuvering_jets
+
+/datum/design/hardsuitmodules/drill_module
+ name = "hardsuit drill mount"
+ desc = "A very heavy diamond-tipped drill."
+ id = "drill_module"
+ req_tech = list(TECH_ENGINEERING = 5, TECH_MATERIAL = 5, TECH_POWER = 4, TECH_MAGNET = 4)
+ materials = list("glass" = 2250, DEFAULT_WALL_MATERIAL = 55000, "silver" = 5250, "diamond" = 3750)
+ build_path = /obj/item/rig_module/device/drill
+
+/datum/design/hardsuitmodules/rcd_module
+ name = "RCD mount"
+ desc = "A cell-powered rapid construction device for a hardsuit."
+ id = "rcd_module"
+ req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 5, TECH_POWER = 5, TECH_BLUESPACE = 4)
+ materials = list(DEFAULT_WALL_MATERIAL= 30000, "phoron" = 12500, "silver" = 10000, "gold" = 10000)
+ build_path = /obj/item/rig_module/device/rcd
+
+/datum/design/hardsuitmodules/taser_module
+ name = "mounted taser"
+ desc = "A palm-mounted nonlethal energy projector."
+ id = "taser_module"
+ req_tech = list(TECH_MATERIAL = 2, TECH_POWER = 3, TECH_COMBAT = 3, TECH_MAGNET = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 5250)
+ build_path = /obj/item/rig_module/mounted/taser
+
+/datum/design/hardsuitmodules/egun_module
+ name = "mounted taser"
+ desc = "A forearm-mounted energy projector."
+ id = "egun_module"
+ req_tech = list(TECH_MATERIAL = 3, TECH_POWER = 4, TECH_COMBAT = 4, TECH_MAGNET = 3)
+ materials = list(DEFAULT_WALL_MATERIAL= 7000, "glass"= 2250, "uranium"= 3250, "gold"= 2500)
+ build_path = /obj/item/rig_module/mounted/egun
\ No newline at end of file
diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi
index 366825c4122..d045d92babe 100644
Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 4ad3a3cbf17..04f46a8df7e 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index f1efd2f90e2..c5aefae272f 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 7c9c4e311e4..6f91a6a4098 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index eeda221bcd9..c2fa9ddbc98 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ
diff --git a/icons/obj/telescience.dmi b/icons/obj/telescience.dmi
index a0491827924..0a95347b6b4 100644
Binary files a/icons/obj/telescience.dmi and b/icons/obj/telescience.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index f4bc20d1deb..3063e3f5e68 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -4325,7 +4325,7 @@
"bFi" = (/obj/machinery/message_server,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room)
"bFj" = (/obj/machinery/camera/network/command{c_tag = "AI - Messaging Server"; dir = 1},/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room)
"bFk" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research)
-"bFl" = (/obj/machinery/light{dir = 1},/mob/living/simple_animal/yithian,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/hor)
+"bFl" = (/obj/machinery/light{dir = 1},/obj/structure/lamarr,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/hor)
"bFm" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station)
"bFn" = (/obj/machinery/recharge_station,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station)
"bFo" = (/obj/machinery/computer/teleporter,/turf/simulated/floor/plating,/area/teleporter)
@@ -4708,7 +4708,7 @@
"bMB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/miningdock)
"bMC" = (/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "acutesep"; name = "Acute Separation Shutters"; opacity = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper)
"bMD" = (/obj/machinery/door/airlock/external{name = "Toxins Test Chamber"},/turf/simulated/floor/airless,/area/rnd/test_area)
-"bME" = (/obj/structure/closet/emcloset,/turf/simulated/floor/airless,/area/rnd/test_area)
+"bME" = (/obj/structure/table/rack{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/research_port)
"bMF" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/research{c_tag = "Research - Toxins Test Chamber North"; network = list("Research","Toxins Test Area")},/turf/simulated/floor/tiled/airless,/area/rnd/test_area)
"bMG" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "mining_dock_airlock"; pixel_x = 25; pixel_y = -5; req_one_access = list(13,48); tag_airpump = "mining_dock_pump"; tag_chamber_sensor = "mining_dock_sensor"; tag_exterior_door = "mining_dock_outer"; tag_interior_door = "mining_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "mining_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTH)"; icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/miningdock)
"bMH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1380; id_tag = "mining_dock_pump"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (NORTHWEST)"; icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/miningdock)
@@ -5209,7 +5209,7 @@
"bWi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/effect/floor_decal/corner/pink{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing)
"bWj" = (/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bWk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/research_starboard)
-"bWl" = (/obj/structure/table/rack{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/research_port)
+"bWl" = (/obj/structure/closet/emcloset,/obj/random/loot,/turf/simulated/floor/airless,/area/rnd/test_area)
"bWm" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bWn" = (/obj/machinery/button/remote/blast_door{id = "misclab"; name = "Test Chamber Blast Doors"; pixel_x = 6; pixel_y = 30; req_access = list(47)},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
"bWo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/rnd/misc_lab)
@@ -7508,9 +7508,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybENbEObENbDNbDKbDObDObDObDObDObDPbDRbDQbzfbDSbqlbDTbDVbDUbDYbDWbEWbEXbEYbEZbFabtNbDZbzlbEhbEabxUbvKbEkbEibElbBnbEmbvKbFibFjbDIbAraaaaaaaaabAwbEnbFmbFnbyUbFobFpbFqbFrbCQbCPbEpbelbwDaQyaLjbEqbEsbEobEtbErbEvbEubExbEwbxJbxMbxMbEEbxMbwpbEIbEFbEKbEJbEMbELbDXbEPbDnbEQbFLbFMbEdbFNbFObFPbESbERbDrbETbDsbEUbDrbDrbFbbEVbFcbEVbEVbFdbFfbFebFgbFhbFkbBVbGdbFsbFubFtbFvbFlbFwbGkbGlbGmbGnaafaafbzUbFybFxbFxbFzbFAbFBbFDbGuaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtybGAbGCbGBbqlbqlbKqbwXbwXbwXbKMbqlbqlbKNbNSbKObqlbGDbGDbGDbFEbGDbFabFFbFHbFGbFIbtNbBmbzlbFJbGKbtNbGLbGLbGLbGLbGLbFKbGLbGLbGLbFCbGLbGLbGLbGLbGLbFQbGLbGLbGLbGLbGLbGLbGLbelbelbelbelbwDaQyaLjbEqbFSbEobFTbFRbFVbFUbFXbFWbFZbFYbGabBLbGcbGbbGfbGebGhbGgbGjbGibGpbGobGrbGqbGsbHmbHnbGvbHpbGwbEbbGtbGxbwCbwCbwCbwCbwCbGybwCbwCbwCbzHbGEbzHbzHbGzbAJbGFbBVbGdbGHbGJbGIbGMbGGbGNbGkbGlbGmbHDaaaaaabzUbGPbGObDGbAZbHGbGRbGSbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHJaafaaaaaaaaaaaabGDbGUbGTbGWbGVbHObGXbGZbGYbHabtNbBmbzlbzmbuIbHcbHbbHebHdbHgbHfbHibHhbHkbHjbHobHlbHqbuIbuIbHrbHtbHsbuIbHubuIbHvbHgbHwbHybHxbHAbHzbwDaQybCUaIXbDHbIqbDHbGQbHBbxJbHEbHCbHHbHFbHKbHIbHMbHLbHPbHNbwrbHQbHSbHRbDXbHTbHVbHUbIJbIKbFObILbHYbHXbEbbIObIPbIQbIRbISbHZbIUbIabHWbIbbIYbIebIdbIfbJcbzHbIgbGFbBVbJebIhbIjbIibIlbIkbImbGkbGlbJlbEDbEDbEDbzUbzUbzUbJmbJnbzUbzUbHGbzUaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaabJoaaaaaaaaaaaaaaaaaaaaaaaaaaabGDbIobInbIrbIpbJtbIsbIubItbIvbtNbBmbIwbIybIxbIxbIzbIBbIAbIDbICbIBbIzbIxbIxbIFbIEbIHbIGbIMbIIbINbIxbIxbITbIBbIAbIDbICbIWbIVbIXbIVbJabIZbuVaIXbJdbIcbJbbIcbJfbJYbCXbJgbKabKbbxMbJhbKdbKebDgbJibwpbJkbJqbJpbDXbJjbJsbJrbKmbJvbFObKobHYbJvbEbbKpbWlbIQbJxbJwbJzbJubJAbJybJBbIYbJEbJDbJFbJFbzHbJGbJCbJHbJIbJJbJMbJLbJObJNbJPbGkbGlbKLbEDcbAcbGcbBbEDaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJRbJQbJQbJSbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtybtybtyaaaaaaaaaaaaaaaaaabJoaaaaaaaaaaaaaaaaaaaaaaaaaaabGDbIobInbIrbIpbJtbIsbIubItbIvbtNbBmbIwbIybIxbIxbIzbIBbIAbIDbICbIBbIzbIxbIxbIFbIEbIHbIGbIMbIIbINbIxbIxbITbIBbIAbIDbICbIWbIVbIXbIVbJabIZbuVaIXbJdbIcbJbbIcbJfbJYbCXbJgbKabKbbxMbJhbKdbKebDgbJibwpbJkbJqbJpbDXbJjbJsbJrbKmbJvbFObKobHYbJvbEbbKpbMEbIQbJxbJwbJzbJubJAbJybJBbIYbJEbJDbJFbJFbzHbJGbJCbJHbJIbJJbJMbJLbJObJNbJPbGkbGlbKLbEDcbAcbGcbBbEDaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbJRbJQbJQbJSbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtybtybtybtybtyaaaaaaaaaaaaaaaaaaaaaaaabJUbJTbKXbJTbJVaaaaaaaaabGDbGDbJXbJWbIrbJWbLbbJZbKfbKcbKgbtNbKhbBmbKjbKibuIbKkbuIbzkbHgbHwbuIbKlbKrbKnbKtbKsbzmbuIbKvbKubHkbKwbHkbHkbKybKxbKAbKzbKCbKBbbLbKDaLjaLjaLjaIXbJKbEtbEvbKEbKGbKFbKIbKHbLFbKJbKPbKKbKQbLKbDgbHNbLLbLMbLNbDXbDXbLObLObLObEbbKVbLQbKWbLSbKYbEbbLUbLVbIQbLWbLXbHZbLYbKZbKRbLabIYbLebLdbJFbJFbzHbLfbLcbBVbwCbLhbLjbLibLlbLkbLmbGkbMmbMnbMobMobMobMpbGnaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLnbMtbLobMtbKSbKTbKTbLpbLqbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLrbMwbMxbMybLrbMzbMAbMBbGDbLsbLubLtbLwbLvbLybLxbLzbLzbLAbtNbtNbtNbMLbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbLCbLBbLDbtNbtNbtNbtNbtNbLEbtNbtNbtNaIXaIXbMQaIXaKfaLibLgaIXbLHbLGbLIbIcbLJbxJbCXbLPbxJbLRbLZbLTbMabwpbMcbMbbNdbMebMgbMfbMibMhbNjbMjbHYbJvbFObFObMkbJvbEbbNmbNnbNnbNnbNnbNnbNnbNnbNnbNnbNnbMqbMlbMrbMrbzHbMsbMdbMvbwCbNubNubNubNvbNwbNxbNubNubNubNubNubNubNybNzaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbMDbMtbMtbMEbKTbKTbLpbLpbMFbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLrbMwbMxbMybLrbMzbMAbMBbGDbLsbLubLtbLwbLvbLybLxbLzbLzbLAbtNbtNbtNbMLbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbtNbLCbLBbLDbtNbtNbtNbtNbtNbLEbtNbtNbtNaIXaIXbMQaIXaKfaLibLgaIXbLHbLGbLIbIcbLJbxJbCXbLPbxJbLRbLZbLTbMabwpbMcbMbbNdbMebMgbMfbMibMhbNjbMjbHYbJvbFObFObMkbJvbEbbNmbNnbNnbNnbNnbNnbNnbNnbNnbNnbNnbMqbMlbMrbMrbzHbMsbMdbMvbwCbNubNubNubNvbNwbNxbNubNubNubNubNubNubNybNzaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapaapbMDbMtbMtbWlbKTbKTbLpbLpbMFbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNEbNFbNEbKXbNGbMHbMGbNJbMIbMJbJWbMMbMKbFabMNbMPbMObMRbFacdyccRbNUbNVaaaaaaaaaaaabNWcqvbNYbNZbOabObbOcbOdbMTbMSbMUbOdbMWbMVbMYbMXbNabMZbNcbNbbNebOqbOrbOsbOsbOsbOsbDHbDHbDHbDHbMCbMCbxJbNfbCWbNgbLZbNibNhbNlbNkbNpbNobNqbNrbNAbNtbNCbNBbNjbOJbFObFObOKbJvbJvbOJbEbbNmbNnbNDbNIbNHbNLbNKbNNbNMbNObNnbNQbNPbNRbNRbzHbOebNsbBVbzPbOfbOhbOgbOkbOjbOmbOlbOobOnbOtbOpbNubPjbEDbPkbPkbPkbPkbPkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabPlbKTbMDbKTbKTbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLrbNEbNEbNEbPmbPnbJWbOubOwbOvbJWbOxbOzbOybFabFabFabFabFabFabPubPvbPwbPxaaabPybPzbPzbPAbPBbPCbPDbPEbPCbPFbOdbOBbOAbOCbOdbOEbODbOGbOFbOIbOHbNcbPQbPQbOqbPRbPSbPTbPUbPVbDHbOibIcbOLbIcbIcbOMbCXbONbxJbOObOQbOPbORbwpbOTbOSbwpbOVbOXbOWbOZbOYbNjbEbbEbbEbbEbbEbbEbbEbbEbbBjbNnbPabPcbPbbNHbNHbNHbNHbPdbNnbPebLdbPfbPfbzHbAJbLcbBVbPgbOUbOUbPhbPobPibPpbPqbPtbPsbPtbPGbNubPHbPIbPkbPKbPJbPLbQHaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbPNbPMbPMbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQbwQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKXbNFbNFbNFbKXbQKbPPbPObQNbPWbJWbJWbPYbPXbQRbQSbQSbQSbQSbQSbQSbQTbQUbQVaaabQWbQabPZbQZbRabPCbRbbRcbRdbPCbOdbQcbQbbQdbOdbQfbQebQhbQgbQjbQibQkbPQbRobPUbRpbOsbPUbPUcgBbDHbPrbIcbQmbQlbIcbQnbCXbCWbRwbQobQqbQpbQrbRBbDgbHNbRCbOVbOWbOWbOZbQtbNjbQsbQvbQubRHbQwbQybQxbRLbBjbNnbNHbNHbQAbNHbQBbNHbNHbQCbNnbQDbLdbQEbQEbzHbLfbQzbQFbQIbQGbQLbQJbQObQMbQQbQPbQYbQXbRfbRebRgbRhbRkbRjbRmbRlbPLbSkaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKTbKTbRnbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7523,7 +7523,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamcaBaamaamaamaamaamaaaaaaaaaaaaaaaaaaaafaafaaacaCcaDcaDcaDcaEcaDcaDbZBbZAbZrbZCbZDbZrbZLbZEbZNbZMbZPbZObZTbZSbZVbZUbZXbZWcaVbYabZGcaWcaXbZJcaYbVibWMbWMbWMbWMbWMcaZbOqbDHcaabZYcafcabcahbZucajcagbUlcamaAJcancaocbmcbncbocbpcaebYXbYVcapcaicarcaqcakcascaucatcakcawbnFbBjbIPcbxcbycbzcbxcbxbIPbIPbIPcFkcGucbCcbDcbEbwCbwCcavbwCbwCcKNcbHcazcbJcbKcbLcbMcbNcbOcbPcbQcbRcbScbTbUQbUQbUQbUQaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKSbKTbTzbTxbTxbLpbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcaAcaGcaFcaIcaHcbZcaJcaLcaKbZrcaMcaNbZrbZrcaOcaQcaPcaScaRcckcaTbYEbYDbYGcaUcbabYabYaccoccpbYaccqbVicbccbbbWMcbdbWMbUhccuccuccuccuccuccuccubUlcbecaxbUlcbfcbhcbgcbicbmccBccCccDcaebYXbYVcbjcaicblcbkcakcbqcbscbrcakcbubnFccLccMccNccOccPccQccNctcccSccTccUccVccWccXccUccYcbtcbwcbvcbUcbIcdhcbVcdgcdhcdicdjcdhcdkcdlcdmcdncdocdpcdqcbWbUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabPlbKTbMDbKTbKTbLpbLpbLpbLpbLpbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafcbXcbXcaFccacbYcbZccbccccdxbZrccdccfccecchccgccjcciccmcclcdHccnccsccrccvcctccwcdOcdPcdQcdRcdScdTccxcczccyccEccAbWMbUhccuccFccHccGccJccIccZcbFcdaccKcdccdbcdecddcdfcbmcdtcdscducaebYXbYVcdrcaicdwcdvcakcdzcdBcdAcakcdDbnFbnFcexccNceycezceAccNceBceCceDceEceEceFceGceEceHcdCcdFcdEceHceLceMceNceOceLceLceLceLcePceNceOceLceLceQceRcdIceTcdKcdJceWcdLcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdMcdUcdNcdNcdVbKTbKTbLpbLpcdWbLpbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfdcfdcfdcfdcfdcfdcfdcfecffbZrbZrbZrbZrbZrcfgcfhcficficficfjcdXbYEbYDbYGcdYbZFcdZcebceacedcecceebVicegcefcehcefbWMbUhccuceicejcejcejcekcelbUlcemcdGbUlcbfcbgcenceocbmcerceqcescaebYXbYVbUscaicetcepcakcakcakcakcakcevcewbnFcexccNcfKcfLccNccNceBcfMceDceEceIceuceuceJceHcfQceKcfSceHceSceUceUceUceVceZceYcfaceXcfccfbcfkceLcfncfmcfobUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcfqcfpcfrbMEbKSbKTbKTbLpbLqbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfdcfdcfdcfdcfdcfdcfdcfecffbZrbZrbZrbZrbZrcfgcfhcficficficfjcdXbYEbYDbYGcdYbZFcdZcebceacedcecceebVicegcefcehcefbWMbUhccuceicejcejcejcekcelbUlcemcdGbUlcbfcbgcenceocbmcerceqcescaebYXbYVbUscaicetcepcakcakcakcakcakcevcewbnFcexccNcfKcfLccNccNceBcfMceDceEceIceuceuceJceHcfQceKcfSceHceSceUceUceUceVceZceYcfaceXcfccfbcfkceLcfncfmcfobUQbUQbUQbUQaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcfqcfpcfrbWlbKSbKTbKTbLpbLqbLpbKTbKTaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcfdcgjcgkcglcfscftcfdcfucgpcgqcfvcfxcfwcfycfycgvcfzcfzcfAcfBcaTbYEbYDbYGcfCcaVcfDcfFcfEcfHcfGcfIbVicefcefbWMcfJbWMbUhccucfNcfOcfOcfOcfPccucgKcfTcfRcgKcflcfVcfUcfWcbmcfYceqcfZcaecgacfXcgbcaicgdcgccaicgYbLVbVJcggcgfcghbnFchcchdchdchechfchfchfchfchgceEcgicgecgecgmchkcgncgrcgochocgscgtcgtcgtcgucgxcgxcgycgwcgAcgzcgCceLchychzchAchyaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgEbJQbJQbJSbKSbKSbKTbKTbKTbKTbKUaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafchCchCchCchCchCchCchCchCchCchCchCchCchCaaaaaachDchEchFchFcgFcgGcfdcgIcgHcgLcgJcgNcgMcgPcgOcgRcgQcgTcgScgVcgUcgXcgWchacgZbVibVibVibVibVibVibVibVichhchbbWMchibWMbUhccuccucidciecifccuccuchjchmchlcgKcbmcbmcbmcbmcbmcaechnchpcaecilcgDcilcaichrchqcaicipceBbVJchtbVJchubnFcisbnFbnFcitciuciuciucivbnFceEchvchschschwchBchxchHchGchIchJchLchLchLchLchNchMchLchOchLchPchQceLciLciMciNchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCchRchSchRchCchTchUchTchCchVchWchVchCaaaaaaciUchEchFcgFcgFchXcfdchZchYciYciaciccibcihcigcijciiciicikciicaTbYEcimbYGcincjjciocirciqcirciwcixcjpcjpcjqcjqcjqcjqbUhcjrchKciyciyciAcizciDciCciFciEciHciBciIciGciGciJcjFcaecaecaeciPciOciQcaicaicaicaiceBceBbVJciRbVJciSbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEciTciKciWciVcjaciXcjbciZcjecjdcjfcjdcjdcjgcjicjhcgxcjkcgxcjlcjmceLckcckdckechyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-3.dmm b/maps/exodus-3.dmm
index ed87a219590..40720548b51 100644
--- a/maps/exodus-3.dmm
+++ b/maps/exodus-3.dmm
@@ -301,7 +301,7 @@
"fO" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
"fP" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
"fQ" = (/obj/machinery/telecomms/server/presets/command,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
-"fR" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
+"fR" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/machinery/ntnet_relay,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
"fS" = (/obj/machinery/telecomms/server/presets/security,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber)
"fT" = (/obj/machinery/porta_turret{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer)
"fU" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'LETHAL TURRETS'. Enter at your own risk!"; name = "LETHAL TURRETS"; pixel_x = -32; pixel_y = 0},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled,/area/turret_protected/tcomfoyer)