diff --git a/_maps/RandomZLevels/centcomAway.dmm b/_maps/RandomZLevels/centcomAway.dmm
index 8148d474bcd..cca944ad45b 100644
--- a/_maps/RandomZLevels/centcomAway.dmm
+++ b/_maps/RandomZLevels/centcomAway.dmm
@@ -154,7 +154,7 @@
"cX" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/simulated/floor/plasteel/shuttle{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"cY" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "yellow"},/area/awaymission/centcomAway/general)
"cZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/centcomAway/maint)
-"da" = (/obj/structure/table,/obj/item/device/flash,/turf/simulated/floor/plasteel/shuttle{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
+"da" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel/shuttle{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"db" = (/turf/simulated/floor/plasteel/shuttle{icon_state = "floor2"},/area/awaymission/centcomAway/hangar)
"dc" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/shuttle,/area/awaymission/centcomAway/hangar)
"dd" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/awaymission/centcomAway/hangar)
@@ -484,7 +484,7 @@
"jp" = (/obj/machinery/computer/card,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/centcomAway/general)
"jq" = (/obj/item/weapon/stamp,/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/centcomAway/general)
"jr" = (/obj/structure/table,/obj/item/weapon/firstaid_arm_assembly,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
-"js" = (/obj/structure/table,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
+"js" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"jt" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"ju" = (/obj/structure/table,/obj/item/device/mmi/radio_enabled,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
"jv" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/centcomAway/hangar)
diff --git a/_maps/RandomZLevels/stationCollision.dmm b/_maps/RandomZLevels/stationCollision.dmm
index 0bbc955da76..06b3e41b421 100644
--- a/_maps/RandomZLevels/stationCollision.dmm
+++ b/_maps/RandomZLevels/stationCollision.dmm
@@ -400,7 +400,7 @@
"hJ" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/awaymission/arrivalblock)
"hK" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"hL" = (/obj/structure/table,/obj/item/weapon/storage/fancy/donut_box,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
-"hM" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
+"hM" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel,/area/awaymission/arrivalblock)
"hN" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/arrivalblock)
"hO" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/blue,/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"hP" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/purple,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm
index 9663788b647..ab6550ade5c 100644
--- a/_maps/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/RandomZLevels/undergroundoutpost45.dmm
@@ -195,7 +195,7 @@
"dM" = (/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "green"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dN" = (/obj/structure/closet/secure_closet{icon_broken = "hydrosecurebroken"; icon_closed = "hydrosecure"; icon_locked = "hydrosecure1"; icon_off = "hydrosecureoff"; icon_opened = "hydrosecureopen"; icon_state = "hydrosecure"; locked = 0; name = "botanist's locker"; req_access_txt = "201"},/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/device/analyzer/plant_analyzer,/obj/item/clothing/mask/bandana,/obj/item/weapon/hatchet,/turf/simulated/floor/plasteel{dir = 4; heat_capacity = 1e+006; icon_state = "vault"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{burnt = 1; heat_capacity = 1e+006; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
-"dP" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/weapon/storage/belt/security,/obj/item/device/flash/handheld,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
+"dP" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/item/weapon/storage/belt/security,/obj/item/device/assembly/flash/handheld,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 9; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dQ" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/obj/structure/stool/bed/chair,/obj/structure/reagent_dispensers/peppertank{pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dR" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"dS" = (/obj/machinery/door/airlock/security{name = "Security Checkpoint"; req_access_txt = "201"},/turf/simulated/floor/plasteel{heat_capacity = 1e+006},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -789,7 +789,7 @@
"pi" = (/obj/item/weapon/storage/secure/safe{pixel_x = 5; pixel_y = -27},/turf/simulated/floor/plasteel{dir = 5; heat_capacity = 1e+006; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pj" = (/obj/structure/filingcabinet,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pk" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/button/door{desc = "A remote control-switch whichs locks the research division down in the event of a biohazard leak or contamination."; id = "UO45_biohazard"; name = "Biohazard Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "201"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
-"pl" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
+"pl" = (/obj/structure/closet/secure_closet{icon_broken = "secbroken"; icon_closed = "sec"; icon_locked = "sec1"; icon_off = "secoff"; icon_opened = "secopen"; icon_state = "sec1"; locked = 1; name = "security officer's locker"; req_access_txt = "201"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/plasteel{dir = 6; heat_capacity = 1e+006; icon_state = "red"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pm" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{broken = 1; heat_capacity = 1e+006; icon_state = "platingdmg3"; tag = "icon-platingdmg3"},/area/awaycontent/a5{has_gravity = 1; name = "UO45 Research"})
"pn" = (/obj/structure/flora/kirbyplants{layer = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel{dir = 10; heat_capacity = 1e+006; icon_state = "neutral"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"po" = (/turf/simulated/floor/plasteel{dir = 8; heat_capacity = 1e+006; icon_state = "neutralcorner"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
diff --git a/_maps/map_files/AsteroidStation/Asteroidstation.dmm b/_maps/map_files/AsteroidStation/Asteroidstation.dmm
index 29b348f4ae3..7096a7e099c 100644
--- a/_maps/map_files/AsteroidStation/Asteroidstation.dmm
+++ b/_maps/map_files/AsteroidStation/Asteroidstation.dmm
@@ -247,7 +247,7 @@
"aeM" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint{name = "Customs Desk"})
"aeN" = (/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint{name = "Customs Desk"})
"aeO" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 1},/area/security/checkpoint{name = "Customs Desk"})
-"aeP" = (/obj/item/device/flash/handheld,/obj/item/weapon/crowbar/red,/obj/structure/table/reinforced,/obj/machinery/light_switch{dir = 4; pixel_x = 22},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint{name = "Customs Desk"})
+"aeP" = (/obj/item/device/assembly/flash/handheld,/obj/item/weapon/crowbar/red,/obj/structure/table/reinforced,/obj/machinery/light_switch{dir = 4; pixel_x = 22},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 5},/area/security/checkpoint{name = "Customs Desk"})
"aeQ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 8; icon_state = "redcorner"},/area/hallway/primary/fore{name = "Fore Hallway"})
"aeR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore{name = "Fore Hallway"})
"aeS" = (/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/fore{name = "Fore Hallway"})
@@ -534,7 +534,7 @@
"akn" = (/obj/structure/rack,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = -1},/obj/item/clothing/gloves/color/yellow,/obj/item/device/multitool,/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/storage/tech)
"ako" = (/obj/structure/table,/obj/item/device/analyzer/plant_analyzer,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light_switch{pixel_y = -22},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/storage/tech)
"akp" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/healthanalyzer,/obj/machinery/requests_console{department = "Tech storage"; name = "Tech Storage Requests Console"; pixel_y = -32},/turf/simulated/floor/plasteel{icon_state = "yellow"},/area/storage/tech)
-"akq" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/storage/tech)
+"akq" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel{dir = 6; icon_state = "yellow"},/area/storage/tech)
"akr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/fore{name = "Fore Hallway"})
"aks" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel,/area/hallway/primary/fore{name = "Fore Hallway"})
"akt" = (/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Fore Hallway APC"; pixel_x = 24},/turf/simulated/floor/plasteel{icon_state = "neutralcorner"},/area/hallway/primary/fore{name = "Fore Hallway"})
@@ -1771,7 +1771,7 @@
"aIc" = (/turf/simulated/wall/r_wall,/area/security/prison)
"aId" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel{icon_state = "neutral"; dir = 8},/area/security/main)
"aIe" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/security/main)
-"aIf" = (/obj/structure/table/wood,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel,/area/security/main)
+"aIf" = (/obj/structure/table/wood,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel,/area/security/main)
"aIg" = (/obj/structure/table/wood,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/atmospherics/components/unary/vent_scrubber{on = 1},/turf/simulated/floor/plasteel,/area/security/main)
"aIh" = (/obj/structure/table/wood,/obj/item/weapon/book/manual/wiki/security_space_law,/turf/simulated/floor/plasteel,/area/security/main)
"aIi" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/security/main)
@@ -2924,15 +2924,15 @@
"bel" = (/obj/machinery/disposal/bin,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bem" = (/obj/machinery/button/door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = -1; pixel_y = -24; req_access_txt = "19"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"ben" = (/obj/machinery/light,/obj/machinery/firealarm{dir = 1; pixel_x = -3; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/heads)
-"beo" = (/obj/structure/table/wood,/obj/item/device/flash/handheld,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"beo" = (/obj/structure/table/wood,/obj/item/device/assembly/flash/handheld,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bep" = (/obj/structure/table/wood,/obj/item/weapon/folder/blue,/obj/item/weapon/stamp/hop,/obj/machinery/requests_console{announcementConsole = 1; department = "Head of Personnel's Desk"; departmentType = 5; name = "Head of Personnel Requests Console"; pixel_y = -30},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"beq" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"ber" = (/obj/structure/closet/secure_closet/hop,/obj/item/clothing/suit/ianshirt,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bes" = (/obj/machinery/light{dir = 8},/obj/machinery/status_display{pixel_x = -32},/turf/simulated/floor/plasteel,/area/bridge)
"bet" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "bluecorner"},/area/bridge)
"beu" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/button/door{id = "evashutter"; name = "E.V.A. Storage Shutter Control"; pixel_y = -24; req_access_txt = "19"},/obj/machinery/button/door{id = "bridgeshut"; name = "Bridge Shutters Control"; pixel_y = -34; req_access_txt = "19"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/bridge)
-"bev" = (/obj/structure/table,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/bridge)
-"bew" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/bridge)
+"bev" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/bridge)
+"bew" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel{dir = 8; icon_state = "yellow"},/area/bridge)
"bex" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/floor/plating,/area/mine/explored)
"bey" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = 23},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/mine/explored)
"bez" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel{dir = 5; icon_state = "brown"},/area/security/prison)
@@ -3999,7 +3999,7 @@
"byU" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"byV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/assembly/chargebay)
"byW" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/assembly/assembly_line)
-"byX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/rack,/obj/item/device/flash/handheld,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/assembly/assembly_line)
+"byX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/rack,/obj/item/device/assembly/flash/handheld,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/assembly/assembly_line)
"byY" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4},/obj/structure/rack,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/assembly/assembly_line)
"byZ" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/assembly/assembly_line)
"bza" = (/obj/machinery/light{dir = 1},/obj/machinery/requests_console{department = "Robotics"; departmentType = 2; name = "Robotics Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel{dir = 1; icon_state = "whiteyellow"},/area/assembly/assembly_line)
@@ -4299,7 +4299,7 @@
"bEI" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"bEJ" = (/obj/structure/table/glass,/obj/item/clothing/glasses/welding,/obj/item/weapon/crowbar,/obj/item/device/multitool,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"bEK" = (/obj/structure/stool,/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
-"bEL" = (/obj/structure/table/glass,/obj/item/device/flash/handheld,/obj/item/stack/cable_coil,/obj/item/borg/upgrade/rename,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
+"bEL" = (/obj/structure/table/glass,/obj/item/device/assembly/flash/handheld,/obj/item/stack/cable_coil,/obj/item/borg/upgrade/rename,/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"bEM" = (/obj/structure/table/glass,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/stack/sheet/glass{amount = 20; pixel_x = -3; pixel_y = 6},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/metal{amount = 50},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"bEN" = (/obj/structure/table/glass,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
"bEO" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_y = -29},/obj/structure/table/glass,/obj/machinery/cell_charger,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel,/area/assembly/assembly_line)
diff --git a/_maps/map_files/AsteroidStation/z2.dmm b/_maps/map_files/AsteroidStation/z2.dmm
index 8294dd9d383..e36823ef654 100644
--- a/_maps/map_files/AsteroidStation/z2.dmm
+++ b/_maps/map_files/AsteroidStation/z2.dmm
@@ -196,7 +196,7 @@
"dN" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"dO" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"dP" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
-"dQ" = (/obj/structure/table,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
+"dQ" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"dR" = (/turf/indestructible/fakedoor{name = "Thunderdome Admin"},/area/tdome/tdomeadmin)
"dS" = (/obj/structure/table,/obj/machinery/button/door{id = "thunderdomehea"; name = "Heavy Supply Control"; pixel_y = 0; req_access_txt = "102"},/turf/simulated/floor/plasteel,/area/tdome/tdomeadmin)
"dT" = (/obj/structure/table,/obj/machinery/button/door{id = "thunderdome"; name = "Main Blast Doors Control"; pixel_y = 0; req_access_txt = "102"},/turf/simulated/floor/plasteel,/area/tdome/tdomeadmin)
diff --git a/_maps/map_files/MetaStation/MetaStation.v41G.dmm b/_maps/map_files/MetaStation/MetaStation.v41G.dmm
index 9c69fa133dc..43e899f21c2 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41G.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41G.dmm
@@ -153,7 +153,7 @@
"acW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport)
"acX" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/lattice/catwalk,/turf/space,/area/solar/auxport)
"acY" = (/obj/structure/table,/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = -4; pixel_y = 1},/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate{name = "chloral hydrate bottle"},/obj/item/weapon/reagent_containers/glass/bottle/toxin{pixel_x = 6; pixel_y = 8},/obj/item/weapon/reagent_containers/glass/bottle/morphine{pixel_x = 5; pixel_y = 1},/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/bottle/facid{name = "fluorosulfuric acid bottle"; pixel_x = -3; pixel_y = 6},/obj/item/weapon/reagent_containers/syringe{pixel_y = 5},/obj/item/weapon/reagent_containers/dropper,/obj/machinery/alarm{desc = "This particular atmos control unit appears to have no access restrictions."; dir = 4; icon_state = "alarm0"; locked = 0; name = "all-access air alarm"; pixel_x = -24; req_access = "0"; req_one_access = "0"},/obj/machinery/button/ignition{id = "executionburn"; name = "Justice Ignition Switch"; pixel_x = -25; pixel_y = 36},/obj/machinery/button/door{id = "executionfireblast"; name = "Justice Area Lockdown"; pixel_x = -25; pixel_y = 26; req_access_txt = "2"},/obj/item/device/assembly/signaler{pixel_x = -3; pixel_y = 2},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/machinery/button/flasher{id = "justiceflash"; name = "Justice Flash Control"; pixel_x = -36; pixel_y = 36; req_access_txt = "1"},/obj/machinery/button/door{dir = 2; id = "SecJusticeChamber"; layer = 4; name = "Justice Vent Control"; pixel_x = -36; pixel_y = 26; req_access_txt = "3"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
-"acZ" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/device/taperecorder{pixel_x = -3; pixel_y = 0},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/device/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
+"acZ" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/device/taperecorder{pixel_x = -3; pixel_y = 0},/obj/item/weapon/storage/fancy/cigarettes,/obj/item/device/assembly/flash/handheld,/obj/item/weapon/reagent_containers/spray/pepper,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"ada" = (/obj/machinery/atmospherics/pipe/simple/general/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"adb" = (/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "old sink"; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
"adc" = (/obj/machinery/power/apc{cell_type = 2500; dir = 1; name = "Prisoner Education Chamber APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/injection{name = "educational injections"; pixel_x = 2},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkred"; tag = "icon-darkblue"},/area/prison/solitary{name = "Prisoner Education Chamber"})
@@ -347,7 +347,7 @@
"agI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarport)
"agJ" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plating{tag = "icon-platingdmg2"; icon_state = "platingdmg2"},/area/maintenance/auxsolarport)
"agK" = (/obj/structure/table,/obj/item/weapon/folder/red{pixel_x = 3},/obj/item/weapon/folder/white{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
-"agL" = (/obj/structure/rack,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flash/handheld,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
+"agL" = (/obj/structure/rack,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/flash/handheld,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"agM" = (/obj/structure/table,/obj/item/weapon/storage/box/bodybags{pixel_x = 4; pixel_y = 2},/obj/item/weapon/pen,/obj/item/weapon/storage/box/prisoner,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"agN" = (/obj/structure/closet/secure_closet/brig{anchored = 1},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
"agO" = (/obj/structure/closet/secure_closet/brig{anchored = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/security/prison)
@@ -834,7 +834,7 @@
"aqb" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel,/area/security/main)
"aqc" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/storage/secure/briefcase,/turf/simulated/floor/plasteel,/area/security/main)
"aqd" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "redfull"},/area/security/main)
-"aqe" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel,/area/security/main)
+"aqe" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel,/area/security/main)
"aqf" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/security/main)
"aqg" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/item/weapon/pen,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/plasteel,/area/security/main)
"aqh" = (/obj/effect/landmark/start{name = "Security Officer"},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Security - Office - Starboard"; dir = 8; network = list("SS13")},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/main)
@@ -2685,7 +2685,7 @@
"aZG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"aZH" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/secure_data{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/security{pixel_x = 1; pixel_y = -1},/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 31},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"aZI" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/cloning{pixel_x = 0},/obj/item/weapon/circuitboard/med_data{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/clonescanner,/obj/item/weapon/circuitboard/clonepod,/obj/item/weapon/circuitboard/scan_consolenew,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
-"aZJ" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
+"aZJ" = (/obj/structure/table,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/machinery/light/small{dir = 1},/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"aZK" = (/obj/structure/table,/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"aZL" = (/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"aZM" = (/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
@@ -3126,7 +3126,7 @@
"bif" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/shuttle/arrival)
"big" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion (WEST)"; icon_state = "propulsion"; dir = 8},/turf/simulated/floor/plating,/area/shuttle/arrival)
"bih" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "arrival"},/area/hallway/secondary/entry{name = "Arrivals"})
-"bii" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/flash/handheld,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2{name = "Customs"})
+"bii" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet,/obj/item/weapon/crowbar,/obj/item/device/assembly/flash/handheld,/obj/item/device/radio,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/checkpoint2{name = "Customs"})
"bij" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2{name = "Customs"})
"bik" = (/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/table/reinforced,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2{name = "Customs"})
"bil" = (/obj/item/weapon/paper,/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{dir = 2; name = "Arrivals Security Checkpoint"; pixel_y = -8; req_access_txt = "1"},/turf/simulated/floor/plasteel{icon_state = "red"},/area/security/checkpoint2{name = "Customs"})
@@ -3543,7 +3543,7 @@
"bqg" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 1; icon_state = "neutralcorner"},/area/hallway/primary/central)
"bqh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=4-Customs"; location = "3-Central-Port"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"bqi" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/door/poddoor/preopen{id = "hop"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/crew_quarters/heads)
-"bqj" = (/obj/item/weapon/folder/blue,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/wood,/obj/item/device/flash/handheld,/turf/simulated/floor/wood,/area/crew_quarters/heads)
+"bqj" = (/obj/item/weapon/folder/blue,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/wood,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bqk" = (/obj/effect/landmark/start{name = "Head of Personnel"},/obj/structure/stool/bed/chair/office/dark{dir = 8},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bql" = (/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/obj/machinery/computer/security/mining,/turf/simulated/floor/wood,/area/crew_quarters/heads)
"bqm" = (/obj/machinery/power/apc{cell_type = 10000; dir = 8; name = "Bridge APC"; pixel_x = -27; pixel_y = 0},/obj/structure/cable/yellow,/obj/machinery/camera{c_tag = "Bridge - Port"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel{dir = 8; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge)
@@ -7096,7 +7096,7 @@
"cGx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"cGy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"cGz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/assembly/robotics)
-"cGA" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/item/device/flash/handheld,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
+"cGA" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"},/area/assembly/robotics)
"cGB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cGC" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGD" = (/obj/machinery/door/poddoor{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 9b6fbd72fe9..46c399499b6 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -158,7 +158,7 @@
"db" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
"dc" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
"dd" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/stamp,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
-"de" = (/obj/structure/table,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
+"de" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
"df" = (/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
"dg" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel/shuttle,/area/centcom/evac)
"dh" = (/obj/structure/table,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/plasteel/shuttle{icon_state = "shuttlefloor4"},/area/centcom/evac)
diff --git a/_maps/map_files/MetaStation/z4.dmm b/_maps/map_files/MetaStation/z4.dmm
index 0289d8b49a4..ea77a4e1da7 100644
--- a/_maps/map_files/MetaStation/z4.dmm
+++ b/_maps/map_files/MetaStation/z4.dmm
@@ -320,7 +320,7 @@
"gh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/derelict/singularity_engine)
"gi" = (/obj/item/stack/cable_coil/cut,/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/derelict/singularity_engine)
"gj" = (/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
-"gk" = (/obj/structure/table,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
+"gk" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"gl" = (/obj/structure/table,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"gm" = (/obj/structure/table,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"gn" = (/obj/structure/table,/obj/item/weapon/stock_parts/cell{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 7ec490939e4..980025226bb 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -39,7 +39,7 @@
"aM" = (/obj/structure/fireaxecabinet{pixel_x = 32},/turf/simulated/floor/plasteel,/area/bridge)
"aN" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/bridge)
"aO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/bridge)
-"aP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/bridge)
+"aP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/obj/item/device/assembly/flash/handheld,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel,/area/bridge)
"aQ" = (/obj/structure/stool/bed/chair/comfy/black{dir = 2},/obj/effect/landmark/start{name = "Captain"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/button/door{id = "bridge blast"; name = "Bridge Blast Door Control"; pixel_x = 29; pixel_y = 6; req_access_txt = "19"},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_y = 28},/turf/simulated/floor/plasteel,/area/bridge)
"aR" = (/obj/structure/table/reinforced,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/plasteel,/area/bridge)
"aS" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/bridge)
@@ -367,7 +367,7 @@
"hc" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/crate,/turf/simulated/floor/plasteel{icon_state = "bot"},/area/quartermaster/storage)
"hd" = (/obj/machinery/atmospherics/pipe/simple{dir = 2},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_research{name = "Server Room"; req_access_txt = "47"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/medical/research{name = "Research Division"})
"he" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel,/area/hallway/primary/central)
-"hf" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/timer,/obj/item/device/flash,/turf/simulated/floor/plasteel,/area/security/brig)
+"hf" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/obj/item/device/assembly/timer,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel,/area/security/brig)
"hg" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/obj/structure/stool/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Security Officer"},/turf/simulated/floor/plasteel,/area/security/brig)
"hh" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel,/area/security/brig)
"hi" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/table,/obj/item/weapon/book/manual/wiki/security_space_law,/obj/item/weapon/storage/lockbox/loyalty,/turf/simulated/floor/plasteel,/area/security/brig)
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 9d9f5317db8..47a6fa1e78c 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -1452,7 +1452,7 @@
pixel_x = -3;
pixel_y = 0
},
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/obj/item/weapon/reagent_containers/spray/pepper,
/turf/simulated/floor/plasteel{
icon_state = "dark"
@@ -3167,7 +3167,7 @@
/area/security/main)
"agi" = (
/obj/structure/table,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/simulated/floor/plasteel,
/area/security/main)
@@ -15136,7 +15136,7 @@
"aEt" = (
/obj/item/device/radio/off,
/obj/item/weapon/crowbar,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/obj/structure/table,
/turf/simulated/floor/plasteel{
icon_state = "red";
@@ -20724,8 +20724,8 @@
/area/storage/tools)
"aQS" = (
/obj/structure/table/reinforced,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/turf/simulated/floor/plasteel,
/area/bridge)
"aQT" = (
@@ -29762,11 +29762,11 @@
pixel_y = 0
},
/obj/structure/table,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
@@ -30526,8 +30526,8 @@
amount = 10
},
/obj/item/stack/cable_coil,
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/turf/simulated/floor/plasteel,
/area/assembly/robotics)
"blV" = (
@@ -39257,8 +39257,8 @@
pixel_x = 1;
pixel_y = 5
},
-/obj/item/device/flash/handheld,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/obj/machinery/ai_status_display{
pixel_x = -32;
pixel_y = 0
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 7756f32ef39..4d07dc41b64 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -1060,7 +1060,7 @@
/area/centcom/evac)
"df" = (
/obj/structure/table,
-/obj/item/device/flash/handheld,
+/obj/item/device/assembly/flash/handheld,
/turf/simulated/floor/plasteel/shuttle{
icon_state = "shuttlefloor4"
},
diff --git a/_maps/map_files/generic/z4.dmm b/_maps/map_files/generic/z4.dmm
index e1371b05dde..1e023fe0e23 100644
--- a/_maps/map_files/generic/z4.dmm
+++ b/_maps/map_files/generic/z4.dmm
@@ -856,7 +856,7 @@
"qx" = (/obj/structure/rack,/obj/item/weapon/circuitboard/solar_control,/turf/simulated/floor/plasteel,/area/derelict/bridge/ai_upload)
"qy" = (/obj/item/ammo_casing/a357{pixel_x = -5},/obj/item/ammo_casing/a357{pixel_x = 5; pixel_y = 6},/obj/item/ammo_casing/a357,/turf/simulated/floor/plasteel/airless,/area/derelict/hallway/primary)
"qz" = (/obj/machinery/porta_turret_cover,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/ai_upload)
-"qA" = (/obj/structure/table,/obj/item/device/flash/handheld,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
+"qA" = (/obj/structure/table,/obj/item/device/assembly/flash/handheld,/turf/simulated/floor/plasteel/airless,/area/derelict/bridge/access)
"qB" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 8; name = "8maintenance loot spawner"},/turf/simulated/floor/plating/airless,/area/derelict/atmospherics)
"qC" = (/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/mineral/bananium/airless,/area/space)
"qD" = (/obj/item/weapon/shovel,/turf/simulated/floor/mineral/bananium/airless,/area/space)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 1fd4258bcea..f65a339b6a2 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -256,9 +256,9 @@
text += "
Flash: give"
var/list/L = current.get_contents()
- var/obj/item/device/flash/flash = locate() in L
+ var/obj/item/device/assembly/flash/flash = locate() in L
if (flash)
- if(!flash.broken)
+ if(!flash.crit_fail)
text += "|take."
else
text += "|take|repair."
@@ -807,18 +807,19 @@
if("takeflash")
var/list/L = current.get_contents()
- var/obj/item/device/flash/flash = locate() in L
+ var/obj/item/device/assembly/flash/flash = locate() in L
if (!flash)
usr << "Deleting flash failed!"
qdel(flash)
if("repairflash")
var/list/L = current.get_contents()
- var/obj/item/device/flash/flash = locate() in L
+ var/obj/item/device/assembly/flash/flash = locate() in L
if (!flash)
usr << "Repairing flash failed!"
else
- flash.broken = 0
+ flash.crit_fail = 0
+ flash.update_icon()
@@ -1372,7 +1373,7 @@
ticker.mode.greet_revolutionary(src,0)
var/list/L = current.get_contents()
- var/obj/item/device/flash/flash = locate() in L
+ var/obj/item/device/assembly/flash/flash = locate() in L
qdel(flash)
take_uplink()
var/fail = 0
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 5e7be34941a..d8f3cefe45c 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -10,7 +10,6 @@ var/list/same_wires = list()
var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown", "gold", "gray", "cyan", "navy", "purple", "pink")
/datum/wires
-
var/random = 0 // Will the wires be different for every single instance.
var/atom/holder = null // The holder
var/holder_type = null // The holder type; used to make sure that the holder is the correct type.
@@ -48,6 +47,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
/datum/wires/Destroy()
holder = null
+ signallers = list()
return ..()
/datum/wires/proc/GenerateWires()
@@ -68,13 +68,33 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
src.wires[colour] = index
//wires = shuffle(wires)
+/datum/wires/proc/IsInteractionTool(obj/item/I)
+ if(istype(I, /obj/item/device/multitool))
+ return 1
+
+ if(istype(I, /obj/item/weapon/wirecutters))
+ return 1
+
+ if(istype(I, /obj/item/device/assembly))
+ var/obj/item/device/assembly/A = I
+ if(A.attachable)
+ return 1
+
+ return 0
+
/datum/wires/proc/Interact(mob/living/user)
-
var/html = null
if(holder && CanUse(user))
html = GetInteractWindow()
if(html)
+ if(user.machine != holder)
+ for(var/A in signallers)
+ if(istype(signallers[A], /obj/item))
+ var/obj/item/I = signallers[A]
+ if(I.on_found(user))
+ return
+
user.set_machine(holder)
else
user.unset_machine()
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 0da1f7b219b..882accb90c0 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -126,7 +126,7 @@
mob.dna.remove_mutation(CLOWNMUT)
- var/obj/item/device/flash/T = new(mob)
+ var/obj/item/device/assembly/flash/T = new(mob)
var/obj/item/toy/crayon/spraycan/R = new(mob)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(mob)
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 41e3290920b..f07cfcee824 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -212,7 +212,7 @@ var/hsboxspawn = 1
if("hsbrcd")
if(!hsboxspawn) return
- new/obj/item/weapon/rcd{matter=30;canRturf=1}(usr.loc)
+ new/obj/item/weapon/rcd/combat(usr.loc)
//
// New sandbox airlock maker
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 616c05e9a05..24e2af7988c 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -84,7 +84,7 @@ Warden
H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/device/flash/handheld(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/device/assembly/flash/handheld(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
@@ -175,7 +175,7 @@ Security Officer
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/sec(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/device/flash/handheld(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/device/assembly/flash/handheld(H), slot_l_store)
H.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs(H), slot_in_backpack)
H.equip_to_slot_or_del(new /obj/item/weapon/melee/baton/loaded(H), slot_in_backpack)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 06280cdb9ab..c7a9ae00c1c 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -783,11 +783,7 @@ About the new airlock wires panel:
src.p_open = !( src.p_open )
user << "You [p_open ? "open":"close"] the maintenance panel of the airlock."
src.update_icon()
- else if(istype(C, /obj/item/weapon/wirecutters))
- return src.attack_hand(user)
- else if(istype(C, /obj/item/device/multitool))
- return src.attack_hand(user)
- else if(istype(C, /obj/item/device/assembly/signaler))
+ else if(wires.IsInteractionTool(C))
return src.attack_hand(user)
else if(istype(C, /obj/item/weapon/pai_cable))
var/obj/item/weapon/pai_cable/cable = C
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index e48b7be8c84..407db623ab9 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -5,7 +5,7 @@
desc = "A wall-mounted flashbulb device."
icon = 'icons/obj/stationobjs.dmi'
icon_state = "mflash1"
- var/obj/item/device/flash/handheld/bulb = null
+ var/obj/item/device/assembly/flash/handheld/bulb = null
var/id = null
var/range = 2 //this is roughly the size of brig cell
var/last_flash = 0 //Don't want it getting spammed like regular flashes
@@ -24,12 +24,12 @@
/obj/machinery/flasher/New()
..() // ..() is EXTREMELY IMPORTANT, never forget to add it
- bulb = new /obj/item/device/flash/handheld(src)
+ bulb = new /obj/item/device/assembly/flash/handheld(src)
/obj/machinery/flasher/power_change()
if (powered() && anchored && bulb)
stat &= ~NOPOWER
- if(bulb.broken)
+ if(bulb.crit_fail)
icon_state = "[base_state]1-p"
else
icon_state = "[base_state]1"
@@ -49,7 +49,7 @@
bulb = null
power_change()
- else if (istype(W, /obj/item/device/flash/handheld))
+ else if (istype(W, /obj/item/device/assembly/flash/handheld))
if (!bulb)
if(!user.drop_item())
return
@@ -73,7 +73,7 @@
if (!powered() || !bulb)
return
- if (bulb.broken || (last_flash && world.time < src.last_flash + 150))
+ if (bulb.crit_fail || (last_flash && world.time < src.last_flash + 150))
return
if(!bulb.flash_recharge(30)) //Bulb can burn out if it's used too often too fast
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 49245b20148..48962ff51a7 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -146,12 +146,12 @@
st.energy = min(st.max_energy, st.energy + coeff * st.recharge_rate)
for(var/obj/O in um)
//General
- if(istype(O,/obj/item/device/flash))
- var/obj/item/device/flash/F = O
- if(F.broken)
- F.broken = 0
+ if(istype(O,/obj/item/device/assembly/flash))
+ var/obj/item/device/assembly/flash/F = O
+ if(F.crit_fail)
+ F.crit_fail = 0
F.times_used = 0
- F.icon_state = "flash"
+ F.update_icon()
// Security
if(istype(O,/obj/item/weapon/gun/energy/gun/advtaser/cyborg))
var/obj/item/weapon/gun/energy/gun/advtaser/cyborg/T = O
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index aae5224f0a6..b72707db1f2 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -76,9 +76,8 @@
update_icon()
user << "You [open_panel ? "open" : "close"] the wire panel."
- else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler ))
- if(open_panel)
- wires.Interact(user)
+ else if(wires.IsInteractionTool(I) && open_panel)
+ wires.Interact(user)
else if(istype(I, /obj/item/weapon/crowbar))
if(open_panel && isWireCut(WIRE_BOOM) && isWireCut(WIRE_UNBOLT) && isWireCut(WIRE_DELAY) && isWireCut(WIRE_PROCEED) && isWireCut(WIRE_ACTIVATE))
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 9bcbb941b7e..212fb8b403b 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -654,7 +654,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
/obj/machinery/vending/assist
products = list( /obj/item/device/assembly/prox_sensor = 5,/obj/item/device/assembly/igniter = 3,/obj/item/device/assembly/signaler = 4,
/obj/item/weapon/wirecutters = 1, /obj/item/weapon/cartridge/signal = 4)
- contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2)
+ contraband = list(/obj/item/device/flashlight = 5,/obj/item/device/assembly/timer = 2, /obj/item/device/assembly/voice = 2, /obj/item/device/assembly/health = 2)
product_ads = "Only the finest!;Have some tools.;The most robust equipment.;The finest gear in space!"
/obj/machinery/vending/coffee
@@ -773,6 +773,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
products = list(/obj/item/clothing/under/rank/scientist = 6,/obj/item/clothing/suit/bio_suit = 6,/obj/item/clothing/head/bio_hood = 6,
/obj/item/device/transfer_valve = 6,/obj/item/device/assembly/timer = 6,/obj/item/device/assembly/signaler = 6,
/obj/item/device/assembly/prox_sensor = 6,/obj/item/device/assembly/igniter = 6)
+ contraband = list(/obj/item/device/assembly/health = 3)
/obj/machinery/vending/wallmed
name = "\improper NanoMed"
@@ -797,7 +798,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "sec"
icon_deny = "sec-deny"
req_access_txt = "1"
- products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 10,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/flash/handheld = 5,
+ products = list(/obj/item/weapon/restraints/handcuffs = 8,/obj/item/weapon/restraints/handcuffs/cable/zipties = 10,/obj/item/weapon/grenade/flashbang = 4,/obj/item/device/assembly/flash/handheld = 5,
/obj/item/weapon/reagent_containers/food/snacks/donut = 12,/obj/item/weapon/storage/box/evidence = 6,/obj/item/device/flashlight/seclite = 4)
contraband = list(/obj/item/clothing/glasses/sunglasses = 2,/obj/item/weapon/storage/fancy/donut_box = 2)
premium = list(/obj/item/weapon/coin/antagtoken = 1)
@@ -937,7 +938,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
icon_state = "robotics"
icon_deny = "robotics-deny"
req_access_txt = "29"
- products = list(/obj/item/clothing/suit/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/flash/handheld = 4,
+ products = list(/obj/item/clothing/suit/toggle/labcoat = 4,/obj/item/clothing/under/rank/roboticist = 4,/obj/item/stack/cable_coil = 4,/obj/item/device/assembly/flash/handheld = 4,
/obj/item/weapon/stock_parts/cell/high = 12, /obj/item/device/assembly/prox_sensor = 3,/obj/item/device/assembly/signaler = 3,/obj/item/device/healthanalyzer = 3,
/obj/item/weapon/scalpel = 2,/obj/item/weapon/circular_saw = 2,/obj/item/weapon/tank/internals/anesthetic = 2,/obj/item/clothing/mask/breath/medical = 5,
/obj/item/weapon/screwdriver = 5,/obj/item/weapon/crowbar = 5)
diff --git a/code/game/objects/items/apc_frame.dm b/code/game/objects/items/apc_frame.dm
index b86ddc77b64..c0fad8ee6fb 100644
--- a/code/game/objects/items/apc_frame.dm
+++ b/code/game/objects/items/apc_frame.dm
@@ -66,6 +66,7 @@
icon = 'icons/obj/apc_repair.dmi'
icon_state = "apc_frame"
result_path = /obj/machinery/power/apc
+ inverse = 1
/obj/item/wallframe/apc/try_build(turf/on_wall)
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index 09f6046f96a..1e6d2a5244b 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -89,7 +89,7 @@
else
attack_hand(user)
return
- if(istype(I, /obj/item/device/multitool))
+ if(wires.IsInteractionTool(I))
attack_hand(user)
return
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 213dab28ded..7e917325b84 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -37,8 +37,8 @@
name = "cyborg head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
icon_state = "head"
- var/obj/item/device/flash/handheld/flash1 = null
- var/obj/item/device/flash/handheld/flash2 = null
+ var/obj/item/device/assembly/flash/handheld/flash1 = null
+ var/obj/item/device/assembly/flash/handheld/flash2 = null
/obj/item/robot_parts/robot_suit
name = "cyborg endoskeleton"
@@ -329,12 +329,12 @@
/obj/item/robot_parts/head/attackby(obj/item/W, mob/user, params)
..()
- if(istype(W, /obj/item/device/flash/handheld))
- var/obj/item/device/flash/handheld/F = W
+ if(istype(W, /obj/item/device/assembly/flash/handheld))
+ var/obj/item/device/assembly/flash/handheld/F = W
if(src.flash1 && src.flash2)
user << "You have already inserted the eyes!"
return
- else if(F.broken)
+ else if(F.crit_fail)
user << "You can't use a broken flash!"
return
else
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index 95bac4c181c..63baee79c37 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -508,7 +508,7 @@ RCD
matter = 160
/obj/item/weapon/rcd/combat
- name = "combat RCD"
+ name = "industrial RCD"
max_matter = 500
matter = 500
canRturf = 1
@@ -519,12 +519,11 @@ RCD
icon = 'icons/obj/ammo.dmi'
icon_state = "rcd"
item_state = "rcdammo"
- opacity = 0
- density = 0
- anchored = 0.0
- origin_tech = "materials=2"
+ origin_tech = "materials=3"
materials = list(MAT_METAL=3000, MAT_GLASS=2000)
var/ammoamt = 40
/obj/item/weapon/rcd_ammo/large
+ origin_tech = "materials=4"
+ materials = list(MAT_METAL=12000, MAT_GLASS=8000)
ammoamt = 160
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 653a40406d4..1046feaaa06 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -53,7 +53,7 @@
if(istype(I, /obj/item/weapon/screwdriver))
open_panel = !open_panel
user << "You [open_panel ? "open" : "close"] the wire panel."
- else if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler))
+ else if(wires.IsInteractionTool(I))
wires.Interact(user)
else
..()
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 25bbb762e03..eb1c9b9566b 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -94,7 +94,7 @@
/obj/item/weapon/grenade/chem_grenade/teargas,
/obj/item/weapon/reagent_containers/spray/pepper,
/obj/item/weapon/restraints/handcuffs,
- /obj/item/device/flash/handheld,
+ /obj/item/device/assembly/flash/handheld,
/obj/item/clothing/glasses,
/obj/item/ammo_casing/shotgun,
/obj/item/ammo_box,
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 8d817f95c4f..41ff286953f 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -209,12 +209,12 @@
/obj/item/weapon/storage/box/flashes/New()
..()
- new /obj/item/device/flash/handheld(src)
- new /obj/item/device/flash/handheld(src)
- new /obj/item/device/flash/handheld(src)
- new /obj/item/device/flash/handheld(src)
- new /obj/item/device/flash/handheld(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
/obj/item/weapon/storage/box/teargas
name = "box of tear gas grenades (WARNING)"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index ec973ab94b0..bc0a1f2279f 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -73,6 +73,9 @@
//Object behaviour on storage dump
/obj/item/weapon/storage/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
for(var/obj/item/I in src_object)
+ if(user.s_active != src_object)
+ if(I.on_found(user))
+ return
if(can_be_inserted(I,0,user))
src_object.remove_from_storage(I, src)
orient2hud(user)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 0ae8d3f8177..c03090a5119 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -21,7 +21,7 @@
new /obj/item/tapeproj/engineering(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/device/multitool(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/clothing/glasses/meson/engine(src)
/obj/structure/closet/secure_closet/engineering_electrical
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 4552fb78ff5..59c42451189 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -70,7 +70,7 @@
new /obj/item/weapon/defibrillator/compact/loaded(src)
new /obj/item/clothing/gloves/color/latex/nitrile(src)
new /obj/item/weapon/storage/belt/medical(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/weapon/reagent_containers/hypospray/CMO(src)
new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
index a52bcd649ec..21a126d07db 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm
@@ -9,7 +9,7 @@
new /obj/item/weapon/storage/firstaid/regular(src)
new /obj/item/weapon/storage/box/handcuffs(src)
new /obj/item/device/aicard(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
if(prob(50))
new /obj/item/ammo_box/magazine/m50(src)
new /obj/item/ammo_box/magazine/m50(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index b5bd0b7df19..262485abb9f 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -19,5 +19,5 @@
new /obj/item/weapon/tank/internals/air(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/suit/armor/reactive(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/device/laser_pointer(src)
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 354038dfedb..effd0e8cdc6 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -40,7 +40,7 @@
new /obj/item/weapon/storage/box/ids(src)
new /obj/item/device/megaphone/command(src)
new /obj/item/clothing/suit/armor/vest(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/weapon/gun/energy/gun(src)
@@ -108,7 +108,7 @@
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
new /obj/item/weapon/reagent_containers/spray/pepper(src)
- new /obj/item/device/flash/handheld(src)
+ new /obj/item/device/assembly/flash/handheld(src)
new /obj/item/weapon/grenade/flashbang(src)
new /obj/item/weapon/storage/belt/security/full(src)
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 755f5b4fa49..3db0aa0ae76 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -197,6 +197,9 @@
/turf/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
for(var/obj/item/I in src_object)
+ if(user.s_active != src_object)
+ if(I.on_found(user))
+ return
src_object.remove_from_storage(I, src) //No check needed, put everything inside
return 1
diff --git a/code/game/objects/items/devices/flash.dm b/code/modules/assembly/flash.dm
similarity index 67%
rename from code/game/objects/items/devices/flash.dm
rename to code/modules/assembly/flash.dm
index 735e48dbf6b..f56bbac901a 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -1,170 +1,197 @@
-/obj/item/device/flash
- name = "flash"
- desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
- icon_state = "flash"
- item_state = "flashtool"
- throwforce = 0
- w_class = 1
- throw_speed = 3
- throw_range = 7
- flags = CONDUCT
- origin_tech = "magnets=2;combat=1"
-
- var/times_used = 0 //Number of times it's been used.
- var/broken = 0 //Is the flash burnt out?
- var/last_used = 0 //last world.time it was used.
-
-
-/obj/item/device/flash/proc/clown_check(mob/living/carbon/human/user)
- if(user.disabilities & CLUMSY && prob(50))
- flash_carbon(user, user, 15, 0)
- return 0
- return 1
-
-
-/obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
- broken = 1
- icon_state = "[initial(icon_state)]burnt"
- visible_message("The [src.name] burns out!")
-
-
-/obj/item/device/flash/proc/flash_recharge(interval=10)
- if(prob(times_used * 3)) //The more often it's used in a short span of time the more likely it will burn out
- burn_out()
- return 0
-
- var/deciseconds_passed = world.time - last_used
- for(var/seconds = deciseconds_passed/10, seconds>=interval, seconds-=interval) //get 1 charge every interval
- times_used--
-
- last_used = world.time
- times_used = max(0, times_used) //sanity
- return 1
-
-/obj/item/device/flash/proc/try_use_flash(mob/user = null)
- flash_recharge(10)
-
- if(broken)
- return 0
-
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
- flick("[initial(icon_state)]2", src)
- times_used++
-
- if(user && !clown_check(user))
- return 0
-
- return 1
-
-
-/obj/item/device/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1)
- add_logs(user, M, "flashed", src)
- if(user && targeted)
- if(M.weakeyes)
- M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
- if(M.flash_eyes(1, 1))
- M.confused += power
- terrible_conversion_proc(M, user)
- M.Stun(1)
- visible_message("[user] blinds [M] with the flash!")
- user << "You blind [M] with the flash!"
- M << "[user] blinds you with the flash!"
- if(M.weakeyes)
- M.Stun(2)
- M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!")
- else
- visible_message("[user] fails to blind [M] with the flash!")
- user << "You fail to blind [M] with the flash!"
- M << "[user] fails to blind you with the flash!"
- else
- if(M.flash_eyes())
- M.confused += power
-
-/obj/item/device/flash/attack(mob/living/M, mob/user)
- if(!try_use_flash(user))
- return 0
-
- if(iscarbon(M))
- flash_carbon(M, user, 5, 1)
- return 1
-
- else if(issilicon(M))
- add_logs(user, M, "flashed", src)
- flick("e_flash", M.flash)
- M.Weaken(rand(5,10))
- user.visible_message("[user] overloads [M]'s sensors with the flash!", "You overload [M]'s sensors with the flash!")
- return 1
-
- user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!")
-
-
-/obj/item/device/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
- if(!try_use_flash(user))
- return 0
- user.visible_message("[user]'s flash emits a blinding light!", "Your flash emits a blinding light!")
- for(var/mob/living/carbon/M in oviewers(3, null))
- flash_carbon(M, user, 1, 0)
-
-
-/obj/item/device/flash/emp_act(severity)
- if(!try_use_flash())
- return 0
- for(var/mob/living/carbon/M in viewers(3, null))
- flash_carbon(M, null, 10, 0)
- burn_out()
- ..()
-
-
-/obj/item/device/flash/proc/terrible_conversion_proc(mob/M, mob/user)
- if(ishuman(M) && ishuman(user) && M.stat != DEAD)
- if(user.mind && (user.mind in ticker.mode.head_revolutionaries))
- if(M.client)
- if(M.stat == CONSCIOUS)
- M.mind_initialize() //give them a mind datum if they don't have one.
- var/resisted
- if(!isloyal(M))
- if(user.mind in ticker.mode.head_revolutionaries)
- if(ticker.mode.add_revolutionary(M.mind))
- times_used -- //Flashes less likely to burn out for headrevs when used for conversion
- else
- resisted = 1
- else
- resisted = 1
-
- if(resisted)
- user << "This mind seems resistant to the flash!"
- else
- user << "They must be conscious before you can convert them!"
- else
- user << "This mind is so vacant that it is not susceptible to influence!"
-
-
-/obj/item/device/flash/cyborg
- origin_tech = null
-
-/obj/item/device/flash/cyborg/attack(mob/living/M, mob/user)
- ..()
- cyborg_flash_animation(user)
-
-/obj/item/device/flash/cyborg/attack_self(mob/user)
- ..()
- cyborg_flash_animation(user)
-
-/obj/item/device/flash/cyborg/proc/cyborg_flash_animation(mob/living/user)
- var/atom/movable/overlay/animation = new(user.loc)
- animation.layer = user.layer + 1
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = user
- flick("blspell", animation)
- sleep(5)
- qdel(animation)
-
-
-/obj/item/device/flash/memorizer
- name = "memorizer"
- desc = "If you see this, you're not likely to remember it any time soon."
- icon_state = "memorizer"
- item_state = "nullrod"
-
-/obj/item/device/flash/handheld //this is now the regular pocket flashes
+/obj/item/device/assembly/flash
+ name = "flash"
+ desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production."
+ icon_state = "flash"
+ item_state = "flashtool"
+ throwforce = 0
+ w_class = 1
+ origin_tech = "magnets=2;combat=1"
+
+ crit_fail = 0 //Is the flash burnt out?
+ var/times_used = 0 //Number of times it's been used.
+ var/last_used = 0 //last world.time it was used.
+
+
+/obj/item/device/assembly/flash/update_icon(var/flash = 0)
+ overlays.Cut()
+ attached_overlays = list()
+ if(crit_fail)
+ overlays += "flashburnt"
+ attached_overlays += "flashburnt"
+
+ if(flash)
+ overlays += "flash-f"
+ attached_overlays += "flash-f"
+ spawn(5)
+ update_icon()
+ if(holder)
+ holder.update_icon()
+
+/obj/item/device/assembly/flash/proc/clown_check(mob/living/carbon/human/user)
+ if(user.disabilities & CLUMSY && prob(50))
+ flash_carbon(user, user, 15, 0)
+ return 0
+ return 1
+
+/obj/item/device/assembly/flash/activate()
+ if(!try_use_flash())
+ return 0
+ var/turf/T = get_turf(src)
+ T.visible_message("[src] emits a blinding light!")
+ for(var/mob/living/carbon/M in viewers(3, null))
+ flash_carbon(M, null, 2, 0)
+
+
+/obj/item/device/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
+ crit_fail = 1
+ update_icon()
+ var/turf/T = get_turf(src)
+ T.visible_message("The [src.name] burns out!")
+
+
+/obj/item/device/assembly/flash/proc/flash_recharge(interval=10)
+ if(prob(times_used * 3)) //The more often it's used in a short span of time the more likely it will burn out
+ burn_out()
+ return 0
+
+ var/deciseconds_passed = world.time - last_used
+ for(var/seconds = deciseconds_passed/10, seconds>=interval, seconds-=interval) //get 1 charge every interval
+ times_used--
+
+ last_used = world.time
+ times_used = max(0, times_used) //sanity
+ return 1
+
+/obj/item/device/assembly/flash/proc/try_use_flash(mob/user = null)
+ flash_recharge(10)
+
+ if(crit_fail)
+ return 0
+
+ playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ update_icon(1)
+ times_used++
+
+ if(user && !clown_check(user))
+ return 0
+
+ return 1
+
+
+/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 5, targeted = 1)
+ add_logs(user, M, "flashed", src)
+ if(user && targeted)
+ if(M.weakeyes)
+ M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash
+ if(M.flash_eyes(1, 1))
+ M.confused += power
+ terrible_conversion_proc(M, user)
+ M.Stun(1)
+ visible_message("[user] blinds [M] with the flash!")
+ user << "You blind [M] with the flash!"
+ M << "[user] blinds you with the flash!"
+ if(M.weakeyes)
+ M.Stun(2)
+ M.visible_message("[M] gasps and shields their eyes!", "You gasp and shields your eyes!")
+ else
+ visible_message("[user] fails to blind [M] with the flash!")
+ user << "You fail to blind [M] with the flash!"
+ M << "[user] fails to blind you with the flash!"
+ else
+ if(M.flash_eyes())
+ M.confused += power
+
+/obj/item/device/assembly/flash/attack(mob/living/M, mob/user)
+ if(!try_use_flash(user))
+ return 0
+
+ if(iscarbon(M))
+ flash_carbon(M, user, 5, 1)
+ return 1
+
+ else if(issilicon(M))
+ add_logs(user, M, "flashed", src)
+ update_icon(1)
+ M.Weaken(rand(5,10))
+ user.visible_message("[user] overloads [M]'s sensors with the flash!", "You overload [M]'s sensors with the flash!")
+ return 1
+
+ user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!")
+
+
+/obj/item/device/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
+ if(holder)
+ return 0
+ if(!try_use_flash(user))
+ return 0
+ user.visible_message("[user]'s flash emits a blinding light!", "Your flash emits a blinding light!")
+ for(var/mob/living/carbon/M in oviewers(3, null))
+ flash_carbon(M, user, 1, 0)
+
+
+/obj/item/device/assembly/flash/emp_act(severity)
+ if(!try_use_flash())
+ return 0
+ for(var/mob/living/carbon/M in viewers(3, null))
+ flash_carbon(M, null, 10, 0)
+ burn_out()
+ ..()
+
+
+/obj/item/device/assembly/flash/proc/terrible_conversion_proc(mob/M, mob/user)
+ if(ishuman(M) && ishuman(user) && M.stat != DEAD)
+ if(user.mind && (user.mind in ticker.mode.head_revolutionaries))
+ if(M.client)
+ if(M.stat == CONSCIOUS)
+ M.mind_initialize() //give them a mind datum if they don't have one.
+ var/resisted
+ if(!isloyal(M))
+ if(user.mind in ticker.mode.head_revolutionaries)
+ if(ticker.mode.add_revolutionary(M.mind))
+ times_used -- //Flashes less likely to burn out for headrevs when used for conversion
+ else
+ resisted = 1
+ else
+ resisted = 1
+
+ if(resisted)
+ user << "This mind seems resistant to the flash!"
+ else
+ user << "They must be conscious before you can convert them!"
+ else
+ user << "This mind is so vacant that it is not susceptible to influence!"
+
+
+/obj/item/device/assembly/flash/cyborg
+ origin_tech = null
+
+/obj/item/device/assembly/flash/cyborg/attack(mob/living/M, mob/user)
+ ..()
+ cyborg_flash_animation(user)
+
+/obj/item/device/assembly/flash/cyborg/attack_self(mob/user)
+ ..()
+ cyborg_flash_animation(user)
+
+/obj/item/device/assembly/flash/cyborg/attackby(obj/item/weapon/W, mob/user, params)
+ return
+
+/obj/item/device/assembly/flash/cyborg/proc/cyborg_flash_animation(mob/living/user)
+ var/atom/movable/overlay/animation = new(user.loc)
+ animation.layer = user.layer + 1
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = user
+ flick("blspell", animation)
+ sleep(5)
+ qdel(animation)
+
+
+/obj/item/device/assembly/flash/memorizer
+ name = "memorizer"
+ desc = "If you see this, you're not likely to remember it any time soon."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "memorizer"
+ item_state = "nullrod"
+
+/obj/item/device/assembly/flash/handheld //this is now the regular pocket flashes
diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm
new file mode 100644
index 00000000000..febe545a30e
--- /dev/null
+++ b/code/modules/assembly/health.dm
@@ -0,0 +1,105 @@
+/obj/item/device/assembly/health
+ name = "health sensor"
+ desc = "Used for scanning and monitoring health."
+ icon_state = "health"
+ materials = list(MAT_METAL=800, MAT_GLASS=200)
+ origin_tech = "magnets=1;biotech=1"
+ attachable = 1
+ secured = 0
+
+ var/scanning = 0
+ var/health_scan
+ var/alarm_health = 0
+
+
+
+/obj/item/device/assembly/health/activate()
+ if(!..()) return 0//Cooldown check
+ toggle_scan()
+ return 0
+
+/obj/item/device/assembly/health/toggle_secure()
+ secured = !secured
+ if(secured && scanning)
+ SSobj.processing |= src
+ else
+ scanning = 0
+ SSobj.processing.Remove(src)
+ update_icon()
+ return secured
+
+/obj/item/device/assembly/health/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/device/multitool))
+ if(alarm_health == 0)
+ alarm_health = -90
+ user.show_message("You toggle [src] to \"detect death\" mode.")
+ else
+ alarm_health = 0
+ user.show_message("You toggle [src] to \"detect critical state\" mode.")
+ return
+ else
+ return ..()
+
+/obj/item/device/assembly/health/process()
+ if(!scanning || !secured)
+ return
+
+ var/atom/A = src
+ if(connected && connected.holder)
+ A = connected.holder
+
+ for(A, A && !ismob(A), A=A.loc);
+ // like get_turf(), but for mobs.
+ var/mob/living/M = A
+
+ if(M)
+ health_scan = M.health
+ if(health_scan <= alarm_health)
+ pulse()
+ audible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
+ toggle_scan()
+ return
+ return
+
+/obj/item/device/assembly/health/proc/toggle_scan()
+ if(!secured) return 0
+ scanning = !scanning
+ if(scanning)
+ SSobj.processing |= src
+ else
+ SSobj.processing.Remove(src)
+ return
+
+/obj/item/device/assembly/health/interact(mob/user as mob)//TODO: Change this to the wires thingy
+ if(!secured)
+ user.show_message("The [name] is unsecured!")
+ return 0
+ var/dat = text("Health Sensor [scanning?"On":"Off"]")
+ if(scanning && health_scan)
+ dat += "
Health: [health_scan]"
+ user << browse(dat, "window=hscan")
+ onclose(user, "hscan")
+ return
+
+
+/obj/item/device/assembly/health/Topic(href, href_list)
+ ..()
+ if(!ismob(usr))
+ return
+
+ var/mob/user = usr
+
+ if(!user.canUseTopic(user))
+ usr << browse(null, "window=hscan")
+ onclose(usr, "hscan")
+ return
+
+ if(href_list["scanning"])
+ toggle_scan()
+
+ if(href_list["close"])
+ usr << browse(null, "window=hscan")
+ return
+
+ attack_self(user)
+ return
\ No newline at end of file
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index fe02a86da7f..dd40a3a2d80 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -21,7 +21,7 @@
attach(A2,user)
name = "[A.name]-[A2.name] assembly"
update_icon()
- feedback_add_details("assembly_made","[type]")
+ feedback_add_details("assembly_made","[A.name]-[A2.name]")
/obj/item/device/assembly_holder/proc/attach(obj/item/device/assembly/A, mob/user)
if(!A.remove_item_from_storage(src))
@@ -41,10 +41,17 @@
overlays += "[a_left.icon_state]_left"
for(var/O in a_left.attached_overlays)
overlays += "[O]_l"
+
if(a_right)
- src.overlays += "[a_right.icon_state]_right"
+ var/list/images = list()
+ images += image(icon, icon_state = "[a_right.icon_state]_left")
for(var/O in a_right.attached_overlays)
- overlays += "[O]_r"
+ images += image(icon, icon_state = "[O]_l")
+ var/matrix = matrix(-1, 0, 0, 0, 1, 0)
+ for(var/image/I in images)
+ I.transform = matrix
+ overlays += I
+
if(master)
master.update_icon()
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 3879bc72230..632eb8e423e 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -4,6 +4,7 @@
icon_state = "mousetrap"
materials = list(MAT_METAL=100)
origin_tech = "combat=1"
+ attachable = 1
var/armed = 0
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 5bdf5f9eaff..6df3e9e1b3e 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -81,7 +81,7 @@
can_toggle = 1
toggle_cooldown = 20
active_sound = 'sound/items/WEEOO1.ogg'
-
+
/obj/item/clothing/head/helmet/justice/escape
name = "alarm helmet"
desc = "WEEEEOOO. WEEEEEOOO. STOP THAT MONKEY. WEEEOOOO."
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 1ae33b0de80..b58216f30c9 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -20,7 +20,7 @@
item_state = "bio_suit"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/flash/handheld, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/internals/emergency_oxygen)
+ allowed = list(/obj/item/weapon/disk, /obj/item/weapon/stamp, /obj/item/weapon/reagent_containers/food/drinks/flask, /obj/item/weapon/melee, /obj/item/weapon/storage/lockbox/medal, /obj/item/device/assembly/flash/handheld, /obj/item/weapon/storage/box/matches, /obj/item/weapon/lighter, /obj/item/clothing/mask/cigarette, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/tank/internals/emergency_oxygen)
//Chaplain
/obj/item/clothing/suit/hooded/chaplain_hoodie
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 1b0e74030e8..cdaa2ef9f05 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -136,7 +136,7 @@
return
if(wires && !primed)
- if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler))
+ if(wires.IsInteractionTool(I))
wires.Interact(user)
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index bf6ee02563f..6024ff02d0f 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -579,4 +579,7 @@ var/const/GALOSHES_DONT_HELP = 4
var/obj/item/organ/internal/alien/plasmavessel/vessel = getorgan(/obj/item/organ/internal/alien/plasmavessel)
if(vessel)
stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]")
+ if(locate(/obj/item/device/assembly/health) in src)
+ stat(null, "Health: [health]")
+
add_abilities_to_panel()
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 9a160fb67fe..bec3e1f8637 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -473,7 +473,7 @@
user << "You insert the power cell."
update_icons()
- else if (istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool) || istype(W, /obj/item/device/assembly/signaler))
+ else if (wires.IsInteractionTool(W))
if (wiresexposed)
wires.Interact(user)
else
@@ -1084,7 +1084,7 @@
new /obj/item/robot_parts/head(T)
var/b
for(b=0, b!=2, b++)
- var/obj/item/device/flash/handheld/F = new /obj/item/device/flash/handheld(T)
+ var/obj/item/device/assembly/flash/handheld/F = new /obj/item/device/assembly/flash/handheld(T)
F.burn_out()
if (cell) //Sanity check.
cell.loc = T
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 3efbcc3baed..9bc33156523 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -40,7 +40,7 @@
/obj/item/weapon/robot_module/New()
- modules += new /obj/item/device/flash/cyborg(src)
+ modules += new /obj/item/device/assembly/flash/cyborg(src)
emag = new /obj/item/toy/sword(src)
emag.name = "Placeholder Emag Item"
return
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 052de1b2505..03f95d9fefb 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -570,9 +570,7 @@
else
if (istype(user, /mob/living/silicon))
return src.attack_hand(user)
- if (!opened && wiresexposed && \
- (istype(W, /obj/item/device/multitool) || \
- istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
+ if (!opened && wiresexposed && wires.IsInteractionTool(W))
return src.attack_hand(user)
..()
diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm
index 0e0153bb26a..b76334d1680 100644
--- a/code/modules/recycling/disposal-unit.dm
+++ b/code/modules/recycling/disposal-unit.dm
@@ -275,6 +275,9 @@
//How disposal handles getting a storage dump from a storage object
/obj/machinery/disposal/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
for(var/obj/item/I in src_object)
+ if(user.s_active != src_object)
+ if(I.on_found(user))
+ return
src_object.remove_from_storage(I, src)
return 1
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index a80441f1e2d..7cf5fff85f4 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -354,6 +354,14 @@
build_path = /obj/item/device/assembly/infra
category = list("initial", "Misc")
+/datum/design/health_sensor
+ name = "Health sensor"
+ id = "health_sensor"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 800, MAT_GLASS = 200)
+ build_path = /obj/item/device/assembly/health
+ category = list("initial", "Medical")
+
/datum/design/timer
name = "Timer"
id = "timer"
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 329066dfa42..cf283810d38 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -71,7 +71,7 @@
materials = list(MAT_METAL = 750, MAT_GLASS = 750)
construction_time = 100
reliability = 76
- build_path = /obj/item/device/flash/handheld
+ build_path = /obj/item/device/assembly/flash/handheld
category = list("Misc")
/datum/design/bluespacebeaker
diff --git a/icons/obj/assemblies/new_assemblies.dmi b/icons/obj/assemblies/new_assemblies.dmi
index 6255dc886d3..3cc1d93114e 100644
Binary files a/icons/obj/assemblies/new_assemblies.dmi and b/icons/obj/assemblies/new_assemblies.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 7b1f45f6d21..56a87a791b9 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 1f2da9a0a93..fec0366d291 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -593,7 +593,6 @@
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
-#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\instruments.dm"
#include "code\game\objects\items\devices\laserpointer.dm"
@@ -864,6 +863,8 @@
#include "code\modules\assembly\assembly.dm"
#include "code\modules\assembly\bomb.dm"
#include "code\modules\assembly\doorcontrol.dm"
+#include "code\modules\assembly\flash.dm"
+#include "code\modules\assembly\health.dm"
#include "code\modules\assembly\helpers.dm"
#include "code\modules\assembly\holder.dm"
#include "code\modules\assembly\igniter.dm"