diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index b1ebef8272b..38540b750f2 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -1579,6 +1579,22 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/security/checkpoint/supply)
+"ahP" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"ahS" = (
/obj/machinery/status_display/evac/directional/east,
/obj/machinery/light/directional/east,
@@ -3147,6 +3163,12 @@
},
/turf/open/floor/iron,
/area/ai_monitored/command/storage/eva)
+"asu" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating/airless,
+/area/science/misc_lab/range)
"asD" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/sign/barsign{
@@ -3784,31 +3806,6 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central/aft)
-"ayL" = (
-/obj/machinery/door/firedoor,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/research{
- name = "Toxins Launch Site";
- req_access_txt = "8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"ayR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet/crate,
@@ -5905,6 +5902,18 @@
/obj/machinery/newscaster/directional/south,
/turf/open/floor/iron/dark/corner,
/area/maintenance/disposal/incinerator)
+"aPJ" = (
+/obj/machinery/doppler_array/research/science{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/structure/extinguisher_cabinet/directional/south{
+ pixel_x = -26
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"aPS" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -6290,6 +6299,10 @@
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/turf/open/floor/iron/dark,
/area/security/execution/education)
+"aST" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"aSY" = (
/obj/effect/landmark/event_spawn,
/obj/effect/turf_decal/tile/red{
@@ -6668,6 +6681,13 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/aisat_interior)
+"aXp" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"aXx" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
@@ -7666,6 +7686,11 @@
},
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"bfJ" = (
+/obj/structure/training_machine,
+/obj/item/target/syndicate,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"bfR" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -7822,6 +7847,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/grimy,
/area/ai_monitored/turret_protected/aisat_interior)
+"bhD" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"bhH" = (
/obj/machinery/light/small/directional/north,
/obj/effect/turf_decal/tile/blue{
@@ -8272,6 +8304,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/ai_monitored/security/armory)
+"bly" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"blB" = (
/obj/structure/disposalpipe/segment{
dir = 9
@@ -11732,6 +11770,17 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/grimy,
/area/service/chapel/main)
+"bLH" = (
+/obj/machinery/light/directional/north,
+/obj/machinery/component_printer,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"bLU" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -19449,6 +19498,19 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/commons/dorms)
+"cBP" = (
+/obj/effect/landmark/xeno_spawn,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/science/misc_lab/range)
"cBR" = (
/obj/effect/turf_decal/tile/green{
dir = 4
@@ -19865,6 +19927,16 @@
},
/turf/open/floor/iron,
/area/maintenance/disposal/incinerator)
+"cGu" = (
+/obj/machinery/airalarm/directional/north,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"cGJ" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Chapel Maintenance";
@@ -26041,38 +26113,17 @@
},
/turf/open/floor/iron,
/area/science/xenobiology)
-"djn" = (
-/obj/structure/table/reinforced,
-/obj/item/screwdriver,
-/obj/effect/spawner/lootdrop/maintenance/two,
-/turf/open/floor/iron,
-/area/maintenance/port)
"djo" = (
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/science/research/abandoned)
-"djp" = (
-/obj/structure/table/reinforced,
-/obj/machinery/cell_charger,
-/turf/open/floor/iron,
-/area/maintenance/port)
-"djr" = (
-/turf/open/floor/iron,
-/area/maintenance/port)
"djs" = (
/obj/item/kirbyplants/random,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/science/research/abandoned)
-"djv" = (
-/obj/structure/sign/poster/official/random{
- pixel_y = 32
- },
-/obj/structure/rack,
-/turf/open/floor/iron,
-/area/maintenance/port)
"djw" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/storage/box/mousetraps,
@@ -26585,10 +26636,6 @@
},
/turf/open/floor/iron/dark,
/area/service/abandoned_gambling_den)
-"dle" = (
-/obj/structure/table/reinforced,
-/turf/open/floor/iron,
-/area/maintenance/port)
"dlf" = (
/obj/effect/turf_decal/stripes/line{
dir = 9
@@ -27436,42 +27483,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/maintenance/starboard/aft)
-"dog" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
-"doh" = (
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"doi" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
/area/science/research/abandoned)
-"doj" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/landmark/event_spawn,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
-"dok" = (
-/obj/structure/girder,
-/turf/open/floor/plating,
-/area/maintenance/port)
-"dol" = (
-/obj/machinery/light/directional/north,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"dom" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -27482,17 +27497,6 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
/area/science/research/abandoned)
-"doo" = (
-/obj/structure/closet/crate,
-/obj/item/target/alien,
-/obj/item/target/alien,
-/obj/item/target/clown,
-/obj/item/target/clown,
-/obj/item/target/syndicate,
-/obj/item/gun/energy/laser/practice,
-/obj/item/gun/energy/laser/practice,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"doq" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -27783,11 +27787,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"dpX" = (
-/obj/structure/training_machine,
-/obj/item/target/syndicate,
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"dpY" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
@@ -28037,19 +28036,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/hallway/secondary/construction)
-"drz" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
-"drA" = (
-/obj/structure/sign/poster/official/random{
- pixel_y = -32
- },
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"drB" = (
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
@@ -28068,33 +28054,6 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/aisat/exterior)
-"drC" = (
-/obj/structure/table/reinforced,
-/obj/machinery/recharger,
-/obj/structure/cable,
-/obj/machinery/power/apc/auto_name/south,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
-"drD" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
-"drE" = (
-/obj/structure/sign/poster/official/build{
- pixel_y = -32
- },
-/obj/structure/table/reinforced,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
-"drF" = (
-/obj/machinery/vending/assist,
-/obj/machinery/firealarm/directional/east,
-/obj/machinery/light_switch/directional/south,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"drG" = (
/obj/machinery/light/directional/south,
/obj/structure/reagent_dispensers/water_cooler,
@@ -29790,26 +29749,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/service/electronic_marketing_den)
-"dze" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dzf" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
@@ -30977,10 +30916,6 @@
"dEk" = (
/turf/closed/wall,
/area/security/detectives_office/private_investigators_office)
-"dEn" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/misc_lab)
"dEo" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -31362,61 +31297,6 @@
},
/turf/open/floor/iron/dark,
/area/security/detectives_office/private_investigators_office)
-"dFz" = (
-/obj/structure/chair/office{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dFA" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dFB" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/status_display/evac/directional/north,
-/obj/item/crowbar,
-/obj/item/wrench,
-/obj/item/clothing/mask/gas,
-/obj/machinery/camera{
- c_tag = "Science - Toxins Launch Site";
- name = "science camera";
- network = list("ss13","rd")
- },
-/obj/machinery/light/directional/north,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dFC" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dFD" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dFE" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/components/unary/portables_connector/visible,
-/obj/machinery/airalarm/directional/east,
-/obj/machinery/newscaster/directional/north,
-/obj/machinery/light_switch/directional/east{
- pixel_y = 26
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dFI" = (
/obj/item/assembly/signaler{
pixel_y = 8
@@ -31665,63 +31545,6 @@
/obj/effect/spawner/structure/window/reinforced/tinted,
/turf/open/floor/plating,
/area/science/test_area)
-"dGY" = (
-/obj/structure/table/reinforced,
-/obj/machinery/computer/security/telescreen/toxins{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dGZ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dHa" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/science/misc_lab)
-"dHc" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/components/trinary/filter{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dHe" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/north,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dHg" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dHh" = (
/obj/structure/table/reinforced,
/obj/item/book/manual/wiki/toxins,
@@ -31945,23 +31768,6 @@
},
/turf/open/floor/plating/airless,
/area/science/test_area)
-"dIj" = (
-/obj/structure/chair/office{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/item/radio/intercom/directional/west,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dIk" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dIx" = (
/obj/structure/rack,
/obj/effect/decal/cleanable/dirt,
@@ -32339,62 +32145,6 @@
},
/turf/open/floor/plating/airless,
/area/science/test_area)
-"dJJ" = (
-/obj/machinery/doppler_array/research/science{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/obj/structure/extinguisher_cabinet/directional/south{
- pixel_x = -26
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJK" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJM" = (
-/obj/structure/table,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/clothing/gloves/color/latex,
-/obj/item/clothing/glasses/science,
-/obj/item/clothing/glasses/science,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJN" = (
-/obj/machinery/research/explosive_compressor,
-/obj/effect/turf_decal/bot,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJO" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/obj/machinery/firealarm/directional/east,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJQ" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/south,
-/obj/effect/turf_decal/stripes/line{
- dir = 10
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dJS" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dJT" = (
/obj/structure/tank_dispenser,
/obj/effect/turf_decal/bot,
@@ -32562,26 +32312,6 @@
},
/turf/open/floor/plating/airless,
/area/science/test_area)
-"dKA" = (
-/obj/structure/sign/warning/vacuum,
-/turf/closed/wall,
-/area/science/misc_lab)
-"dKB" = (
-/obj/structure/sign/warning/securearea,
-/turf/closed/wall,
-/area/science/misc_lab)
-"dKC" = (
-/obj/machinery/door/window/southleft{
- name = "Mass Driver Door";
- req_access_txt = "8"
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/loading_area,
-/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver{
- pixel_x = 28
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dKE" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/door/airlock/maintenance_hatch{
@@ -32933,55 +32663,6 @@
},
/turf/open/floor/plating/airless,
/area/science/test_area)
-"dLI" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating/airless,
-/area/science/misc_lab)
-"dLJ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/turf/open/floor/plating/airless,
-/area/science/misc_lab)
-"dLK" = (
-/obj/machinery/door/poddoor/massdriver_toxins,
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/science/misc_lab)
-"dLL" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/end{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dLM" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dLN" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/end{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"dLO" = (
-/obj/machinery/mass_driver/toxins{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/stripes/end{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"dLP" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/reagent_dispensers/fueltank,
@@ -34131,6 +33812,23 @@
},
/turf/open/floor/iron,
/area/medical/virology)
+"dQV" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"dQW" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -37581,6 +37279,12 @@
},
/turf/open/floor/iron,
/area/commons/fitness/recreation)
+"ehi" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"ehq" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
@@ -37990,6 +37694,22 @@
},
/turf/open/floor/iron,
/area/medical/medbay/central)
+"emq" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/status_display/evac/directional/north,
+/obj/item/crowbar,
+/obj/item/wrench,
+/obj/item/clothing/mask/gas,
+/obj/machinery/camera{
+ c_tag = "Science - Toxins Launch Site";
+ name = "science camera";
+ network = list("ss13","rd")
+ },
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"emw" = (
/obj/structure/filingcabinet/security,
/turf/open/floor/carpet,
@@ -39288,20 +39008,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/medical/medbay/central)
-"eGN" = (
-/obj/machinery/power/apc/auto_name/east,
-/obj/structure/cable,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"eGP" = (
/obj/machinery/door/airlock/maintenance_hatch{
name = "Law Office Maintenance";
@@ -39530,14 +39236,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/engine,
/area/engineering/supermatter/room)
-"eJF" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"eJG" = (
/obj/machinery/light/small/directional/south,
/obj/structure/closet/crate/goldcrate,
@@ -39769,6 +39467,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/maintenance/port/aft)
+"eMn" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating/airless,
+/area/science/misc_lab/range)
"eMt" = (
/obj/effect/turf_decal/stripes/line,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -40775,20 +40480,6 @@
},
/turf/open/floor/iron/dark,
/area/security/courtroom)
-"eYc" = (
-/obj/effect/landmark/xeno_spawn,
-/obj/machinery/door/window/brigdoor{
- dir = 4;
- name = "Test Range"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"eYi" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/green{
@@ -41029,6 +40720,13 @@
},
/turf/open/floor/iron,
/area/engineering/atmos/upper)
+"faO" = (
+/obj/effect/landmark/event_spawn,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"faY" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -41142,6 +40840,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/hallway/primary/central/aft)
+<<<<<<< HEAD
"fbV" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 5
@@ -41157,6 +40856,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos/upper)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"fbY" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment,
@@ -42178,6 +41879,7 @@
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
/turf/open/floor/iron/dark,
/area/engineering/atmos)
+<<<<<<< HEAD
"fqt" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -42193,6 +41895,8 @@
},
/turf/open/floor/iron,
/area/maintenance/disposal/incinerator)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"fqv" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -42226,6 +41930,13 @@
},
/turf/open/floor/iron,
/area/maintenance/starboard/fore)
+"fqO" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/engineering/atmos)
"fqV" = (
/obj/structure/closet/radiation,
/obj/machinery/light/small/directional/west,
@@ -43698,35 +43409,6 @@
/obj/structure/dresser,
/turf/open/floor/iron/grimy,
/area/commons/dorms)
-"fQf" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"fQl" = (
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"fQy" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
@@ -44014,6 +43696,16 @@
},
/turf/open/floor/iron/grimy,
/area/command/heads_quarters/hos)
+"fUX" = (
+/obj/structure/table/reinforced,
+/obj/machinery/computer/security/telescreen/toxins{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"fUZ" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/yellow,
@@ -45294,6 +44986,22 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/hallway/secondary/service)
+"gpg" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/door/window/brigdoor{
+ dir = 4;
+ name = "Test Range"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"gpp" = (
/obj/structure/closet/toolcloset,
/obj/effect/decal/cleanable/dirt,
@@ -45536,6 +45244,12 @@
},
/turf/open/floor/engine/co2,
/area/engineering/atmos)
+"gsi" = (
+/obj/structure/cable,
+/obj/machinery/power/apc/auto_name/south,
+/obj/structure/filingcabinet/chestdrawer,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"gsn" = (
/obj/machinery/door/airlock/command{
name = "Chief Medical Officer's Office";
@@ -46252,6 +45966,15 @@
/obj/item/flashlight/lantern,
/turf/open/floor/iron/grimy,
/area/service/chapel/main)
+"gDm" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"gDw" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/red{
@@ -48095,6 +47818,30 @@
},
/turf/open/floor/iron/white,
/area/hallway/primary/central/aft)
+"hgS" = (
+/obj/machinery/door/airlock/research{
+ name = "Circuits Testing Lab";
+ req_access_txt = "47"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/door/firedoor,
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"hgT" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -49375,6 +49122,13 @@
/obj/item/food/grown/poppy/lily,
/turf/open/floor/iron/grimy,
/area/service/chapel/office)
+"hAH" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"hAI" = (
/obj/structure/window,
/obj/structure/sink{
@@ -50009,6 +49763,17 @@
/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
/turf/open/floor/iron,
/area/engineering/atmos)
+"hIQ" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/item/radio/intercom/directional/west,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"hJb" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -50282,12 +50047,6 @@
},
/turf/open/floor/carpet,
/area/commons/vacant_room/office)
-"hNZ" = (
-/obj/structure/chair/office/light{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/maintenance/port)
"hOg" = (
/obj/machinery/door/firedoor,
/obj/structure/disposalpipe/segment{
@@ -50328,6 +50087,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"hOV" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"hOZ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -51817,6 +51582,19 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central/fore)
+"ifR" = (
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"ifX" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -53186,6 +52964,16 @@
},
/turf/open/floor/iron,
/area/security/prison)
+"izv" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"izG" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue{
@@ -54204,6 +53992,18 @@
/obj/machinery/power/apc/auto_name/east,
/turf/open/floor/iron,
/area/cargo/miningoffice)
+"iNP" = (
+/obj/structure/sign/poster/official/build{
+ pixel_y = -32
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"iNS" = (
/obj/structure/chair/office{
dir = 4
@@ -54337,6 +54137,16 @@
},
/turf/open/floor/iron,
/area/science/research/abandoned)
+"iPA" = (
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"iPI" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -54888,10 +54698,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/cargo/storage)
-"iYN" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/maintenance/port)
"iYT" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 9
@@ -55650,16 +55456,6 @@
},
/turf/open/floor/iron/grimy,
/area/service/chapel/main)
-"jjN" = (
-/obj/structure/table/reinforced,
-/obj/machinery/camera{
- c_tag = "Science - Experimentation Lab";
- name = "science camera";
- network = list("ss13","rd")
- },
-/obj/effect/spawner/lootdrop/maintenance,
-/turf/open/floor/iron,
-/area/maintenance/port)
"jkf" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
@@ -56430,6 +56226,7 @@
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/plating/airless,
/area/space/nearstation)
+<<<<<<< HEAD
"jwE" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/status_display/evac{
@@ -56447,6 +56244,8 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"jwH" = (
/mob/living/simple_animal/mouse/brown/tom,
/turf/open/floor/iron,
@@ -56747,6 +56546,17 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/cargo/miningoffice)
+"jAR" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"jAZ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -56983,33 +56793,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/medical/medbay/central)
-"jEi" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
-"jEz" = (
-/obj/machinery/camera{
- c_tag = "Science - Firing Range";
- name = "science camera";
- network = list("ss13","rd")
- },
-/obj/structure/table/reinforced,
-/obj/item/clothing/ears/earmuffs,
-/obj/item/clothing/ears/earmuffs,
-/obj/item/gun/energy/laser/practice,
-/obj/item/gun/energy/laser/practice{
- pixel_x = 3;
- pixel_y = -3
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"jEG" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/xeno_spawn,
@@ -57295,6 +57078,19 @@
/obj/item/pen,
/turf/open/floor/iron/grimy,
/area/command/bridge)
+"jHZ" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 4
+ },
+/obj/effect/landmark/xeno_spawn,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"jId" = (
/obj/structure/table/wood,
/obj/item/lipstick/random{
@@ -59498,6 +59294,19 @@
},
/turf/open/floor/engine/n2,
/area/engineering/atmos)
+"kon" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
+"kot" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall,
+/area/science/misc_lab/range)
"koD" = (
/obj/machinery/door/firedoor,
/obj/effect/decal/cleanable/dirt,
@@ -61157,16 +60966,6 @@
/obj/structure/window/reinforced,
/turf/open/floor/iron/dark,
/area/commons/fitness/recreation)
-"kJJ" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"kJW" = (
/obj/structure/cable,
/obj/machinery/power/apc/auto_name/west,
@@ -61848,14 +61647,6 @@
},
/turf/open/floor/iron/dark,
/area/service/chapel/office)
-"kTQ" = (
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Maintenance Hatch";
- req_one_access_txt = "12;47"
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/maintenance/port)
"kUc" = (
/obj/machinery/computer/atmos_alert,
/obj/effect/turf_decal/tile/yellow{
@@ -62003,6 +61794,9 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/security/warden)
+"kVu" = (
+/turf/closed/wall,
+/area/science/misc_lab/range)
"kVD" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -62339,6 +62133,22 @@
},
/turf/open/floor/iron,
/area/science/research)
+"kZB" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"kZE" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -62736,17 +62546,6 @@
},
/turf/open/floor/iron,
/area/commons/storage/primary)
-"leq" = (
-/obj/effect/landmark/start/scientist,
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"let" = (
/turf/closed/wall/r_wall,
/area/engineering/gravity_generator)
@@ -62870,6 +62669,13 @@
},
/turf/open/floor/iron,
/area/cargo/storage)
+"lft" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/end{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"lfw" = (
/obj/effect/turf_decal/stripes/corner,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -62907,6 +62713,19 @@
},
/turf/open/floor/iron,
/area/commons/fitness/recreation)
+"lgf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"lgs" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -63414,6 +63233,12 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/command/teleporter)
+"lmF" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"lmL" = (
/turf/closed/wall,
/area/engineering/supermatter/room)
@@ -63731,6 +63556,13 @@
/obj/item/training_toolbox,
/turf/open/floor/iron,
/area/commons/fitness/recreation)
+"lra" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"lrc" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -64791,6 +64623,12 @@
},
/turf/open/floor/iron,
/area/service/bar/atrium)
+"lHp" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"lHI" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/camera{
@@ -64874,6 +64712,12 @@
},
/turf/open/floor/iron/dark,
/area/service/theater/abandoned)
+"lIN" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 1
+ },
+/turf/closed/wall,
+/area/engineering/atmos)
"lIP" = (
/obj/machinery/camera{
c_tag = "Holodeck Control";
@@ -65779,30 +65623,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/engineering/atmos)
-"lVN" = (
-/obj/machinery/door/airlock/research{
- name = "Research Testing Range";
- req_access_txt = "47"
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/machinery/door/firedoor,
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"lVS" = (
/obj/structure/chair/office{
dir = 8
@@ -65934,15 +65754,6 @@
},
/turf/open/floor/iron,
/area/security/checkpoint)
-"lXM" = (
-/obj/structure/window/reinforced{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"lYa" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/stripes/line,
@@ -66184,6 +65995,12 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/primary/fore)
+"map" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"mat" = (
/obj/effect/decal/cleanable/dirt,
/obj/item/kirbyplants/random,
@@ -68027,19 +67844,6 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/commons/storage/primary)
-"myW" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"mzf" = (
/obj/machinery/door/poddoor/preopen{
id = "bridgedoors";
@@ -68549,6 +68353,13 @@
},
/turf/open/floor/plating,
/area/engineering/supermatter/room)
+"mGu" = (
+/obj/structure/sign/poster/official/random{
+ pixel_y = -32
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"mHf" = (
/obj/structure/chair/comfy/brown{
dir = 8
@@ -68924,6 +68735,12 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central/fore)
+"mLI" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"mLO" = (
/obj/structure/disposalpipe/segment,
/obj/effect/turf_decal/trimline/brown/filled/line{
@@ -68952,6 +68769,21 @@
},
/turf/open/floor/iron,
/area/commons/vacant_room/commissary)
+"mLZ" = (
+/obj/structure/closet/crate,
+/obj/item/target/alien,
+/obj/item/target/alien,
+/obj/item/target/clown,
+/obj/item/target/clown,
+/obj/item/target/syndicate,
+/obj/item/gun/energy/laser/practice,
+/obj/item/gun/energy/laser/practice,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"mMg" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/green,
@@ -69151,6 +68983,28 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/commons/toilet/restrooms)
+"mPh" = (
+/obj/machinery/camera{
+ c_tag = "Science - Firing Range";
+ name = "science camera";
+ network = list("ss13","rd")
+ },
+/obj/structure/table/reinforced,
+/obj/item/clothing/ears/earmuffs,
+/obj/item/clothing/ears/earmuffs,
+/obj/item/gun/energy/laser/practice,
+/obj/item/gun/energy/laser/practice{
+ pixel_x = 3;
+ pixel_y = -3
+ },
+/obj/structure/window/reinforced,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
+"mPo" = (
+/obj/machinery/research/explosive_compressor,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"mPp" = (
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -69379,6 +69233,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/command/meeting_room/council)
+<<<<<<< HEAD
"mSy" = (
/obj/structure/cable,
/obj/effect/turf_decal/stripes/line{
@@ -69395,6 +69250,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos/upper)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"mSA" = (
/obj/structure/window/reinforced{
dir = 8
@@ -69780,6 +69637,16 @@
},
/turf/open/floor/plating,
/area/maintenance/central/secondary)
+"mYu" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"mYA" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment{
@@ -71311,6 +71178,18 @@
/obj/item/electronics/apc,
/turf/open/floor/wood,
/area/service/electronic_marketing_den)
+"nsn" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos/upper)
"nsp" = (
/obj/item/reagent_containers/glass/bucket,
/obj/effect/decal/cleanable/cobweb/cobweb2,
@@ -72326,12 +72205,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/engineering/break_room)
-"nDZ" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"nEf" = (
/obj/structure/table/wood,
/obj/item/clothing/head/papersack/smiley,
@@ -72567,6 +72440,15 @@
/obj/effect/turf_decal/bot,
/turf/open/floor/iron,
/area/engineering/gravity_generator)
+"nGU" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"nGZ" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
@@ -73426,6 +73308,31 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/cargo/storage)
+"nSA" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/door/airlock/research{
+ name = "Toxins Launch Site";
+ req_access_txt = "8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"nSD" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -73726,6 +73633,18 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/maintenance/port/fore)
+"nUV" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/table/reinforced,
+/obj/item/multitool/circuit{
+ pixel_x = 7
+ },
+/obj/item/multitool/circuit,
+/obj/item/multitool/circuit{
+ pixel_x = -8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"nUZ" = (
/obj/machinery/holopad,
/obj/structure/cable,
@@ -73878,6 +73797,12 @@
},
/turf/open/floor/iron,
/area/ai_monitored/command/storage/eva)
+"nXC" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"nXD" = (
/obj/item/kirbyplants/random,
/obj/machinery/light_switch/directional/west,
@@ -75116,6 +75041,10 @@
},
/turf/open/floor/iron/white,
/area/hallway/primary/central/aft)
+"oly" = (
+/obj/machinery/modular_computer/console/preset/civilian,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"olC" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -75388,6 +75317,19 @@
},
/turf/open/floor/iron,
/area/maintenance/disposal/incinerator)
+"oox" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"ooH" = (
/obj/machinery/camera{
c_tag = "Engineering Hallway - Starboard";
@@ -76482,6 +76424,18 @@
/obj/machinery/air_sensor/atmos/nitrogen_tank,
/turf/open/floor/engine/n2,
/area/engineering/atmos)
+"oDB" = (
+/obj/machinery/door/window/southleft{
+ name = "Mass Driver Door";
+ req_access_txt = "8"
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/loading_area,
+/obj/machinery/computer/pod/old/mass_driver_controller/toxinsdriver{
+ pixel_x = 28
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"oDC" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -76655,6 +76609,12 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+"oFL" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"oFV" = (
/obj/structure/window/reinforced{
dir = 4
@@ -77987,25 +77947,6 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central/aft)
-"oVN" = (
-/obj/item/stack/rods/fifty,
-/obj/item/stack/sheet/glass/fifty,
-/obj/item/stack/sheet/iron/fifty,
-/obj/item/target,
-/obj/item/target/syndicate,
-/obj/item/target/alien,
-/obj/item/target/clown,
-/obj/structure/closet/crate/secure{
- desc = "A secure crate containing various materials for building a customised test-site.";
- name = "Test Site Materials Crate";
- req_access_txt = "8"
- },
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 9
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"oVQ" = (
/obj/structure/table/wood,
/obj/item/toy/cards/deck/syndicate{
@@ -78380,6 +78321,13 @@
},
/turf/open/floor/plating,
/area/security/prison)
+"paL" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"paN" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -78903,6 +78851,18 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/primary/fore)
+"pjj" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/maintenance/disposal/incinerator)
"pjK" = (
/obj/structure/table/wood,
/obj/item/folder/red,
@@ -79201,10 +79161,6 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron/dark,
/area/commons/cryopods)
-"pmQ" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"pmV" = (
/obj/structure/closet/crate/trashcart/laundry,
/obj/effect/spawner/lootdrop/prison_contraband,
@@ -79694,6 +79650,18 @@
},
/turf/open/floor/iron,
/area/security/prison)
+"puE" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 6
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/obj/machinery/airalarm/directional/east,
+/obj/machinery/newscaster/directional/north,
+/obj/machinery/light_switch/directional/east{
+ pixel_y = 26
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"puL" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
@@ -81400,22 +81368,6 @@
/obj/item/kirbyplants/random,
/turf/open/floor/wood,
/area/command/heads_quarters/captain)
-"pUp" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"pUx" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/atmos/glass{
@@ -82426,12 +82378,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/commons/fitness/recreation)
-"qhc" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"qhd" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -82449,6 +82395,12 @@
},
/turf/open/floor/iron/dark,
/area/service/kitchen)
+"qhk" = (
+/obj/machinery/vending/assist,
+/obj/machinery/firealarm/directional/east,
+/obj/machinery/light_switch/directional/south,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"qhm" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -82578,6 +82530,10 @@
},
/turf/open/floor/plating,
/area/maintenance/central/secondary)
+"qje" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/closed/wall,
+/area/engineering/atmos)
"qjm" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/blue,
@@ -83696,6 +83652,15 @@
/obj/machinery/light_switch/directional/east,
/turf/open/floor/circuit/green,
/area/engineering/main)
+"qyo" = (
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"qyu" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -84404,6 +84369,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/hallway/secondary/entry)
+"qGq" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"qGs" = (
/obj/machinery/light/directional/west,
/obj/machinery/camera{
@@ -84664,6 +84633,17 @@
/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden,
/turf/open/floor/iron,
/area/science/mixing)
+"qKr" = (
+/obj/effect/landmark/start/scientist,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"qKx" = (
/obj/machinery/power/tesla_coil,
/obj/effect/turf_decal/bot,
@@ -86323,6 +86303,55 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/brown/visible,
/turf/open/floor/iron,
/area/engineering/supermatter/room)
+"rev" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
+"rew" = (
+/obj/machinery/door/firedoor,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/door/airlock/research{
+ name = "Toxins Mixing Lab";
+ req_access_txt = "8"
+ },
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "rdtoxins";
+ name = "Toxins Lab Shutters"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"reB" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/red,
@@ -87288,6 +87317,11 @@
},
/turf/open/floor/iron,
/area/engineering/main)
+"rsF" = (
+/obj/machinery/door/poddoor/massdriver_toxins,
+/obj/structure/fans/tiny,
+/turf/open/floor/plating,
+/area/science/misc_lab/range)
"rsL" = (
/obj/structure/plaque/static_plaque/atmos,
/turf/closed/wall,
@@ -87900,9 +87934,6 @@
/obj/machinery/airalarm/directional/west,
/turf/open/floor/wood,
/area/service/library/abandoned)
-"rCv" = (
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"rCA" = (
/obj/item/kirbyplants{
icon_state = "plant-21"
@@ -88456,6 +88487,18 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron,
/area/science/research)
+"rKf" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/rack,
+/obj/item/controller,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"rKh" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -88587,6 +88630,25 @@
/obj/machinery/atmospherics/pipe/bridge_pipe/orange/visible,
/turf/open/space,
/area/engineering/atmos)
+"rLO" = (
+/obj/item/stack/rods/fifty,
+/obj/item/stack/sheet/glass/fifty,
+/obj/item/stack/sheet/iron/fifty,
+/obj/item/target,
+/obj/item/target/syndicate,
+/obj/item/target/alien,
+/obj/item/target/clown,
+/obj/structure/closet/crate/secure{
+ desc = "A secure crate containing various materials for building a customised test-site.";
+ name = "Test Site Materials Crate";
+ req_access_txt = "8"
+ },
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"rLP" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/red{
@@ -89079,6 +89141,19 @@
},
/turf/open/floor/iron,
/area/service/hydroponics)
+"rSH" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos/upper)
"rSJ" = (
/obj/structure/disposalpipe/sorting/mail{
dir = 4;
@@ -89641,6 +89716,19 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/medical/medbay/central)
+"saJ" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 5
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"saQ" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/virology{
@@ -89984,6 +90072,28 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/secondary/command)
+"sfm" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron{
+ heat_capacity = 1e+006
+ },
+/area/science/misc_lab/range)
"sfo" = (
/obj/effect/decal/remains/xeno,
/turf/open/floor/engine/vacuum,
@@ -90326,6 +90436,10 @@
},
/turf/open/floor/iron,
/area/command/gateway)
+"skA" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/misc_lab/range)
"skH" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/brown,
@@ -91738,6 +91852,16 @@
"sCg" = (
/turf/open/floor/carpet,
/area/command/bridge)
+"sCm" = (
+/obj/machinery/mass_driver/toxins{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"sCo" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/neutral{
@@ -92344,6 +92468,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/grimy,
/area/service/library)
+"sJb" = (
+/obj/structure/table,
+/obj/effect/decal/cleanable/dirt,
+/obj/item/clothing/gloves/color/latex,
+/obj/item/clothing/glasses/science,
+/obj/item/clothing/glasses/science,
+/obj/effect/turf_decal/bot,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"sJv" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -92470,6 +92603,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/medical/virology)
+"sKO" = (
+/obj/structure/sign/poster/official/random{
+ pixel_y = 32
+ },
+/obj/structure/rack,
+/obj/item/integrated_circuit/loaded/speech_relay,
+/obj/item/integrated_circuit/loaded/hello_world,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"sKP" = (
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron,
@@ -93064,12 +93206,6 @@
},
/turf/open/floor/iron/dark/corner,
/area/engineering/atmos)
-"sTI" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/maintenance/port)
"sUa" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/sign/departments/medbay/alt,
@@ -93130,6 +93266,10 @@
},
/turf/open/floor/engine/vacuum,
/area/engineering/atmos)
+"sUT" = (
+/obj/structure/sign/nanotrasen,
+/turf/closed/wall/r_wall,
+/area/science/misc_lab)
"sUU" = (
/obj/structure/cable,
/obj/effect/turf_decal/tile/yellow,
@@ -93478,6 +93618,13 @@
},
/turf/open/floor/iron,
/area/security/prison/safe)
+"sYB" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"sYF" = (
/obj/machinery/door/firedoor,
/obj/machinery/door/airlock/command{
@@ -94232,16 +94379,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/cafeteria,
/area/security/prison)
-"tjw" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"tjD" = (
/obj/structure/window/reinforced{
dir = 8
@@ -94972,6 +95109,13 @@
},
/turf/open/floor/iron,
/area/maintenance/starboard/fore)
+"tuj" = (
+/obj/structure/chair/office/light{
+ dir = 1;
+ pixel_y = 3
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"tuq" = (
/obj/effect/landmark/event_spawn,
/obj/effect/turf_decal/tile/red{
@@ -95094,6 +95238,11 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/engineering/main)
+"twD" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"txh" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
@@ -96368,12 +96517,6 @@
},
/turf/open/floor/iron/white,
/area/hallway/primary/central/aft)
-"tMk" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab/range)
"tMm" = (
/obj/machinery/photocopier,
/obj/effect/turf_decal/tile/neutral{
@@ -97514,19 +97657,6 @@
},
/turf/open/floor/iron,
/area/maintenance/starboard/fore)
-"ubd" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"ubv" = (
/obj/effect/turf_decal/delivery,
/turf/open/floor/iron,
@@ -98097,6 +98227,20 @@
/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron/dark,
/area/service/chapel/office)
+"ujY" = (
+/obj/machinery/power/apc/auto_name/east,
+/obj/structure/cable,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"ukj" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/purple,
@@ -98903,12 +99047,6 @@
/obj/effect/landmark/start/hangover/closet,
/turf/open/floor/iron/dark,
/area/commons/locker)
-"uuM" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 5
- },
-/turf/open/floor/iron,
-/area/maintenance/port)
"uuR" = (
/obj/effect/landmark/start/cook,
/obj/structure/cable,
@@ -99107,6 +99245,18 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron,
/area/hallway/primary/port)
+"uxQ" = (
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/trinary/filter{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"uyh" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/brown,
@@ -100054,6 +100204,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai)
+"uJJ" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"uJK" = (
/obj/machinery/button/crematorium{
id = "cremawheat";
@@ -100470,6 +100624,13 @@
/obj/machinery/power/apc/auto_name/east,
/turf/open/floor/iron/dark,
/area/ai_monitored/command/nuke_storage)
+"uRm" = (
+/obj/machinery/light/directional/north,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"uRC" = (
/obj/structure/bonfire,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice{
@@ -101261,6 +101422,18 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/wood,
/area/command/heads_quarters/captain)
+"veb" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/machinery/light/directional/south,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"vec" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/tank_holder/emergency_oxygen,
@@ -103134,6 +103307,14 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/primary/fore)
+"vFN" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/south,
+/obj/effect/turf_decal/stripes/line{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"vFR" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -103153,6 +103334,12 @@
},
/turf/open/floor/iron,
/area/security/prison/safe)
+"vGv" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"vGx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
@@ -104861,6 +105048,22 @@
},
/turf/open/floor/carpet,
/area/service/chapel/office)
+"wbX" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus{
+ pixel_x = 5;
+ pixel_y = 10
+ },
+/obj/item/stock_parts/cell/high/plus,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"wcg" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/landmark/xeno_spawn,
@@ -105014,16 +105217,16 @@
},
/turf/open/floor/iron/dark,
/area/commons/fitness/recreation)
-"wei" = (
-/obj/machinery/airalarm/directional/north,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"wew" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"weA" = (
+/obj/structure/sign/warning/vacuum,
+/turf/closed/wall,
+/area/science/misc_lab/range)
"weH" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -105221,6 +105424,12 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"whX" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/turf_decal/bot,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"whY" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
@@ -105353,15 +105562,6 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/aisat/exterior)
-"wjz" = (
-/obj/effect/landmark/blobstart,
-/obj/item/beacon,
-/obj/structure/cable,
-/obj/effect/turf_decal/bot,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"wjF" = (
/obj/structure/chair/office/light{
dir = 1;
@@ -105939,6 +106139,14 @@
},
/turf/open/floor/engine/vacuum,
/area/engineering/atmos/upper)
+"wrZ" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/north,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"wss" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/disposalpipe/segment{
@@ -106617,10 +106825,6 @@
/obj/item/clipboard,
/turf/open/floor/iron/cafeteria,
/area/security/prison)
-"wAA" = (
-/obj/structure/sign/nanotrasen,
-/turf/closed/wall/r_wall,
-/area/science/misc_lab/range)
"wAZ" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -107449,35 +107653,6 @@
/obj/structure/cable,
/turf/open/floor/wood,
/area/service/electronic_marketing_den)
-"wPJ" = (
-/obj/machinery/door/firedoor,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/door/airlock/research{
- name = "Toxins Mixing Lab";
- req_access_txt = "8"
- },
-/obj/machinery/door/poddoor/shutters/preopen{
- id = "rdtoxins";
- name = "Toxins Lab Shutters"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron,
-/area/science/mixing)
"wPK" = (
/obj/machinery/door/airlock{
id_tag = "AuxToilet1";
@@ -109225,6 +109400,17 @@
},
/turf/open/floor/iron/dark/corner,
/area/engineering/atmos)
+"xoY" = (
+/obj/structure/cable,
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 5
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"xpb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -110679,6 +110865,9 @@
},
/turf/open/floor/iron,
/area/service/hydroponics)
+"xKO" = (
+/turf/open/floor/iron,
+/area/science/misc_lab)
"xKQ" = (
/obj/item/kirbyplants/random,
/obj/structure/disposalpipe/segment{
@@ -110699,6 +110888,9 @@
/obj/machinery/atmospherics/components/binary/thermomachine/freezer,
/turf/open/floor/iron,
/area/science/mixing)
+"xLa" = (
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"xLd" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/tile/neutral{
@@ -111571,6 +111763,15 @@
},
/turf/open/floor/iron/dark,
/area/service/bar)
+"xXZ" = (
+/obj/effect/landmark/blobstart,
+/obj/item/beacon,
+/obj/structure/cable,
+/obj/effect/turf_decal/bot,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron,
+/area/science/misc_lab/range)
"xYc" = (
/obj/structure/table/wood,
/obj/item/flashlight/lamp,
@@ -112009,28 +112210,6 @@
/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron,
/area/commons/fitness/recreation)
-"ydd" = (
-/obj/structure/cable,
-/obj/effect/turf_decal/stripes/corner,
-/obj/effect/turf_decal/stripes/corner{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/turf/open/floor/iron{
- heat_capacity = 1e+006
- },
-/area/science/misc_lab)
"ydg" = (
/obj/machinery/door/poddoor/preopen{
id = "brigprison";
@@ -135125,7 +135304,7 @@ uiP
woP
bgH
aDu
-jwE
+fqO
oVs
kQs
tMQ
@@ -136391,7 +136570,7 @@ wLZ
cHk
tmu
aIy
-fqt
+pjj
gcW
mZD
hbW
@@ -136986,11 +137165,11 @@ nPM
nPM
nPM
nPM
-saw
-saw
-saw
-saw
-saw
+gSi
+gSi
+gSi
+gSi
+gSi
dhQ
dhQ
dhQ
@@ -137160,9 +137339,9 @@ nMS
nMS
nMS
mdD
-fbV
+nsn
jiy
-mSy
+rSH
fKs
sSx
vIB
@@ -137171,11 +137350,19 @@ qkN
vzJ
ntl
mZD
+<<<<<<< HEAD
mZD
xXs
mZD
xXs
mZD
+=======
+lIN
+xXs
+mZD
+xXs
+qje
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
mZD
eJp
owx
@@ -137240,14 +137427,14 @@ iuP
exk
swm
pfQ
-caE
-djn
-dle
-saw
-dog
-nDZ
-drz
-saw
+tCh
+map
+vGv
+vGv
+vGv
+vGv
+lmF
+gSi
dul
dvZ
dxH
@@ -137497,14 +137684,14 @@ cjq
ced
wXQ
moY
-caE
-jjN
-hNZ
-saw
-qhc
-dpX
-pmQ
-saw
+tCh
+mLI
+xKO
+xKO
+xKO
+bfJ
+aST
+gSi
djs
dlf
dxI
@@ -137754,14 +137941,14 @@ cMY
cMY
ceb
moY
-caE
-djp
-qpq
-saw
-doh
-rCv
-pmQ
-saw
+tCh
+uRm
+qGq
+ehi
+ehi
+faO
+aST
+gSi
dlg
dli
xwx
@@ -138011,14 +138198,14 @@ cNd
cMY
cea
kEw
-caE
-qpq
-qpq
-saw
-qhc
-rCv
-drA
-saw
+tCh
+mLI
+xKO
+xKO
+xKO
+ehi
+mGu
+gSi
dum
dli
dpZ
@@ -138268,14 +138455,14 @@ dcb
cMY
cea
laE
-kTQ
-iYN
-uuM
-saw
-qhc
-tMk
-pmQ
-saw
+tCh
+kon
+qyo
+qyo
+qyo
+jHZ
+aST
+gSi
yjc
lEl
dxJ
@@ -138525,14 +138712,14 @@ xtH
cMY
deX
aiu
-caE
-qpq
-sTI
-saw
-doj
-eYc
-lXM
-saw
+tCh
+nUV
+saJ
+wbX
+mPh
+gpg
+nGU
+gSi
dun
lEl
dxK
@@ -138782,14 +138969,14 @@ lvo
cMY
deX
joJ
-caE
-xMn
-dok
-saw
-jEz
-eJF
-drC
-saw
+tCh
+oly
+tuj
+xLa
+xLa
+xoY
+gsi
+gSi
duo
dmu
eMD
@@ -139039,14 +139226,14 @@ xXC
cMY
deY
oAw
-caE
-cea
-djr
-saw
-dol
-myW
-drD
-saw
+tCh
+bLH
+bly
+xLa
+uJJ
+ifR
+veb
+gSi
dup
dlg
dxL
@@ -139296,14 +139483,14 @@ enx
cMY
cjp
hST
-caE
-cea
-cea
-saw
-wei
-fQl
-drE
-saw
+tCh
+cGu
+hOV
+hOV
+hOV
+oox
+iNP
+gSi
duq
dlh
dxM
@@ -139553,14 +139740,14 @@ dcd
cMY
deZ
joJ
-caE
-djv
-ceb
-saw
-doo
-fQl
-drF
-saw
+tCh
+sKO
+rKf
+bhD
+mLZ
+dQV
+qhk
+gSi
dur
xze
dxN
@@ -139810,14 +139997,14 @@ rMk
cMY
deX
joJ
-caE
-caE
-caE
-saw
-wAA
-lVN
-saw
-saw
+tCh
+tCh
+tCh
+gSi
+sUT
+hgS
+gSi
+gSi
dus
dwa
dom
@@ -140853,14 +141040,14 @@ cxO
mbI
caE
aad
-gSi
-dEn
-dEn
-gSi
-dEn
-gSi
-dLI
-gSi
+saw
+skA
+skA
+saw
+skA
+saw
+eMn
+saw
dOa
dOM
aad
@@ -141110,14 +141297,14 @@ cxN
uzE
cOj
aaa
-dEn
-dFz
-dGY
-dIj
-dJJ
-dEn
-dLJ
-gSi
+skA
+gDm
+fUX
+hIQ
+aPJ
+skA
+asu
+saw
dOb
ert
ert
@@ -141367,14 +141554,14 @@ cxO
oFE
cOj
aad
-dEn
-dFA
-dGZ
-dIk
-dJK
-dKA
-dLK
-gSi
+skA
+nXC
+lra
+lHp
+iPA
+weA
+rsF
+saw
dOc
ert
yiM
@@ -141624,14 +141811,14 @@ dzo
mbI
caE
aaa
-gSi
-dFB
-dHa
-kJJ
-oVN
-dEn
-dLL
-gSi
+saw
+emq
+cBP
+mYu
+rLO
+skA
+hAH
+saw
dOd
ert
iKu
@@ -141881,14 +142068,14 @@ dzp
wJa
cOj
aad
-dEn
-dFC
-ubd
-leq
-dJM
-dKB
-dLM
-gSi
+skA
+sYB
+lgf
+qKr
+sJb
+kot
+aXp
+saw
dOe
hmH
yli
@@ -142138,14 +142325,14 @@ dzq
mbI
cOj
aaa
-dEn
-dFD
-dHc
-tjw
-dJN
-dEn
-dLN
-gSi
+skA
+twD
+uxQ
+izv
+mPo
+skA
+lft
+saw
dLW
fTa
elW
@@ -142395,14 +142582,14 @@ cxO
oFE
caE
aad
-gSi
-dFE
-eGN
-jEi
-dJO
-dKC
-dLO
-gSi
+saw
+puE
+ujY
+jAR
+whX
+oDB
+sCm
+saw
qHZ
kwQ
bce
@@ -142652,14 +142839,14 @@ dzp
pxk
caE
caE
-gSi
-gSi
-gSi
-ayL
-gSi
-gSi
-gSi
-gSi
+saw
+saw
+saw
+nSA
+saw
+saw
+saw
+saw
uSp
hmH
etl
@@ -142910,11 +143097,11 @@ wJa
dBY
cea
dEo
-tCh
-dHe
-dze
-dJQ
-tCh
+kVu
+wrZ
+rev
+vFN
+kVu
dLP
dNt
cGi
@@ -143168,9 +143355,9 @@ exk
sCo
oWN
pDd
-pUp
-wjz
-fQf
+kZB
+xXZ
+ahP
pYc
ucq
dWh
@@ -143424,11 +143611,11 @@ cjq
dBZ
cjq
dEp
-tCh
-dHg
-ydd
-dJS
-tCh
+kVu
+paL
+sfm
+oFL
+kVu
dLS
dQE
agR
@@ -143681,11 +143868,11 @@ drP
drP
drP
drP
-gSi
-gSi
-wPJ
-gSi
-gSi
+saw
+saw
+rew
+saw
+saw
dLS
dNw
fGR
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index c3d0f0dc4c8..7d80009d90c 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -9889,6 +9889,7 @@
"bfv" = (
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload)
+<<<<<<< HEAD
"bfx" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
@@ -9899,6 +9900,8 @@
},
/turf/open/floor/iron,
/area/maintenance/disposal/incinerator)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"bfF" = (
/turf/closed/wall,
/area/medical/pharmacy)
@@ -15417,13 +15420,6 @@
"bJN" = (
/turf/closed/wall,
/area/science/xenobiology)
-"bJO" = (
-/obj/machinery/door/airlock/research{
- name = "Testing Lab";
- req_access_txt = "47"
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"bJP" = (
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible,
/turf/open/floor/plating/snowed/icemoon,
@@ -16366,10 +16362,6 @@
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/iron/white,
/area/science/xenobiology)
-"bQO" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"bQQ" = (
/obj/machinery/door/firedoor,
/obj/structure/cable,
@@ -17739,12 +17731,14 @@
},
/turf/open/floor/plating,
/area/maintenance/aft)
-"caY" = (
-/obj/machinery/disposal/bin,
-/obj/structure/disposalpipe/trunk{
- dir = 8
+"caW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 6
},
-/turf/open/floor/iron,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/white,
/area/science/misc_lab)
"caZ" = (
/obj/effect/turf_decal/tile/blue{
@@ -18081,12 +18075,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/maintenance/port/aft)
-"cdz" = (
-/obj/structure/tank_holder,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/starboard/aft)
"cdI" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -18294,6 +18282,15 @@
/obj/item/storage/fancy/donut_box,
/turf/open/floor/carpet,
/area/command/heads_quarters/captain)
+"chC" = (
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 5
+ },
+/turf/open/floor/iron/white/side{
+ dir = 1
+ },
+/area/maintenance/starboard/aft)
"chH" = (
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
@@ -18436,10 +18433,6 @@
/obj/structure/closet/crate/solarpanel_small,
/turf/open/floor/iron/dark,
/area/engineering/engine_smes)
-"cka" = (
-/obj/structure/table,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"cko" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
@@ -21468,6 +21461,13 @@
/obj/structure/window/reinforced,
/turf/open/floor/iron/cafeteria,
/area/command/heads_quarters/rd)
+"dcS" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 9
+ },
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/engineering/atmos)
"ddd" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 4
@@ -21774,6 +21774,9 @@
/obj/item/storage/box,
/turf/open/floor/iron,
/area/engineering/atmos)
+"dov" = (
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"doE" = (
/obj/structure/light_construct/directional/east,
/turf/open/floor/iron,
@@ -23175,6 +23178,14 @@
},
/turf/open/floor/iron,
/area/cargo/office)
+"egV" = (
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 1;
+ name = "N2 to Airmix"
+ },
+/obj/machinery/light/directional/south,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"ehm" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input{
dir = 8
@@ -24166,6 +24177,10 @@
},
/turf/open/floor/iron,
/area/cargo/miningdock)
+"eOr" = (
+/obj/structure/cable,
+/turf/open/floor/iron/white/side,
+/area/science/misc_lab)
"eOE" = (
/obj/structure/chair/office{
dir = 1
@@ -25505,6 +25520,13 @@
/obj/effect/landmark/start/cargo_technician,
/turf/open/floor/iron,
/area/cargo/sorting)
+"fIO" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos)
"fIP" = (
/obj/machinery/nuclearbomb/selfdestruct,
/obj/effect/turf_decal/tile/neutral{
@@ -26147,15 +26169,6 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/engine/vacuum,
/area/science/mixing/chamber)
-"fXM" = (
-/obj/structure/disposalpipe/segment{
- dir = 6
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"fXZ" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -26181,6 +26194,14 @@
},
/turf/open/floor/iron/grimy,
/area/commons/vacant_room/office)
+"fZt" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 6
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"fZF" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -26230,6 +26251,16 @@
/obj/item/trash/semki,
/turf/open/floor/iron,
/area/maintenance/port/fore)
+"gaD" = (
+/obj/structure/table,
+/obj/item/stock_parts/cell/high,
+/obj/machinery/cell_charger{
+ pixel_y = 5
+ },
+/turf/open/floor/iron/white/corner{
+ dir = 4
+ },
+/area/maintenance/starboard/aft)
"gaT" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -27734,6 +27765,18 @@
/obj/effect/spawner/lootdrop/maintenance/three,
/turf/open/floor/plating,
/area/maintenance/port)
+"gWT" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock/maintenance{
+ name = "Testing Lab Maintenance";
+ req_access_txt = "47"
+ },
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"gWZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 5
@@ -27959,13 +28002,6 @@
},
/turf/open/floor/iron,
/area/cargo/storage)
-"her" = (
-/obj/effect/turf_decal/arrows,
-/obj/effect/turf_decal/stripes/line{
- dir = 9
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"het" = (
/obj/machinery/light/directional/east,
/turf/open/floor/iron/dark,
@@ -28873,6 +28909,27 @@
},
/turf/open/floor/iron,
/area/security/brig)
+"hFE" = (
+/obj/structure/table,
+/obj/item/multitool/circuit{
+ pixel_x = -8
+ },
+/obj/item/multitool/circuit{
+ pixel_x = -4
+ },
+/obj/item/multitool/circuit,
+/obj/item/stock_parts/cell/high{
+ pixel_x = 8;
+ pixel_y = 9
+ },
+/obj/item/stock_parts/cell/high{
+ pixel_x = 8;
+ pixel_y = -2
+ },
+/turf/open/floor/iron/white/side{
+ dir = 4
+ },
+/area/science/misc_lab)
"hFZ" = (
/obj/machinery/navbeacon{
codes_txt = "delivery;dir=8";
@@ -30510,6 +30567,14 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/service/bar)
+"iGi" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron/white/side{
+ dir = 8
+ },
+/area/science/misc_lab)
"iGv" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 8
@@ -30975,12 +31040,6 @@
},
/turf/open/floor/iron,
/area/hallway/secondary/exit)
-"iVn" = (
-/obj/structure/closet/l3closet/scientist{
- pixel_x = -2
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"iVY" = (
/obj/structure/table,
/obj/item/assembly/signaler,
@@ -31683,6 +31742,11 @@
"joZ" = (
/turf/open/floor/engine/n2,
/area/engineering/atmos)
+"jpx" = (
+/turf/open/floor/iron/white/side{
+ dir = 8
+ },
+/area/science/misc_lab)
"jpE" = (
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
@@ -32866,17 +32930,6 @@
},
/turf/open/floor/iron,
/area/security/checkpoint/medical)
-"jZb" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"jZf" = (
/obj/structure/closet/secure_closet/chemical,
/obj/effect/turf_decal/trimline/blue/line,
@@ -32933,11 +32986,6 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/commons/storage/mining)
-"kbE" = (
-/obj/structure/closet/bombcloset,
-/obj/structure/extinguisher_cabinet/directional/west,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"kbG" = (
/obj/effect/turf_decal/tile/yellow{
dir = 8
@@ -34868,6 +34916,7 @@
},
/turf/open/floor/iron,
/area/engineering/main)
+<<<<<<< HEAD
"lhV" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -34878,6 +34927,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"liu" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -35290,15 +35341,6 @@
},
/turf/open/floor/iron/freezer,
/area/commons/toilet)
-"ltG" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 6
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"ltP" = (
/obj/effect/turf_decal/stripes/line{
dir = 4
@@ -37826,6 +37868,19 @@
/obj/structure/lattice/catwalk,
/turf/open/openspace/icemoon,
/area/science/server)
+"mIV" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/obj/structure/sign/warning/securearea{
+ pixel_y = 32
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"mIX" = (
/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{
dir = 5
@@ -38163,6 +38218,7 @@
},
/turf/open/floor/iron,
/area/engineering/engine_smes)
+<<<<<<< HEAD
"mRj" = (
/obj/machinery/light,
/obj/machinery/atmospherics/components/binary/pump/on{
@@ -38172,6 +38228,8 @@
/obj/machinery/light/directional/south,
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"mRA" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 1
@@ -39345,14 +39403,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/hallway/primary/central)
-"nyR" = (
-/obj/structure/rack,
-/obj/item/wrench,
-/obj/item/crowbar,
-/obj/effect/decal/cleanable/dirt,
-/obj/item/hand_labeler,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"nyY" = (
/obj/machinery/computer/crew,
/obj/effect/turf_decal/tile/green,
@@ -39664,6 +39714,15 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/service/bar)
+"nIs" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 10
+ },
+/turf/open/floor/iron,
+/area/maintenance/disposal/incinerator)
"nIt" = (
/obj/machinery/porta_turret/ai{
dir = 4;
@@ -39843,6 +39902,12 @@
/obj/machinery/light/directional/north,
/turf/open/floor/iron/white,
/area/medical/medbay)
+"nPK" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"nPP" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -39945,6 +40010,7 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+<<<<<<< HEAD
"nRS" = (
/obj/machinery/light{
dir = 4
@@ -39955,6 +40021,8 @@
/obj/machinery/light/directional/east,
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"nSI" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -41472,6 +41540,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/wood,
/area/service/library)
+<<<<<<< HEAD
"oOp" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
@@ -41480,6 +41549,8 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"oOF" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -41534,6 +41605,10 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/primary/central)
+"oQI" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/xenobiology)
"oQS" = (
/obj/machinery/atmospherics/components/binary/pump{
name = "Pure to Port"
@@ -41806,6 +41881,14 @@
"pbq" = (
/turf/closed/wall,
/area/service/chapel/office)
+"pby" = (
+/obj/structure/rack,
+/obj/item/integrated_circuit/loaded/speech_relay,
+/obj/item/integrated_circuit/loaded/hello_world,
+/turf/open/floor/iron/white/side{
+ dir = 4
+ },
+/area/science/misc_lab)
"pbB" = (
/obj/machinery/atmospherics/components/binary/pump/on{
dir = 4;
@@ -43799,6 +43882,13 @@
dir = 10
},
/area/science/research)
+"qbd" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos)
"qbj" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
@@ -44816,6 +44906,15 @@
/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron,
/area/science/robotics/lab)
+"qJG" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/meter/atmos/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable,
+/turf/open/floor/plating,
+/area/maintenance/starboard/aft)
"qJQ" = (
/obj/item/kirbyplants/random,
/turf/open/floor/iron/grimy,
@@ -45381,6 +45480,15 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/hallway/primary/central)
+"rbd" = (
+/obj/machinery/disposal/bin,
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/turf/open/floor/iron/white/corner{
+ dir = 1
+ },
+/area/science/misc_lab)
"rbz" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 8
@@ -46358,6 +46466,13 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/command/gateway)
+"rDD" = (
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
+ dir = 6
+ },
+/obj/machinery/light/directional/east,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"rDE" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -46843,14 +46958,6 @@
/obj/effect/landmark/xeno_spawn,
/turf/open/floor/iron,
/area/construction)
-"rOY" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 6
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"rPX" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall,
@@ -48301,13 +48408,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/carpet,
/area/command/heads_quarters/hos)
-"sHk" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"sHm" = (
/obj/structure/cable,
/turf/open/floor/plating/asteroid/snow/icemoon,
@@ -48911,11 +49011,6 @@
},
/turf/open/floor/iron,
/area/maintenance/port/fore)
-"sXV" = (
-/obj/effect/decal/cleanable/cobweb,
-/obj/structure/closet/emcloset,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"sXZ" = (
/obj/effect/turf_decal/stripes/corner{
dir = 1
@@ -49479,14 +49574,6 @@
},
/turf/open/floor/iron,
/area/commons/dorms)
-"tny" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/meter/atmos/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"tnP" = (
/obj/structure/cable,
/obj/machinery/atmospherics/components/trinary/filter/atmos/co2,
@@ -49720,19 +49807,6 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/service/bar)
-"ttY" = (
-/obj/structure/sign/warning/securearea{
- pixel_y = 32
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 4
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"tun" = (
/obj/structure/closet/secure_closet/personal{
anchored = 1
@@ -49857,20 +49931,6 @@
"txw" = (
/turf/open/floor/iron/dark,
/area/ai_monitored/command/storage/eva)
-"txB" = (
-/obj/structure/rack,
-/obj/item/clothing/mask/gas{
- pixel_x = 3;
- pixel_y = 3
- },
-/obj/item/clothing/mask/gas,
-/obj/item/clothing/mask/gas{
- pixel_x = -3;
- pixel_y = -3
- },
-/obj/machinery/airalarm/directional/west,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"txF" = (
/obj/structure/chair/comfy/black,
/turf/open/floor/carpet,
@@ -50179,6 +50239,14 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+"tHZ" = (
+/obj/machinery/airalarm/directional/north,
+/obj/structure/rack,
+/obj/item/controller,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
+/turf/open/floor/iron/white/corner,
+/area/science/misc_lab)
"tIa" = (
/obj/machinery/camera{
c_tag = "Atmospherics North East"
@@ -50234,6 +50302,12 @@
/obj/item/pen,
/turf/open/floor/iron,
/area/security/office)
+"tJy" = (
+/obj/machinery/component_printer,
+/turf/open/floor/iron/white/side{
+ dir = 4
+ },
+/area/science/misc_lab)
"tKl" = (
/obj/structure/cable,
/obj/structure/railing,
@@ -51980,11 +52054,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/hallway/primary/port)
-"uCq" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/structure/cable,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"uCs" = (
/obj/machinery/light/small/directional/south,
/turf/open/floor/plating,
@@ -52264,6 +52333,13 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+"uLK" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron/white/corner{
+ dir = 8
+ },
+/area/science/misc_lab)
"uLQ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 4
@@ -52539,6 +52615,14 @@
},
/turf/open/floor/iron,
/area/command/teleporter)
+"uWL" = (
+/obj/machinery/modular_computer/console/preset/civilian{
+ dir = 4
+ },
+/turf/open/floor/iron/white/side{
+ dir = 4
+ },
+/area/science/misc_lab)
"uXm" = (
/obj/machinery/door/morgue{
name = "Confession Booth (Chaplain)";
@@ -52750,6 +52834,17 @@
dir = 8
},
/area/science/research)
+"vdD" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment{
+ dir = 6
+ },
+/turf/open/floor/iron/white/side{
+ dir = 9
+ },
+/area/maintenance/starboard/aft)
"vdE" = (
/obj/structure/chair/office{
dir = 1
@@ -53252,6 +53347,13 @@
/obj/structure/girder,
/turf/open/floor/iron/white,
/area/maintenance/port/fore)
+"vwQ" = (
+/obj/machinery/door/airlock/research{
+ name = "Circuit Testing Lab";
+ req_access_txt = "47"
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"vwX" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/effect/decal/cleanable/dirt,
@@ -53979,6 +54081,9 @@
"vOj" = (
/turf/closed/wall,
/area/security/office)
+"vOl" = (
+/turf/open/floor/iron/white/side,
+/area/science/misc_lab)
"vOu" = (
/turf/closed/wall,
/area/hallway/primary/aft)
@@ -54519,6 +54624,7 @@
},
/turf/open/floor/iron,
/area/engineering/main)
+<<<<<<< HEAD
"wed" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
dir = 4
@@ -54529,6 +54635,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"weh" = (
/obj/machinery/airalarm/directional/west,
/obj/machinery/camera{
@@ -54612,6 +54720,12 @@
dir = 9
},
/area/science/research)
+"wgT" = (
+/obj/structure/chair/office{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"whg" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 4
@@ -55712,17 +55826,6 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/science/storage)
-"wQy" = (
-/obj/structure/disposalpipe/segment,
-/obj/machinery/door/airlock/maintenance{
- name = "Testing Lab Maintenance";
- req_access_txt = "47"
- },
-/obj/structure/cable,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/turf/open/floor/plating,
-/area/maintenance/starboard/aft)
"wQH" = (
/obj/structure/table/wood,
/obj/machinery/airalarm/directional/east,
@@ -57210,6 +57313,15 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+"xGt" = (
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron/white/corner{
+ dir = 1
+ },
+/area/maintenance/starboard/aft)
"xGS" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/light/directional/west,
@@ -57278,6 +57390,13 @@
},
/turf/open/floor/engine,
/area/engineering/supermatter)
+"xIk" = (
+/obj/effect/turf_decal/arrows,
+/obj/effect/turf_decal/stripes/line{
+ dir = 9
+ },
+/turf/open/floor/iron/white,
+/area/maintenance/starboard/aft)
"xIt" = (
/obj/machinery/space_heater,
/obj/structure/sign/poster/official/random{
@@ -57788,6 +57907,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/iron,
/area/commons/dorms)
+"xWW" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 4
+ },
+/turf/open/floor/iron/white/side{
+ dir = 8
+ },
+/area/science/misc_lab)
"xXc" = (
/obj/machinery/door/airlock/maintenance{
name = "Crematorium Maintenance";
@@ -91185,7 +91313,7 @@ hnq
rLU
rGD
ciH
-lhV
+qbd
sAE
nqb
qoC
@@ -91443,7 +91571,7 @@ rLU
oKF
tQD
hYi
-mRj
+egV
cmC
rjM
ccm
@@ -92727,7 +92855,7 @@ kuR
ruE
hvb
nsg
-wed
+fIO
dFW
fJb
bIZ
@@ -93239,7 +93367,7 @@ rLU
gsC
jhK
wNJ
-nRS
+rDD
pBb
pBb
mkZ
@@ -93496,7 +93624,7 @@ fJb
uqR
fJb
oiX
-oOp
+dcS
ojf
ojf
fsN
@@ -96841,7 +96969,7 @@ bAw
bxo
akE
wLA
-bfx
+nIs
bBl
bEv
bEV
@@ -103770,9 +103898,9 @@ bJN
bJN
bDb
bDb
+oQI
bDb
-bDb
-bDb
+oQI
bDb
bDb
bDb
@@ -104026,13 +104154,13 @@ tMH
hgm
bhA
bPN
-kbE
-iVn
-txB
-nyR
-bQZ
-sXV
-cdz
+tHZ
+pby
+tJy
+uWL
+hFE
+gaD
+mtK
bTC
uTB
cmo
@@ -104283,14 +104411,14 @@ bzE
bzE
bWo
bPK
-bQO
-vHt
-bQO
-vHt
-bQZ
-ttY
-iLm
-iLm
+vOl
+dov
+dov
+wgT
+dov
+chC
+mtK
+mIV
iLm
iLm
iLm
@@ -104539,15 +104667,15 @@ dcG
rNt
bWr
bWo
-bJO
-bYj
-rOY
-ltG
-fXM
-wQy
-jZb
-jsw
-tny
+vwQ
+eOr
+fZt
+caW
+nPK
+vdD
+xGt
+gWT
+qJG
jsw
jsw
cri
@@ -104797,13 +104925,13 @@ tCL
cdM
bWo
bPK
-uCq
-pWN
-sHk
-caY
-bQZ
-cNW
+uLK
+iGi
+xWW
+jpx
+rbd
cNW
+mtK
qUz
cNW
cNW
@@ -105057,17 +105185,17 @@ bPN
uOi
cba
gZY
-eeY
+vHt
bQZ
nlW
-her
+xIk
xtu
cNW
qQH
cvO
bNA
cNW
-cOe
+cdu
iLm
tkC
cNW
@@ -105571,7 +105699,7 @@ kQl
bYj
pWN
bOv
-cka
+eeY
bQZ
gSR
qiP
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index b60b387d8b0..3c6cc5d0e42 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -4842,16 +4842,18 @@
},
/area/maintenance/port/fore)
"anS" = (
-/obj/machinery/mass_driver{
- dir = 4;
- id = "toxinsdriver"
+/obj/machinery/door/airlock/maintenance{
+ name = "Testing Lab Maintainance";
+ req_access_txt = "8"
},
-/obj/effect/turf_decal/stripes/end{
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
-/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
/turf/open/floor/plating,
-/area/science/mixing)
+/area/maintenance/starboard)
"anT" = (
/obj/structure/table/wood,
/obj/item/clipboard,
@@ -11296,15 +11298,6 @@
/obj/effect/turf_decal/tile/purple,
/turf/open/floor/iron/showroomfloor,
/area/science/genetics)
-"aLP" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/turf_decal/bot,
-/obj/structure/closet/cardboard,
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/starboard)
"aLQ" = (
/obj/effect/turf_decal/bot,
/obj/structure/rack,
@@ -12300,7 +12293,6 @@
},
/obj/effect/turf_decal/tile/purple,
/obj/machinery/meter,
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 4
},
@@ -12308,6 +12300,7 @@
dir = 10
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
+/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/science/mixing/chamber)
"aOK" = (
@@ -12372,10 +12365,10 @@
/obj/effect/turf_decal/stripes/corner{
dir = 8
},
-/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 4
},
+/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/science/mixing/chamber)
"aOS" = (
@@ -13647,7 +13640,6 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
-/obj/structure/cable,
/turf/open/floor/plating{
icon_state = "panelscorched"
},
@@ -14153,14 +14145,8 @@
/area/medical/storage)
"aSQ" = (
/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/maintenance/starboard)
+/turf/closed/wall/rust,
+/area/science/test_area)
"aSR" = (
/obj/item/kirbyplants{
icon_state = "plant-18"
@@ -15867,8 +15853,12 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/iron/dark,
-/area/science/mixing)
+/area/science/test_area)
"aYd" = (
/turf/closed/wall/r_wall,
/area/science/lab)
@@ -16956,9 +16946,17 @@
},
/area/maintenance/central)
"baC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/science/mixing)
+/obj/structure/rack,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple,
+/obj/item/integrated_circuit/loaded/speech_relay,
+/obj/item/integrated_circuit/loaded/hello_world,
+/obj/machinery/light_switch/directional/south,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"baD" = (
/obj/structure/table/reinforced,
/obj/item/wrench,
@@ -17524,25 +17522,18 @@
/turf/open/floor/engine,
/area/science/mixing/chamber)
"bcb" = (
-/obj/structure/chair{
+/obj/effect/turf_decal/tile/purple{
dir = 4
},
-/obj/machinery/computer/security/telescreen{
- desc = "Used for watching the test chamber.";
- dir = 8;
- layer = 4;
- name = "Test Chamber Telescreen";
- network = list("toxins");
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/turf/open/floor/iron/dark,
-/area/science/mixing)
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"bcc" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 4
@@ -17605,6 +17596,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
+/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/science/mixing/chamber)
"bck" = (
@@ -17826,38 +17818,19 @@
/turf/open/floor/iron/showroomfloor,
/area/science/lab)
"bcR" = (
-/obj/item/target,
-/obj/item/target/syndicate,
-/obj/item/target/alien,
-/obj/item/target/clown,
-/obj/structure/closet/crate/secure{
- desc = "A secure crate containing various materials for building a customised test-site.";
- name = "Test Site Materials Crate";
- req_access_txt = "8"
- },
-/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/dark,
-/area/science/mixing)
-"bcS" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
+/obj/effect/turf_decal/stripes/corner{
dir = 4
},
-/obj/effect/turf_decal/tile/purple{
- dir = 1
+/obj/structure/sign/warning/explosives/alt{
+ pixel_x = -32
},
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"bcW" = (
/obj/effect/turf_decal/tile/purple{
dir = 8
@@ -18161,9 +18134,9 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
+/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
+/area/science/test_area)
"bdW" = (
/obj/structure/transit_tube/horizontal{
dir = 1
@@ -18318,36 +18291,26 @@
/turf/open/floor/iron,
/area/hallway/primary/fore)
"bej" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
-/obj/effect/turf_decal/tile/purple,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 9
},
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
+"bek" = (
+/obj/structure/chair/office/light{
+ dir = 4
+ },
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
},
/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
-"bek" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/turf_decal/tile/purple{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 8
- },
-/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
+/area/science/test_area)
"bem" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -18544,7 +18507,7 @@
"beH" = (
/obj/effect/spawner/structure/window,
/turf/open/floor/plating,
-/area/science/mixing)
+/area/science/test_area)
"beI" = (
/obj/machinery/portable_atmospherics/canister/toxins,
/obj/effect/turf_decal/bot,
@@ -19064,17 +19027,6 @@
/obj/structure/cable,
/turf/open/floor/iron/dark,
/area/maintenance/starboard)
-"bge" = (
-/obj/machinery/door/airlock/external{
- name = "External Airlock";
- req_access_txt = "13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/cable,
-/turf/open/floor/iron/dark,
-/area/maintenance/starboard)
"bgf" = (
/obj/structure/lattice/catwalk,
/obj/structure/cable,
@@ -19241,7 +19193,7 @@
"bgy" = (
/obj/machinery/door/firedoor/heavy,
/obj/machinery/door/airlock/research{
- name = "Toxins Launch Room";
+ name = "Testing Lab";
req_access_txt = "8"
},
/obj/effect/turf_decal/stripes/corner{
@@ -19250,8 +19202,9 @@
/obj/effect/turf_decal/stripes/corner{
dir = 1
},
+/obj/structure/cable,
/turf/open/floor/iron/dark,
-/area/science/mixing)
+/area/science/test_area)
"bgA" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -19777,15 +19730,12 @@
},
/area/maintenance/starboard)
"bic" = (
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 9
+ dir = 6
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 9
+ dir = 6
},
/obj/structure/cable,
/turf/open/floor/plating,
@@ -20171,27 +20121,23 @@
/turf/open/floor/iron/dark,
/area/security/courtroom)
"bkX" = (
-/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/effect/turf_decal/tile/purple,
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
-/obj/effect/turf_decal/stripes/line,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
+/area/science/test_area)
"blc" = (
/obj/machinery/door/airlock/maintenance{
name = "kitchen maintenance";
@@ -20825,18 +20771,6 @@
/obj/structure/closet/firecloset,
/turf/open/floor/iron/dark,
/area/hallway/primary/starboard)
-"bpg" = (
-/obj/effect/turf_decal/stripes/line{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 4
- },
-/turf/open/floor/plating{
- icon_state = "panelscorched"
- },
-/area/science/mixing)
"bpk" = (
/obj/effect/decal/cleanable/blood/old,
/obj/effect/decal/cleanable/dirt,
@@ -30746,32 +30680,6 @@
icon_state = "platingdmg3"
},
/area/maintenance/port/aft)
-"cbe" = (
-/obj/effect/turf_decal/loading_area{
- dir = 4
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 1
- },
-/obj/effect/turf_decal/stripes/corner{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating{
- icon_state = "platingdmg1"
- },
-/area/science/mixing)
-"cbf" = (
-/obj/machinery/door/poddoor{
- id = "toxinsdriver";
- name = "Toxins Launcher Bay Door"
- },
-/obj/effect/turf_decal/delivery,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/turf/open/floor/iron/dark,
-/area/science/mixing)
"cbg" = (
/obj/effect/turf_decal/delivery,
/obj/effect/decal/cleanable/dirt,
@@ -33591,6 +33499,22 @@
/obj/structure/cable,
/turf/open/floor/iron/showroomfloor,
/area/security/execution/education)
+"cjV" = (
+/obj/machinery/door/window/southleft{
+ name = "Mass Driver Door";
+ req_access_txt = "7"
+ },
+/obj/effect/turf_decal/loading_area,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/light/small/directional/west,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"cjZ" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 6
@@ -41109,6 +41033,7 @@
/obj/effect/turf_decal/stripes/corner,
/obj/effect/spawner/lootdrop/maintenance,
/obj/effect/loot_site_spawner,
+/obj/structure/closet/cardboard,
/turf/open/floor/plating{
icon_state = "platingdmg3"
},
@@ -41135,6 +41060,11 @@
},
/turf/open/floor/iron,
/area/hallway/secondary/exit/departure_lounge)
+"cOD" = (
+/obj/machinery/space_heater,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"cPa" = (
/turf/closed/wall/r_wall/rust,
/area/security/prison/safe)
@@ -41625,6 +41555,15 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/grass,
/area/service/chapel/main)
+"cZU" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"cZV" = (
/obj/effect/turf_decal/tile/brown,
/obj/effect/turf_decal/tile/brown{
@@ -41748,6 +41687,17 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron,
/area/security/brig)
+"dcM" = (
+/obj/machinery/door/poddoor{
+ id = "toxinsdriver";
+ name = "Toxins Launcher Bay Door"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"dcO" = (
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/tile/neutral{
@@ -42581,6 +42531,12 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/service/janitor)
+"dxa" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/closed/wall,
+/area/maintenance/starboard)
"dxn" = (
/obj/machinery/air_sensor/atmos/nitrous_tank,
/turf/open/floor/engine/n2o,
@@ -42610,6 +42566,31 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/command/heads_quarters/cmo)
+"dxS" = (
+/obj/structure/table,
+/obj/machinery/cell_charger{
+ pixel_y = 5
+ },
+/obj/item/stock_parts/cell/high,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/machinery/light/directional/south,
+/obj/item/stock_parts/cell/high{
+ pixel_x = 8;
+ pixel_y = -2
+ },
+/obj/item/stock_parts/cell/high{
+ pixel_x = 8;
+ pixel_y = 9
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"dyi" = (
/obj/effect/landmark/start/bartender,
/turf/open/floor/wood,
@@ -42830,6 +42811,11 @@
},
/turf/open/floor/iron,
/area/commons/storage/primary)
+"dDz" = (
+/obj/structure/lattice,
+/obj/structure/grille/broken,
+/turf/open/space/basic,
+/area/space)
"dDS" = (
/obj/machinery/porta_turret/ai{
dir = 1
@@ -43275,6 +43261,41 @@
/obj/item/pen,
/turf/open/floor/iron/dark,
/area/service/bar)
+"dPm" = (
+/obj/effect/turf_decal/stripes/corner,
+/obj/structure/table,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
+/obj/item/paper_bin{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/assembly/signaler{
+ desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted.";
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/item/assembly/signaler{
+ desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted.";
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/item/assembly/signaler{
+ desc = "Used to remotely activate devices. Allows for syncing when using a secure signaler on another. Slightly scooted.";
+ pixel_x = 8;
+ pixel_y = 4
+ },
+/obj/item/pen,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"dPy" = (
/obj/effect/turf_decal/tile/purple{
dir = 4
@@ -44634,6 +44655,10 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/engineering/supermatter/room)
+"ewV" = (
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space)
"exe" = (
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
@@ -46258,21 +46283,25 @@
},
/area/maintenance/starboard/aft)
"ffM" = (
-/obj/machinery/door/window/southleft{
- name = "Mass Driver Door";
- req_access_txt = "7"
- },
-/obj/effect/turf_decal/loading_area,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
},
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/light/small/directional/west,
-/turf/open/floor/iron/dark,
-/area/science/mixing)
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"ffO" = (
/obj/machinery/atmospherics/components/binary/pump{
dir = 4;
@@ -46305,6 +46334,17 @@
icon_state = "platingdmg3"
},
/area/engineering/supermatter/room)
+"fga" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/structure/cable,
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/maintenance/starboard)
"fgq" = (
/obj/machinery/conveyor{
dir = 4;
@@ -47991,6 +48031,17 @@
},
/turf/open/floor/iron/showroomfloor,
/area/security/warden)
+"fOT" = (
+/obj/machinery/doppler_array/research/science{
+ dir = 4
+ },
+/obj/item/radio/intercom/directional/east,
+/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"fOZ" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/effect/turf_decal/tile/blue{
@@ -48246,6 +48297,10 @@
/obj/machinery/status_display/evac/directional/south,
/turf/open/floor/iron,
/area/hallway/secondary/exit/departure_lounge)
+"fVn" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/test_area)
"fVr" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 9
@@ -48712,6 +48767,14 @@
/obj/effect/decal/cleanable/greenglow,
/turf/open/floor/iron/dark,
/area/engineering/gravity_generator)
+"giX" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/space)
"gjG" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -49740,6 +49803,25 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/service/chapel/office)
+"gGX" = (
+/obj/item/target,
+/obj/item/target/syndicate,
+/obj/item/target/alien,
+/obj/item/target/clown,
+/obj/structure/closet/crate/secure{
+ desc = "A secure crate containing various materials for building a customised test-site.";
+ name = "Test Site Materials Crate";
+ req_access_txt = "8"
+ },
+/obj/effect/turf_decal/bot,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"gHq" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 6
@@ -50428,6 +50510,23 @@
},
/turf/open/floor/iron/white,
/area/security/prison)
+"gZY" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"haI" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -51278,6 +51377,17 @@
},
/turf/open/floor/iron/dark,
/area/engineering/break_room)
+"hvo" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet/directional/north,
+/obj/machinery/component_printer,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"hwo" = (
/obj/item/storage/firstaid/regular{
pixel_x = 3;
@@ -52194,6 +52304,17 @@
"hUi" = (
/turf/open/floor/wood,
/area/service/library)
+"hUx" = (
+/obj/machinery/mass_driver{
+ dir = 4;
+ id = "toxinsdriver"
+ },
+/obj/effect/turf_decal/stripes/end{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/science/test_area)
"hUK" = (
/obj/item/radio{
pixel_x = 5;
@@ -53534,6 +53655,18 @@
},
/turf/open/floor/grass,
/area/service/chapel/main)
+"iAU" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"iBe" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/decal/cleanable/dirt,
@@ -55163,6 +55296,16 @@
},
/turf/open/floor/iron/dark,
/area/maintenance/starboard/aft)
+"jkW" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/power/apc/auto_name/north,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"jkY" = (
/obj/effect/turf_decal/bot,
/obj/machinery/holopad,
@@ -55452,6 +55595,33 @@
/obj/effect/landmark/event_spawn,
/turf/open/floor/iron/dark,
/area/service/bar)
+"jtb" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/machinery/button/massdriver{
+ id = "toxinsdriver";
+ pixel_x = 24;
+ pixel_y = -24
+ },
+/obj/machinery/computer/security/telescreen{
+ desc = "Used for watching the test chamber.";
+ dir = 8;
+ layer = 4;
+ name = "Test Chamber Telescreen";
+ network = list("toxins");
+ pixel_x = 30
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/light/small/directional/south,
+/obj/machinery/airalarm/directional/south,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"jtw" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/loot_site_spawner,
@@ -60540,16 +60710,20 @@
/turf/open/floor/engine/vacuum,
/area/maintenance/disposal/incinerator)
"lxK" = (
-/obj/machinery/doppler_array/research/science{
- dir = 4
- },
-/obj/item/radio/intercom/directional/east,
-/obj/effect/turf_decal/delivery,
+/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/table,
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 5
+ },
+/obj/structure/cable,
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
/turf/open/floor/iron/dark,
-/area/science/mixing)
+/area/science/test_area)
"lxO" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -61081,6 +61255,21 @@
/obj/structure/closet/athletic_mixed,
/turf/open/floor/plating,
/area/maintenance/port/aft)
+"lKm" = (
+/obj/effect/turf_decal/loading_area{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating{
+ icon_state = "platingdmg1"
+ },
+/area/science/test_area)
"lKu" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable,
@@ -61439,6 +61628,11 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/aisat/foyer)
+"lTo" = (
+/obj/structure/lattice/catwalk,
+/obj/structure/railing,
+/turf/open/space/basic,
+/area/space)
"lTM" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -64429,6 +64623,21 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+"nlf" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"nlh" = (
/obj/structure/frame/machine,
/obj/effect/turf_decal/stripes/line{
@@ -64595,6 +64804,10 @@
icon_state = "platingdmg3"
},
/area/maintenance/port/aft)
+"npa" = (
+/obj/structure/sign/warning/securearea,
+/turf/closed/wall,
+/area/space)
"npd" = (
/obj/machinery/power/compressor{
comp_id = "incineratorturbine";
@@ -64925,6 +65138,22 @@
/obj/structure/extinguisher_cabinet/directional/west,
/turf/open/floor/iron/dark,
/area/security/courtroom)
+"nzb" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"nzl" = (
/obj/machinery/airalarm/directional/south,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
@@ -66509,6 +66738,18 @@
},
/turf/open/floor/iron/dark,
/area/engineering/main)
+"ojK" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 4
+ },
+/turf/open/floor/plating{
+ icon_state = "panelscorched"
+ },
+/area/science/test_area)
"ojM" = (
/obj/effect/turf_decal/delivery,
/obj/effect/turf_decal/tile/neutral{
@@ -66639,6 +66880,11 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/command/heads_quarters/hop)
+"olO" = (
+/obj/structure/lattice,
+/obj/structure/grille,
+/turf/open/space/basic,
+/area/space)
"olX" = (
/obj/structure/flora/grass/jungle,
/obj/structure/flora/ausbushes/grassybush,
@@ -67993,24 +68239,6 @@
},
/turf/open/floor/iron,
/area/cargo/storage)
-"oOa" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/machinery/light/small/directional/north,
-/obj/machinery/camera{
- c_tag = "Toxins Launch Site";
- name = "science camera";
- network = list("ss13","rd")
- },
-/obj/structure/extinguisher_cabinet/directional/north,
-/obj/structure/sign/warning/explosives/alt{
- pixel_x = -32
- },
-/obj/machinery/research/explosive_compressor,
-/turf/open/floor/iron/dark,
-/area/science/mixing)
"oOf" = (
/turf/open/floor/engine/plasma,
/area/engineering/atmos)
@@ -68933,6 +69161,17 @@
icon_state = "platingdmg1"
},
/area/maintenance/disposal/incinerator)
+"pji" = (
+/obj/machinery/door/airlock/external{
+ name = "External Airlock";
+ req_access_txt = "13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/obj/structure/cable,
+/turf/open/floor/iron/dark,
+/area/space/nearstation)
"pjn" = (
/obj/effect/turf_decal/stripes/line{
dir = 1
@@ -75724,6 +75963,22 @@
},
/turf/open/floor/wood,
/area/commons/locker)
+"shr" = (
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/light/small/directional/north,
+/obj/machinery/camera{
+ c_tag = "Toxins Launch Site";
+ name = "science camera";
+ network = list("ss13","rd")
+ },
+/obj/machinery/research/explosive_compressor,
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"sih" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 1
@@ -76476,6 +76731,20 @@
/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/dark,
/area/engineering/storage/tcomms)
+"sDo" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating{
+ icon_state = "platingdmg3"
+ },
+/area/maintenance/starboard)
"sDp" = (
/obj/structure/sign/warning/securearea,
/turf/closed/wall/rust,
@@ -77842,6 +78111,23 @@
},
/turf/open/floor/iron/dark,
/area/command/heads_quarters/captain)
+"tno" = (
+/obj/structure/table,
+/obj/item/multitool/circuit{
+ pixel_x = -8
+ },
+/obj/item/multitool/circuit{
+ pixel_x = -4
+ },
+/obj/item/multitool/circuit,
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple,
+/obj/machinery/firealarm/directional/south,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"tnC" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -78010,6 +78296,9 @@
/obj/machinery/status_display/evac/directional/west,
/turf/open/floor/iron/dark,
/area/security/processing)
+"tpF" = (
+/turf/closed/wall,
+/area/science/test_area)
"tpP" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -78518,6 +78807,20 @@
},
/turf/open/floor/plating,
/area/commons/fitness/recreation)
+"tAG" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/purple,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"tAI" = (
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
@@ -79670,32 +79973,19 @@
/turf/open/floor/iron/dark,
/area/command/teleporter)
"tWc" = (
-/obj/structure/chair{
- dir = 4
- },
-/obj/machinery/button/massdriver{
- id = "toxinsdriver";
- pixel_x = 24;
- pixel_y = -24
- },
-/obj/machinery/computer/security/telescreen{
- desc = "Used for watching the test chamber.";
- dir = 8;
- layer = 4;
- name = "Test Chamber Telescreen";
- network = list("toxins");
- pixel_x = 30
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/tile/purple,
+/obj/effect/turf_decal/tile/purple,
+/obj/machinery/modular_computer/console/preset/civilian{
dir = 8
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
},
-/obj/machinery/light/small/directional/south,
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron/dark,
-/area/science/mixing)
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/iron/showroomfloor,
+/area/science/test_area)
"tWd" = (
/obj/structure/flora/grass/jungle/b,
/obj/structure/flora/ausbushes/ywflowers,
@@ -79735,6 +80025,26 @@
/obj/effect/turf_decal/tile/neutral,
/turf/open/floor/iron/dark,
/area/command/heads_quarters/rd)
+"tWQ" = (
+/obj/structure/chair{
+ dir = 4
+ },
+/obj/machinery/computer/security/telescreen{
+ desc = "Used for watching the test chamber.";
+ dir = 8;
+ layer = 4;
+ name = "Test Chamber Telescreen";
+ network = list("toxins");
+ pixel_x = 30
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/turf/open/floor/iron/dark,
+/area/science/test_area)
"tXk" = (
/obj/structure/table,
/obj/effect/turf_decal/tile/neutral{
@@ -80283,6 +80593,14 @@
},
/turf/open/floor/plating,
/area/cargo/warehouse)
+"uhx" = (
+/obj/effect/loot_site_spawner,
+/obj/structure/closet/crate{
+ icon_state = "crateopen"
+ },
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"uhO" = (
/obj/machinery/light/floor,
/turf/open/floor/engine/vacuum,
@@ -83215,6 +83533,9 @@
},
/turf/open/floor/iron/dark,
/area/science/xenobiology)
+"vun" = (
+/turf/closed/wall/rust,
+/area/space)
"vuX" = (
/obj/effect/turf_decal/box/corners,
/obj/effect/turf_decal/tile/neutral,
@@ -84377,6 +84698,17 @@
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/iron/dark,
/area/security/interrogation)
+"vUr" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 6
+ },
+/obj/structure/cable,
+/obj/effect/decal/cleanable/dirt,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"vUt" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -84523,6 +84855,15 @@
/obj/effect/landmark/start/security_officer,
/turf/open/floor/iron/dark,
/area/security/office)
+"vXM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 9
+ },
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"vXS" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 1
@@ -87042,15 +87383,19 @@
/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/effect/turf_decal/tile/purple{
- dir = 8
- },
/obj/effect/turf_decal/tile/purple{
dir = 1
},
-/obj/machinery/firealarm/directional/west,
+/obj/structure/rack,
+/obj/effect/turf_decal/tile/purple{
+ dir = 8
+ },
+/obj/item/controller,
+/obj/machinery/light/directional/west,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
/turf/open/floor/iron/showroomfloor,
-/area/science/mixing)
+/area/science/test_area)
"xfz" = (
/obj/machinery/door/firedoor,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
@@ -88735,6 +89080,9 @@
/obj/effect/landmark/start/hangover,
/turf/open/floor/iron,
/area/hallway/primary/fore)
+"xOP" = (
+/turf/closed/wall/rust,
+/area/science/test_area)
"xPl" = (
/obj/effect/turf_decal/bot,
/obj/machinery/disposal/bin,
@@ -89540,6 +89888,10 @@
},
/turf/open/floor/iron,
/area/engineering/break_room)
+"yib" = (
+/obj/structure/girder,
+/turf/open/floor/plating,
+/area/maintenance/starboard)
"yid" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/door/poddoor/shutters{
@@ -131228,14 +131580,14 @@ bdh
aPm
aOF
bcf
-bbN
-oOa
+tpF
+tpF
xfe
bkX
ffM
anS
-bbN
-bfw
+vXM
+bic
bic
wkN
loE
@@ -131490,9 +131842,9 @@ bcR
bdV
bej
baC
-cbe
-bcD
-azG
+tpF
+yib
+vUr
bkd
pDR
wkN
@@ -131744,12 +132096,12 @@ aOQ
bcj
bgy
aYc
-bcS
+bdV
bek
-baC
-bpg
-bbN
-bfM
+tno
+xOP
+uhx
+vUr
avA
acm
wJf
@@ -132003,10 +132355,10 @@ beH
lxK
bcb
tWc
-bbN
-cbf
-bbN
-bfQ
+dxS
+xOP
+cOD
+vUr
avA
acm
wJf
@@ -132256,14 +132608,14 @@ beo
hdj
aOT
bbi
-awi
-bbN
-baC
-baC
-bcD
-cbg
-cbk
-bfW
+caT
+hvo
+iAU
+dPm
+tpF
+tpF
+xOP
+vUr
bkd
qJs
tIc
@@ -132514,14 +132866,14 @@ cbk
aOU
aRE
aSQ
-aUZ
-aYi
-aYZ
-baN
-bdj
-aWN
-bfX
-ava
+shr
+bdV
+nzb
+cjV
+hUx
+tpF
+bfw
+dxa
aaa
aaa
aaa
@@ -132769,15 +133121,15 @@ aim
alT
lqr
aOY
-cbj
-aLP
-auz
-cOn
-cOo
-hqC
-cuf
-cbm
-bgb
+fga
+aSQ
+gGX
+iAU
+gZY
+fVn
+lKm
+xOP
+sDo
bkd
aaa
aaa
@@ -133026,16 +133378,16 @@ cOr
aKl
cOv
ava
-bkd
-bkd
-ava
+cZU
+xOP
+jkW
+nlf
+tAG
+fVn
+ojK
+tpF
+bfM
avA
-avA
-bkd
-bBX
-ava
-iYL
-bkd
aaa
aaa
aaa
@@ -133283,16 +133635,16 @@ avA
aKn
avA
bkd
-aeu
-aeu
-aeu
-acm
-aaa
-acm
-aaa
-bkd
-bge
-ava
+cZU
+tpF
+fOT
+tWQ
+jtb
+tpF
+dcM
+tpF
+bfQ
+avA
aaa
aaa
aaa
@@ -133540,16 +133892,16 @@ cmi
aKr
cCs
ava
-aeu
-alm
-acm
-aaQ
-aeo
-aeo
-acm
-acm
-bgf
-acm
+cZU
+xOP
+tpF
+fVn
+fVn
+xOP
+cbg
+cbk
+bfW
+bkd
aaa
aaa
aaa
@@ -133797,16 +134149,16 @@ agy
cLR
agy
bkd
-aeu
-aeU
-aaa
-acm
-aaa
-acm
-aaa
-acm
-qDp
-acm
+cZU
+cZU
+aUZ
+aYi
+aYZ
+baN
+bdj
+aWN
+bfX
+ava
aaa
aaa
aaa
@@ -134054,16 +134406,16 @@ aaa
aaa
aaa
bhq
-aeu
-aUz
-aaa
-aaQ
-aaa
-acm
-aaa
-acm
-qDp
-aaa
+avA
+avA
+auz
+cOn
+cOo
+hqC
+cuf
+cbm
+bgb
+bkd
aaa
aaa
aaa
@@ -134311,16 +134663,16 @@ aaa
aaa
aaa
akA
-aeu
aeU
-aaa
-aeo
-aaa
-acm
-aaa
-acm
-eiW
-aaa
+aeU
+ava
+avA
+avA
+bkd
+bBX
+ava
+iYL
+bkd
aaa
aaa
aaa
@@ -134569,15 +134921,15 @@ aaa
aaa
aod
aeu
-aeu
aeU
-acm
+aUz
+cry
aaa
-acK
acm
-acK
-viq
-aaa
+acm
+anH
+pji
+vun
aaa
aaa
aaa
@@ -134826,15 +135178,15 @@ cOd
aob
aoe
aeu
-aeu
-aeu
+aeU
+aeU
alm
acm
-acm
+aeo
aaa
acm
-viq
-aaa
+bgf
+cmJ
aaa
aaa
aaa
@@ -135083,14 +135435,14 @@ acm
acK
qJs
aeu
-aeu
+aUz
aeu
aeu
aaa
acm
aaa
acm
-acK
+qDp
aaa
qJs
acm
@@ -135344,10 +135696,10 @@ aeu
aeu
aeu
aaa
-aeo
-aaa
acm
+aaa
acK
+qDp
acm
aaQ
aeo
@@ -135601,10 +135953,10 @@ aeu
aeu
aeu
aeu
-aeo
+acm
aaa
acm
-acK
+eiW
aaa
aaa
acm
@@ -135858,10 +136210,10 @@ aeu
aeu
aeu
aeu
-aaQ
+acK
aaa
acm
-qDp
+viq
aaQ
aeo
aeo
@@ -136118,7 +136470,7 @@ aeu
acm
aaa
acm
-eiW
+viq
aaa
acm
aaa
@@ -136375,7 +136727,7 @@ acm
acm
aaa
acm
-jTL
+acK
aeo
aeo
aaa
@@ -136629,9 +136981,9 @@ aeu
aeu
aeU
aaa
-acK
+aeo
+acm
acm
-acK
acK
acm
aaa
@@ -136886,9 +137238,9 @@ aeu
aeU
aUz
aaa
-acm
+aeo
aaa
-aaQ
+acm
acK
aeo
aaa
@@ -137143,10 +137495,10 @@ aeu
aeU
aaa
aaa
-acm
+aaQ
aaa
-aeo
-viq
+acm
+qDp
aaa
aaa
aaa
@@ -137402,13 +137754,13 @@ aaa
aaa
acm
aaa
-aeo
acK
+eiW
aeo
aaQ
aaa
aaa
-aaB
+aaa
aaa
aaa
aaa
@@ -137657,10 +138009,10 @@ aaa
aaa
aaa
aaa
-aaQ
+acm
aaa
-aeo
-acK
+aaQ
+jTL
aaa
aaa
aaa
@@ -137910,14 +138262,14 @@ aeu
aUz
aaa
aaa
-aaB
aaa
aaa
aaa
+aaa
+acK
+aaa
aeo
-aaa
-acm
-viq
+acK
aaa
aaa
aaa
@@ -138171,10 +138523,10 @@ aaa
aaa
aaa
aaa
-aeo
+acm
aaa
-aaQ
-eiW
+aeo
+acK
aaa
aaa
aaa
@@ -138430,8 +138782,8 @@ aaa
aaa
acm
aaa
-acm
-acK
+aeo
+viq
aaa
aaa
aaa
@@ -138962,10 +139314,10 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
+cqi
+cqi
+cqi
+cmJ
aaa
aaa
aaa
@@ -139219,13 +139571,13 @@ aaa
aaa
aaa
aaa
+cqi
+npa
+cmJ
+dDz
+olO
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cmJ
aaa
aaa
aaa
@@ -139476,10 +139828,10 @@ aaa
aaa
aaa
aaa
+cqi
+uku
aaa
-aaa
-aaa
-aaa
+cmJ
aaa
aaa
aaa
@@ -139733,10 +140085,10 @@ aaa
aaa
aaa
aaa
+cqi
+dNv
aaa
-aaa
-aaa
-aaa
+dDz
aaa
aaa
aaa
@@ -139990,10 +140342,10 @@ aaa
aaa
aaa
aaa
+cqi
+uku
aaa
-aaa
-aaa
-aaa
+olO
aaa
aaa
aaa
@@ -140247,13 +140599,13 @@ aaa
aaa
aaa
aaa
+cqi
+cqi
+uku
+cmJ
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+cmJ
aaa
aaa
aaa
@@ -142309,7 +142661,7 @@ aaa
aaa
aaa
aaa
-aaa
+cmJ
aaa
aaa
aaa
@@ -143079,15 +143431,15 @@ aaa
aaa
aaa
aaa
+cmJ
+aaa
+aaa
+ewV
aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
-aaa
-aaa
+aaB
aaa
aaa
aaa
@@ -143336,10 +143688,10 @@ aaa
aaa
aaa
aaa
+dDz
aaa
aaa
-aaa
-aaa
+ewV
aaa
aaa
aaa
@@ -143589,14 +143941,14 @@ aaa
aaa
aaa
aaa
+aaB
aaa
aaa
aaa
+olO
aaa
-aaa
-aaa
-aaa
-aaa
+cmJ
+lTo
aaa
aaa
aaa
@@ -143850,10 +144202,10 @@ aaa
aaa
aaa
aaa
+olO
aaa
-aaa
-aaa
-aaa
+dDz
+giX
aaa
aaa
aaa
@@ -144107,10 +144459,10 @@ aaa
aaa
aaa
aaa
+cmJ
aaa
-aaa
-aaa
-aaa
+cmJ
+ewV
aaa
aaa
aaa
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index a4b5105bfd4..e7188af4eaa 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -2744,6 +2744,27 @@
/obj/structure/cable,
/turf/open/floor/iron,
/area/security/brig)
+"atX" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/northleft{
+ dir = 2;
+ name = "Atmospherics Desk";
+ req_access_txt = "24"
+ },
+/obj/item/folder/yellow,
+/obj/item/pen,
+/obj/machinery/door/firedoor,
+/obj/machinery/door/poddoor/preopen{
+ id = "atmos";
+ name = "Atmospherics Blast Door"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/structure/cable,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"aua" = (
/obj/structure/table/reinforced,
/obj/item/folder/red,
@@ -3469,6 +3490,12 @@
},
/turf/open/floor/iron,
/area/security/brig)
+"azM" = (
+/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos)
"azP" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/chair,
@@ -7959,6 +7986,16 @@
dir = 4
},
/area/medical/break_room)
+"brK" = (
+/obj/effect/turf_decal/trimline/blue/filled/corner,
+/obj/effect/turf_decal/trimline/brown/filled/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/purple/filled/warning{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"brO" = (
/obj/structure/transit_tube/diagonal/topleft,
/turf/open/space,
@@ -15854,17 +15891,6 @@
},
/turf/open/floor/iron,
/area/command/heads_quarters/ce)
-"cWc" = (
-/obj/structure/table,
-/obj/item/reagent_containers/glass/beaker/large{
- pixel_y = 6
- },
-/obj/item/reagent_containers/dropper{
- pixel_y = -5
- },
-/obj/machinery/airalarm/directional/south,
-/turf/open/floor/iron,
-/area/science/misc_lab)
"cWl" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -18111,6 +18137,10 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
/turf/open/floor/iron/dark,
/area/security/brig)
+"dCg" = (
+/obj/machinery/component_printer,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"dCi" = (
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance,
@@ -19394,6 +19424,7 @@
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/iron/white,
/area/maintenance/aft/secondary)
+<<<<<<< HEAD
"dZg" = (
/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
/obj/effect/spawner/structure/window/reinforced,
@@ -19402,6 +19433,8 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"eae" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -21084,6 +21117,14 @@
},
/turf/open/floor/iron/white,
/area/science/mixing)
+"eAF" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"eAP" = (
/obj/machinery/holopad,
/obj/structure/cable,
@@ -23208,6 +23249,14 @@
},
/turf/open/floor/plating/airless,
/area/maintenance/space_hut)
+"fiB" = (
+/obj/structure/table,
+/obj/structure/cable,
+/obj/item/controller,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"fiJ" = (
/obj/structure/table,
/obj/machinery/recharger,
@@ -26579,6 +26628,7 @@
/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron,
/area/command/heads_quarters/rd)
+<<<<<<< HEAD
"grs" = (
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
@@ -26593,6 +26643,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"grw" = (
/obj/machinery/light/directional/west,
/obj/machinery/computer/camera_advanced/base_construction/aux{
@@ -27657,13 +27709,6 @@
},
/turf/open/floor/iron,
/area/science/xenobiology)
-"gIA" = (
-/obj/effect/decal/cleanable/dirt,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 10
- },
-/turf/open/floor/engine,
-/area/science/misc_lab/range)
"gIF" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/purple{
@@ -27935,20 +27980,6 @@
/obj/effect/turf_decal/tile/purple,
/turf/open/floor/iron,
/area/hallway/primary/aft)
-"gQp" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/door/window/northright{
- dir = 8;
- name = "Research Test Chamber";
- req_access_txt = "7"
- },
-/turf/open/floor/engine,
-/area/science/misc_lab/range)
"gQU" = (
/obj/structure/window/reinforced,
/obj/effect/turf_decal/tile/blue{
@@ -31204,12 +31235,6 @@
},
/turf/open/floor/plating,
/area/maintenance/disposal)
-"ibT" = (
-/obj/machinery/power/apc/auto_name/north,
-/obj/structure/cable,
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"icp" = (
/obj/machinery/light/directional/south,
/obj/machinery/aug_manipulator,
@@ -32272,6 +32297,23 @@
},
/turf/open/floor/iron/white,
/area/science/research)
+"isK" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"isO" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
@@ -33353,6 +33395,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/wood,
/area/service/bar)
+<<<<<<< HEAD
"iNB" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/northleft{
@@ -33375,6 +33418,8 @@
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden,
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"iND" = (
/obj/machinery/door/airlock/external{
name = "Escape Pod Two"
@@ -35742,6 +35787,19 @@
/obj/structure/cable,
/turf/open/floor/plating,
/area/commons/storage/primary)
+"jHt" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"jHx" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
@@ -36092,15 +36150,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/maintenance/port)
-"jNE" = (
-/obj/structure/window/reinforced{
- dir = 8
- },
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
- dir = 4
- },
-/turf/open/floor/engine,
-/area/science/misc_lab/range)
"jNH" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 8
@@ -36212,12 +36261,6 @@
dir = 8
},
/area/science/lab)
-"jPj" = (
-/obj/structure/table,
-/obj/item/crowbar,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"jPt" = (
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/trimline/purple/corner{
@@ -36609,12 +36652,15 @@
"jVV" = (
/turf/closed/wall/r_wall,
/area/command/heads_quarters/hos)
+<<<<<<< HEAD
"jVY" = (
/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
dir = 4
},
/turf/open/space,
/area/space/nearstation)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"jWu" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -36734,6 +36780,11 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard)
+"jXY" = (
+/obj/effect/decal/cleanable/dirt,
+/obj/effect/landmark/start/scientist,
+/turf/open/floor/engine,
+/area/science/misc_lab/range)
"jYj" = (
/obj/structure/chair/stool{
pixel_y = 8
@@ -36986,6 +37037,12 @@
},
/turf/open/floor/iron,
/area/service/hydroponics)
+"kcX" = (
+/obj/structure/rack,
+/obj/item/integrated_circuit/loaded/hello_world,
+/obj/item/integrated_circuit/loaded/speech_relay,
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"kdb" = (
/obj/machinery/computer/security/mining,
/obj/machinery/keycard_auth/directional/north,
@@ -38110,6 +38167,15 @@
/obj/machinery/light_switch/directional/east,
/turf/open/floor/iron,
/area/security/office)
+"kwZ" = (
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/binary/thermomachine/heater,
+/turf/open/floor/iron/dark/corner{
+ dir = 1
+ },
+/area/engineering/atmos)
"kxl" = (
/obj/effect/turf_decal/tile/neutral{
dir = 8
@@ -38893,6 +38959,12 @@
/obj/effect/landmark/blobstart,
/turf/open/floor/iron,
/area/cargo/warehouse)
+"kJS" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"kJV" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -39148,6 +39220,13 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/service/bar)
+"kPm" = (
+/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{
+ dir = 4
+ },
+/obj/structure/lattice,
+/turf/open/space,
+/area/space/nearstation)
"kPn" = (
/obj/structure/table/reinforced,
/obj/item/folder/yellow,
@@ -41247,6 +41326,7 @@
/obj/structure/chair/comfy/black,
/turf/open/floor/iron/dark,
/area/security/office)
+<<<<<<< HEAD
"lza" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible,
@@ -41255,6 +41335,8 @@
},
/turf/open/floor/plating,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"lzj" = (
/obj/structure/table,
/obj/item/hand_labeler,
@@ -41559,6 +41641,14 @@
},
/turf/open/floor/iron,
/area/commons/vacant_room/commissary)
+"lGi" = (
+/obj/effect/turf_decal/tile/purple,
+/obj/structure/cable,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"lGl" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
@@ -43354,6 +43444,13 @@
},
/turf/open/floor/carpet,
/area/commons/vacant_room/office)
+"mle" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engineering/atmos)
"mlo" = (
/obj/structure/cable,
/obj/machinery/door/airlock/maintenance{
@@ -45136,6 +45233,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/engine,
/area/engineering/supermatter)
+<<<<<<< HEAD
"mNQ" = (
/obj/machinery/computer/atmos_control/tank/mix_tank{
dir = 8
@@ -45146,6 +45244,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"mNW" = (
/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/dark,
@@ -46082,6 +46182,14 @@
/obj/machinery/duct,
/turf/open/floor/iron/freezer,
/area/commons/toilet/restrooms)
+"ncQ" = (
+/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible,
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 4;
+ name = "Mix to Engine"
+ },
+/turf/open/floor/iron,
+/area/engineering/atmos)
"ncV" = (
/obj/machinery/button/door/directional/west{
id = "transitlockdown";
@@ -46287,15 +46395,6 @@
},
/turf/open/floor/iron/white,
/area/medical/virology)
-"nfX" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"nfZ" = (
/obj/structure/sign/poster/contraband/missing_gloves,
/turf/closed/wall,
@@ -49043,10 +49142,6 @@
},
/turf/open/floor/iron,
/area/science/mixing)
-"nXH" = (
-/obj/item/kirbyplants/random,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"nYo" = (
/obj/effect/turf_decal/trimline/red/filled/line{
dir = 4
@@ -50407,6 +50502,7 @@
dir = 1
},
/area/command/gateway)
+<<<<<<< HEAD
"owa" = (
/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible,
/obj/machinery/atmospherics/components/binary/pump{
@@ -50415,6 +50511,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"owm" = (
/obj/structure/lattice/catwalk,
/turf/open/space/basic,
@@ -54925,6 +55023,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/carpet,
/area/service/library)
+<<<<<<< HEAD
"pVT" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -54934,6 +55033,8 @@
dir = 1
},
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"pVX" = (
/obj/machinery/light_switch/directional/north,
/turf/open/floor/iron/freezer,
@@ -56831,17 +56932,6 @@
},
/turf/open/floor/iron/white,
/area/medical/medbay/central)
-"qDm" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 9
- },
-/obj/effect/decal/cleanable/dirt,
-/obj/effect/landmark/start/scientist,
-/turf/open/floor/engine,
-/area/science/misc_lab/range)
"qDr" = (
/obj/machinery/status_display/evac/directional/north,
/obj/machinery/porta_turret/ai,
@@ -59051,12 +59141,6 @@
/obj/structure/sign/warning/securearea,
/turf/closed/wall/r_wall,
/area/science/mixing)
-"rpH" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 9
- },
-/turf/open/floor/engine,
-/area/science/misc_lab/range)
"rpK" = (
/obj/structure/urinal/directional/north,
/obj/effect/landmark/start/hangover,
@@ -60182,6 +60266,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/hallway/primary/central)
+"rHp" = (
+/obj/machinery/door/window/northright{
+ dir = 8;
+ name = "Research Test Chamber";
+ req_access_txt = "7"
+ },
+/turf/open/floor/engine,
+/area/science/misc_lab/range)
"rHI" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -62391,12 +62483,15 @@
/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/service/chapel/main)
+<<<<<<< HEAD
"srl" = (
/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{
dir = 9
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"ssm" = (
/obj/machinery/portable_atmospherics/canister/oxygen,
/obj/effect/turf_decal/bot,
@@ -64523,6 +64618,14 @@
},
/turf/open/floor/iron,
/area/hallway/primary/port)
+"tbP" = (
+/obj/structure/table,
+/obj/machinery/airalarm/directional/south,
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"tbR" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
@@ -66995,6 +67098,7 @@
/obj/effect/spawner/lootdrop/gross_decal_spawner,
/turf/open/floor/wood,
/area/maintenance/port/aft)
+<<<<<<< HEAD
"tTH" = (
/obj/machinery/light{
dir = 4
@@ -67011,6 +67115,8 @@
},
/turf/open/floor/iron,
/area/engineering/atmos)
+=======
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
"tTJ" = (
/obj/machinery/mass_driver/toxins,
/turf/open/floor/plating,
@@ -67491,11 +67597,6 @@
/obj/effect/loot_site_spawner,
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"ucA" = (
-/obj/effect/turf_decal/tile/purple,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"ucI" = (
/obj/machinery/light/directional/south,
/obj/effect/turf_decal/tile/neutral,
@@ -68924,13 +69025,6 @@
/obj/machinery/holopad,
/turf/open/floor/iron,
/area/commons/locker)
-"uxB" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
- dir = 8
- },
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"uxN" = (
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -70914,6 +71008,17 @@
/obj/machinery/status_display/evac/directional/south,
/turf/open/floor/engine,
/area/engineering/supermatter/room)
+"vhc" = (
+/obj/machinery/computer/atmos_control/tank/mix_tank{
+ dir = 8
+ },
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"vhr" = (
/obj/machinery/airalarm/directional/south,
/obj/effect/turf_decal/tile/neutral{
@@ -71382,13 +71487,6 @@
/obj/structure/cable,
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai)
-"vns" = (
-/obj/structure/table,
-/obj/item/flashlight/lamp,
-/obj/machinery/power/apc/auto_name/north,
-/obj/structure/cable,
-/turf/open/floor/iron/white,
-/area/science/misc_lab/range)
"vnv" = (
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
@@ -72995,6 +73093,21 @@
},
/turf/open/floor/iron/dark,
/area/science/robotics/lab)
+"vPY" = (
+/obj/effect/turf_decal/tile/green,
+/obj/effect/turf_decal/tile/green{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/green{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Unfiltered & Air to Mix"
+ },
+/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4,
+/turf/open/floor/iron,
+/area/engineering/atmos)
"vQs" = (
/obj/structure/table,
/obj/item/stock_parts/subspace/transmitter,
@@ -73012,6 +73125,19 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden,
/turf/open/floor/plating,
/area/engineering/supermatter/room)
+"vQQ" = (
+/obj/structure/table,
+/obj/machinery/power/apc/auto_name/north,
+/obj/structure/cable,
+/obj/item/multitool/circuit{
+ pixel_x = 7
+ },
+/obj/item/multitool/circuit,
+/obj/item/multitool/circuit{
+ pixel_x = -8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab/range)
"vRT" = (
/obj/machinery/light/directional/south,
/obj/item/stack/sheet/cardboard{
@@ -76005,18 +76131,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/turf/open/floor/plating,
/area/maintenance/aft)
-"wVM" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 8
- },
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 4
- },
-/obj/effect/turf_decal/tile/purple{
- dir = 1
- },
-/turf/open/floor/iron/white,
-/area/science/misc_lab)
"wWa" = (
/obj/effect/turf_decal/tile/blue{
dir = 8
@@ -76772,6 +76886,13 @@
icon_state = "platingdmg2"
},
/area/maintenance/starboard)
+"xiB" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/engineering/atmos)
"xiO" = (
/obj/machinery/light/small/directional/south,
/obj/effect/turf_decal/stripes/red/line,
@@ -77366,17 +77487,6 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron,
/area/commons/locker)
-"xtp" = (
-/obj/structure/table,
-/obj/effect/turf_decal/trimline/blue/filled/corner,
-/obj/effect/turf_decal/trimline/brown/filled/line{
- dir = 4
- },
-/obj/effect/turf_decal/trimline/purple/filled/warning{
- dir = 4
- },
-/turf/open/floor/iron,
-/area/science/misc_lab)
"xtw" = (
/obj/item/stack/rods,
/turf/open/space/basic,
@@ -77872,6 +77982,15 @@
},
/turf/open/floor/iron,
/area/hallway/primary/central)
+"xAx" = (
+/obj/effect/turf_decal/tile/purple{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron/white,
+/area/science/misc_lab)
"xAy" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -78967,6 +79086,18 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/medical/medbay/central)
+"xRK" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 6
+ },
+/turf/open/floor/engine,
+/area/science/misc_lab/range)
"xRU" = (
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
@@ -113057,7 +113188,7 @@ hzH
hCb
awD
cXm
-cWc
+tbP
ihQ
ihQ
ihQ
@@ -113310,11 +113441,11 @@ vey
quV
ooL
yeb
-ibT
+kcX
cYl
iPj
eCd
-xtp
+brK
nhL
qXy
hUy
@@ -113825,9 +113956,9 @@ cdU
oKY
yeb
yjC
-ucA
-uxB
-wVM
+lGi
+eAF
+xAx
sVU
nhL
oLk
@@ -114081,11 +114212,11 @@ wjL
quV
sUf
yeb
-vns
-jPj
-nfX
-wVM
-nXH
+vQQ
+fiB
+jHt
+kJS
+dCg
nhL
iYn
nGU
@@ -114340,8 +114471,8 @@ dlc
cuZ
fXC
dFB
-jNE
-gQp
+xRK
+rHp
fen
uDv
gTZ
@@ -114597,8 +114728,8 @@ ooL
cuZ
uzH
cwZ
-gIA
-qDm
+cFB
+jXY
dGP
uDv
lWY
@@ -114855,7 +114986,7 @@ cuZ
pcn
oxa
cFB
-rpH
+pcn
vNS
uDv
wLY
@@ -120225,7 +120356,7 @@ bqZ
wgC
lNR
nsB
-iNB
+atX
icJ
gZN
uvW
@@ -124089,7 +124220,7 @@ qJm
egV
hjv
hjv
-owa
+ncQ
cwM
hjv
hjv
@@ -124594,11 +124725,11 @@ aOY
kbv
iCt
jMk
-pVT
-srl
-tTH
-mNQ
-grs
+kwZ
+azM
+isK
+vhc
+vPY
nIZ
lxw
lVV
@@ -124853,9 +124984,15 @@ ack
jMk
jMk
jMk
+<<<<<<< HEAD
dZg
mjX
lza
+=======
+mle
+cor
+xiB
+>>>>>>> b84a9f97b28 (Integrated Circuits (Wiremod) (#59232))
cor
vNA
cor
@@ -125122,7 +125259,7 @@ bMx
aaf
cQi
aaf
-jVY
+kPm
aaf
cQi
aaf
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index ca8c20383ce..bdfb9f443cf 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -12459,6 +12459,7 @@
req_one_access_txt = "47"
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"aSq" = (
@@ -14816,6 +14817,14 @@
/obj/effect/landmark/start/cargo_technician,
/turf/open/floor/iron,
/area/cargo/storage)
+"bAq" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/maintenance/starboard/secondary)
"bAE" = (
/turf/open/floor/iron/dark,
/area/command/heads_quarters/cmo)
@@ -19724,6 +19733,9 @@
/obj/machinery/door/firedoor,
/turf/open/floor/iron,
/area/engineering/main)
+"duT" = (
+/turf/open/space/basic,
+/area/mine/explored)
"duU" = (
/obj/effect/turf_decal/trimline/yellow/filled/line{
dir = 9
@@ -19926,6 +19938,7 @@
},
/obj/effect/turf_decal/sand/plating,
/obj/item/assembly/mousetrap/armed,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"dzX" = (
@@ -20586,6 +20599,8 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/decal/cleanable/dirt,
/obj/effect/spawner/lootdrop/food_packaging,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"dKr" = (
@@ -21090,6 +21105,14 @@
/obj/effect/landmark/start/depsec/medical,
/turf/open/floor/iron,
/area/security/checkpoint/medical)
+"dVY" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 5
+ },
+/obj/machinery/light/directional/north,
+/obj/machinery/component_printer,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"dWa" = (
/obj/structure/weightmachine/weightlifter,
/obj/effect/turf_decal/trimline/red/filled/line{
@@ -24200,6 +24223,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/science/mixing)
"fiQ" = (
@@ -25254,6 +25278,7 @@
dir = 8
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"fFE" = (
@@ -31304,6 +31329,14 @@
},
/turf/open/floor/iron/white,
/area/medical/psychology)
+"hVW" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/machinery/power/apc/auto_name/north,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"hVZ" = (
/obj/structure/holosign/barrier/atmos,
/turf/open/floor/plating,
@@ -32130,6 +32163,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/science/mixing)
"iok" = (
@@ -32223,6 +32257,9 @@
dir = 10
},
/obj/effect/decal/cleanable/dirt,
+/obj/structure/cable,
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"iqY" = (
@@ -32519,6 +32556,15 @@
/obj/machinery/newscaster/security_unit/directional/north,
/turf/open/floor/iron/white,
/area/science/research)
+"ixB" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"ixJ" = (
/obj/machinery/door/airlock/command/glass{
name = "Bridge";
@@ -33751,6 +33797,10 @@
},
/turf/open/space/basic,
/area/space/nearstation)
+"iRT" = (
+/obj/structure/chair/office/light,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"iRW" = (
/obj/effect/turf_decal/trimline/red/filled/corner,
/obj/effect/turf_decal/trimline/red/filled/corner{
@@ -35844,6 +35894,12 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/turret_protected/aisat_interior)
+"jKX" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"jLa" = (
/obj/structure/table/glass,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
@@ -37045,11 +37101,18 @@
/turf/open/floor/iron/dark,
/area/service/bar)
"kgw" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/starboard/secondary)
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/machinery/light_switch/directional/west,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"kgy" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/obj/effect/turf_decal/trimline/blue/filled/line{
@@ -37639,6 +37702,10 @@
},
/turf/open/floor/wood,
/area/command/heads_quarters/hop)
+"kqO" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/science/misc_lab)
"kqR" = (
/obj/effect/landmark/xeno_spawn,
/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{
@@ -38141,6 +38208,7 @@
/obj/effect/turf_decal/trimline/purple/filled/line{
dir = 4
},
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/science/mixing)
"kAc" = (
@@ -38639,6 +38707,7 @@
/area/hallway/secondary/command)
"kIX" = (
/obj/effect/turf_decal/trimline/purple/filled/corner,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/science/mixing)
"kJo" = (
@@ -39767,6 +39836,7 @@
},
/obj/machinery/holopad,
/obj/effect/turf_decal/bot,
+/obj/structure/disposalpipe/segment,
/turf/open/floor/iron/white,
/area/science/mixing)
"lgb" = (
@@ -40038,12 +40108,12 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 8
},
-/obj/machinery/door/airlock/maintenance_hatch{
- name = "Research Maintnenace";
- req_one_access_txt = "47"
- },
/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
+/obj/machinery/door/airlock/research{
+ name = "Circuit Laboratory";
+ req_access_txt = "47"
+ },
+/turf/open/floor/iron,
/area/maintenance/starboard/secondary)
"lll" = (
/obj/effect/turf_decal/stripes/line{
@@ -43200,6 +43270,17 @@
},
/turf/open/floor/iron/dark,
/area/command/teleporter)
+"mzy" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/obj/structure/rack,
+/obj/machinery/light/directional/south,
+/obj/item/controller,
+/obj/item/compact_remote,
+/obj/item/compact_remote,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"mzF" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/grille/broken,
@@ -45538,15 +45619,20 @@
/turf/open/floor/engine,
/area/engineering/supermatter)
"nAo" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
- dir = 9
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 8
+ },
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 1
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
- dir = 9
+ dir = 4
},
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/starboard/secondary)
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"nAu" = (
/obj/effect/turf_decal/trimline/brown/filled/line{
dir = 4
@@ -47334,12 +47420,20 @@
/turf/open/floor/engine/plasma,
/area/engineering/atmos)
"omI" = (
-/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/grille/broken,
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/plating,
-/area/maintenance/starboard/secondary)
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 5
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"omZ" = (
/obj/effect/turf_decal/siding/thinplating/corner{
dir = 4
@@ -47561,6 +47655,21 @@
/obj/effect/turf_decal/trimline/purple/filled/line,
/turf/open/floor/iron/dark,
/area/science/xenobiology)
+"orv" = (
+/obj/machinery/door/airlock/maintenance_hatch{
+ name = "Research Maintnenace";
+ req_one_access_txt = "47"
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/plating,
+/area/science/misc_lab)
"orw" = (
/obj/effect/turf_decal/trimline/yellow/warning,
/obj/effect/decal/cleanable/dirt,
@@ -48355,6 +48464,15 @@
},
/turf/open/floor/iron/dark,
/area/ai_monitored/security/armory)
+"oHX" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 10
+ },
+/obj/structure/rack,
+/obj/item/integrated_circuit/loaded/speech_relay,
+/obj/item/integrated_circuit/loaded/hello_world,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"oIj" = (
/obj/effect/turf_decal/trimline/purple/filled/line,
/obj/effect/turf_decal/trimline/neutral/filled/warning,
@@ -49606,6 +49724,17 @@
/obj/structure/cable,
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/aisat_interior)
+"pft" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 1
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
+ dir = 8
+ },
+/obj/machinery/airalarm/directional/north,
+/obj/structure/cable,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"pfC" = (
/obj/structure/cable,
/obj/effect/turf_decal/trimline/purple/filled/corner{
@@ -49617,6 +49746,19 @@
/obj/machinery/light/small/directional/north,
/turf/open/floor/engine,
/area/science/xenobiology)
+"pfP" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 6
+ },
+/obj/structure/table,
+/obj/item/stock_parts/cell/high/plus{
+ pixel_x = -8;
+ pixel_y = 9
+ },
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"pgb" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/engine,
@@ -50479,6 +50621,9 @@
/turf/open/floor/iron/white,
/area/science/research)
"pwI" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/open/floor/iron/white,
/area/science/mixing)
"pwP" = (
@@ -53532,6 +53677,19 @@
/obj/machinery/navbeacon/wayfinding/incinerator,
/turf/open/floor/iron,
/area/maintenance/disposal/incinerator)
+"qKS" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/machinery/disposal/bin{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"qLb" = (
/obj/structure/industrial_lift/tram{
icon_state = "plating"
@@ -55769,6 +55927,13 @@
},
/turf/open/floor/iron,
/area/science/research)
+"rEw" = (
+/obj/effect/turf_decal/trimline/purple/filled/line,
+/obj/machinery/modular_computer/console/preset/civilian{
+ dir = 1
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"rFc" = (
/obj/machinery/rnd/production/circuit_imprinter,
/obj/effect/turf_decal/trimline/yellow/filled/end{
@@ -58725,15 +58890,15 @@
/turf/open/floor/plating,
/area/maintenance/central)
"sOv" = (
-/obj/structure/disposalpipe/segment{
- dir = 10
- },
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 10
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 10
},
+/obj/structure/disposalpipe/junction/flip{
+ dir = 8
+ },
/turf/open/floor/iron/white,
/area/science/mixing)
"sOF" = (
@@ -58823,6 +58988,9 @@
/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/white,
/area/medical/virology)
+"sQi" = (
+/turf/closed/wall,
+/area/science/misc_lab)
"sQq" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -63233,6 +63401,9 @@
},
/turf/open/openspace,
/area/hallway/primary/tram/left)
+"utS" = (
+/turf/open/floor/iron,
+/area/science/misc_lab)
"uus" = (
/obj/structure/table,
/obj/item/paper_bin{
@@ -65318,6 +65489,7 @@
dir = 8
},
/obj/effect/turf_decal/sand/plating,
+/obj/structure/cable,
/turf/open/floor/plating,
/area/maintenance/starboard/secondary)
"vmv" = (
@@ -66995,6 +67167,13 @@
/obj/effect/turf_decal/sand/plating,
/turf/open/floor/plating,
/area/security/office)
+"vVw" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner,
+/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
+ dir = 8
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"vVz" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
dir = 5
@@ -70722,6 +70901,12 @@
/obj/item/toy/figure/assistant,
/turf/open/floor/plating/airless,
/area/science/test_area)
+"xmK" = (
+/obj/structure/disposalpipe/segment{
+ dir = 10
+ },
+/turf/open/floor/iron/white,
+/area/science/mixing)
"xmN" = (
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/trimline/neutral/filled/line{
@@ -72562,6 +72747,23 @@
},
/turf/open/floor/engine,
/area/engineering/supermatter/room)
+"xVI" = (
+/obj/effect/turf_decal/trimline/purple/filled/corner{
+ dir = 4
+ },
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
+ dir = 8
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/turf/open/floor/iron,
+/area/science/misc_lab)
"xVP" = (
/obj/effect/turf_decal/siding/thinplating{
dir = 1
@@ -73166,6 +73368,27 @@
/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/engineering/atmos)
+"yit" = (
+/obj/effect/turf_decal/trimline/purple/filled/line{
+ dir = 4
+ },
+/obj/structure/table,
+/obj/item/multitool/circuit{
+ pixel_x = 7;
+ pixel_y = -4
+ },
+/obj/item/multitool/circuit{
+ pixel_y = -4
+ },
+/obj/item/multitool/circuit{
+ pixel_x = -8;
+ pixel_y = -4
+ },
+/obj/item/storage/toolbox/electrical{
+ pixel_y = 13
+ },
+/turf/open/floor/iron,
+/area/science/misc_lab)
"yiH" = (
/obj/effect/turf_decal/sand,
/obj/structure/closet/crate,
@@ -119027,7 +119250,7 @@ aRL
aRL
aRL
aRL
-aRL
+sQi
der
der
der
@@ -119271,7 +119494,7 @@ lVH
mSi
plm
iPd
-pwI
+xmK
lfS
kIX
ioj
@@ -119280,16 +119503,16 @@ ioj
kzY
aSm
iqM
-kgw
-kgw
+bAq
+bAq
dKl
-kgw
-kgw
-kgw
+bAq
+orv
+xVI
omI
kgw
nAo
-aRO
+oHX
der
mkm
czI
@@ -119541,12 +119764,12 @@ idX
aRL
aRL
aRL
-aRL
-aRL
-aRL
-aRL
-aRL
-aRL
+sQi
+pft
+ixB
+utS
+vVw
+mzy
der
der
der
@@ -119798,13 +120021,13 @@ aRO
aRO
aRL
aae
-aae
-aae
-aae
-aae
-aae
-aae
-aae
+sQi
+hVW
+jKX
+iRT
+rEw
+sQi
+sQi
aae
aae
aae
@@ -120055,12 +120278,12 @@ vrN
kCq
aRL
aae
-aae
-aae
-aae
-aae
-aae
-aae
+sQi
+dVY
+qKS
+yit
+pfP
+sQi
aae
aae
aae
@@ -120312,12 +120535,12 @@ aRO
fGL
aRL
aae
-aae
-aae
-aae
-aae
-aae
-aae
+sQi
+kqO
+sQi
+sQi
+kqO
+sQi
aae
aae
aae
@@ -120570,7 +120793,7 @@ aRL
aRL
aae
aae
-aae
+duT
aae
aae
aBM
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 08b5c2b09f9..1b7b0a414ba 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -1268,3 +1268,18 @@
// Exosca signals
/// Sent on exoscan failure/manual interruption: ()
#define COMSIG_EXOSCAN_INTERRUPTED "exoscan_interrupted"
+
+// Component signals
+/// From /datum/port/output/set_output: (output_value)
+#define COMSIG_PORT_SET_OUTPUT "port_set_output"
+/// From /datum/port/input/set_input: (input_value)
+#define COMSIG_PORT_SET_INPUT "port_set_input"
+/// Sent when a port calls disconnect(). From /datum/port/disconnect: ()
+#define COMSIG_PORT_DISCONNECT "port_disconnect"
+/// Sent on the output port when an input port registers on it: (datum/port/input/registered_port)
+#define COMSIG_PORT_OUTPUT_CONNECT "port_output_connect"
+
+/// Sent when a [/obj/item/circuit_component] is added to a circuit.
+#define COMSIG_CIRCUIT_ADD_COMPONENT "circuit_add_component"
+ /// Cancels adding the component to the circuit.
+ #define COMPONENT_CANCEL_ADD_COMPONENT (1<<0)
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 497e0c0b175..76cd698402b 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -46,6 +46,8 @@
#define AWAY_LATHE (1<<8)
/// Imprinters for offstation roles. More limited tech tree.
#define AWAY_IMPRINTER (1<<9)
+/// For wiremod/integrated circuits. Uses various minerals.
+#define COMPONENT_PRINTER (1<<10)
//Note: More than one of these can be added to a design but imprinter and lathe designs are incompatable.
//Modular computer/NTNet defines
diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm
new file mode 100644
index 00000000000..af791d66174
--- /dev/null
+++ b/code/__DEFINES/wiremod.dm
@@ -0,0 +1,93 @@
+#define PORT_INPUT_RECEIVE_DELAY 0.2 SECONDS
+
+/// Helper define that can only be used in /obj/item/circuit_component/input_received()
+#define COMPONENT_TRIGGERED_BY(trigger, port) (trigger.input_value && trigger == port)
+
+// Port types. Determines what the port can connect to
+
+/// Can accept any datatype. Only works for inputs, output types will runtime.
+#define PORT_TYPE_ANY null
+
+// Fundamental datatypes
+/// String datatype
+#define PORT_TYPE_STRING "string"
+#define PORT_MAX_STRING_LENGTH 500
+/// Number datatype
+#define PORT_TYPE_NUMBER "number"
+/// Signal datatype
+#define PORT_TYPE_SIGNAL "signal"
+/// List datatype
+#define PORT_TYPE_LIST "list"
+
+// Other datatypes
+/// Atom datatype
+#define PORT_TYPE_ATOM "entity"
+
+/// The maximum range between a port and an atom
+#define PORT_ATOM_MAX_RANGE 7
+
+#define COMPONENT_DEFAULT_NAME "component"
+
+/// The minimum position of the x and y co-ordinates of the component in the UI
+#define COMPONENT_MIN_RANDOM_POS 200
+/// The maximum position of the x and y co-ordinates of the component in the UI
+#define COMPONENT_MAX_RANDOM_POS 400
+
+/// The maximum position in both directions that a component can be in.
+/// Prevents someone from positioning a component at an absurdly high value.
+#define COMPONENT_MAX_POS 10000
+
+// Components
+
+/// The value that is sent whenever a component is simply sending a signal. This can be anything.
+#define COMPONENT_SIGNAL 1
+
+// Comparison defines
+#define COMP_COMPARISON_EQUAL "="
+#define COMP_COMPARISON_NOT_EQUAL "!="
+#define COMP_COMPARISON_GREATER_THAN ">"
+#define COMP_COMPARISON_LESS_THAN "<"
+#define COMP_COMPARISON_GREATER_THAN_OR_EQUAL ">="
+#define COMP_COMPARISON_LESS_THAN_OR_EQUAL "<="
+
+// Delay defines
+/// The minimum delay value that the delay component can have.
+#define COMP_DELAY_MIN_VALUE 0.1
+
+// Logic defines
+#define COMP_LOGIC_AND "AND"
+#define COMP_LOGIC_OR "OR"
+#define COMP_LOGIC_XOR "XOR"
+
+// Arithmetic defines
+#define COMP_ARITHMETIC_ADD "Add"
+#define COMP_ARITHMETIC_SUBTRACT "Subtract"
+#define COMP_ARITHMETIC_MULTIPLY "Multiply"
+#define COMP_ARITHMETIC_DIVIDE "Divide"
+#define COMP_ARITHMETIC_MIN "Minimum"
+#define COMP_ARITHMETIC_MAX "Maximum"
+
+// Text defines
+#define COMP_TEXT_LOWER "To Lower"
+#define COMP_TEXT_UPPER "To Upper"
+
+// Typecheck component
+#define COMP_TYPECHECK_MOB "organism"
+#define COMP_TYPECHECK_HUMAN "humanoid"
+
+// Clock component
+#define COMP_CLOCK_DELAY 0.9 SECONDS
+
+// Shells
+
+/// Whether a circuit is stuck on a shell and cannot be removed (by a user)
+#define SHELL_FLAG_CIRCUIT_FIXED (1<<0)
+
+/// Whether the shell needs to be anchored for the circuit to be on.
+#define SHELL_FLAG_REQUIRE_ANCHOR (1<<1)
+
+// Shell capacities. These can be converted to configs very easily later
+#define SHELL_CAPACITY_SMALL 10
+#define SHELL_CAPACITY_MEDIUM 25
+#define SHELL_CAPACITY_LARGE 50
+#define SHELL_CAPACITY_VERY_LARGE 500
diff --git a/code/__HELPERS/~skyrat_helpers/integrated_circuits.dm b/code/__HELPERS/~skyrat_helpers/integrated_circuits.dm
deleted file mode 100644
index 001986ea9d7..00000000000
--- a/code/__HELPERS/~skyrat_helpers/integrated_circuits.dm
+++ /dev/null
@@ -1,104 +0,0 @@
-// Integrated Circuits helpers
-/// isnum() returns TRUE for NaN. Also, NaN != NaN. Checkmate, BYOND.
-#define isnan(x) ( (x) != (x) )
-
-#define isinf(x) (isnum((x)) && (((x) == text2num("inf")) || ((x) == text2num("-inf"))))
-
-/// NaN isn't a number, damn it. Infinity is a problem too.
-#define isnum_safe(x) ( isnum((x)) && !isnan((x)) && !isinf((x)) )
-
-#define string2charlist(string) (splittext(string, regex("(.)")) - splittext(string, ""))
-
-/// Encodes a string to hex
-/proc/strtohex(str)
- if(!istext(str)||!str)
- return
- var/r
- var/c
- for(var/i = 1 to length(str))
- c = text2ascii(str,i)
- r += num2hex(c, 2)
- return r
-
-/// Decodes hex to raw byte string. If safe=TRUE, returns null on incorrect input strings instead of CRASHing
-/proc/hextostr(str, safe=FALSE)
- if(!istext(str)||!str)
- return
- var/r
- var/c
- for(var/i = 1 to length(str)/2)
- c = hex2num(copytext(str,i*2-1,i*2+1))
- if(isnull(c))
- return null
- r += ascii2text(c)
- return r
-
-// this proc is used for various pathfinding and locomotion circuits
-/proc/get_step_towards2(atom/ref , atom/trg)
- var/base_dir = get_dir(ref, get_step_towards(ref,trg))
- var/turf/temp = get_step_towards(ref,trg)
-
- if(temp.is_blocked_turf(TRUE))
- var/dir_alt1 = turn(base_dir, 90)
- var/dir_alt2 = turn(base_dir, -90)
- var/turf/turf_last1 = temp
- var/turf/turf_last2 = temp
- var/free_tile = null
- var/breakpoint = 0
-
- while(!free_tile && breakpoint < 10)
- if(!turf_last1.is_blocked_turf(TRUE))
- free_tile = turf_last1
- break
- if(!turf_last2.is_blocked_turf(TRUE))
- free_tile = turf_last2
- break
- turf_last1 = get_step(turf_last1,dir_alt1)
- turf_last2 = get_step(turf_last2,dir_alt2)
- breakpoint++
-
- if(!free_tile)
- return get_step(ref, base_dir)
- else
- return get_step_towards(ref,free_tile)
-
- else
- return get_step(ref, base_dir)
-
-// same as do_mob except for movables and it allows both to drift and doesn't draw progressbar. Used by inject circuit.
-/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null)
- if(!user || !target)
- return TRUE
- var/user_loc = user.loc
-
- var/drifting = FALSE
- if(!user.Process_Spacemove(0) && user.inertia_dir)
- drifting = TRUE
-
- var/target_drifting = FALSE
- if(!target.Process_Spacemove(0) && target.inertia_dir)
- target_drifting = TRUE
-
- var/target_loc = target.loc
-
- var/endtime = world.time+time
- . = TRUE
- while (world.time < endtime)
- stoplag(1)
- if(QDELETED(user) || QDELETED(target))
- . = 0
- break
- if(uninterruptible)
- continue
-
- if(drifting && !user.inertia_dir)
- drifting = FALSE
- user_loc = user.loc
-
- if(target_drifting && !target.inertia_dir)
- target_drifting = FALSE
- target_loc = target.loc
-
- if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke()))
- . = FALSE
- break
diff --git a/code/controllers/subsystem/delay_component.dm b/code/controllers/subsystem/delay_component.dm
new file mode 100644
index 00000000000..098dd8c65cc
--- /dev/null
+++ b/code/controllers/subsystem/delay_component.dm
@@ -0,0 +1,3 @@
+TIMER_SUBSYSTEM_DEF(circuit_component)
+ name = "Circuit Components"
+ priority = FIRE_PRIORITY_DEFAULT
diff --git a/code/controllers/subsystem/processing/clock_component.dm b/code/controllers/subsystem/processing/clock_component.dm
new file mode 100644
index 00000000000..d07acaa6d79
--- /dev/null
+++ b/code/controllers/subsystem/processing/clock_component.dm
@@ -0,0 +1,5 @@
+/// The subsystem used to tick [/datum/component/acid] instances.
+PROCESSING_SUBSYSTEM_DEF(clock_component)
+ name = "Clock Component"
+ flags = SS_NO_INIT|SS_BACKGROUND|SS_KEEP_TIMING
+ wait = COMP_CLOCK_DELAY
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 4515f5ad2ae..8b5be7d1be7 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -415,3 +415,20 @@
if(!istype(mat))
mat = GET_MATERIAL_REF(mat)
return materials[mat]
+
+/// List format is list(material_name = list(amount = ..., ref = ..., etc.))
+/datum/component/material_container/ui_data(mob/user)
+ var/list/data = list()
+
+ for(var/datum/material/material as anything in materials)
+ var/amount = materials[material]
+
+ data += list(list(
+ "name" = material.name,
+ "ref" = REF(material),
+ "amount" = amount,
+ "sheets" = round(amount / MINERAL_MATERIAL_AMOUNT),
+ "removable" = amount >= MINERAL_MATERIAL_AMOUNT,
+ ))
+
+ return data
diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm
index 566b3b5c1d3..8e62811c598 100644
--- a/code/datums/components/remote_materials.dm
+++ b/code/datums/components/remote_materials.dm
@@ -130,3 +130,21 @@ handles linking back and forth.
return "[mat_container.total_amount] / [mat_container.max_amount == INFINITY ? "Unlimited" : mat_container.max_amount] ([silo ? "remote" : "local"])"
else
return "0 / 0"
+
+/// Ejects the given material ref and logs it, or says out loud the problem.
+/datum/component/remote_materials/proc/eject_sheets(datum/material/material_ref, eject_amount)
+ var/atom/movable/movable_parent = parent
+ if (!istype(movable_parent))
+ return 0
+
+ if (!mat_container)
+ movable_parent.say("No access to material storage, please contact the quartermaster.")
+ return 0
+ if (on_hold())
+ movable_parent.say("Mineral access is on hold, please contact the quartermaster.")
+ return 0
+ var/count = mat_container.retrieve_sheets(eject_amount, material_ref, movable_parent.drop_location())
+ var/list/matlist = list()
+ matlist[material_ref] = eject_amount
+ silo_log(parent, "ejected", -count, "sheets", matlist)
+ return count
diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm
new file mode 100644
index 00000000000..5926e418bd6
--- /dev/null
+++ b/code/datums/components/shell.dm
@@ -0,0 +1,183 @@
+/// Makes an atom a shell that is able to take in an attached circuit.
+/datum/component/shell
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+
+ /// The circuitboard attached to this shell
+ var/obj/item/integrated_circuit/attached_circuit
+
+ /// Flags containing what this shell can do
+ var/shell_flags = 0
+
+ /// The capacity of the shell.
+ var/capacity = INFINITY
+
+ /// A list of components that cannot be removed
+ var/list/obj/item/circuit_component/unremovable_circuit_components
+
+/datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags)
+ . = ..()
+ if(!ismovable(parent))
+ return COMPONENT_INCOMPATIBLE
+
+ src.shell_flags = shell_flags || src.shell_flags
+ src.capacity = capacity || src.capacity
+ src.unremovable_circuit_components = unremovable_circuit_components
+
+ for(var/obj/item/circuit_component/circuit_component as anything in unremovable_circuit_components)
+ circuit_component.removable = FALSE
+
+/datum/component/shell/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attack_by)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, .proc/on_attack_ghost)
+ if(!(shell_flags & SHELL_FLAG_CIRCUIT_FIXED))
+ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), .proc/on_screwdriver_act)
+ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), .proc/on_multitool_act)
+ if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR)
+ RegisterSignal(parent, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, .proc/on_unfasten)
+
+/datum/component/shell/UnregisterFromParent()
+ UnregisterSignal(parent, list(
+ COMSIG_PARENT_ATTACKBY,
+ COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER),
+ COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL),
+ COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH,
+ COMSIG_PARENT_EXAMINE,
+ COMSIG_ATOM_ATTACK_GHOST
+ ))
+
+ QDEL_NULL(attached_circuit)
+
+/datum/component/shell/Destroy(force, silent)
+ QDEL_LIST(unremovable_circuit_components)
+ return ..()
+
+/datum/component/shell/proc/on_attack_ghost(datum/source, mob/dead/observer/ghost)
+ SIGNAL_HANDLER
+ if(attached_circuit)
+ INVOKE_ASYNC(attached_circuit, /datum.proc/ui_interact, ghost)
+
+/datum/component/shell/proc/on_examine(datum/source, mob/user, list/examine_text)
+ SIGNAL_HANDLER
+ if(!attached_circuit)
+ return
+
+ examine_text += "There is an integrated circuit attached. Use a multitool to access the wiring. Use a screwdriver to remove it from [source]."
+ var/obj/item/stock_parts/cell/cell = attached_circuit.cell
+ examine_text += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
+
+
+/**
+ * Called when the shell is wrenched.
+ *
+ * Only applies if the shell has SHELL_FLAG_REQUIRE_ANCHOR.
+ * Disables the integrated circuit if unanchored, otherwise enable the circuit.
+ */
+/datum/component/shell/proc/on_unfasten(atom/source, anchored)
+ SIGNAL_HANDLER
+ attached_circuit?.on = anchored
+/**
+ * Called when an item hits the parent. This is the method to add the circuitboard to the component.
+ */
+/datum/component/shell/proc/on_attack_by(atom/source, obj/item/item, mob/living/attacker)
+ SIGNAL_HANDLER
+ if(istype(item, /obj/item/stock_parts/cell))
+ source.balloon_alert(attacker, "can't pull cell in directly!")
+ return
+
+ if(!istype(item, /obj/item/integrated_circuit))
+ return
+ var/obj/item/integrated_circuit/logic_board = item
+ . = COMPONENT_NO_AFTERATTACK
+
+ if(logic_board.shell) // I'll be surprised if this ever happens
+ return
+
+ if(attached_circuit)
+ source.balloon_alert(attacker, "there is already a circuitboard inside!")
+ return
+
+ if(length(logic_board.attached_components) > capacity)
+ source.balloon_alert(attacker, "this is too large to fit into [parent]!")
+ return
+
+ attach_circuit(logic_board, attacker)
+
+/datum/component/shell/proc/on_multitool_act(atom/source, mob/user, obj/item/tool)
+ SIGNAL_HANDLER
+ if(!attached_circuit)
+ return
+
+ attached_circuit.interact(user)
+ return COMPONENT_BLOCK_TOOL_ATTACK
+
+/**
+ * Called when a screwdriver is used on the parent. Removes the circuitboard from the component.
+ */
+/datum/component/shell/proc/on_screwdriver_act(atom/source, mob/user, obj/item/tool)
+ SIGNAL_HANDLER
+ if(!attached_circuit)
+ return
+
+ tool.play_tool_sound(parent)
+ source.balloon_alert(user, "You unscrew [attached_circuit] from [parent].")
+ remove_circuit()
+ return COMPONENT_BLOCK_TOOL_ATTACK
+
+/**
+ * Checks for when the circuitboard moves. If it moves, removes it from the component.
+ */
+/datum/component/shell/proc/on_circuit_moved(obj/item/integrated_circuit/circuit, atom/new_loc)
+ SIGNAL_HANDLER
+ if(new_loc != parent)
+ remove_circuit()
+
+/**
+ * Checks for when the circuitboard deletes so that it can be unassigned.
+ */
+/datum/component/shell/proc/on_circuit_delete(datum/source)
+ SIGNAL_HANDLER
+ remove_circuit()
+
+/datum/component/shell/proc/on_circuit_add_component(datum/source, obj/item/circuit_component/added_comp)
+ SIGNAL_HANDLER
+ return COMPONENT_CANCEL_ADD_COMPONENT
+
+/**
+ * Attaches a circuit to the parent. Doesn't do any checks to see for any existing circuits so that should be done beforehand.
+ */
+/datum/component/shell/proc/attach_circuit(obj/item/integrated_circuit/circuitboard, mob/living/user)
+ if(!user.transferItemToLoc(circuitboard, parent))
+ return
+ attached_circuit = circuitboard
+ RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, .proc/on_circuit_moved)
+ RegisterSignal(circuitboard, COMSIG_PARENT_QDELETING, .proc/on_circuit_delete)
+ for(var/obj/item/circuit_component/to_add as anything in unremovable_circuit_components)
+ to_add.forceMove(attached_circuit)
+ attached_circuit.add_component(to_add)
+ RegisterSignal(circuitboard, COMSIG_CIRCUIT_ADD_COMPONENT, .proc/on_circuit_add_component)
+ attached_circuit.set_shell(parent)
+
+ if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR)
+ var/atom/movable/parent_atom = parent
+ on_unfasten(parent_atom, parent_atom.anchored)
+
+/**
+ * Removes the circuit from the component. Doesn't do any checks to see for an existing circuit so that should be done beforehand.
+ */
+/datum/component/shell/proc/remove_circuit()
+ attached_circuit.on = TRUE
+ attached_circuit.remove_current_shell()
+ UnregisterSignal(attached_circuit, list(
+ COMSIG_MOVABLE_MOVED,
+ COMSIG_PARENT_QDELETING,
+ COMSIG_CIRCUIT_ADD_COMPONENT,
+ ))
+ if(attached_circuit.loc == parent)
+ var/atom/parent_atom = parent
+ attached_circuit.forceMove(parent_atom.drop_location())
+
+ for(var/obj/item/circuit_component/to_remove as anything in unremovable_circuit_components)
+ attached_circuit.remove_component(to_remove)
+ to_remove.moveToNullspace()
+ attached_circuit = null
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 1484d49b671..60f99615658 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -59,6 +59,11 @@
"ntosradarpointerS.png" = 'icons/ui_icons/tgui/ntosradar_pointer_S.png'
)
+/datum/asset/simple/circuit_assets
+ assets = list(
+ "grid_background.png" = 'icons/ui_icons/tgui/grid_background.png'
+ )
+
/datum/asset/spritesheet/simple/pda
name = "pda"
assets = list(
diff --git a/code/modules/balloon_alert/balloon_alert.dm b/code/modules/balloon_alert/balloon_alert.dm
index 495f5dba90d..d6f17d6ffe9 100644
--- a/code/modules/balloon_alert/balloon_alert.dm
+++ b/code/modules/balloon_alert/balloon_alert.dm
@@ -2,7 +2,11 @@
#define BALLOON_TEXT_SPAWN_TIME (0.2 SECONDS)
#define BALLOON_TEXT_FADE_TIME (0.1 SECONDS)
#define BALLOON_TEXT_FULLY_VISIBLE_TIME (0.7 SECONDS)
-#define BALLOON_TEXT_TOTAL_LIFETIME (BALLOON_TEXT_SPAWN_TIME + BALLOON_TEXT_FULLY_VISIBLE_TIME + BALLOON_TEXT_FADE_TIME)
+#define BALLOON_TEXT_TOTAL_LIFETIME(mult) (BALLOON_TEXT_SPAWN_TIME + BALLOON_TEXT_FULLY_VISIBLE_TIME*mult + BALLOON_TEXT_FADE_TIME)
+/// The increase in duration per character in seconds
+#define BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT (0.05)
+/// The amount of characters needed before this increase takes into effect
+#define BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN 10
/// Creates text that will float from the atom upwards to the viewer.
/atom/proc/balloon_alert(mob/viewer, text)
@@ -48,10 +52,16 @@
viewer_client?.images += balloon_alert
+ var/duration_mult = 1
+ var/duration_length = length(text) - BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN
+
+ if(duration_length > 0)
+ duration_mult += duration_length*BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT
+
animate(
balloon_alert,
pixel_y = world.icon_size * 1.2,
- time = BALLOON_TEXT_TOTAL_LIFETIME,
+ time = BALLOON_TEXT_TOTAL_LIFETIME(1),
easing = SINE_EASING | EASE_OUT,
)
@@ -64,12 +74,14 @@
animate(
alpha = 0,
- time = BALLOON_TEXT_FULLY_VISIBLE_TIME,
+ time = BALLOON_TEXT_FULLY_VISIBLE_TIME*duration_mult,
easing = CUBIC_EASING | EASE_IN,
)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_image_from_client, balloon_alert, viewer_client), BALLOON_TEXT_TOTAL_LIFETIME)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/remove_image_from_client, balloon_alert, viewer_client), BALLOON_TEXT_TOTAL_LIFETIME(duration_mult))
+#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MIN
+#undef BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT
#undef BALLOON_TEXT_FADE_TIME
#undef BALLOON_TEXT_FULLY_VISIBLE_TIME
#undef BALLOON_TEXT_SPAWN_TIME
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index 308144785de..12f697b8a23 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -772,3 +772,11 @@
build_path = /obj/item/circuitboard/machine/exodrone_launcher
category = list ("Engineering Machinery")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/board/component_printer
+ name = "Machine Design (Component Printer)"
+ desc = "The circuit board for a component printer"
+ id = "component_printer"
+ build_path = /obj/item/circuitboard/machine/component_printer
+ category = list("Misc. Machinery")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm
new file mode 100644
index 00000000000..ff75b1b6824
--- /dev/null
+++ b/code/modules/research/designs/wiremod_designs.dm
@@ -0,0 +1,208 @@
+/datum/design/integrated_circuit
+ name = "Integrated Circuit"
+ desc = "The foundation of all circuits. All Circuitry go onto this."
+ id = "integrated_circuit"
+ build_path = /obj/item/integrated_circuit
+ build_type = IMPRINTER | COMPONENT_PRINTER
+ category = list("Circuitry", "Core")
+ materials = list(/datum/material/glass = 1000, /datum/material/iron = 1000)
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/circuit_multitool
+ name = "Circuit Multitool"
+ desc = "A circuit multitool to mark entities and load them into."
+ id = "circuit_multitool"
+ build_path = /obj/item/multitool/circuit
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ category = list("Circuitry", "Core")
+ materials = list(/datum/material/glass = 1000, /datum/material/iron = 1000)
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+
+/datum/design/component
+ name = "Component ( NULL ENTRY )"
+ desc = "A component that goes into an integrated circuit."
+ build_type = IMPRINTER | COMPONENT_PRINTER
+ materials = list(/datum/material/glass = 1000)
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+ category = list("Circuitry", "Components")
+
+/datum/design/component/arithmetic
+ name = "Arithmetic Component"
+ desc = "General arithmetic component with add/subtract/multiplication/division capabilities."
+ id = "comp_arithmetic"
+ build_path = /obj/item/circuit_component/arithmetic
+
+/datum/design/component/clock
+ name = "Clock Component"
+ desc = "A component that repeatedly fires."
+ id = "comp_clock"
+ build_path = /obj/item/circuit_component/clock
+
+/datum/design/component/comparison
+ name = "Comparison Component"
+ desc = "A component that compares two objects."
+ id = "comp_comparison"
+ build_path = /obj/item/circuit_component/compare/comparison
+
+/datum/design/component/logic
+ name = "Logic Component"
+ desc = "A component with 'and' and 'or' capabilities."
+ id = "comp_logic"
+ build_path = /obj/item/circuit_component/compare/logic
+
+/datum/design/component/delay
+ name = "Delay Component"
+ desc = "A component that delays a signal by a specified duration."
+ id = "comp_delay"
+ build_path = /obj/item/circuit_component/delay
+
+/datum/design/component/index
+ name = "Index Component"
+ desc = "A component that returns the value of a list at a given index."
+ id = "comp_index"
+ build_path = /obj/item/circuit_component/index
+
+/datum/design/component/length
+ name = "Length Component"
+ desc = "A component that returns the length of its input."
+ id = "comp_length"
+ build_path = /obj/item/circuit_component/length
+
+/datum/design/component/light
+ name = "Light Component"
+ desc = "A component that emits a light of a specific brightness and colour. Requires a shell."
+ id = "comp_light"
+ build_path = /obj/item/circuit_component/light
+
+/datum/design/component/not
+ name = "Not Component"
+ desc = "A component that inverts its input."
+ id = "comp_not"
+ build_path = /obj/item/circuit_component/not
+
+/datum/design/component/ram
+ name = "RAM Component"
+ desc = "A component that retains a variable."
+ id = "comp_ram"
+ build_path = /obj/item/circuit_component/ram
+
+/datum/design/component/random
+ name = "Random Component"
+ desc = "A component that returns random values."
+ id = "comp_random"
+ build_path = /obj/item/circuit_component/random
+
+/datum/design/component/species
+ name = "Get Species Component"
+ desc = "A component that returns the species of its input."
+ id = "comp_species"
+ build_path = /obj/item/circuit_component/species
+
+/datum/design/component/speech
+ name = "Speech Component"
+ desc = "A component that sends a message. Requires a shell."
+ id = "comp_speech"
+ build_path = /obj/item/circuit_component/speech
+
+/datum/design/component/tostring
+ name = "To String Component"
+ desc = "A component that converts its input to text."
+ id = "comp_tostring"
+ build_path = /obj/item/circuit_component/tostring
+
+/datum/design/component/typecheck
+ name = "Typecheck Component"
+ desc = "A component that checks the type of its input."
+ id = "comp_typecheck"
+ build_path = /obj/item/circuit_component/compare/typecheck
+
+/datum/design/component/concat
+ name = "Concatenation Component"
+ desc = "A component that combines strings."
+ id = "comp_concat"
+ build_path = /obj/item/circuit_component/concat
+
+/datum/design/component/textcase
+ name = "Textcase Component"
+ desc = "A component that makes its input uppercase or lowercase."
+ id = "comp_textcase"
+ build_path = /obj/item/circuit_component/textcase
+
+/datum/design/component/hear
+ name = "Voice Activator Component"
+ desc = "A component that listens for messages. Requires a shell."
+ id = "comp_hear"
+ build_path = /obj/item/circuit_component/hear
+
+/datum/design/component/contains
+ name = "String Contains Component"
+ desc = "Checks if a string contains a word/letter"
+ id = "comp_string_contains"
+ build_path = /obj/item/circuit_component/compare/contains
+
+/datum/design/component/self
+ name = "Self Component"
+ desc = "A component that returns the current shell."
+ id = "comp_self"
+ build_path = /obj/item/circuit_component/self
+
+/datum/design/component/radio
+ name = "Radio Component"
+ desc = "A component that can listen and send frequencies."
+ id = "comp_radio"
+ build_path = /obj/item/circuit_component/radio
+
+
+/datum/design/compact_remote_shell
+ name = "Compact Remote Shell"
+ desc = "A handheld shell with one big button."
+ id = "compact_remote_shell"
+ build_path = /obj/item/compact_remote
+ materials = list(/datum/material/glass = 2000, /datum/material/iron = 5000)
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ category = list("Circuitry", "Shells")
+
+/datum/design/controller_shell
+ name = "Controller Shell"
+ desc = "A handheld shell with several buttons."
+ id = "controller_shell"
+ build_path = /obj/item/controller
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ materials = list(/datum/material/glass = 2000, /datum/material/iron = 7000)
+ category = list("Circuitry", "Shells")
+
+/datum/design/bot_shell
+ name = "Bot Shell"
+ desc = "An immobile shell that can store more components."
+ id = "bot_shell"
+ build_path = /obj/item/shell/bot
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ materials = list(/datum/material/glass = 2000, /datum/material/iron = 10000)
+ category = list("Circuitry", "Shells")
+
+/datum/design/drone_shell
+ name = "Drone Shell"
+ desc = "A shell with the ability to move itself around."
+ id = "drone_shell"
+ build_path = /obj/item/shell/drone
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ materials = list(
+ /datum/material/glass = 2000,
+ /datum/material/iron = 11000,
+ /datum/material/gold = 500,
+ )
+ category = list("Circuitry", "Shells")
+
+/datum/design/server_shell
+ name = "Server Shell"
+ desc = "A very large shell that cannot be moved around. Stores the most components."
+ id = "server_shell"
+ materials = list(
+ /datum/material/glass = 5000,
+ /datum/material/iron = 15000,
+ /datum/material/gold = 1500,
+ )
+ build_path = /obj/item/shell/server
+ build_type = PROTOLATHE | COMPONENT_PRINTER
+ category = list("Circuitry", "Shells")
diff --git a/code/modules/research/machinery/circuit_imprinter.dm b/code/modules/research/machinery/circuit_imprinter.dm
index ab44ffa8fbe..fabe05ac597 100644
--- a/code/modules/research/machinery/circuit_imprinter.dm
+++ b/code/modules/research/machinery/circuit_imprinter.dm
@@ -14,7 +14,8 @@
"Subspace Telecomms",
"Research Machinery",
"Misc. Machinery",
- "Computer Parts"
+ "Computer Parts",
+ "Circuitry"
)
production_animation = "circuit_imprinter_ani"
allowed_buildtypes = IMPRINTER
diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm
index 99ac2f26982..4ac7ee688b4 100644
--- a/code/modules/research/machinery/protolathe.dm
+++ b/code/modules/research/machinery/protolathe.dm
@@ -15,7 +15,8 @@
"Weapons",
"Ammo",
"Firing Pins",
- "Computer Parts"
+ "Computer Parts",
+ "Circuitry"
)
production_animation = "protolathe_n"
allowed_buildtypes = PROTOLATHE
diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm
index 68a57bf54ef..a0afaf8b671 100644
--- a/code/modules/research/machinery/techfab.dm
+++ b/code/modules/research/machinery/techfab.dm
@@ -26,7 +26,8 @@
"Subspace Telecomms",
"Research Machinery",
"Misc. Machinery",
- "Computer Parts"
+ "Computer Parts",
+ "Circuitry"
)
console_link = FALSE
production_animation = "protolathe_n"
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 8d1384e01da..ce1f6a4dc68 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -62,6 +62,16 @@
"stethoscope", "surgical_drapes", "hospital_gown", "syringe", "plumbing_rcd", "beaker", "large_beaker", "xlarge_beaker",
"dropper", "defibmountdefault", "surgical_tape", "portable_chem_mixer") //SKYRAT EDIT ADDITION: added "surgical_drapes"
+/datum/techweb_node/basic_circuitry
+ id = "basic_circuitry"
+ starting_node = TRUE
+ display_name = "Basic Integrated Circuits"
+ description = "Research on how to fully exploit the power of integrated circuits"
+ design_ids = list("integrated_circuit", "circuit_multitool", "comp_arithmetic", "comp_clock", "comp_comparison", "comp_delay", "comp_hear",
+ "comp_index", "comp_length", "comp_light", "comp_logic", "comp_not", "comp_ram", "comp_random", "comp_species", "comp_textcase",
+ "comp_speech", "comp_concat", "comp_speech", "comp_self", "comp_radio", "comp_tostring", "comp_typecheck", "compact_remote_shell", "component_printer",
+ "comp_string_contains")
+
/////////////////////////Biotech/////////////////////////
/datum/techweb_node/biotech
@@ -286,6 +296,32 @@
design_ids = list("mech_plasma_cutter")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+/////////////////////////integrated circuits tech/////////////////////////
+
+/datum/techweb_node/adv_shells
+ id = "adv_shells"
+ display_name = "Advanced Shell Research"
+ description = "Grants access to more complicated shell designs."
+ prereq_ids = list("basic_circuitry", "engineering")
+ design_ids = list("controller_shell", "bot_shell")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
+
+/datum/techweb_node/movable_shells_tech
+ id = "movable_shells"
+ display_name = "Movable Shell Research"
+ description = "Grants access to movable shells."
+ prereq_ids = list("adv_shells", "robotics")
+ design_ids = list("drone_shell")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+
+/datum/techweb_node/server_shell_tech
+ id = "server_shell"
+ display_name = "Server Technology Research"
+ description = "Grants access to a server shell that has a very high capacity for components."
+ prereq_ids = list("adv_shells", "computer_hardware_basic")
+ design_ids = list("server_shell")
+ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3000)
+
/////////////////////////robotics tech/////////////////////////
/datum/techweb_node/robotics
id = "robotics"
diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm
index c2af3ddd89b..47d17130875 100644
--- a/code/modules/vehicles/mecha/mech_fabricator.dm
+++ b/code/modules/vehicles/mecha/mech_fabricator.dm
@@ -177,37 +177,6 @@
return part
-/**
- * Generates a list of resources / materials available to this Exosuit Fab
- *
- * Returns null if there is no material container available.
- * List format is list(material_name = list(amount = ..., ref = ..., etc.))
- */
-/obj/machinery/mecha_part_fabricator/proc/output_available_resources()
- var/datum/component/material_container/materials = rmat.mat_container
-
- var/list/material_data = list()
-
- if(materials)
- for(var/mat_id in materials.materials)
- var/datum/material/M = mat_id
- var/list/material_info = list()
- var/amount = materials.materials[mat_id]
-
- material_info = list(
- "name" = M.name,
- "ref" = REF(M),
- "amount" = amount,
- "sheets" = round(amount / MINERAL_MATERIAL_AMOUNT),
- "removable" = amount >= MINERAL_MATERIAL_AMOUNT
- )
-
- material_data += list(material_info)
-
- return material_data
-
- return null
-
/**
* Intended to be called when an item starts printing.
*
@@ -488,7 +457,7 @@
/obj/machinery/mecha_part_fabricator/ui_data(mob/user)
var/list/data = list()
- data["materials"] = output_available_resources()
+ data["materials"] = rmat.mat_container?.ui_data()
if(being_built)
var/list/part = list(
@@ -588,36 +557,18 @@
queue.Swap(index,new_index)
return
if("remove_mat")
- // Remove a material from the fab
- var/mat_ref = params["ref"]
+ var/datum/material/material = locate(params["ref"])
var/amount = text2num(params["amount"])
- var/datum/material/mat = locate(mat_ref)
- eject_sheets(mat, amount)
+
+ if (!amount)
+ return
+
+ // SAFETY: eject_sheets checks for valid mats
+ rmat.eject_sheets(material, amount)
return
return FALSE
-/**
- * Eject material sheets.
- *
- * Returns the number of sheets successfully ejected.
- * eject_sheet - Byond REF of the material to eject.
- * eject_amt - Number of sheets to attempt to eject.
- */
-/obj/machinery/mecha_part_fabricator/proc/eject_sheets(eject_sheet, eject_amt)
- var/datum/component/material_container/mat_container = rmat.mat_container
- if (!mat_container)
- say("No access to material storage, please contact the quartermaster.")
- return 0
- if (rmat.on_hold())
- say("Mineral access is on hold, please contact the quartermaster.")
- return 0
- var/count = mat_container.retrieve_sheets(text2num(eject_amt), eject_sheet, drop_location())
- var/list/matlist = list()
- matlist[eject_sheet] = text2num(eject_amt)
- rmat.silo_log(src, "ejected", -count, "sheets", matlist)
- return count
-
/obj/machinery/mecha_part_fabricator/proc/AfterMaterialInsert(item_inserted, id_inserted, amount_inserted)
var/datum/material/M = id_inserted
add_overlay("fab-load-[M.name]")
diff --git a/code/modules/wiremod/component.dm b/code/modules/wiremod/component.dm
new file mode 100644
index 00000000000..e8a3cc7d610
--- /dev/null
+++ b/code/modules/wiremod/component.dm
@@ -0,0 +1,182 @@
+/**
+ * # Integrated Circuit Component
+ *
+ * A component that performs a function when given an input
+ *
+ * Can be attached to an integrated circuitboard, where it can then
+ * be connected between other components to provide an output or to receive
+ * an input. This is the base type of all components
+ */
+/obj/item/circuit_component
+ name = COMPONENT_DEFAULT_NAME
+ icon = 'icons/obj/module.dmi'
+ icon_state = "component"
+ inhand_icon_state = "electronic"
+
+ /// The name of the component shown on the UI
+ var/display_name = "Generic"
+
+ /// The integrated_circuit that this component is attached to.
+ var/obj/item/integrated_circuit/parent
+
+ /// A list that contains the outpurt ports on this component
+ /// Used to connect between the ports
+ var/list/datum/port/output/output_ports = list()
+
+ /// A list that contains the components the input ports on this component
+ /// Used to connect between the ports
+ var/list/datum/port/input/input_ports = list()
+
+ /// Generic trigger input for triggering this component
+ var/datum/port/input/trigger_input
+ var/datum/port/output/trigger_output
+
+ var/has_trigger = FALSE
+
+ /// Used to determine the x position of the component within the UI
+ var/rel_x = 0
+ /// Used to determine the y position of the component within the UI
+ var/rel_y = 0
+
+ /// The power usage whenever this component receives an input
+ var/power_usage_per_input = 1
+
+ /// The current selected option
+ var/current_option
+ /// The options that this component can take on. Limited to strings
+ var/list/options
+
+ // Whether the component is removable or not. Only affects user UI
+ var/removable = TRUE
+
+/obj/item/circuit_component/Initialize()
+ . = ..()
+ if(name == COMPONENT_DEFAULT_NAME)
+ name = "[lowertext(display_name)] [COMPONENT_DEFAULT_NAME]"
+ if(length(options))
+ current_option = options[1]
+
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/item/circuit_component/LateInitialize()
+ . = ..()
+ if(has_trigger)
+ trigger_input = add_input_port("Trigger", PORT_TYPE_SIGNAL)
+ trigger_output = add_output_port("Triggered", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/Destroy()
+ if(parent)
+ parent.remove_component(src)
+ parent = null
+
+ trigger_input = null
+ trigger_output = null
+
+ QDEL_LIST(output_ports)
+ QDEL_LIST(input_ports)
+ return ..()
+
+/**
+ * Called when a shell is registered from the component/the component is added to a circuit.
+ *
+ * Register all signals here on the shell.
+ * Arguments:
+ * * shell - Shell being registered
+ */
+/obj/item/circuit_component/proc/register_shell(atom/movable/shell)
+ return
+
+/**
+ * Called when a shell is unregistered from the component/the component is removed from a circuit.
+ *
+ * Unregister all signals here on the shell.
+ * Arguments:
+ * * shell - Shell being unregistered
+ */
+/obj/item/circuit_component/proc/unregister_shell(atom/movable/shell)
+ return
+
+/**
+ * Disconnects a component from other components
+ *
+ * Disconnects both the input and output ports of the component
+ */
+/obj/item/circuit_component/proc/disconnect()
+ for(var/datum/port/output/port_to_disconnect as anything in output_ports)
+ port_to_disconnect.disconnect()
+
+ for(var/datum/port/input/port_to_disconnect as anything in input_ports)
+ port_to_disconnect.disconnect()
+
+/**
+ * Sets the option on this component
+ *
+ * Can only be a value from the options variable
+ * Arguments:
+ * * option - The option that has been switched to.
+ */
+/obj/item/circuit_component/proc/set_option(option)
+ current_option = option
+ input_received()
+
+/**
+ * Matches the output port's datatype with the input port's current connected port.
+ *
+ * Returns true if datatype was changed, otherwise returns false.
+ * Arguments:
+ * * input_port - The input port to check the connected port from.
+ * * output_port - The output port to convert. Warning, this does change the output port.
+ */
+/obj/item/circuit_component/proc/match_port_datatype(datum/port/input/input_port, datum/port/output/output_port)
+ if(input_port.connected_port)
+ var/datum/port/connected_port = input_port.connected_port
+ if(connected_port.datatype != output_port.datatype)
+ output_port.set_datatype(connected_port.datatype)
+ return TRUE
+ return FALSE
+
+
+/**
+ * Adds an input port and returns it
+ *
+ * Arguments:
+ * * name - The name of the input port
+ * * type - The datatype it handles
+ * * trigger - Whether this input port triggers an update on the component when updated.
+ */
+/obj/item/circuit_component/proc/add_input_port(name, type, trigger = TRUE, default = null)
+ var/datum/port/input/input_port = new(src, name, type, trigger, default)
+ input_ports += input_port
+ return input_port
+
+
+/**
+ * Adds an output port and returns it
+ *
+ * Arguments:
+ * * name - The name of the output port
+ * * type - The datatype it handles.
+ */
+/obj/item/circuit_component/proc/add_output_port(name, type)
+ var/datum/port/output/output_port = new(src, name, type)
+ output_ports += output_port
+ return output_port
+
+/**
+ * Called whenever an input is received from one of the ports.
+ *
+ * Return value indicates that the circuit should not do anything
+ * Arguments:
+ * * port - Can be null. The port that sent the input
+ */
+/obj/item/circuit_component/proc/input_received(datum/port/input/port)
+ SHOULD_CALL_PARENT(TRUE)
+ if(!parent?.on)
+ return TRUE
+
+ var/obj/item/stock_parts/cell/cell = parent.get_cell()
+ if(!cell?.use(power_usage_per_input))
+ return TRUE
+
+ if(has_trigger && !COMPONENT_TRIGGERED_BY(trigger_input, port))
+ return TRUE
diff --git a/code/modules/wiremod/component_printer.dm b/code/modules/wiremod/component_printer.dm
new file mode 100644
index 00000000000..b04d5c70592
--- /dev/null
+++ b/code/modules/wiremod/component_printer.dm
@@ -0,0 +1,134 @@
+/// Component printer, creates components for integrated circuits.
+/obj/machinery/component_printer
+ name = "component printer"
+ desc = "Produces components for the creation of integrated circuits."
+ icon = 'icons/obj/wiremod_fab.dmi'
+ icon_state = "fab-idle"
+ circuit = /obj/item/circuitboard/machine/component_printer
+
+ /// The internal material bus
+ var/datum/component/remote_materials/materials
+
+ density = TRUE
+
+ /// The techweb the printer will get researched designs from
+ var/datum/techweb/techweb
+
+/obj/machinery/component_printer/Initialize(mapload)
+ . = ..()
+
+ techweb = SSresearch.science_tech
+
+ materials = AddComponent( \
+ /datum/component/remote_materials, \
+ "component_printer", \
+ mapload, \
+ mat_container_flags = BREAKDOWN_FLAGS_LATHE, \
+ )
+
+/obj/machinery/component_printer/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ComponentPrinter", name)
+ ui.open()
+
+/obj/machinery/component_printer/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/spritesheet/sheetmaterials)
+ )
+
+/obj/machinery/component_printer/ui_act(action, list/params)
+ . = ..()
+ if (.)
+ return
+
+ switch (action)
+ if ("print")
+ var/design_id = params["designId"]
+ if (!techweb.researched_designs[design_id])
+ return TRUE
+
+ var/datum/design/design = SSresearch.techweb_design_by_id(design_id)
+ if (!(design.build_type & COMPONENT_PRINTER))
+ return TRUE
+
+ if (materials.on_hold())
+ say("Mineral access is on hold, please contact the quartermaster.")
+ return TRUE
+
+ if (!materials.mat_container?.has_materials(design.materials))
+ say("Not enough materials.")
+ return TRUE
+
+ balloon_alert_to_viewers("printed [design.name]")
+ materials.mat_container?.use_materials(design.materials)
+ materials.silo_log(src, "printed", -1, design.name, design.materials)
+ var/atom/printed_design = new design.build_path(drop_location())
+ printed_design.pixel_x = printed_design.base_pixel_x + rand(-5, 5)
+ printed_design.pixel_y = printed_design.base_pixel_y + rand(-5, 5)
+ if ("remove_mat")
+ var/datum/material/material = locate(params["ref"])
+ var/amount = text2num(params["amount"])
+
+ if (!amount)
+ return TRUE
+
+ // SAFETY: eject_sheets checks for valid mats
+ materials.eject_sheets(material, amount)
+
+ return TRUE
+
+/obj/machinery/component_printer/ui_data(mob/user)
+ var/list/data = list()
+ data["materials"] = materials.mat_container.ui_data()
+ return data
+
+/obj/machinery/component_printer/ui_static_data(mob/user)
+ var/list/data = list()
+
+ var/list/designs = list()
+
+ // for (var/datum/design/component/component_design_type as anything in subtypesof(/datum/design/component))
+ for (var/researched_design_id in techweb.researched_designs)
+ var/datum/design/design = SSresearch.techweb_design_by_id(researched_design_id)
+ if (!(design.build_type & COMPONENT_PRINTER))
+ continue
+
+ designs[researched_design_id] = list(
+ "name" = design.name,
+ "description" = design.desc,
+ "materials" = get_material_cost_data(design.materials),
+ "categories" = design.category,
+ )
+
+ data["designs"] = designs
+
+ return data
+
+/obj/machinery/component_printer/crowbar_act(mob/living/user, obj/item/tool)
+ if(..())
+ return TRUE
+ return default_deconstruction_crowbar(tool)
+
+/obj/machinery/component_printer/screwdriver_act(mob/living/user, obj/item/tool)
+ if(..())
+ return TRUE
+ return default_deconstruction_screwdriver(user, "fab-o", "fab-idle", tool)
+
+/obj/machinery/component_printer/proc/get_material_cost_data(list/materials)
+ var/list/data = list()
+
+ for (var/datum/material/material_type as anything in materials)
+ data[initial(material_type.name)] = materials[material_type]
+
+ return data
+
+/obj/item/circuitboard/machine/component_printer
+ name = "\improper Component Printer (Machine Board)"
+ greyscale_colors = CIRCUIT_COLOR_SCIENCE
+ build_path = /obj/machinery/component_printer
+ req_components = list(
+ /obj/item/stock_parts/matter_bin = 2,
+ /obj/item/stock_parts/manipulator = 2,
+ /obj/item/reagent_containers/glass/beaker = 2,
+ )
diff --git a/code/modules/wiremod/components/abstract/compare.dm b/code/modules/wiremod/components/abstract/compare.dm
new file mode 100644
index 00000000000..c5fff8aa6ad
--- /dev/null
+++ b/code/modules/wiremod/components/abstract/compare.dm
@@ -0,0 +1,67 @@
+/**
+ * # Compare Component
+ *
+ * Abstract component to build conditional components
+ */
+/obj/item/circuit_component/compare
+ display_name = "Compare"
+
+ /// The amount of input ports to have
+ var/input_port_amount = 4
+
+ /// The trigger for the true/false signals
+ var/datum/port/input/compare
+
+ /// Signals sent on compare
+ var/datum/port/output/true
+ var/datum/port/output/false
+
+ /// The result from the output
+ var/datum/port/output/result
+
+/obj/item/circuit_component/compare/Initialize()
+ . = ..()
+ for(var/port_id in 1 to input_port_amount)
+ var/letter = ascii2text(text2ascii("A") + (port_id-1))
+ add_input_port(letter, PORT_TYPE_ANY)
+
+ load_custom_ports()
+ compare = add_input_port("Compare", PORT_TYPE_SIGNAL)
+
+ true = add_output_port("True", PORT_TYPE_SIGNAL)
+ false = add_output_port("False", PORT_TYPE_SIGNAL)
+ result = add_output_port("Result", PORT_TYPE_NUMBER)
+
+/**
+ * Used by derivatives to load their own ports in for custom use.
+ */
+/obj/item/circuit_component/compare/proc/load_custom_ports()
+ return
+
+/obj/item/circuit_component/compare/Destroy()
+ true = null
+ false = null
+ result = null
+ compare = null
+ return ..()
+
+/obj/item/circuit_component/compare/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/list/ports = input_ports.Copy()
+ if(input_port_amount)
+ ports.Cut(input_port_amount+1)
+
+ var/logic_result = do_comparisons(ports)
+ if(COMPONENT_TRIGGERED_BY(compare, port))
+ if(logic_result)
+ true.set_output(COMPONENT_SIGNAL)
+ else
+ false.set_output(COMPONENT_SIGNAL)
+ result.set_output(logic_result)
+
+/// Do the comparisons and return a result
+/obj/item/circuit_component/compare/proc/do_comparisons(list/ports)
+ return FALSE
diff --git a/code/modules/wiremod/components/arithmetic.dm b/code/modules/wiremod/components/arithmetic.dm
new file mode 100644
index 00000000000..75a574dc92c
--- /dev/null
+++ b/code/modules/wiremod/components/arithmetic.dm
@@ -0,0 +1,75 @@
+/**
+ * # Arithmetic Component
+ *
+ * General arithmetic unit with add/sub/mult/divide capabilities
+ * This one only works with numbers.
+ */
+/obj/item/circuit_component/arithmetic
+ display_name = "Arithmetic"
+
+ /// The amount of input ports to have
+ var/input_port_amount = 4
+
+ /// The result from the output
+ var/datum/port/output/output
+
+ has_trigger = TRUE
+
+GLOBAL_LIST_INIT(comp_arithmetic_options, list(
+ COMP_ARITHMETIC_ADD,
+ COMP_ARITHMETIC_SUBTRACT,
+ COMP_ARITHMETIC_MULTIPLY,
+ COMP_ARITHMETIC_DIVIDE,
+ COMP_ARITHMETIC_MIN,
+ COMP_ARITHMETIC_MAX,
+))
+
+/obj/item/circuit_component/arithmetic/Initialize()
+ options = GLOB.comp_arithmetic_options
+ . = ..()
+ for(var/port_id in 1 to input_port_amount)
+ var/letter = ascii2text(text2ascii("A") + (port_id-1))
+ add_input_port(letter, PORT_TYPE_NUMBER)
+
+ output = add_output_port("Output", PORT_TYPE_NUMBER)
+
+/obj/item/circuit_component/arithmetic/Destroy()
+ output = null
+ return ..()
+
+/obj/item/circuit_component/arithmetic/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/list/ports = input_ports.Copy()
+ var/datum/port/input/first_port = ports[1]
+ ports -= first_port
+ ports -= trigger_input
+ var/result = first_port.input_value
+
+ for(var/datum/port/input/input_port as anything in ports)
+ var/value = input_port.input_value
+ if(isnull(value))
+ continue
+
+ switch(current_option)
+ if(COMP_ARITHMETIC_ADD)
+ result += value
+ if(COMP_ARITHMETIC_SUBTRACT)
+ result -= value
+ if(COMP_ARITHMETIC_MULTIPLY)
+ result *= value
+ if(COMP_ARITHMETIC_DIVIDE)
+ // Protect from div by zero errors.
+ if(value == 0)
+ result = null
+ break
+ result /= value
+ if(COMP_ARITHMETIC_MAX)
+ result = max(result, value)
+ if(COMP_ARITHMETIC_MIN)
+ result = min(result, value)
+
+ output.set_output(result)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/clock.dm b/code/modules/wiremod/components/clock.dm
new file mode 100644
index 00000000000..9fe6c5699e7
--- /dev/null
+++ b/code/modules/wiremod/components/clock.dm
@@ -0,0 +1,54 @@
+/**
+ * # Clock Component
+ *
+ * Fires every tick of the circuit timer SS
+ */
+/obj/item/circuit_component/clock
+ display_name = "Clock"
+
+ /// Whether the clock is on or not
+ var/datum/port/input/on
+
+ /// The signal from this clock component
+ var/datum/port/output/signal
+
+/obj/item/circuit_component/clock/Initialize()
+ . = ..()
+ on = add_input_port("On", PORT_TYPE_NUMBER)
+
+ signal = add_output_port("Signal", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/clock/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ if(on.input_value)
+ start_process()
+ else
+ stop_process()
+
+/obj/item/circuit_component/clock/Destroy()
+ on = null
+ signal = null
+ stop_process()
+ return ..()
+
+/obj/item/circuit_component/clock/process(delta_time)
+ signal.set_output(COMPONENT_SIGNAL)
+
+/**
+ * Adds the component to the SSclock_component process list
+ *
+ * Starts ticking to send signals between periods of time
+ */
+/obj/item/circuit_component/clock/proc/start_process()
+ START_PROCESSING(SSclock_component, src)
+
+/**
+ * Removes the component to the SSclock_component process list
+ *
+ * Signals stop getting sent.
+ */
+/obj/item/circuit_component/clock/proc/stop_process()
+ STOP_PROCESSING(SSclock_component, src)
diff --git a/code/modules/wiremod/components/comparison.dm b/code/modules/wiremod/components/comparison.dm
new file mode 100644
index 00000000000..2d3ef3be516
--- /dev/null
+++ b/code/modules/wiremod/components/comparison.dm
@@ -0,0 +1,44 @@
+/**
+ * # Comparison Component
+ *
+ * Compares two objects
+ */
+/obj/item/circuit_component/compare/comparison
+ display_name = "Comparison"
+
+ input_port_amount = 2
+
+GLOBAL_LIST_INIT(comp_comparison_options, list(
+ COMP_COMPARISON_EQUAL,
+ COMP_COMPARISON_NOT_EQUAL,
+ COMP_COMPARISON_GREATER_THAN,
+ COMP_COMPARISON_LESS_THAN,
+ COMP_COMPARISON_GREATER_THAN_OR_EQUAL,
+ COMP_COMPARISON_LESS_THAN_OR_EQUAL
+))
+
+/obj/item/circuit_component/compare/comparison/Initialize()
+ options = GLOB.comp_comparison_options
+ return ..()
+
+/obj/item/circuit_component/compare/comparison/do_comparisons(list/ports)
+ if(length(ports) < input_port_amount)
+ return FALSE
+
+ // Comparison component only compares the first two ports
+ var/input1 = input_ports[1].input_value
+ var/input2 = input_ports[2].input_value
+
+ switch(current_option)
+ if(COMP_COMPARISON_EQUAL)
+ return input1 == input2
+ if(COMP_COMPARISON_NOT_EQUAL)
+ return input1 != input2
+ if(COMP_COMPARISON_GREATER_THAN)
+ return input1 > input2
+ if(COMP_COMPARISON_GREATER_THAN_OR_EQUAL)
+ return input1 >= input2
+ if(COMP_COMPARISON_LESS_THAN)
+ return input1 < input2
+ if(COMP_COMPARISON_LESS_THAN_OR_EQUAL)
+ return input1 <= input2
diff --git a/code/modules/wiremod/components/concat.dm b/code/modules/wiremod/components/concat.dm
new file mode 100644
index 00000000000..cd073cc7cea
--- /dev/null
+++ b/code/modules/wiremod/components/concat.dm
@@ -0,0 +1,45 @@
+/**
+ * # Concatenate Component
+ *
+ * General string concatenation component. Puts strings together.
+ */
+/obj/item/circuit_component/concat
+ display_name = "Concatenate"
+
+ /// The amount of input ports to have
+ var/input_port_amount = 4
+
+ /// The result from the output
+ var/datum/port/output/output
+ has_trigger = TRUE
+
+/obj/item/circuit_component/concat/Initialize()
+ . = ..()
+ for(var/port_id in 1 to input_port_amount)
+ var/letter = ascii2text(text2ascii("A") + (port_id-1))
+ add_input_port(letter, PORT_TYPE_STRING)
+
+ output = add_output_port("Output", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/concat/Destroy()
+ output = null
+ return ..()
+
+/obj/item/circuit_component/concat/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/result = ""
+ var/list/ports = input_ports.Copy()
+ ports -= trigger_input
+
+ for(var/datum/port/input/input_port as anything in ports)
+ var/value = input_port.input_value
+ if(isnull(value))
+ continue
+
+ result += "[value]"
+
+ output.set_output(result)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/contains.dm b/code/modules/wiremod/components/contains.dm
new file mode 100644
index 00000000000..3f5c34e595a
--- /dev/null
+++ b/code/modules/wiremod/components/contains.dm
@@ -0,0 +1,34 @@
+/**
+ * # String Contains Component
+ *
+ * Checks if a string contains a word/letter
+ */
+/obj/item/circuit_component/compare/contains
+ display_name = "String Contains"
+
+ input_port_amount = 0
+
+ var/datum/port/input/needle
+ var/datum/port/input/haystack
+
+/obj/item/circuit_component/compare/contains/load_custom_ports()
+ needle = add_input_port("Needle", PORT_TYPE_STRING)
+ haystack = add_input_port("Haystack", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/compare/contains/Destroy()
+ needle = null
+ haystack = null
+ return ..()
+
+
+/obj/item/circuit_component/compare/contains/do_comparisons(list/ports)
+ if(length(ports) < input_port_amount)
+ return
+
+ var/to_find = needle.input_value
+ var/to_search = haystack.input_value
+
+ if(!to_find || !to_search)
+ return
+
+ return findtext(to_search, to_find)
diff --git a/code/modules/wiremod/components/delay.dm b/code/modules/wiremod/components/delay.dm
new file mode 100644
index 00000000000..ff659162d2a
--- /dev/null
+++ b/code/modules/wiremod/components/delay.dm
@@ -0,0 +1,43 @@
+/**
+ * # Delay Component
+ *
+ * Delays a signal by a specified duration.
+ */
+/obj/item/circuit_component/delay
+ display_name = "Delay"
+
+ /// Amount to delay by
+ var/datum/port/input/delay_amount
+ /// Input signal to fire the delay
+ var/datum/port/input/trigger
+
+ /// The output of the signal
+ var/datum/port/output/output
+
+/obj/item/circuit_component/delay/Initialize()
+ . = ..()
+ delay_amount = add_input_port("Delay", PORT_TYPE_NUMBER, FALSE)
+ trigger = add_input_port("Trigger", PORT_TYPE_SIGNAL)
+
+ output = add_output_port("Result", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/delay/Destroy()
+ output = null
+ trigger = null
+ delay_amount = null
+ return ..()
+
+/obj/item/circuit_component/delay/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ if(!COMPONENT_TRIGGERED_BY(trigger, port))
+ return
+
+ var/delay = delay_amount.input_value
+ if(delay > COMP_DELAY_MIN_VALUE)
+ // Convert delay into deciseconds
+ addtimer(CALLBACK(output, /datum/port/output.proc/set_output, trigger.input_value), delay*10, timer_subsystem =SScircuit_component)
+ else
+ output.set_output(trigger.input_value)
diff --git a/code/modules/wiremod/components/dummy.dm b/code/modules/wiremod/components/dummy.dm
new file mode 100644
index 00000000000..58f63ef2776
--- /dev/null
+++ b/code/modules/wiremod/components/dummy.dm
@@ -0,0 +1,33 @@
+/**
+ * # Dummy Component
+ *
+ * Dummy component that does nothing, only for debugging purposes
+ *
+ * Has two input and output ports that do nothing
+ */
+/obj/item/circuit_component/dummy
+ display_name = "Dummy Component"
+
+ /// The input ports of the dummy component
+ var/datum/port/input/receive1
+ var/datum/port/input/receive2
+
+ /// The output ports of the dummy component
+ var/datum/port/output/output1
+ var/datum/port/output/output2
+
+/obj/item/circuit_component/dummy/Initialize()
+ . = ..()
+ receive1 = add_input_port("Receive 1", PORT_TYPE_ANY)
+ receive2 = add_input_port("Receive 2", PORT_TYPE_ANY)
+
+ output1 = add_output_port("Output 1", PORT_TYPE_NUMBER)
+ output2 = add_output_port("Output 2", PORT_TYPE_NUMBER)
+
+/obj/item/circuit_component/dummy/Destroy()
+ // Cleaned up in parent proc
+ receive1 = null
+ receive2 = null
+ output1 = null
+ output2 = null
+ return ..()
diff --git a/code/modules/wiremod/components/hear.dm b/code/modules/wiremod/components/hear.dm
new file mode 100644
index 00000000000..92dad54c4ce
--- /dev/null
+++ b/code/modules/wiremod/components/hear.dm
@@ -0,0 +1,43 @@
+/**
+ * # Hear Component
+ *
+ * Listens for messages. Requires a shell.
+ */
+/obj/item/circuit_component/hear
+ display_name = "Voice Activator"
+
+ flags_1 = HEAR_1
+
+ /// The message heard
+ var/datum/port/output/message_port
+ /// The language heard
+ var/datum/port/output/language_port
+ /// The speaker
+ var/datum/port/output/speaker_port
+ /// The trigger sent when this event occurs
+ var/datum/port/output/trigger_port
+
+/obj/item/circuit_component/hear/Initialize()
+ . = ..()
+ message_port = add_output_port("Message", PORT_TYPE_STRING)
+ language_port = add_output_port("Language", PORT_TYPE_STRING)
+ speaker_port = add_output_port("Speaker", PORT_TYPE_ATOM)
+ trigger_port = add_output_port("Triggered", PORT_TYPE_SIGNAL)
+
+
+/obj/item/circuit_component/hear/Destroy()
+ message_port = null
+ language_port = null
+ speaker_port = null
+ trigger_port = null
+ return ..()
+
+/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods)
+ if(speaker == parent?.shell)
+ return
+
+ message_port.set_output(raw_message)
+ if(message_language)
+ language_port.set_output(initial(message_language.name))
+ speaker_port.set_output(speaker)
+ trigger_port.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/index.dm b/code/modules/wiremod/components/index.dm
new file mode 100644
index 00000000000..cc1d69e612e
--- /dev/null
+++ b/code/modules/wiremod/components/index.dm
@@ -0,0 +1,47 @@
+/**
+ * # Index Component
+ *
+ * Return the index of a list
+ */
+/obj/item/circuit_component/index
+ display_name = "Index List"
+
+ /// The input port
+ var/datum/port/input/list_port
+ var/datum/port/input/index_port
+
+ /// The result from the output
+ var/datum/port/output/output
+ has_trigger = TRUE
+
+/obj/item/circuit_component/index/Initialize()
+ . = ..()
+ index_port = add_input_port("Index", PORT_TYPE_ANY)
+ list_port = add_input_port("List", PORT_TYPE_LIST)
+
+ output = add_output_port("Value", PORT_TYPE_ANY)
+
+/obj/item/circuit_component/index/Destroy()
+ list_port = null
+ index_port = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/index/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/index = index_port.input_value
+ var/list/list_input = list_port.input_value
+
+ if(!islist(list_input) || !index)
+ output.set_output(null)
+ return
+
+ if(isnum(index) && (index < 1 || index > length(list_input)))
+ output.set_output(null)
+ return
+
+ output.set_output(list_input[index])
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/length.dm b/code/modules/wiremod/components/length.dm
new file mode 100644
index 00000000000..9a52fe5d542
--- /dev/null
+++ b/code/modules/wiremod/components/length.dm
@@ -0,0 +1,33 @@
+/**
+ * # Length Component
+ *
+ * Return the length of an input
+ */
+/obj/item/circuit_component/length
+ display_name = "Length"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// The result from the output
+ var/datum/port/output/output
+ has_trigger = TRUE
+
+/obj/item/circuit_component/length/Initialize()
+ . = ..()
+ input_port = add_input_port("Input", PORT_TYPE_ANY)
+
+ output = add_output_port("Length", PORT_TYPE_NUMBER)
+
+/obj/item/circuit_component/length/Destroy()
+ input_port = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/length/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ output.set_output(length(input_port.input_value))
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/light.dm b/code/modules/wiremod/components/light.dm
new file mode 100644
index 00000000000..49384636968
--- /dev/null
+++ b/code/modules/wiremod/components/light.dm
@@ -0,0 +1,72 @@
+/**
+ * # Light Component
+ *
+ * Emits a light of a specific brightness and colour. Requires a shell.
+ */
+/obj/item/circuit_component/light
+ display_name = "Light"
+
+ /// The colours of the light
+ var/datum/port/input/red
+ var/datum/port/input/green
+ var/datum/port/input/blue
+
+ /// The brightness
+ var/datum/port/input/brightness
+
+ /// Whether the light is on or not
+ var/datum/port/input/on
+
+ var/max_power = 5
+ var/min_lightness = 0.4
+ var/shell_light_color
+
+/obj/item/circuit_component/light/Initialize()
+ . = ..()
+ red = add_input_port("Red", PORT_TYPE_NUMBER)
+ green = add_input_port("Green", PORT_TYPE_NUMBER)
+ blue = add_input_port("Blue", PORT_TYPE_NUMBER)
+ brightness = add_input_port("Brightness", PORT_TYPE_NUMBER)
+
+ on = add_input_port("On", PORT_TYPE_NUMBER)
+
+
+/obj/item/circuit_component/light/Destroy()
+ red = null
+ green = null
+ blue = null
+ brightness = null
+ on = null
+ return ..()
+
+/obj/item/circuit_component/light/register_shell(atom/movable/shell)
+ . = ..()
+ input_received()
+
+/obj/item/circuit_component/light/unregister_shell(atom/movable/shell)
+ shell.set_light_on(FALSE)
+ return ..()
+
+/obj/item/circuit_component/light/input_received(datum/port/input/port)
+ . = ..()
+ brightness.set_input(min(max(brightness.input_value || 0, 0), max_power), FALSE)
+ red.set_input(min(max(red.input_value, 0), 255), FALSE)
+ blue.set_input(min(max(blue.input_value, 0), 255), FALSE)
+ green.set_input(min(max(green.input_value, 0), 255), FALSE)
+ var/list/hsl = rgb2hsl(red.input_value || 0, green.input_value || 0, blue.input_value || 0)
+ var/list/light_col = hsl2rgb(hsl[1], hsl[2], max(min_lightness, hsl[3]))
+ shell_light_color = rgb(light_col[1], light_col[2], light_col[3])
+ if(.)
+ return
+
+ if(parent.shell)
+ set_atom_light(parent.shell)
+
+/obj/item/circuit_component/light/proc/set_atom_light(atom/movable/target_atom)
+ // Clamp anyways just for safety
+ var/bright_val = min(max(brightness.input_value || 0, 0), max_power)
+
+ target_atom.set_light_power(bright_val)
+ target_atom.set_light_range(bright_val)
+ target_atom.set_light_color(shell_light_color)
+ target_atom.set_light_on(!!on.input_value)
diff --git a/code/modules/wiremod/components/logic.dm b/code/modules/wiremod/components/logic.dm
new file mode 100644
index 00000000000..02a37194279
--- /dev/null
+++ b/code/modules/wiremod/components/logic.dm
@@ -0,0 +1,47 @@
+/**
+ * # Logic Component
+ *
+ * General logic unit with AND OR capabilities
+ */
+/obj/item/circuit_component/compare/logic
+ display_name = "Logic"
+
+
+GLOBAL_LIST_INIT(comp_logic_options, list(
+ COMP_LOGIC_AND,
+ COMP_LOGIC_OR,
+ COMP_LOGIC_XOR
+))
+
+/obj/item/circuit_component/compare/logic/Initialize()
+ options = GLOB.comp_logic_options
+ return ..()
+
+/obj/item/circuit_component/compare/logic/do_comparisons(list/ports)
+ . = FALSE
+ // Used by XOR
+ var/total_ports = 0
+ var/total_true_ports = 0
+ for(var/datum/port/input/port as anything in ports)
+ if(isnull(port.input_value))
+ continue
+
+ total_ports += 1
+ switch(current_option)
+ if(COMP_LOGIC_AND)
+ if(!port.input_value)
+ return FALSE
+ . = TRUE
+ if(COMP_LOGIC_OR)
+ if(port.input_value)
+ return TRUE
+ if(COMP_LOGIC_XOR)
+ if(port.input_value)
+ . = TRUE
+ total_true_ports += 1
+
+ if(current_option == COMP_LOGIC_XOR)
+ if(total_ports == total_true_ports)
+ return FALSE
+ if(.)
+ return TRUE
diff --git a/code/modules/wiremod/components/not.dm b/code/modules/wiremod/components/not.dm
new file mode 100644
index 00000000000..c70c1966879
--- /dev/null
+++ b/code/modules/wiremod/components/not.dm
@@ -0,0 +1,33 @@
+/**
+ * # Logic Component
+ *
+ * General logic unit with AND OR capabilities
+ */
+/obj/item/circuit_component/not
+ display_name = "Not"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// The result from the output
+ var/datum/port/output/result
+ has_trigger = TRUE
+
+/obj/item/circuit_component/not/Initialize()
+ . = ..()
+ input_port = add_input_port("Input", PORT_TYPE_ANY)
+
+ result = add_output_port("Result", PORT_TYPE_NUMBER)
+
+/obj/item/circuit_component/not/Destroy()
+ input_port = null
+ result = null
+ return ..()
+
+/obj/item/circuit_component/not/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ result.set_output(!input_port.input_value)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/radio.dm b/code/modules/wiremod/components/radio.dm
new file mode 100644
index 00000000000..f20b1458c2d
--- /dev/null
+++ b/code/modules/wiremod/components/radio.dm
@@ -0,0 +1,57 @@
+/**
+ * # Radio Component
+ *
+ * Listens out for signals on the designated frequencies and
+ */
+/obj/item/circuit_component/radio
+ display_name = "Radio"
+
+ /// Frequency input
+ var/datum/port/input/freq
+ /// Signal input
+ var/datum/port/input/code
+
+ /// Current frequency value
+ var/current_freq = DEFAULT_SIGNALER_CODE
+
+ var/datum/radio_frequency/radio_connection
+
+/obj/item/circuit_component/radio/Initialize()
+ . = ..()
+ freq = add_input_port("Frequency", PORT_TYPE_NUMBER, default = FREQ_SIGNALER)
+ code = add_input_port("Code", PORT_TYPE_NUMBER, default = DEFAULT_SIGNALER_CODE)
+ trigger_input = add_input_port("Send", PORT_TYPE_SIGNAL)
+ trigger_output = add_output_port("Received", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/radio/Destroy()
+ freq = null
+ code = null
+ trigger_input = null
+ trigger_output = null
+ SSradio.remove_object(src, current_freq)
+ radio_connection = null
+ return ..()
+
+/obj/item/circuit_component/radio/input_received(datum/port/input/port)
+ . = ..()
+ freq.set_input(sanitize_frequency(freq.input_value, TRUE), FALSE)
+ if(.)
+ return
+ var/frequency = freq.input_value
+
+ SSradio.remove_object(src, current_freq)
+ radio_connection = SSradio.add_object(src, frequency, RADIO_SIGNALER)
+ current_freq = frequency
+
+ if(COMPONENT_TRIGGERED_BY(trigger_input, port))
+ var/datum/signal/signal = new(list("code" = round(code.input_value) || 0))
+ radio_connection.post_signal(src, signal)
+
+/obj/item/circuit_component/radio/receive_signal(datum/signal/signal)
+ . = FALSE
+ if(!signal)
+ return
+ if(signal.data["code"] != round(code.input_value || 0))
+ return
+
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/ram.dm b/code/modules/wiremod/components/ram.dm
new file mode 100644
index 00000000000..194f4474e54
--- /dev/null
+++ b/code/modules/wiremod/components/ram.dm
@@ -0,0 +1,51 @@
+/**
+ * # RAM Component
+ *
+ * Stores the current input when triggered.
+ * Players will need to think logically when using the RAM component
+ * as there can be race conditions due to the delays of transferring signals
+ */
+/obj/item/circuit_component/ram
+ display_name = "RAM"
+
+ /// The input to store
+ var/datum/port/input/input_port
+ /// The trigger to store the current value of the input
+ var/datum/port/input/trigger
+ /// Clears the current input
+ var/datum/port/input/clear
+
+ /// The current set value
+ var/datum/port/output/output
+
+/obj/item/circuit_component/ram/Initialize()
+ . = ..()
+ input_port = add_input_port("Input", PORT_TYPE_ANY)
+ trigger = add_input_port("Store", PORT_TYPE_SIGNAL)
+ clear = add_input_port("Clear", PORT_TYPE_SIGNAL)
+
+ output = add_output_port("Stored Value", PORT_TYPE_ANY)
+
+/obj/item/circuit_component/ram/Destroy()
+ input_port = null
+ trigger = null
+ clear = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/ram/input_received(datum/port/input/port)
+ . = ..()
+ match_port_datatype(input_port, output)
+ if(.)
+ return
+
+ if(COMPONENT_TRIGGERED_BY(clear, port))
+ output.set_output(null)
+ return
+
+ if(!COMPONENT_TRIGGERED_BY(trigger, port))
+ return
+
+ var/input_val = input_port.input_value
+
+ output.set_output(input_val)
diff --git a/code/modules/wiremod/components/random.dm b/code/modules/wiremod/components/random.dm
new file mode 100644
index 00000000000..4c1cf149b5f
--- /dev/null
+++ b/code/modules/wiremod/components/random.dm
@@ -0,0 +1,45 @@
+/**
+ * # Random Component
+ *
+ * Generates a random number between specific values
+ */
+/obj/item/circuit_component/random
+ display_name = "Random"
+
+ /// The minimum value that the random number can be
+ var/datum/port/input/minimum
+ /// The maximum value that the random number can be
+ var/datum/port/input/maximum
+
+ has_trigger = TRUE
+
+ /// The result from the output
+ var/datum/port/output/output
+
+/obj/item/circuit_component/random/Initialize()
+ . = ..()
+ minimum = add_input_port("Minimum", PORT_TYPE_NUMBER, FALSE)
+ maximum = add_input_port("Maximum", PORT_TYPE_NUMBER, FALSE)
+
+ output = add_output_port("Output", PORT_TYPE_NUMBER)
+
+/obj/item/circuit_component/random/Destroy()
+ minimum = null
+ maximum = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/random/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/min_val = minimum.input_value || 0
+ var/max_val = maximum.input_value || 0
+
+ if(max_val < min_val)
+ output.set_output(0)
+ return
+
+ output.set_output(rand(min_val, max_val))
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/self.dm b/code/modules/wiremod/components/self.dm
new file mode 100644
index 00000000000..fdd69567da7
--- /dev/null
+++ b/code/modules/wiremod/components/self.dm
@@ -0,0 +1,24 @@
+/**
+ * # Self Component
+ *
+ * Return the current shell.
+ */
+/obj/item/circuit_component/self
+ display_name = "Self"
+
+ /// The shell this component is attached to.
+ var/datum/port/output/output
+
+/obj/item/circuit_component/self/Initialize()
+ . = ..()
+ output = add_output_port("Self", PORT_TYPE_ATOM)
+
+/obj/item/circuit_component/self/Destroy()
+ output = null
+ return ..()
+
+/obj/item/circuit_component/self/register_shell(atom/movable/shell)
+ output.set_output(shell)
+
+/obj/item/circuit_component/self/unregister_shell(atom/movable/shell)
+ output.set_output(null)
diff --git a/code/modules/wiremod/components/species.dm b/code/modules/wiremod/components/species.dm
new file mode 100644
index 00000000000..5799f0580c6
--- /dev/null
+++ b/code/modules/wiremod/components/species.dm
@@ -0,0 +1,39 @@
+/**
+ * # Get Species Component
+ *
+ * Return the species of a mob
+ */
+/obj/item/circuit_component/species
+ display_name = "Get Species"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// The result from the output
+ var/datum/port/output/output
+
+ has_trigger = TRUE
+
+/obj/item/circuit_component/species/Initialize()
+ . = ..()
+ input_port = add_input_port("Organism", PORT_TYPE_ATOM)
+
+ output = add_output_port("Species", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/species/Destroy()
+ input_port = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/species/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/living/carbon/human/human = input_port.input_value
+ if(!istype(human) || !human.has_dna())
+ output.set_output(null)
+ return
+
+ output.set_output(human.dna.species.name)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/speech.dm b/code/modules/wiremod/components/speech.dm
new file mode 100644
index 00000000000..aafbbfdd1e0
--- /dev/null
+++ b/code/modules/wiremod/components/speech.dm
@@ -0,0 +1,49 @@
+/**
+ * # Speech Component
+ *
+ * Sends a message. Requires a shell.
+ */
+/obj/item/circuit_component/speech
+ display_name = "Speech"
+
+ /// The message to send
+ var/datum/port/input/message
+ /// The trigger to send the message
+ var/datum/port/input/trigger
+
+ /// The cooldown for this component of how often it can send speech messages.
+ var/speech_cooldown = 1 SECONDS
+
+ COOLDOWN_DECLARE(next_speech)
+
+/obj/item/circuit_component/speech/Initialize()
+ . = ..()
+ message = add_input_port("Message", PORT_TYPE_STRING, FALSE)
+
+ trigger = add_input_port("Trigger", PORT_TYPE_SIGNAL)
+
+
+/obj/item/circuit_component/speech/Destroy()
+ message = null
+ trigger = null
+ return ..()
+
+/obj/item/circuit_component/speech/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ if(!COMPONENT_TRIGGERED_BY(trigger, port))
+ return
+
+ if(!COOLDOWN_FINISHED(src, next_speech))
+ return
+
+ if(message.input_value)
+ var/atom/movable/shell = parent.shell
+ // Prevents appear as the individual component if there is a shell.
+ if(shell)
+ shell.say(message.input_value)
+ else
+ say(message.input_value)
+ COOLDOWN_START(src, next_speech, speech_cooldown)
diff --git a/code/modules/wiremod/components/textcase.dm b/code/modules/wiremod/components/textcase.dm
new file mode 100644
index 00000000000..1963455fc8e
--- /dev/null
+++ b/code/modules/wiremod/components/textcase.dm
@@ -0,0 +1,50 @@
+/**
+ * # Text Component
+ *
+ * Either makes the text upper case or lower case.
+ */
+/obj/item/circuit_component/textcase
+ display_name = "Text Case"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// The result of the text operation
+ var/datum/port/output/output
+
+ has_trigger = TRUE
+
+GLOBAL_LIST_INIT(comp_text_operations, list(
+ COMP_TEXT_LOWER,
+ COMP_TEXT_UPPER
+))
+
+/obj/item/circuit_component/textcase/Initialize()
+ options = GLOB.comp_text_operations
+ . = ..()
+ input_port = add_input_port("Input", PORT_TYPE_STRING)
+ output = add_output_port("Output", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/textcase/Destroy()
+ input_port = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/textcase/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/value = input_port.input_value
+ if(isnull(value))
+ return
+
+ var/result
+ switch(current_option)
+ if(COMP_TEXT_LOWER)
+ result = lowertext(value)
+ if(COMP_TEXT_UPPER)
+ result = uppertext(value)
+
+ output.set_output(result)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/tostring.dm b/code/modules/wiremod/components/tostring.dm
new file mode 100644
index 00000000000..d37a4827167
--- /dev/null
+++ b/code/modules/wiremod/components/tostring.dm
@@ -0,0 +1,44 @@
+/**
+ * # To String Component
+ *
+ * Converts any value into a string
+ */
+/obj/item/circuit_component/tostring
+ display_name = "To String"
+
+ /// The input port
+ var/datum/port/input/input_port
+
+ /// The result from the output
+ var/datum/port/output/output
+
+ has_trigger = TRUE
+
+ var/min_range = 5
+
+/obj/item/circuit_component/tostring/Initialize()
+ . = ..()
+ input_port = add_input_port("Input", PORT_TYPE_ANY)
+
+ output = add_output_port("Output", PORT_TYPE_STRING)
+
+/obj/item/circuit_component/tostring/Destroy()
+ input_port = null
+ output = null
+ return ..()
+
+/obj/item/circuit_component/tostring/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/input_value = input_port.input_value
+ if(isatom(input_value))
+ var/turf/location = get_turf(src)
+ var/atom/object = input_value
+ if(object.z != location.z || get_dist(location, object) > min_range)
+ output.set_output(PORT_TYPE_ATOM)
+ return
+
+ output.set_output("[input_value]")
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/components/typecheck.dm b/code/modules/wiremod/components/typecheck.dm
new file mode 100644
index 00000000000..cf8cf8270e9
--- /dev/null
+++ b/code/modules/wiremod/components/typecheck.dm
@@ -0,0 +1,48 @@
+/**
+ * # Typecheck Component
+ *
+ * Checks the type of a value
+ */
+/obj/item/circuit_component/compare/typecheck
+ display_name = "Typecheck"
+
+ input_port_amount = 1
+
+ has_trigger = TRUE
+
+
+GLOBAL_LIST_INIT(comp_typecheck_options, list(
+ PORT_TYPE_STRING,
+ PORT_TYPE_NUMBER,
+ PORT_TYPE_LIST,
+ PORT_TYPE_ATOM,
+ COMP_TYPECHECK_MOB,
+ COMP_TYPECHECK_HUMAN,
+))
+
+/obj/item/circuit_component/compare/typecheck/Initialize()
+ options = GLOB.comp_typecheck_options
+ return ..()
+
+/obj/item/circuit_component/compare/typecheck/do_comparisons(list/ports)
+ if(!length(ports))
+ return
+ . = FALSE
+
+ // We're only comparing the first port/value. There shouldn't be any more.
+ var/datum/port/input/input_port = ports[1]
+ var/input_val = input_port.input_value
+ switch(current_option)
+ if(PORT_TYPE_STRING)
+ return istext(input_val)
+ if(PORT_TYPE_NUMBER)
+ return isnum(input_val)
+ if(PORT_TYPE_LIST)
+ return islist(input_val)
+ if(PORT_TYPE_ATOM)
+ return isatom(input_val)
+ if(COMP_TYPECHECK_MOB)
+ return ismob(input_val)
+ if(COMP_TYPECHECK_HUMAN)
+ return ishuman(input_val)
+ trigger_output.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/integrated_circuit.dm b/code/modules/wiremod/integrated_circuit.dm
new file mode 100644
index 00000000000..0715b55cc35
--- /dev/null
+++ b/code/modules/wiremod/integrated_circuit.dm
@@ -0,0 +1,351 @@
+/**
+ * # Integrated Circuitboard
+ *
+ * A circuitboard that holds components that work together
+ *
+ * Has a limited amount of power.
+ */
+/obj/item/integrated_circuit
+ name = "integrated circuit"
+ icon = 'icons/obj/module.dmi'
+ icon_state = "integrated_circuit"
+ inhand_icon_state = "electronic"
+
+ /// The power of the integrated circuit
+ var/obj/item/stock_parts/cell/cell
+
+ /// The shell that this circuitboard is attached to. Used by components.
+ var/atom/movable/shell
+
+ /// The attached components
+ var/list/obj/item/circuit_component/attached_components = list()
+
+ /// Whether the integrated circuit is on or not. Handled by the shell.
+ var/on = FALSE
+
+/obj/item/integrated_circuit/loaded/Initialize()
+ . = ..()
+ cell = new /obj/item/stock_parts/cell/high(src)
+
+/obj/item/integrated_circuit/Destroy()
+ for(var/obj/item/circuit_component/to_delete in attached_components)
+ remove_component(to_delete)
+ qdel(to_delete)
+ shell = null
+ QDEL_NULL(cell)
+ return ..()
+
+/obj/item/integrated_circuit/examine(mob/user)
+ . = ..()
+ if(cell)
+ . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%."
+ else
+ . += "There is no power cell installed."
+
+/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, params)
+ . = ..()
+ if(istype(I, /obj/item/circuit_component))
+ add_component(I, user)
+ return
+
+ if(istype(I, /obj/item/stock_parts/cell))
+ if(cell)
+ balloon_alert(user, "There already is a cell inside!")
+ return
+ if(!user.transferItemToLoc(I, src))
+ return
+ cell = I
+ I.add_fingerprint(user)
+ user.visible_message("[user] inserts a power cell into [src].", "You insert the power cell into [src].")
+ return
+
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ if(!cell)
+ return
+ I.play_tool_sound(src)
+ user.visible_message("[user] unscrews the power cell from [src].", "You unscrew the power cell from [src].")
+ cell.forceMove(drop_location())
+ cell = null
+ return
+
+/**
+ * Registers an movable atom as a shell
+ *
+ * No functionality is done here. This is so that input components
+ * can properly register any signals on the shell.
+ * Arguments:
+ * * new_shell - The new shell to register.
+ */
+/obj/item/integrated_circuit/proc/set_shell(atom/movable/new_shell)
+ remove_current_shell()
+ on = TRUE
+ shell = new_shell
+ RegisterSignal(shell, COMSIG_PARENT_QDELETING, .proc/remove_current_shell)
+ for(var/obj/item/circuit_component/attached_component as anything in attached_components)
+ attached_component.register_shell(shell)
+ // Their input ports may be updated with user values, but the outputs haven't updated
+ // because on is FALSE
+ attached_component.input_received()
+
+/**
+ * Unregisters the current shell attached to this circuit.
+ */
+/obj/item/integrated_circuit/proc/remove_current_shell()
+ SIGNAL_HANDLER
+ if(!shell)
+ return
+ for(var/obj/item/circuit_component/attached_component as anything in attached_components)
+ attached_component.unregister_shell(shell)
+ UnregisterSignal(shell, COMSIG_PARENT_QDELETING)
+ shell = null
+ on = FALSE
+
+/**
+ * Adds a component to the circuitboard
+ *
+ * Once the component is added, the ports can be attached to other components
+ */
+/obj/item/integrated_circuit/proc/add_component(obj/item/circuit_component/to_add, mob/living/user)
+ if(to_add.parent)
+ return
+
+ if(SEND_SIGNAL(src, COMSIG_CIRCUIT_ADD_COMPONENT, to_add, user) & COMPONENT_CANCEL_ADD_COMPONENT)
+ return
+
+ var/success = FALSE
+ if(user)
+ success = user.transferItemToLoc(to_add, src)
+ else
+ success = to_add.forceMove(src)
+
+ if(!success)
+ return
+
+ to_add.rel_x = rand(COMPONENT_MIN_RANDOM_POS, COMPONENT_MAX_RANDOM_POS)
+ to_add.rel_y = rand(COMPONENT_MIN_RANDOM_POS, COMPONENT_MAX_RANDOM_POS)
+ to_add.parent = src
+ attached_components += to_add
+ RegisterSignal(to_add, COMSIG_MOVABLE_MOVED, .proc/component_move_handler)
+ SStgui.update_uis(src)
+
+ if(shell)
+ to_add.register_shell(shell)
+
+/obj/item/integrated_circuit/proc/component_move_handler(obj/item/circuit_component/source)
+ SIGNAL_HANDLER
+ if(source.loc != src)
+ remove_component(source)
+
+/**
+ * Removes a component to the circuitboard
+ *
+ * This removes all connects between the ports
+ */
+/obj/item/integrated_circuit/proc/remove_component(obj/item/circuit_component/to_remove)
+ if(shell)
+ to_remove.unregister_shell(shell)
+
+ UnregisterSignal(to_remove, COMSIG_MOVABLE_MOVED)
+ attached_components -= to_remove
+ to_remove.disconnect()
+ to_remove.parent = null
+ SStgui.update_uis(src)
+
+/obj/item/integrated_circuit/get_cell()
+ return cell
+
+/obj/item/integrated_circuit/ui_assets(mob/user)
+ return list(
+ get_asset_datum(/datum/asset/simple/circuit_assets)
+ )
+
+/obj/item/integrated_circuit/ui_data(mob/user)
+ . = list()
+ .["components"] = list()
+ for(var/obj/item/circuit_component/component as anything in attached_components)
+ var/list/component_data = list()
+ component_data["input_ports"] = list()
+ for(var/datum/port/input/port as anything in component.input_ports)
+ var/current_data = port.input_value
+ if(isatom(current_data)) // Prevent passing the name of the atom.
+ current_data = null
+ component_data["input_ports"] += list(list(
+ "name" = port.name,
+ "type" = port.datatype,
+ "ref" = REF(port), // The ref is the identifier to work out what it is connected to
+ "connected_to" = REF(port.connected_port),
+ "color" = port.color,
+ "current_data" = current_data,
+ ))
+ component_data["output_ports"] = list()
+ for(var/datum/port/output/port as anything in component.output_ports)
+ component_data["output_ports"] += list(list(
+ "name" = port.name,
+ "type" = port.datatype,
+ "ref" = REF(port),
+ "color" = port.color
+ ))
+
+ component_data["name"] = component.display_name
+ component_data["x"] = component.rel_x
+ component_data["y"] = component.rel_y
+ component_data["option"] = component.current_option
+ component_data["options"] = component.options
+ component_data["removable"] = component.removable
+ .["components"] += list(component_data)
+
+/obj/item/integrated_circuit/ui_host(mob/user)
+ if(shell)
+ return shell
+ return ..()
+
+/obj/item/integrated_circuit/ui_state(mob/user)
+ if(!shell)
+ return GLOB.hands_state
+ return GLOB.physical_obscured_state
+
+/obj/item/integrated_circuit/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "IntegratedCircuit", name)
+ ui.open()
+ ui.set_autoupdate(FALSE)
+
+#define WITHIN_RANGE(id, table) (id >= 1 && id <= length(table))
+
+/obj/item/integrated_circuit/ui_act(action, list/params)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("add_connection")
+ var/input_component_id = text2num(params["input_component_id"])
+ var/output_component_id = text2num(params["output_component_id"])
+ var/input_port_id = text2num(params["input_port_id"])
+ var/output_port_id = text2num(params["output_port_id"])
+ if(!WITHIN_RANGE(input_component_id, attached_components) || !WITHIN_RANGE(output_component_id, attached_components))
+ return
+ var/obj/item/circuit_component/input_component = attached_components[input_component_id]
+ var/obj/item/circuit_component/output_component = attached_components[output_component_id]
+
+ if(!WITHIN_RANGE(input_port_id, input_component.input_ports) || !WITHIN_RANGE(output_port_id, output_component.output_ports))
+ return
+ var/datum/port/input/input_port = input_component.input_ports[input_port_id]
+ var/datum/port/output/output_port = output_component.output_ports[output_port_id]
+
+ if(input_port.datatype && !output_port.compatible_datatype(input_port.datatype))
+ return
+
+ input_port.register_output_port(output_port)
+ . = TRUE
+ if("remove_connection")
+ var/component_id = text2num(params["component_id"])
+ var/is_input = params["is_input"]
+ var/port_id = text2num(params["port_id"])
+
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+
+ var/list/port_table
+ if(is_input)
+ port_table = component.input_ports
+ else
+ port_table = component.output_ports
+
+ if(!WITHIN_RANGE(port_id, port_table))
+ return
+
+ var/datum/port/port = port_table[port_id]
+ port.disconnect()
+ . = TRUE
+ if("detach_component")
+ var/component_id = text2num(params["component_id"])
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+ if(!component.removable)
+ return
+ component.disconnect()
+ remove_component(component)
+ usr.put_in_hands(component)
+ . = TRUE
+ if("set_component_coordinates")
+ var/component_id = text2num(params["component_id"])
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+ component.rel_x = min(max(-COMPONENT_MAX_POS, text2num(params["rel_x"])), COMPONENT_MAX_POS)
+ component.rel_y = min(max(-COMPONENT_MAX_POS, text2num(params["rel_y"])), COMPONENT_MAX_POS)
+ . = TRUE
+ if("set_component_option")
+ var/component_id = text2num(params["component_id"])
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+ var/option = params["option"]
+ if(!(option in component.options))
+ return
+ component.set_option(option)
+ . = TRUE
+ if("set_component_input")
+ var/component_id = text2num(params["component_id"])
+ var/port_id = text2num(params["port_id"])
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+ if(!WITHIN_RANGE(port_id, component.input_ports))
+ return
+ var/datum/port/input/port = component.input_ports[port_id]
+
+ if(port.connected_port)
+ return
+
+ if(params["set_null"])
+ port.set_input(null)
+ return TRUE
+
+ if(params["marked_atom"])
+ if(port.datatype != PORT_TYPE_ATOM && port.datatype != PORT_TYPE_ANY)
+ return
+ var/obj/item/multitool/circuit/marker = usr.get_active_held_item()
+ if(!istype(marker))
+ return TRUE
+ if(!marker.marked_atom)
+ port.set_input(null)
+ marker.say("Cleared port ('[port.name]')'s value.")
+ return TRUE
+ marker.say("Updated port ('[port.name]')'s value to the marked entity.")
+ port.set_input(marker.marked_atom)
+ return TRUE
+
+ var/user_input = params["input"]
+ switch(port.datatype)
+ if(PORT_TYPE_NUMBER)
+ port.set_input(text2num(user_input))
+ if(PORT_TYPE_ANY)
+ var/any_type = copytext(user_input, 1, PORT_MAX_STRING_LENGTH)
+ port.set_input(text2num(any_type) || any_type)
+ if(PORT_TYPE_STRING)
+ port.set_input(copytext(user_input, 1, PORT_MAX_STRING_LENGTH))
+ . = TRUE
+ if("get_component_value")
+ var/component_id = text2num(params["component_id"])
+ var/port_id = text2num(params["port_id"])
+ if(!WITHIN_RANGE(component_id, attached_components))
+ return
+ var/obj/item/circuit_component/component = attached_components[component_id]
+ if(!WITHIN_RANGE(port_id, component.output_ports))
+ return
+
+ var/datum/port/output/port = component.output_ports[port_id]
+ var/value = port.output_value
+ if(isatom(value))
+ value = port.convert_value(port.output_value)
+ else if(isnull(value))
+ value = "null"
+ balloon_alert(usr, "[port.name] value: [value]")
+ . = TRUE
+
+#undef WITHIN_RANGE
diff --git a/code/modules/wiremod/marker.dm b/code/modules/wiremod/marker.dm
new file mode 100644
index 00000000000..1bae6b6569c
--- /dev/null
+++ b/code/modules/wiremod/marker.dm
@@ -0,0 +1,49 @@
+/obj/item/multitool/circuit
+ name = "circuit multitool"
+ desc = "A circuit multitool. Used to mark entities which can then be uploaded to components by pressing the upload button on a port. \
+ Acts as a normal multitool otherwise. Use in hand to clear marked entity so that you can mark another entity."
+
+ /// The marked atom of this multitool
+ var/atom/marked_atom
+
+/obj/item/multitool/circuit/Destroy()
+ marked_atom = null
+ return ..()
+
+/obj/item/multitool/circuit/examine(mob/user)
+ . = ..()
+ . += "It has [marked_atom? "a" : "no"] marked entity registered."
+
+/obj/item/multitool/circuit/attack_self(mob/user, modifiers)
+ . = ..()
+ if(.)
+ return
+ if(!marked_atom)
+ return
+
+ say("Cleared marked targets.")
+ clear_marked_atom()
+ return TRUE
+
+/obj/item/multitool/circuit/melee_attack_chain(mob/user, atom/target, params)
+ var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK)
+
+ if(marked_atom || !user.Adjacent(target) || is_right_clicking)
+ return ..()
+
+ say("Marked [target].")
+ marked_atom = target
+ RegisterSignal(marked_atom, COMSIG_PARENT_QDELETING, .proc/cleanup_marked_atom)
+ return TRUE
+
+/// Clears the current marked atom
+/obj/item/multitool/circuit/proc/clear_marked_atom()
+ if(!marked_atom)
+ return
+ UnregisterSignal(marked_atom, COMSIG_PARENT_QDELETING)
+ marked_atom = null
+
+/obj/item/multitool/circuit/proc/cleanup_marked_atom(datum/source)
+ SIGNAL_HANDLER
+ if(source == marked_atom)
+ clear_marked_atom()
diff --git a/code/modules/wiremod/port.dm b/code/modules/wiremod/port.dm
new file mode 100644
index 00000000000..5bbcb6c87f7
--- /dev/null
+++ b/code/modules/wiremod/port.dm
@@ -0,0 +1,282 @@
+/**
+ * # Component Port
+ *
+ * A base type port used by a component
+ *
+ * Connects to other ports. This is an abstract type that should not be instanciated
+ */
+/datum/port
+ /// The component this port is attached to
+ var/obj/item/circuit_component/connected_component
+
+ /// Name of the port. Used when displaying the port.
+ var/name
+
+ /// The port type. Ports can only connect to each other if the type matches
+ var/datatype
+
+ /// The port color. If unset, appears as blue.
+ var/color
+
+/datum/port/New(obj/item/circuit_component/to_connect, name, datatype)
+ if(!to_connect)
+ qdel(src)
+ return
+ . = ..()
+ // Don't need to do src.connected_component here, but it looks inline
+ // with the other variable declarations
+ src.connected_component = to_connect
+ src.name = name
+ src.datatype = datatype
+ src.color = datatype_to_color()
+
+
+///Converts the datatype into an appropriate colour
+/datum/port/proc/datatype_to_color()
+ switch(datatype)
+ if(PORT_TYPE_ATOM)
+ return "purple"
+ if(PORT_TYPE_NUMBER)
+ return "green"
+ if(PORT_TYPE_STRING)
+ return "orange"
+ if(PORT_TYPE_LIST)
+ return "white"
+ if(PORT_TYPE_SIGNAL)
+ return "teal"
+
+/datum/port/Destroy(force)
+ if(!force && !QDELETED(connected_component))
+ // This should never happen. Ports should be deleted with their components
+ stack_trace("Attempted to delete a port with a non-destroyed connected_component! (port name: [name], component type: [connected_component.type])")
+ return QDEL_HINT_LETMELIVE
+ connected_component = null
+ return ..()
+
+/**
+ * Returns the value to be set for the port
+ *
+ * Used for implicit conversions between outputs and inputs (e.g. number -> string)
+ * and applying/removing signals on inputs
+ */
+/datum/port/proc/convert_value(prev_value, value_to_convert)
+ if(prev_value == value_to_convert)
+ return prev_value
+ . = value_to_convert
+
+ switch(datatype)
+ if(PORT_TYPE_STRING)
+ // So that they can't easily get the name like this.
+ if(isatom(value_to_convert))
+ return PORT_TYPE_ATOM
+ else
+ return "[value_to_convert]"
+
+ if(isatom(value_to_convert))
+ var/atom/atom_to_check = value_to_convert
+ if(QDELETED(atom_to_check))
+ return null
+
+/**
+ * Sets the datatype of the port.
+ *
+ * Arguments:
+ * * type_to_set - The type this port is set to.
+ */
+/datum/port/proc/set_datatype(type_to_set)
+ datatype = type_to_set
+ color = datatype_to_color()
+ disconnect()
+ if(connected_component)
+ SStgui.update_uis(connected_component)
+
+/**
+ * Disconnects a port from all other ports
+ *
+ * Called by [/obj/item/circuit_component] whenever it is disconnected from
+ * an integrated circuit
+ */
+/datum/port/proc/disconnect()
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_PORT_DISCONNECT)
+
+
+/**
+ * # Output Port
+ *
+ * An output port that many input ports can connect to
+ *
+ * Sends a signal whenever the output value is changed
+ */
+/datum/port/output
+ /// The output value of the port
+ var/output_value
+
+/datum/port/output/disconnect()
+ set_output(null)
+ return ..()
+
+/datum/port/output/Destroy(force)
+ output_value = null
+ return ..()
+
+/**
+ * Sets the output value of the port
+ *
+ * Arguments:
+ * * value - The value to set it to
+ */
+/datum/port/output/proc/set_output(value)
+ if(isatom(output_value))
+ UnregisterSignal(output_value, COMSIG_PARENT_QDELETING)
+ output_value = convert_value(output_value, value)
+ if(isatom(output_value))
+ RegisterSignal(output_value, COMSIG_PARENT_QDELETING, .proc/null_output)
+
+ SEND_SIGNAL(src, COMSIG_PORT_SET_OUTPUT, output_value)
+
+/// Signal handler proc to null the output if an atom is deleted. An update is not sent because this was not set.
+/datum/port/output/proc/null_output(datum/source)
+ SIGNAL_HANDLER
+ if(output_value == source)
+ output_value = null
+
+/datum/port/output/set_datatype(type_to_set)
+ . = ..()
+ set_output(null)
+
+/**
+ * Determines if a datatype is compatible with this port.
+ *
+ * Arguments:
+ * * other_datatype - The datatype to check
+ */
+/datum/port/output/proc/compatible_datatype(datatype_to_check)
+ if(datatype_to_check == datatype)
+ return TRUE
+
+ switch(datatype)
+ if(PORT_TYPE_NUMBER)
+ // Can easily convert a number to string. Everything else has to use a tostring component
+ return datatype_to_check == PORT_TYPE_STRING || datatype_to_check == PORT_TYPE_SIGNAL
+ if(PORT_TYPE_SIGNAL)
+ // A signal port is just a number port but distinguishable
+ return datatype_to_check == PORT_TYPE_NUMBER
+
+ return FALSE
+
+/**
+ * # Input Port
+ *
+ * An input port that can only be connected to 1 output port
+ *
+ * Registers a signal on the target output port to listen out for any output
+ * so that an update can be sent to the attached component
+ */
+/datum/port/input
+ /// The output value of the port
+ var/input_value
+
+ /// The connected output port
+ var/datum/port/output/connected_port
+
+ /// The delay before updating the input value whenever a modification is made.
+ /// This does not apply when when the output port is registered
+ var/input_receive_delay = PORT_INPUT_RECEIVE_DELAY
+
+ /// Whether this port triggers an update whenever an output is received.
+ var/trigger = FALSE
+
+ /// The default value of this input
+ var/default
+
+/datum/port/input/New(obj/item/circuit_component/to_connect, name, datatype, trigger, default)
+ . = ..()
+ src.trigger = trigger
+ src.default = default
+ set_input(default, FALSE)
+
+/**
+ * Connects the input port to the output port
+ *
+ * Sets the input_value and registers a signal to receive future updates.
+ * Arguments:
+ * * port_to_register - The port to connect the input port to
+ */
+/datum/port/input/proc/register_output_port(datum/port/output/port_to_register)
+ unregister_output_port()
+
+ RegisterSignal(port_to_register, COMSIG_PORT_SET_OUTPUT, .proc/receive_output)
+ RegisterSignal(port_to_register, list(
+ COMSIG_PORT_DISCONNECT,
+ COMSIG_PARENT_QDELETING
+ ), .proc/unregister_output_port)
+
+ connected_port = port_to_register
+ SEND_SIGNAL(connected_port, COMSIG_PORT_OUTPUT_CONNECT, src)
+ set_input(connected_port.output_value)
+
+
+/**
+ * Sets a timer depending on the value of the input_receive_delay
+ *
+ * The timer will call a proc that updates the value.
+ * Arguments:
+ * * connected_port - The connected output port
+ * * new_value - The new value received from the output port
+ */
+/datum/port/input/proc/receive_output(datum/port/output/connected_port, new_value)
+ SIGNAL_HANDLER
+ if(input_receive_delay)
+ addtimer(CALLBACK(src, .proc/set_input, new_value), input_receive_delay, timer_subsystem = SScircuit_component)
+ else
+ set_input(new_value)
+
+/**
+ * Updates the value of the input
+ *
+ * It updates the value of the input and calls input_received on the connected component
+ * Arguments:
+ * * port_to_register - The port to connect the input port to
+ */
+/datum/port/input/proc/set_input(new_value, send_update = TRUE)
+ if(isatom(input_value))
+ UnregisterSignal(input_value, COMSIG_PARENT_QDELETING)
+ input_value = convert_value(input_value, new_value)
+ if(isatom(input_value))
+ RegisterSignal(input_value, COMSIG_PARENT_QDELETING, .proc/null_output)
+
+ SEND_SIGNAL(src, COMSIG_PORT_SET_INPUT, input_value)
+ if(trigger && send_update)
+ connected_component.input_received(src)
+
+/// Signal handler proc to null the input if an atom is deleted. An update is not sent because this was not set by anything.
+/datum/port/input/proc/null_output(datum/source)
+ SIGNAL_HANDLER
+ if(input_value == source)
+ input_value = null
+
+/datum/port/input/disconnect()
+ unregister_output_port()
+ return ..()
+
+/datum/port/input/set_datatype(type_to_set)
+ . = ..()
+ set_input(default)
+
+/datum/port/input/proc/unregister_output_port()
+ SIGNAL_HANDLER
+ if(!connected_port)
+ return
+ UnregisterSignal(connected_port, list(
+ COMSIG_PARENT_QDELETING,
+ COMSIG_PORT_SET_OUTPUT,
+ COMSIG_PORT_DISCONNECT
+ ))
+ connected_port = null
+ set_input(default)
+
+/datum/port/input/Destroy()
+ unregister_output_port()
+ connected_port = null
+ return ..()
diff --git a/code/modules/wiremod/preset/hello_world.dm b/code/modules/wiremod/preset/hello_world.dm
new file mode 100644
index 00000000000..9aee88a300a
--- /dev/null
+++ b/code/modules/wiremod/preset/hello_world.dm
@@ -0,0 +1,14 @@
+/**
+ * # Hello World preset
+ *
+ * Says "Hello World" when triggered. Needs to be wired up and connected first.
+ */
+/obj/item/integrated_circuit/loaded/hello_world
+
+/obj/item/integrated_circuit/loaded/hello_world/Initialize()
+ . = ..()
+ var/obj/item/circuit_component/speech/speech = new()
+ add_component(speech)
+
+ speech.message.set_input("Hello World")
+
diff --git a/code/modules/wiremod/preset/speech_relay.dm b/code/modules/wiremod/preset/speech_relay.dm
new file mode 100644
index 00000000000..1b6cd65d561
--- /dev/null
+++ b/code/modules/wiremod/preset/speech_relay.dm
@@ -0,0 +1,22 @@
+/**
+ * # Speech Relay preset
+ *
+ * Acts like poly. Says whatever it hears.
+ */
+/obj/item/integrated_circuit/loaded/speech_relay
+
+/obj/item/integrated_circuit/loaded/speech_relay/Initialize()
+ . = ..()
+ var/obj/item/circuit_component/hear/hear = new()
+ add_component(hear)
+ hear.rel_x = 100
+ hear.rel_y = 200
+
+ var/obj/item/circuit_component/speech/speech = new()
+ add_component(speech)
+ speech.rel_x = 400
+ speech.rel_y = 200
+
+ speech.message.register_output_port(hear.message_port)
+ speech.trigger.register_output_port(hear.trigger_port)
+
diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm
new file mode 100644
index 00000000000..8145d307692
--- /dev/null
+++ b/code/modules/wiremod/shell/bot.dm
@@ -0,0 +1,18 @@
+/**
+ * # Bot
+ *
+ * Immobile (but not dense) shells that can interact with world.
+ */
+/obj/structure/bot
+ name = "bot"
+ icon = 'icons/obj/wiremod.dmi'
+ icon_state = "setup_medium_box"
+
+ density = FALSE
+ light_system = MOVABLE_LIGHT
+ light_on = FALSE
+
+/obj/structure/bot/Initialize()
+ . = ..()
+ AddComponent(/datum/component/shell, null, SHELL_CAPACITY_LARGE)
+
diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm
new file mode 100644
index 00000000000..cc3b5327243
--- /dev/null
+++ b/code/modules/wiremod/shell/compact_remote.dm
@@ -0,0 +1,50 @@
+/**
+ * # Compact Remote
+ *
+ * A handheld device with one big button.
+ */
+/obj/item/compact_remote
+ name = "compact remote"
+ icon = 'icons/obj/wiremod.dmi'
+ icon_state = "setup_small_simple"
+ inhand_icon_state = "electronic"
+ worn_icon_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ light_system = MOVABLE_LIGHT_DIRECTIONAL
+ light_on = FALSE
+
+/obj/item/compact_remote/Initialize()
+ . = ..()
+ AddComponent(/datum/component/shell, list(
+ new /obj/item/circuit_component/compact_remote()
+ ), SHELL_CAPACITY_SMALL)
+
+/obj/item/circuit_component/compact_remote
+ display_name = "Compact Remote"
+
+ /// Called when attack_self is called on the shell.
+ var/datum/port/output/signal
+
+/obj/item/circuit_component/compact_remote/Initialize()
+ . = ..()
+ signal = add_output_port("Signal", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/compact_remote/Destroy()
+ signal = null
+ return ..()
+
+/obj/item/circuit_component/compact_remote/register_shell(atom/movable/shell)
+ RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger)
+
+/obj/item/circuit_component/compact_remote/unregister_shell(atom/movable/shell)
+ UnregisterSignal(shell, COMSIG_ITEM_ATTACK_SELF)
+
+/**
+ * Called when the shell item is used in hand.
+ */
+/obj/item/circuit_component/compact_remote/proc/send_trigger(atom/source, mob/user)
+ SIGNAL_HANDLER
+ source.balloon_alert(user, "clicked primary button")
+ playsound(source, get_sfx("terminal_type"), 25, FALSE)
+ signal.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm
new file mode 100644
index 00000000000..c9cc153a9db
--- /dev/null
+++ b/code/modules/wiremod/shell/controller.dm
@@ -0,0 +1,84 @@
+/**
+ * # Compact Remote
+ *
+ * A handheld device with several buttons.
+ * In game, this translates to having different signals for normal usage, alt-clicking, and ctrl-clicking when in your hand.
+ */
+/obj/item/controller
+ name = "controller"
+ icon = 'icons/obj/wiremod.dmi'
+ icon_state = "setup_small_calc"
+ inhand_icon_state = "electronic"
+ worn_icon_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ light_system = MOVABLE_LIGHT_DIRECTIONAL
+ light_on = FALSE
+
+/obj/item/controller/Initialize()
+ . = ..()
+ AddComponent(/datum/component/shell, list(
+ new /obj/item/circuit_component/controller()
+ ), SHELL_CAPACITY_MEDIUM)
+
+/obj/item/circuit_component/controller
+ display_name = "Controller"
+
+ /// The three separate buttons that are called in attack_hand on the shell.
+ var/datum/port/output/signal
+ var/datum/port/output/alt
+ var/datum/port/output/right
+
+/obj/item/circuit_component/controller/Initialize()
+ . = ..()
+ signal = add_output_port("Signal", PORT_TYPE_SIGNAL)
+ alt = add_output_port("Alternate Signal", PORT_TYPE_SIGNAL)
+ right = add_output_port("Extra Signal", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/controller/Destroy()
+ signal = null
+ alt = null
+ right = null
+ return ..()
+
+/obj/item/circuit_component/controller/register_shell(atom/movable/shell)
+ RegisterSignal(shell, COMSIG_ITEM_ATTACK_SELF, .proc/send_trigger)
+ RegisterSignal(shell, COMSIG_CLICK_ALT, .proc/send_alternate_signal)
+ RegisterSignal(shell, COMSIG_CLICK_ALT_SECONDARY, .proc/send_right_signal)
+
+/obj/item/circuit_component/controller/unregister_shell(atom/movable/shell)
+ UnregisterSignal(shell, list(
+ COMSIG_ITEM_ATTACK_SELF,
+ COMSIG_CLICK_ALT_SECONDARY,
+ COMSIG_CLICK_ALT,
+ ))
+
+/**
+ * Called when the shell item is used in hand, including right click.
+ */
+/obj/item/circuit_component/controller/proc/send_trigger(atom/source, mob/user)
+ SIGNAL_HANDLER
+ if(!user.Adjacent(source))
+ return
+ source.balloon_alert(user, "clicked primary button")
+ playsound(source, get_sfx("terminal_type"), 25, FALSE)
+ signal.set_output(COMPONENT_SIGNAL)
+
+/**
+ * Called when the shell item is alt-clicked
+ */
+/obj/item/circuit_component/controller/proc/send_alternate_signal(atom/source, mob/user)
+ SIGNAL_HANDLER
+ if(!user.Adjacent(source))
+ return
+ source.balloon_alert(user, "clicked alternate button")
+ playsound(source, get_sfx("terminal_type"), 25, FALSE)
+ alt.set_output(COMPONENT_SIGNAL)
+
+/obj/item/circuit_component/controller/proc/send_right_signal(atom/source, mob/user)
+ SIGNAL_HANDLER
+ if(!user.Adjacent(source))
+ return
+ source.balloon_alert(user, "clicked extra button")
+ playsound(source, get_sfx("terminal_type"), 25, FALSE)
+ right.set_output(COMPONENT_SIGNAL)
diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm
new file mode 100644
index 00000000000..356bc20b438
--- /dev/null
+++ b/code/modules/wiremod/shell/drone.dm
@@ -0,0 +1,68 @@
+/**
+ * # Drone
+ *
+ * A movable mob that can be fed inputs on which direction to travel.
+ */
+/mob/living/circuit_drone
+ name = "drone"
+ icon = 'icons/obj/wiremod.dmi'
+ icon_state = "setup_medium_med"
+ living_flags = 0
+ light_system = MOVABLE_LIGHT_DIRECTIONAL
+ light_on = FALSE
+
+/mob/living/circuit_drone/Initialize()
+ . = ..()
+ AddComponent(/datum/component/shell, list(
+ new /obj/item/circuit_component/bot_circuit()
+ ), SHELL_CAPACITY_LARGE)
+
+/mob/living/circuit_drone/updatehealth()
+ . = ..()
+ if(health < 0)
+ gib(no_brain = TRUE, no_organs = TRUE, no_bodyparts = TRUE)
+
+/mob/living/circuit_drone/spawn_gibs()
+ new /obj/effect/gibspawner/robot(drop_location(), src, get_static_viruses())
+
+/obj/item/circuit_component/bot_circuit
+ display_name = "Drone"
+
+ /// The inputs to allow for the drone to move
+ var/datum/port/input/north
+ var/datum/port/input/east
+ var/datum/port/input/south
+ var/datum/port/input/west
+
+/obj/item/circuit_component/bot_circuit/Initialize()
+ . = ..()
+ north = add_input_port("Move North", PORT_TYPE_SIGNAL)
+ east = add_input_port("Move East", PORT_TYPE_SIGNAL)
+ south = add_input_port("Move South", PORT_TYPE_SIGNAL)
+ west = add_input_port("Move West", PORT_TYPE_SIGNAL)
+
+/obj/item/circuit_component/bot_circuit/input_received(datum/port/input/port)
+ . = ..()
+ if(.)
+ return
+
+ var/mob/living/shell = parent.shell
+ if(!istype(shell) || shell.stat)
+ return
+
+ var/direction
+
+ if(COMPONENT_TRIGGERED_BY(north, port))
+ direction = NORTH
+ else if(COMPONENT_TRIGGERED_BY(east, port))
+ direction = EAST
+ else if(COMPONENT_TRIGGERED_BY(south, port))
+ direction = SOUTH
+ else if(COMPONENT_TRIGGERED_BY(west, port))
+ direction = WEST
+
+ if(!direction)
+ return
+
+ if(shell.Process_Spacemove(direction))
+ shell.Move(get_step(shell, direction), direction)
diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm
new file mode 100644
index 00000000000..d63deb18f1e
--- /dev/null
+++ b/code/modules/wiremod/shell/server.dm
@@ -0,0 +1,24 @@
+/**
+ * # Server
+ *
+ * Immobile (but not dense) shells that can interact with
+ * world.
+ */
+/obj/structure/server
+ name = "server"
+ icon = 'icons/obj/wiremod.dmi'
+ icon_state = "setup_stationary"
+
+ density = TRUE
+ light_system = MOVABLE_LIGHT
+ light_on = FALSE
+
+/obj/structure/server/Initialize()
+ . = ..()
+ AddComponent(/datum/component/shell, null, SHELL_CAPACITY_VERY_LARGE, SHELL_FLAG_REQUIRE_ANCHOR)
+
+/obj/structure/server/wrench_act(mob/living/user, obj/item/tool)
+ set_anchored(!anchored)
+ tool.play_tool_sound(src)
+ balloon_alert(user, "You [anchored?"secure":"unsecure"] [src].")
+ return TRUE
diff --git a/code/modules/wiremod/shell/shell_items.dm b/code/modules/wiremod/shell/shell_items.dm
new file mode 100644
index 00000000000..ebc2f3ca512
--- /dev/null
+++ b/code/modules/wiremod/shell/shell_items.dm
@@ -0,0 +1,42 @@
+/**
+ * # Shell Item
+ *
+ * Printed out by protolathes. Screwdriver to complete the shell.
+ */
+/obj/item/shell
+ name = "assembly"
+ desc = "A shell assembly that can be completed by screwdrivering it."
+ icon = 'icons/obj/wiremod.dmi'
+ var/shell_to_spawn
+ var/screw_delay = 3 SECONDS
+
+/obj/item/shell/screwdriver_act(mob/living/user, obj/item/tool)
+ user.visible_message("[user] begins finishing [src].", "You begin finishing [src].")
+ tool.play_tool_sound(src)
+ if(!do_after(user, screw_delay, src))
+ return
+ user.visible_message("[user] finishes [src].", "You finish [src].")
+
+ var/turf/drop_loc = drop_location()
+
+ qdel(src)
+ if(drop_loc)
+ new shell_to_spawn(drop_loc)
+
+ return TRUE
+
+/obj/item/shell/bot
+ name = "bot assembly"
+ icon_state = "setup_medium_box-open"
+ shell_to_spawn = /obj/structure/bot
+
+/obj/item/shell/drone
+ name = "drone assembly"
+ icon_state = "setup_medium_med-open"
+ shell_to_spawn = /mob/living/circuit_drone
+
+/obj/item/shell/server
+ name = "server assembly"
+ icon_state = "setup_stationary-open"
+ shell_to_spawn = /obj/structure/server
+ screw_delay = 10 SECONDS
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 707ab1b47e7..d70a56695ef 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/wiremod.dmi b/icons/obj/wiremod.dmi
new file mode 100644
index 00000000000..97e6930a2e2
Binary files /dev/null and b/icons/obj/wiremod.dmi differ
diff --git a/icons/obj/wiremod_fab.dmi b/icons/obj/wiremod_fab.dmi
new file mode 100644
index 00000000000..d41ec99ce5f
Binary files /dev/null and b/icons/obj/wiremod_fab.dmi differ
diff --git a/icons/ui_icons/tgui/grid_background.png b/icons/ui_icons/tgui/grid_background.png
new file mode 100644
index 00000000000..228d373456c
Binary files /dev/null and b/icons/ui_icons/tgui/grid_background.png differ
diff --git a/modular_skyrat/master_files/code/controllers/processing/circuit.dm b/modular_skyrat/master_files/code/controllers/processing/circuit.dm
deleted file mode 100644
index 68cc2e62ff0..00000000000
--- a/modular_skyrat/master_files/code/controllers/processing/circuit.dm
+++ /dev/null
@@ -1,94 +0,0 @@
-PROCESSING_SUBSYSTEM_DEF(circuit)
- name = "Circuit"
- stat_tag = "CIR"
- init_order = INIT_ORDER_CIRCUIT
- flags = NONE
-
- var/cipherkey
-
- var/regex/bad_regex
- var/list/all_components = list() // Associative list of [component_name]:[component_path] pairs
- var/list/cached_components = list() // Associative list of [component_path]:[component] pairs
- var/list/all_assemblies = list() // Associative list of [assembly_name]:[assembly_path] pairs
- var/list/cached_assemblies = list() // Associative list of [assembly_path]:[assembly] pairs
- var/list/all_circuits = list() // Associative list of [circuit_name]:[circuit_path] pairs
- var/list/circuit_fabricator_recipe_list = list() // Associative list of [category_name]:[list_of_circuit_paths] pairs
- var/cost_multiplier = MINERAL_MATERIAL_AMOUNT / 10 // Each circuit cost unit is 200cm3
-
-/datum/controller/subsystem/processing/circuit/Initialize(start_timeofday)
- SScircuit.cipherkey = uppertext(random_string(2000+rand(0,10), GLOB.alphabet))
- circuits_init()
- //Setup the input regex
- bad_regex = new("\[^\\w{}:\",.\\-*&+ =\'\\(\\)\\\[\\\]#\]", "g")
- return ..()
-
-/datum/controller/subsystem/processing/circuit/proc/circuits_init()
- //Cached lists for free performance
- for(var/path in typesof(/obj/item/integrated_circuit))
- var/obj/item/integrated_circuit/IC = path
- var/name = initial(IC.name)
- all_components[name] = path // Populating the component lists
- cached_components[IC] = new path
-
- if(!(initial(IC.spawn_flags) & (IC_SPAWN_DEFAULT | IC_SPAWN_RESEARCH)))
- continue
-
- var/category = initial(IC.category_text)
- if(!circuit_fabricator_recipe_list[category])
- circuit_fabricator_recipe_list[category] = list()
- var/list/category_list = circuit_fabricator_recipe_list[category]
- category_list += IC // Populating the fabricator categories
-
- for(var/path in typesof(/obj/item/electronic_assembly))
- var/obj/item/electronic_assembly/A = path
- var/name = initial(A.name)
- all_assemblies[name] = path
- cached_assemblies[A] = new path
-
-
- circuit_fabricator_recipe_list["Assemblies"] = list(
- /obj/item/electronic_assembly/default,
- /obj/item/electronic_assembly/calc,
- /obj/item/electronic_assembly/clam,
- /obj/item/electronic_assembly/simple,
- /obj/item/electronic_assembly/hook,
- /obj/item/electronic_assembly/pda,
- /obj/item/electronic_assembly/small/default,
- /obj/item/electronic_assembly/small/cylinder,
- /obj/item/electronic_assembly/small/scanner,
- /obj/item/electronic_assembly/small/hook,
- /obj/item/electronic_assembly/small/box,
- /obj/item/electronic_assembly/medium/default,
- /obj/item/electronic_assembly/medium/box,
- /obj/item/electronic_assembly/medium/clam,
- /obj/item/electronic_assembly/medium/medical,
- ///obj/item/electronic_assembly/medium/gun,
- /obj/item/electronic_assembly/medium/radio,
- /obj/item/electronic_assembly/large/default,
- /obj/item/electronic_assembly/large/scope,
- /obj/item/electronic_assembly/large/terminal,
- /obj/item/electronic_assembly/large/arm,
- /obj/item/electronic_assembly/large/tall,
- /obj/item/electronic_assembly/large/industrial,
- /obj/item/electronic_assembly/drone/default,
- /obj/item/electronic_assembly/drone/arms,
- /obj/item/electronic_assembly/drone/secbot,
- /obj/item/electronic_assembly/drone/medbot,
- /obj/item/electronic_assembly/drone/genbot,
- /obj/item/electronic_assembly/drone/android,
- /obj/item/electronic_assembly/wallmount/tiny,
- /obj/item/electronic_assembly/wallmount/light,
- /obj/item/electronic_assembly/wallmount,
- /obj/item/electronic_assembly/wallmount/heavy
- ///obj/item/weapon/implant/integrated_circuit
- )
-
- circuit_fabricator_recipe_list["Tools"] = list(
- /obj/item/integrated_electronics/wirer,
- /obj/item/integrated_electronics/debugger,
- /obj/item/integrated_electronics/analyzer,
- /obj/item/integrated_electronics/detailer,
- /obj/item/card/data,
- /obj/item/card/data/full_color,
- /obj/item/card/data/disk
- )
diff --git a/modular_skyrat/modules/integrated_circuits/code/game/data_huds.dm b/modular_skyrat/modules/integrated_circuits/code/game/data_huds.dm
deleted file mode 100644
index 3f7323acfca..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/game/data_huds.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-/*~~~~~~~~~~~~
- Circuitry!
-~~~~~~~~~~~~~*/
-/obj/item/electronic_assembly/proc/diag_hud_set_circuithealth(hide = FALSE)
- var/image/holder = hud_list[DIAG_CIRCUIT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- if((!isturf(loc))||hide) //if not on the ground dont show overlay
- holder.icon_state = null
- else
- holder.icon_state = "huddiag[RoundDiagBar(obj_integrity/max_integrity)]"
-
-/obj/item/electronic_assembly/proc/diag_hud_set_circuitcell(hide = FALSE)
- var/image/holder = hud_list[DIAG_BATT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- if((!isturf(loc))||hide) //if not on the ground dont show overlay
- holder.icon_state = null
- else if(battery)
- var/chargelvl = battery.charge/battery.maxcharge
- holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]"
- else
- holder.icon_state = "hudnobatt"
-
-/obj/item/electronic_assembly/proc/diag_hud_set_circuitstat(hide = FALSE) //On, On and dangerous, or Off
- var/image/holder = hud_list[DIAG_STAT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- if((!isturf(loc))||hide) //if not on the ground don't show overlay
- holder.icon_state = null
- else if(!battery)
- holder.icon_state = "hudoffline"
- else if(battery.charge == 0)
- holder.icon_state = "hudoffline"
- else if(combat_circuits) //has a circuit that can harm people
- holder.icon_state = prefered_hud_icon + "-red"
- else //Bot is on and not dangerous
- holder.icon_state = prefered_hud_icon
-
-/obj/item/electronic_assembly/proc/diag_hud_set_circuittracking(hide = FALSE)
- var/image/holder = hud_list[DIAG_TRACK_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- if((!isturf(loc))||hide) //if not on the ground dont show overlay
- holder.icon_state = null
- else if(long_range_circuits)
- holder.icon_state = "hudtracking"
- else
- holder.icon_state = null
diff --git a/modular_skyrat/modules/integrated_circuits/code/game/objects/items/devices/multitool.dm b/modular_skyrat/modules/integrated_circuits/code/game/objects/items/devices/multitool.dm
deleted file mode 100644
index 558674eb431..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/game/objects/items/devices/multitool.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/obj/item/multitool
- var/datum/integrated_io/selected_io = null //functional for integrated circuits.
-
-/obj/item/multitool/attack_self(mob/user)
- if(selected_io)
- selected_io = null
- to_chat(user, "You clear the wired connection from the multitool.")
- update_icon()
-
-/obj/item/multitool/update_icon()
- ..()
- if(selected_io)
- icon_state = "multitool_red"
- else
- icon_state = "multitool"
-
-/obj/item/multitool/proc/wire(var/datum/integrated_io/io, mob/user)
- if(!io.holder.assembly)
- to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.")
- return
-
- if(selected_io)
- if(io == selected_io)
- to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.")
- return
- if(io.io_type != selected_io.io_type)
- to_chat(user, "Those two types of channels are incompatible. The first is a [selected_io.io_type], \
- while the second is a [io.io_type].")
- return
- if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly)
- to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.")
- return
- io.connect_pin(selected_io)
-
- to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].")
- selected_io.holder.interact(user) // This is to update the UI.
- selected_io = null
-
- else
- selected_io = io
- to_chat(user, "You link \the multitool to \the [selected_io.holder]'s [selected_io.name] data channel.")
-
- update_icon()
-
-
-/obj/item/multitool/proc/unwire(var/datum/integrated_io/io1, var/datum/integrated_io/io2, mob/user)
- if(!io1.linked.len || !io2.linked.len)
- to_chat(user, "There is nothing connected to the data channel.")
- return
-
- if(!(io1 in io2.linked) || !(io2 in io1.linked) )
- to_chat(user, "These data pins aren't connected!")
- return
- else
- io1.disconnect_pin(io2)
- to_chat(user, "You clip the data connection between the [io1.holder.displayed_name]'s \
- [io1.name] and the [io2.holder.displayed_name]'s [io2.name].")
- io1.holder.interact(user) // This is to update the UI.
- update_icon()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/analyzer.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/analyzer.dm
deleted file mode 100644
index e9f9ab20b6d..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/analyzer.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/obj/item/integrated_electronics/analyzer
- name = "circuit analyzer"
- desc = "A tool that scans assemblies and gives the user a printout to recreate it in a circuit printer."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_tools.dmi'
- icon_state = "analyzer"
- flags_1 = CONDUCT_1
- w_class = WEIGHT_CLASS_SMALL
- custom_materials = list(/datum/material/iron=200)
-
-/obj/item/integrated_electronics/analyzer/afterattack(var/atom/A, var/mob/living/user)
- . = ..()
- if(istype(A, /obj/item/electronic_assembly))
- var/obj/item/electronic_assembly/EA = A
- if(EA.idlock)
- to_chat(user, "[A] is currently identity-locked and can't be analyzed.")
- return FALSE
-
- var/saved = "[A.name] analyzed! On circuit printers with cloning enabled, you may use the code below to clone the circuit:[SScircuit.save_electronic_assembly(A)]"
- if(saved)
- to_chat(user, "You scan [A].")
- user << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1")
- else
- to_chat(user, "[A] is not complete enough to be encoded!")
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/assemblies.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/assemblies.dm
deleted file mode 100644
index a7929201134..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/assemblies.dm
+++ /dev/null
@@ -1,1050 +0,0 @@
-#define IC_MAX_SIZE_BASE 25
-#define IC_COMPLEXITY_BASE 75
-
-/obj/item/electronic_assembly
- name = "electronic assembly"
- obj_flags = CAN_BE_HIT | UNIQUE_RENAME
- desc = "A case designed for building small electronics."
- w_class = WEIGHT_CLASS_SMALL
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_setups.dmi'
- icon_state = "setup_small"
- item_flags = NOBLUDGEON
- datum_flags = DF_USE_TAG
- custom_materials = list(/datum/material/iron=400)
- var/list/assembly_components = list()
- var/list/ckeys_allowed_to_scan = list() // Players who built the circuit can scan it as a ghost.
- var/max_components = IC_MAX_SIZE_BASE
- var/max_complexity = IC_COMPLEXITY_BASE
- var/opened = TRUE
- var/obj/item/stock_parts/cell/battery // Internal cell which most circuits need to work.
- var/cell_type = /obj/item/stock_parts/cell
- var/can_charge = TRUE //Can it be charged in a recharger?
- var/can_fire_equipped = FALSE //Can it fire/throw weapons when the assembly is being held?
- var/charge_sections = 4
- var/charge_tick = FALSE
- var/charge_delay = 4
- var/use_cyborg_cell = TRUE
- var/ext_next_use = 0
- var/atom/collw
- var/obj/item/card/id/access_card
- var/allowed_circuit_action_flags = IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE //which circuit flags are allowed
- var/combat_circuits = 0 //number of combat cicuits in the assembly, used for diagnostic hud
- var/long_range_circuits = 0 //number of long range cicuits in the assembly, used for diagnostic hud
- var/prefered_hud_icon = "hudstat" // Used by the AR circuit to change the hud icon.
- var/creator // circuit creator if any
- var/static/next_assembly_id = 0
- var/sealed = FALSE
- var/datum/weakref/idlock = null
-
- hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD, DIAG_CIRCUIT_HUD) //diagnostic hud overlays
- max_integrity = 50
- pass_flags = 0
- armor = list("melee" = 50, "bullet" = 70, "laser" = 70, "energy" = 100, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
- anchored = FALSE
- var/can_anchor = TRUE
- var/detail_color = COLOR_ASSEMBLY_BLACK
-
-/obj/item/electronic_assembly/New()
- ..()
- src.max_components = round(max_components)
- src.max_complexity = round(max_complexity)
-
-/obj/item/electronic_assembly/GenerateTag()
- tag = "assembly_[next_assembly_id++]"
-
-/obj/item/electronic_assembly/examine(mob/user)
- . = ..()
- if(can_anchor)
- to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place.")
- else
- to_chat(user, "The maintenance panel [opened ? "can be" : "is"] screwed in place.")
-
- if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || isAdminGhostAI(user))
- to_chat(user, "You can scan this circuit.")
-
- for(var/obj/item/integrated_circuit/I in assembly_components)
- I.external_examine(user)
- if(opened)
- interact(user)
-
-/obj/item/electronic_assembly/proc/check_interactivity(mob/user)
- if(!istype(user, /mob))
- return
- return user.canUseTopic(src, BE_CLOSE)
-
-/obj/item/electronic_assembly/Bump(atom/AM)
- collw = AM
- .=..()
- if((istype(collw, /obj/machinery/door/airlock) || istype(collw, /obj/machinery/door/window)) && (!isnull(access_card)))
- var/obj/machinery/door/D = collw
- if(D.check_access(access_card))
- D.open()
-
-/obj/item/electronic_assembly/Initialize()
- .=..()
- START_PROCESSING(SScircuit, src)
-
- set_custom_materials(list(GET_MATERIAL_REF(/datum/material/iron)=round((max_complexity + max_components) / 4) * SScircuit.cost_multiplier))
-
- //sets up diagnostic hud view
- prepare_huds()
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.add_to_hud(src)
- diag_hud_set_circuithealth()
- diag_hud_set_circuitcell()
- diag_hud_set_circuitstat()
- diag_hud_set_circuittracking()
-
- access_card = new /obj/item/card/id(src)
-
-/obj/item/electronic_assembly/Destroy()
- STOP_PROCESSING(SScircuit, src)
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.remove_from_hud(src)
- QDEL_NULL(access_card)
- return ..()
-
-/obj/item/electronic_assembly/process()
- handle_idle_power()
- check_pulling()
-
- //updates diagnostic hud
- diag_hud_set_circuithealth()
- diag_hud_set_circuitcell()
-
-/obj/item/electronic_assembly/proc/handle_idle_power()
-
- // First we generate power.
- for(var/obj/item/integrated_circuit/passive/power/P in assembly_components)
- P.make_energy()
-
- // Now spend it.
- for(var/obj/item/integrated_circuit/I in assembly_components)
- if(I.power_draw_idle)
- if(!draw_power(I.power_draw_idle))
- I.power_fail()
-
-/obj/item/electronic_assembly/interact(mob/user, circuit)
- ui_interact(user, circuit)
-
-/obj/item/electronic_assembly/ui_interact(mob/user, obj/item/integrated_circuit/circuit_pins)
- . = ..()
- if(!check_interactivity(user))
- return
-
- var/total_part_size = return_total_size()
- var/total_complexity = return_total_complexity()
- var/datum/browser/popup = new(user, "scannernew", name, 800, 630) // Set up the popup browser window
- popup.add_stylesheet("scannernew", 'html/browser/assembly_ui.css')
-
- var/HTML = "
Components: " - else - builtin_components += "[circuit.displayed_name] " - - // Non-inbuilt circuits come after inbuilt circuits - else - removables += "[remove_num]. | " - if(circuit == circuit_pins) - removables += "[circuit.displayed_name] " - else - removables += "[circuit.displayed_name] " - remove_num++ - - // Put removable circuits (if any) in separate categories from non-removable - if(builtin_components) - HTML += " Built in: [builtin_components] Removable: " - - HTML += removables - - HTML += " | "
-
-
- //Getting the newest circuit's pin
- if(!circuit_pins || !istype(circuit_pins,/obj/item/integrated_circuit))
- if(assembly_components.len > 0)
- circuit_pins = assembly_components[1]
-
- if(circuit_pins)
- HTML += " "
-
-
- HTML += "[circuit_pins.displayed_name] " - - HTML += "Refresh | \ - Rename | \ - Copy Ref | \ - Interact" - if(circuit_pins.removable) - HTML += " | Remove" - HTML += " " - - var/table_edge_width = "30%" - var/table_middle_width = "40%" - - HTML += "
| ||||
[SScircuit.save_electronic_assembly(src)]"
- usr << browse(saved, "window=circuit_scan;size=500x600;border=1;can_resize=1;can_close=1;can_minimize=1")
- else
- to_chat(usr, "The circuit is empty!")
- return
-
- if(!check_interactivity(usr))
- return
-
- if(href_list["rename"])
- rename(usr)
-
- if(href_list["remove_cell"])
- if(!battery)
- to_chat(usr, "There's no power cell to remove from \the [src].")
- else
- battery.forceMove(drop_location())
- playsound(src, 'sound/items/Crowbar.ogg', 50, 1)
- to_chat(usr, "You pull \the [battery] out of \the [src]'s power supplier.")
- battery = null
- diag_hud_set_circuitstat() //update diagnostic hud
-
- var/obj/item/integrated_circuit/component
-
- if(href_list["component"])
- component = locate(href_list["component"]) in assembly_components
-
- if(!component)
- return
-
-
- if(href_list["scan"])
- var/obj/held_item = usr.get_active_held_item()
- if(istype(held_item, /obj/item/integrated_electronics/debugger))
- var/obj/item/integrated_electronics/debugger/D = held_item
- if(D.accepting_refs)
- D.afterattack(component, usr, TRUE)
- else
- to_chat(usr, "The debugger's 'ref scanner' needs to be on.")
- else
- to_chat(usr, "You need a debugger set to 'ref' mode to do that.")
-
- // Builtin components are not supposed to be removed or rearranged
- if(!component.removable)
- return
-
- add_allowed_scanner(usr.ckey)
-
- // Find the position of a first removable component
- var/first_removable_pos = 0
- for(var/i in assembly_components)
- first_removable_pos++
- var/obj/item/integrated_circuit/temp_component = i
- if(temp_component.removable)
- break
-
- if(href_list["remove"])
- if(try_remove_component(component, usr))
- component = null
-
- if(href_list["rename_component"])
- component.rename_component(usr)
- if(component.assembly)
- component.assembly.add_allowed_scanner(usr.ckey)
-
- if(href_list["interact"])
- var/obj/item/I = usr.get_active_held_item()
- if(istype(I))
- I.melee_attack_chain(usr, component)
- else
- component.attack_hand(usr)
-
- // Adjust the position
- if(href_list["change_pos"])
- var/new_pos = max(input(usr,"Write the new number","New position") as num,1)
-
- if(new_pos > assembly_components.len)
- new_pos = assembly_components.len
-
- if(new_pos < first_removable_pos)
- new_pos = first_removable_pos
-
- assembly_components.Remove(component)
- assembly_components.Insert(new_pos, component)
-
- interact(usr, component) // To refresh the UI.
-
-/obj/item/electronic_assembly/pickup(mob/living/user)
- . = ..()
- //update diagnostic hud when picked up, true is used to force the hud to be hidden
- diag_hud_set_circuithealth(TRUE)
- diag_hud_set_circuitcell(TRUE)
- diag_hud_set_circuitstat(TRUE)
- diag_hud_set_circuittracking(TRUE)
-
-/obj/item/electronic_assembly/dropped(mob/user)
- . = ..()
- //update diagnostic hud when dropped
- diag_hud_set_circuithealth()
- diag_hud_set_circuitcell()
- diag_hud_set_circuitstat()
- diag_hud_set_circuittracking()
-
-/obj/item/electronic_assembly/proc/rename()
- var/mob/M = usr
- if(!check_interactivity(M))
- return
-
- var/input = reject_bad_name(input("What do you want to name this?", "Rename", src.name) as null|text, TRUE)
- if(!check_interactivity(M))
- return
- if(src && input)
- to_chat(M, "The machine now has a label reading '[input]'.")
- name = input
-
-/obj/item/electronic_assembly/proc/add_allowed_scanner(ckey)
- ckeys_allowed_to_scan[ckey] = TRUE
-
-/obj/item/electronic_assembly/proc/can_move()
- return FALSE
-
-/obj/item/electronic_assembly/update_icon()
- if(opened)
- icon_state = initial(icon_state) + "-open"
- else
- icon_state = initial(icon_state)
- cut_overlays()
- if(detail_color == COLOR_ASSEMBLY_BLACK) //Black colored overlay looks almost but not exactly like the base sprite, so just cut the overlay and avoid it looking kinda off.
- return
- var/mutable_appearance/detail_overlay = mutable_appearance('modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color")
- detail_overlay.color = detail_color
- add_overlay(detail_overlay)
- ..()
-
-/obj/item/electronic_assembly/proc/return_total_complexity()
- var/returnvalue = 0
- for(var/obj/item/integrated_circuit/part in assembly_components)
- returnvalue += part.complexity
- return(returnvalue)
-
-/obj/item/electronic_assembly/proc/return_total_size()
- var/returnvalue = 0
- for(var/obj/item/integrated_circuit/part in assembly_components)
- returnvalue += part.size
- return(returnvalue)
-
-// Returns true if the circuit made it inside.
-/obj/item/electronic_assembly/proc/try_add_component(obj/item/integrated_circuit/IC, mob/user)
- if(!opened)
- to_chat(user, "\The [src]'s hatch is closed, you can't put anything inside.")
- return FALSE
-
- if(IC.w_class > w_class)
- to_chat(user, "\The [IC] is way too big to fit into \the [src].")
- return FALSE
-
- var/total_part_size = return_total_size()
- var/total_complexity = return_total_complexity()
-
- if(IC.max_allowed)
- var/current_components
- for(var/obj/item/integrated_circuit/component as anything in assembly_components)
- if(component.type == IC.type)
- current_components++
- if(current_components >= IC.max_allowed)
- to_chat(user, "You can't seem to add the '[IC]', as there are too many installed already.")
- return FALSE
-
- if((total_part_size + IC.size) > max_components)
- to_chat(user, "You can't seem to add the '[IC]', as there's insufficient space.")
- return FALSE
- if((total_complexity + IC.complexity) > max_complexity)
- to_chat(user, "You can't seem to add the '[IC]', since this setup's too complicated for the case.")
- return FALSE
- if((allowed_circuit_action_flags & IC.action_flags) != IC.action_flags)
- to_chat(user, "You can't seem to add the '[IC]', since the case doesn't support the circuit type.")
- return FALSE
-
- if(!user.transferItemToLoc(IC, src))
- return FALSE
-
- to_chat(user, "You slide [IC] inside [src].")
- playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
- add_allowed_scanner(user.ckey)
- investigate_log("had [IC]([IC.type]) inserted by [key_name(user)].", INVESTIGATE_CIRCUIT)
-
- add_component(IC)
- return TRUE
-
-
-// Actually puts the circuit inside, doesn't perform any checks.
-/obj/item/electronic_assembly/proc/add_component(obj/item/integrated_circuit/component)
- component.forceMove(get_object())
- component.assembly = src
- assembly_components |= component
-
- //increment numbers for diagnostic hud
- if(component.action_flags & IC_ACTION_COMBAT)
- combat_circuits += 1;
- if(component.action_flags & IC_ACTION_LONG_RANGE)
- long_range_circuits += 1;
-
- //diagnostic hud update
- diag_hud_set_circuitstat()
- diag_hud_set_circuittracking()
-
-/obj/item/electronic_assembly/proc/try_remove_component(obj/item/integrated_circuit/IC, mob/user, silent)
- if(!opened)
- if(!silent)
- to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.")
- return FALSE
-
- if(!IC.removable)
- if(!silent)
- to_chat(user, "[src] is permanently attached to the case.")
- return FALSE
-
- remove_component(IC)
- if(!silent)
- to_chat(user, "You pop \the [IC] out of the case, and slide it out.")
- playsound(src, 'sound/items/crowbar.ogg', 50, 1)
- user.put_in_hands(IC)
- add_allowed_scanner(user.ckey)
- investigate_log("had [IC]([IC.type]) removed by [key_name(user)].", INVESTIGATE_CIRCUIT)
-
- return TRUE
-
-// Actually removes the component, doesn't perform any checks.
-/obj/item/electronic_assembly/proc/remove_component(obj/item/integrated_circuit/component)
- component.disconnect_all()
- component.forceMove(drop_location())
- component.assembly = null
-
- assembly_components -= component
-
- //decrement numbers for diagnostic hud
- if(component.action_flags & IC_ACTION_COMBAT)
- combat_circuits -= 1;
- if(component.action_flags & IC_ACTION_LONG_RANGE)
- long_range_circuits -= 1;
-
- //diagnostic hud update
- diag_hud_set_circuitstat()
- diag_hud_set_circuittracking()
-
-
-/obj/item/electronic_assembly/afterattack(atom/target, mob/user, proximity)
- . = ..()
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- if(S.sense(target,user,proximity))
- visible_message(" [user] waves [src] around [target].")
-
-
-/obj/item/electronic_assembly/screwdriver_act(mob/living/user, obj/item/I)
- if(sealed)
- to_chat(user,"The assembly is sealed. Any attempt to force it open would break it.")
- return FALSE
- if(..())
- return TRUE
- I.play_tool_sound(src)
- opened = !opened
- to_chat(user, "You [opened ? "open" : "close"] the maintenance hatch of [src].")
- update_icon()
- return TRUE
-
-/obj/item/electronic_assembly/welder_act(mob/living/user, obj/item/I)
- var/type_to_use
-
- if(!sealed)
- type_to_use = input("What would you like to do?","[src] type setting") as null|anything in list("repair", "seal")
- else
- type_to_use = input("What would you like to do?","[src] type setting") as null|anything in list("repair", "unseal")
-
- switch(type_to_use)
- if("repair")
- if(obj_integrity < max_integrity)
- obj_integrity = min(obj_integrity + 20,max_integrity)
- to_chat(user,"Integrity: [obj_integrity] / [max_integrity]")
- to_chat(user,"You fix the dents and scratches of the assembly.")
- return TRUE
-
- else
- to_chat(user,"The assembly is already in impeccable condition.")
- return FALSE
-
- if("seal")
- if(!opened)
- sealed = TRUE
- if(I.use_tool(src, user, 50, volume=100, amount=3))
- to_chat(user,"You seal the assembly, making it impossible to be opened.")
- return TRUE
-
- else
- to_chat(user,"You need to close the assembly first before sealing it indefinitely!")
- return FALSE
-
- if("unseal")
- to_chat(user,"You start unsealing the assembly carefully...")
- if(I.use_tool(src, user, 50, volume=250, amount=3))
- for(var/obj/item/integrated_circuit/IC in assembly_components)
- if(prob(50))
- IC.disconnect_all()
-
- to_chat(user,"You unsealed the assembly.")
- sealed = FALSE
- return TRUE
-
-/obj/item/electronic_assembly/attackby(obj/item/I, mob/living/user)
- if(can_anchor && default_unfasten_wrench(user, I, 20))
- return
-
- // ID-Lock part: check if we have an id-lock and only lock if we're not trying to get values from it, to prevent accidents
- if(istype(I, /obj/item/integrated_electronics/debugger))
- var/obj/item/integrated_electronics/debugger/debugger = I
- if(debugger.idlock)
- // check if unlocked to lock
- if(!idlock)
- idlock = debugger.idlock
- to_chat(user,"You lock \the [src].")
-
- //if locked, unlock if ids match
- else
- if(idlock.resolve() == debugger.idlock.resolve())
- idlock = null
- to_chat(user,"You unlock \the [src].")
-
- else
- to_chat(user,"The scanned ID doesn't match with \the [src]'s lock.")
-
- debugger.idlock = null
- return
-
- if(istype(I, /obj/item/integrated_circuit))
- if(!user.canUnEquip(I))
- return FALSE
- if(try_add_component(I, user))
- return TRUE
- else
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user)
- return ..()
-
- else if(I.tool_behaviour == TOOL_MULTITOOL || istype(I, /obj/item/integrated_electronics/wirer) || istype(I, /obj/item/integrated_electronics/debugger))
- if(opened)
- interact(user)
- return TRUE
- else
- to_chat(user, "[src]'s hatch is closed, so you can't fiddle with the internal components.")
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user)
- return ..()
-
- else if(istype(I, /obj/item/stock_parts/cell))
- if(!opened)
- to_chat(user, "[src]'s hatch is closed, so you can't access \the [src]'s power supplier.")
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user)
- return ..()
- if(battery)
- to_chat(user, "[src] already has \a [battery] installed. Remove it first if you want to replace it.")
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user)
- return ..()
- I.forceMove(src)
- battery = I
- diag_hud_set_circuitstat() //update diagnostic hud
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- to_chat(user, "You slot the [I] inside \the [src]'s power supplier.")
- return TRUE
-
- else if(istype(I, /obj/item/integrated_electronics/detailer))
- var/obj/item/integrated_electronics/detailer/D = I
- detail_color = D.detail_color
- update_icon()
-
- else
- if(user.combat_mode)
- return ..()
- var/list/input_selection = list()
- //Check all the components asking for an input
- for(var/obj/item/integrated_circuit/input in assembly_components)
- if((input.demands_object_input && opened) || (input.demands_object_input && input.can_input_object_when_closed))
- var/i = 0
- //Check if there is another component with the same name and append a number for identification
- for(var/s in input_selection)
- var/obj/item/integrated_circuit/s_circuit = input_selection[s] //The for-loop iterates the keys of the associative list.
- if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input)
- i++
- var/disp_name= "[input.displayed_name] \[[input]\]"
- if(i)
- disp_name += " ([i+1])"
- //Associative lists prevent me from needing another list and using a Find proc
- input_selection[disp_name] = input
-
- var/obj/item/integrated_circuit/choice
- if(input_selection)
- if(input_selection.len == 1)
- choice = input_selection[input_selection[1]]
- else
- var/selection = input(user, "Where do you want to insert that item?", "Interaction") as null|anything in input_selection
- if(!check_interactivity(user))
- return ..()
- if(selection)
- choice = input_selection[selection]
- if(choice)
- choice.additem(I, user)
- for(var/obj/item/integrated_circuit/input/S in assembly_components)
- S.attackby_react(I,user)
- return ..()
-
-
-/obj/item/electronic_assembly/attack_self(mob/user)
- if(!check_interactivity(user))
- return
- if(opened)
- interact(user)
-
- var/list/input_selection = list()
- //Check all the components asking for an input
- for(var/obj/item/integrated_circuit/input/input in assembly_components)
- if(input.can_be_asked_input)
- var/i = 0
- //Check if there is another component with the same name and append a number for identification
- for(var/s in input_selection)
- var/obj/item/integrated_circuit/s_circuit = input_selection[s] //The for-loop iterates the keys of an associative list.
- if(s_circuit.name == input.name && s_circuit.displayed_name == input.displayed_name && s_circuit != input)
- i++
- var/disp_name= "[input.displayed_name] \[[input]\]"
- if(i)
- disp_name += " ([i+1])"
- //Associative lists prevent me from needing another list and using a Find proc
- input_selection[disp_name] = input
-
- var/obj/item/integrated_circuit/input/choice
-
-
- if(input_selection)
- if(input_selection.len ==1)
- choice = input_selection[input_selection[1]]
- else
- var/selection = input(user, "What do you want to interact with?", "Interaction") as null|anything in input_selection
- if(!check_interactivity(user))
- return
- if(selection)
- choice = input_selection[selection]
-
- if(choice)
- choice.ask_for_input(user)
-
-/obj/item/electronic_assembly/emp_act(severity)
- . = ..()
- if(. & EMP_PROTECT_CONTENTS)
- return
- for(var/I in src)
- var/atom/movable/AM = I
- AM.emp_act(severity)
-
-// Returns true if power was successfully drawn.
-/obj/item/electronic_assembly/proc/draw_power(amount)
- if(battery && battery.use(amount * GLOB.CELLRATE))
- return TRUE
- return FALSE
-
-// Ditto for giving.
-/obj/item/electronic_assembly/proc/give_power(amount)
- if(battery && battery.give(amount * GLOB.CELLRATE))
- return TRUE
- return FALSE
-
-/obj/item/electronic_assembly/Moved(oldLoc, dir)
- for(var/I in assembly_components)
- var/obj/item/integrated_circuit/IC = I
- IC.ext_moved(oldLoc, dir)
- if(light) //Update lighting objects (From light circuits).
- update_light()
- ..()
-
-/obj/item/electronic_assembly/stop_pulling()
- for(var/I in assembly_components)
- var/obj/item/integrated_circuit/IC = I
- IC.stop_pulling()
- ..()
-
-
-// Returns the object that is supposed to be used in attack messages, location checks, etc.
-// Override in children for special behavior.
-/obj/item/electronic_assembly/proc/get_object()
- return src
-
-// Returns the location to be used for dropping items.
-// Same as the regular drop_location(), but with checks being run on acting_object if necessary.
-/obj/item/integrated_circuit/drop_location()
- var/atom/movable/acting_object = get_object()
-
- // plz no infinite loops
- if(acting_object == src)
- return ..()
-
- return acting_object.drop_location()
-
-/obj/item/electronic_assembly/attack_tk(mob/user)
- if(anchored)
- return
- ..()
-
-/obj/item/electronic_assembly/attack_hand(mob/user)
- if(anchored)
- attack_self(user)
- return
- ..()
-
-/obj/item/electronic_assembly/default //The /default electronic_assemblys are to allow the introduction of the new naming scheme without breaking old saves.
- name = "type-a electronic assembly"
-
-/obj/item/electronic_assembly/calc
- name = "type-b electronic assembly"
- icon_state = "setup_small_calc"
- desc = "A case designed for building small electronics. This one resembles a pocket calculator."
-
-/obj/item/electronic_assembly/clam
- name = "type-c electronic assembly"
- icon_state = "setup_small_clam"
- desc = "A case designed for building small electronics. This one has a clamshell design."
-
-/obj/item/electronic_assembly/simple
- name = "type-d electronic assembly"
- icon_state = "setup_small_simple"
- desc = "A case designed for building small electronics. This one has a simple design."
-
-/obj/item/electronic_assembly/hook
- name = "type-e electronic assembly"
- icon_state = "setup_small_hook"
- desc = "A case designed for building small electronics. This one looks like it has a belt clip, but it's purely decorative."
-
-/obj/item/electronic_assembly/pda
- name = "type-f electronic assembly"
- icon_state = "setup_small_pda"
- desc = "A case designed for building small electronics. This one resembles a PDA."
-
-/obj/item/electronic_assembly/small
- name = "electronic device"
- icon_state = "setup_device"
- desc = "A case designed for building tiny-sized electronics."
- w_class = WEIGHT_CLASS_TINY
- max_components = IC_MAX_SIZE_BASE / 2
- max_complexity = IC_COMPLEXITY_BASE / 2
-
-/obj/item/electronic_assembly/small/default
- name = "type-a electronic device"
-
-/obj/item/electronic_assembly/small/cylinder
- name = "type-b electronic device"
- icon_state = "setup_device_cylinder"
- desc = "A case designed for building tiny-sized electronics. This one has a cylindrical design."
-
-/obj/item/electronic_assembly/small/scanner
- name = "type-c electronic device"
- icon_state = "setup_device_scanner"
- desc = "A case designed for building tiny-sized electronics. This one has a scanner-like design."
-
-/obj/item/electronic_assembly/small/hook
- name = "type-d electronic device"
- icon_state = "setup_device_hook"
- desc = "A case designed for building tiny-sized electronics. This one looks like it has a belt clip, but it's purely decorative."
-
-/obj/item/electronic_assembly/small/box
- name = "type-e electronic device"
- icon_state = "setup_device_box"
- desc = "A case designed for building tiny-sized electronics. This one has a box design."
-
-/obj/item/electronic_assembly/medium
- name = "electronic mechanism"
- icon_state = "setup_medium"
- desc = "A case designed for building medium-sized electonics."
- w_class = WEIGHT_CLASS_NORMAL
- max_components = IC_MAX_SIZE_BASE * 2
- max_complexity = IC_COMPLEXITY_BASE * 2
-
-/obj/item/electronic_assembly/medium/default
- name = "type-a electronic mechanism"
-
-/obj/item/electronic_assembly/medium/box
- name = "type-b electronic mechanism"
- icon_state = "setup_medium_box"
- desc = "A case designed for building medium-sized electonics. This one has a box design."
-
-/obj/item/electronic_assembly/medium/clam
- name = "type-c electronic mechanism"
- icon_state = "setup_medium_clam"
- desc = "A case designed for building medium-sized electonics. This one has a clamshell design."
-
-/obj/item/electronic_assembly/medium/medical
- name = "type-d electronic mechanism"
- icon_state = "setup_medium_med"
- desc = "A case designed for building medium-sized electonics. This one resembles medical apparatus."
-
-/* SKYRAT PORT temp removal
-/obj/item/electronic_assembly/medium/gun
- name = "type-e electronic mechanism"
- icon_state = "setup_medium_gun"
- item_state = "circuitgun"
- desc = "A case designed for building medium-sized electonics. This one resembles a gun, or some type of tool, if you're feeling optimistic. It can fire guns and throw items while the user is holding it."
- lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
- can_fire_equipped = TRUE
-*/
-
-/obj/item/electronic_assembly/medium/radio
- name = "type-f electronic mechanism"
- icon_state = "setup_medium_radio"
- desc = "A case designed for building medium-sized electonics. This one resembles an old radio."
-
-/obj/item/electronic_assembly/large
- name = "electronic machine"
- icon_state = "setup_large"
- desc = "A case designed for building large electronics."
- w_class = WEIGHT_CLASS_BULKY
- max_components = IC_MAX_SIZE_BASE * 4
- max_complexity = IC_COMPLEXITY_BASE * 4
-
-/obj/item/electronic_assembly/large/default
- name = "type-a electronic machine"
-
-/obj/item/electronic_assembly/large/scope
- name = "type-b electronic machine"
- icon_state = "setup_large_scope"
- desc = "A case designed for building large electronics. This one resembles an oscilloscope."
-
-/obj/item/electronic_assembly/large/terminal
- name = "type-c electronic machine"
- icon_state = "setup_large_terminal"
- desc = "A case designed for building large electronics. This one resembles a computer terminal."
-
-/obj/item/electronic_assembly/large/arm
- name = "type-d electronic machine"
- icon_state = "setup_large_arm"
- desc = "A case designed for building large electronics. This one resembles a robotic arm."
-
-/obj/item/electronic_assembly/large/tall
- name = "type-e electronic machine"
- icon_state = "setup_large_tall"
- desc = "A case designed for building large electronics. This one has a tall design."
-
-/obj/item/electronic_assembly/large/industrial
- name = "type-f electronic machine"
- icon_state = "setup_large_industrial"
- desc = "A case designed for building mobile electronics. This one resembles industrial machinery."
-
-/obj/item/electronic_assembly/drone
- name = "electronic drone"
- icon_state = "setup_drone"
- desc = "A case designed for building mobile electronics."
- w_class = WEIGHT_CLASS_BULKY
- max_components = IC_MAX_SIZE_BASE * 3
- max_complexity = IC_COMPLEXITY_BASE * 3
- allowed_circuit_action_flags = IC_ACTION_MOVEMENT | IC_ACTION_COMBAT | IC_ACTION_LONG_RANGE
- can_anchor = FALSE
-
-/obj/item/electronic_assembly/drone/can_move()
- return TRUE
-
-/obj/item/electronic_assembly/drone/default
- name = "type-a electronic drone"
-
-/obj/item/electronic_assembly/drone/arms
- name = "type-b electronic drone"
- icon_state = "setup_drone_arms"
- desc = "A case designed for building mobile electronics. This one is armed and dangerous."
-
-/obj/item/electronic_assembly/drone/secbot
- name = "type-c electronic drone"
- icon_state = "setup_drone_secbot"
- desc = "A case designed for building mobile electronics. This one resembles a Securitron."
-
-/obj/item/electronic_assembly/drone/medbot
- name = "type-d electronic drone"
- icon_state = "setup_drone_medbot"
- desc = "A case designed for building mobile electronics. This one resembles a Medibot."
-
-/obj/item/electronic_assembly/drone/genbot
- name = "type-e electronic drone"
- icon_state = "setup_drone_genbot"
- desc = "A case designed for building mobile electronics. This one has a generic bot design."
-
-/obj/item/electronic_assembly/drone/android
- name = "type-f electronic drone"
- icon_state = "setup_drone_android"
- desc = "A case designed for building mobile electronics. This one has a hominoid design."
-
-/obj/item/electronic_assembly/wallmount
- name = "wall-mounted electronic assembly"
- icon_state = "setup_wallmount_medium"
- desc = "A case designed for building medium-sized electronics.. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
- w_class = WEIGHT_CLASS_NORMAL
- max_components = IC_MAX_SIZE_BASE * 2
- max_complexity = IC_COMPLEXITY_BASE * 2
-
-/obj/item/electronic_assembly/wallmount/heavy
- name = "heavy wall-mounted electronic assembly"
- icon_state = "setup_wallmount_large"
- desc = "A case designed for building large electronics. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
- w_class = WEIGHT_CLASS_BULKY
- max_components = IC_MAX_SIZE_BASE * 4
- max_complexity = IC_COMPLEXITY_BASE * 4
-
-/obj/item/electronic_assembly/wallmount/light
- name = "light wall-mounted electronic assembly"
- icon_state = "setup_wallmount_small"
- desc = "A case designed for building small electronics. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
- w_class = WEIGHT_CLASS_SMALL
- max_components = IC_MAX_SIZE_BASE
- max_complexity = IC_COMPLEXITY_BASE
-
-/obj/item/electronic_assembly/wallmount/tiny
- name = "tiny wall-mounted electronic assembly"
- icon_state = "setup_wallmount_tiny"
- desc = "It's a case, for building tiny electronics with. It has a magnetized backing to allow it to stick to walls, but you'll still need to wrench the anchoring bolts in place to keep it on."
- w_class = WEIGHT_CLASS_TINY
- max_components = IC_MAX_SIZE_BASE / 2
- max_complexity = IC_COMPLEXITY_BASE / 2
-
-/obj/item/electronic_assembly/wallmount/proc/mount_assembly(turf/on_wall, mob/user) //Yeah, this is admittedly just an abridged and kitbashed version of the wallframe attach procs.
- if(get_dist(on_wall,user)>1)
- return
- var/ndir = get_dir(on_wall, user)
- if(!(ndir in GLOB.cardinals))
- return
- var/turf/T = get_turf(user)
- if(!isfloorturf(T))
- to_chat(user, "You cannot place [src] on this spot!")
- return
- if(gotwallitem(T, ndir))
- to_chat(user, "There's already an item on this wall!")
- return
- playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
- user.visible_message("[user.name] attaches [src] to the wall.",
- "You attach [src] to the wall.",
- "You hear clicking.")
- user.dropItemToGround(src)
- switch(ndir)
- if(NORTH)
- pixel_y = -31
- if(SOUTH)
- pixel_y = 31
- if(EAST)
- pixel_x = -31
- if(WEST)
- pixel_x = 31
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_ears.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_ears.dm
deleted file mode 100644
index 058eef7beae..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_ears.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-// Ear
-/obj/item/clothing/ears/circuitry
- name = "electronic earwear"
- desc = "It's a wearable case for electronics. This one appears to be a technical-looking headset."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_ears.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_ears.dmi'
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/ears/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/small)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/ears/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/ears/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/ears/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/ears/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/ears/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_glasses.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_glasses.dm
deleted file mode 100644
index 07196a3502c..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_glasses.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-// Glasses.
-/obj/item/clothing/glasses/circuitry
- name = "electronic goggles"
- desc = "It's a wearable case for electronics. This one is a pair of goggles, with wiring sticking out. \
- Could this augment your vision?" // Sadly it won't, or at least not yet.
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_glasses.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_glasses.dmi'
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/glasses/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/small)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/glasses/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/glasses/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/glasses/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/glasses/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/glasses/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_gloves.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_gloves.dm
deleted file mode 100644
index 664a826c649..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_gloves.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-// Gloves.
-/obj/item/clothing/gloves/circuitry
- name = "electronic gloves"
- desc = "It's a wearable case for electronics. This one is a pair of black gloves, with wires woven into them. A small \
- device with a screen is attached to the left glove."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_gloves.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_gloves.dmi'
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/gloves/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/small)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/gloves/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/gloves/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/gloves/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/gloves/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/gloves/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_head.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_head.dm
deleted file mode 100644
index d716cf30bf1..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_head.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-// Head
-/obj/item/clothing/head/circuitry
- name = "electronic headwear"
- desc = "It's a wearable case for electronics. This one appears to be a very technical-looking piece that \
- goes around the collar, with a heads-up-display attached on the right."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_head.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_head.dmi'
- mutant_variants = FALSE // not yet?
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/head/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/small)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/head/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/head/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/head/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/head/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/head/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_shoes.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_shoes.dm
deleted file mode 100644
index 9249fdb5d1e..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_shoes.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-// Shoes
-/obj/item/clothing/shoes/circuitry
- name = "electronic boots"
- desc = "It's a wearable case for electronics. This one is a pair of boots, with wires attached to a small \
- cover."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_shoes.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_shoes.dmi'
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/shoes/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/small)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/shoes/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/shoes/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/shoes/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/shoes/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/shoes/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_suit.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_suit.dm
deleted file mode 100644
index cf0d0004c07..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_suit.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-// Exo-slot
-/obj/item/clothing/suit/circuitry
- name = "electronic chestpiece"
- desc = "It's a wearable case for electronics. This one appears to be a very technical-looking vest, that \
- almost looks professionally made, however the wiring popping out betrays that idea."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_suit.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/circuit_suit.dmi'
- mutant_variants = FALSE
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/suit/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing/large)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/suit/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/suit/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/suit/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/suit/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/suit/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_under.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_under.dm
deleted file mode 100644
index 2808aa58202..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/circuit_under.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-// Jumpsuit.
-/obj/item/clothing/under/circuitry
- name = "electronic jumpsuit"
- desc = "It's a wearable case for electronics. This on is a black jumpsuit with wiring weaved into the fabric."
- can_adjust = FALSE
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/clothing/circuit_under.dmi'
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- worn_icon = 'modular_skyrat/modules/integrated_circuits/icons/mob/clothing/under/circuit_under.dmi'
- actions_types = list(/datum/action/item_action/toggle_circuit)
-
-/obj/item/clothing/under/circuitry/Initialize()
- setup_integrated_circuit(/obj/item/electronic_assembly/clothing)
- integrated_circuit.update_icon()
- return ..()
-
-/obj/item/clothing/under/circuitry/examine(mob/user)
- . = ..()
- if(integrated_circuit)
- . += integrated_circuit.examine(user)
-
-/obj/item/clothing/under/circuitry/emp_act(severity)
- if(integrated_circuit)
- integrated_circuit.emp_act(severity)
- ..()
-
-/obj/item/clothing/under/circuitry/attackby(obj/item/I, mob/user, params)
- if(I.tool_behaviour == TOOL_SCREWDRIVER && integrated_circuit.screwdriver_act(user, I))
- return TRUE
- if(integrated_circuit.attackby(I, user, params))
- return TRUE
- ..()
-
-/obj/item/clothing/under/circuitry/attack_self(mob/user)
- if(integrated_circuit)
- if(integrated_circuit.opened)
- integrated_circuit.attack_self(user)
- else
- action_circuit.do_work()
- else
- ..()
-
-/obj/item/clothing/under/circuitry/Destroy()
- if(integrated_circuit)
- integrated_circuit.clothing = null
- action_circuit = null // Will get deleted by qdel-ing the integrated_circuit assembly.
- qdel(integrated_circuit)
- return ..()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/clothing.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/clothing.dm
deleted file mode 100644
index 71650c5e1e5..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/clothing/clothing.dm
+++ /dev/null
@@ -1,84 +0,0 @@
-
-// The base subtype for assemblies that can be worn. Certain pieces will have more or less capabilities
-// E.g. Glasses have less room than something worn over the chest.
-// Note that the electronic assembly is INSIDE the object that actually gets worn, in a similar way to implants.
-
-/obj/item/electronic_assembly/clothing
- name = "electronic clothing"
- icon_state = "circuitry"
- worn_icon_state = "circuitry" // Needed since icon_state gets updated by the assembly
- // Needs to match the clothing's base icon_state.
- desc = "It's a case, for building machines attached to clothing."
- w_class = WEIGHT_CLASS_SMALL
- max_components = IC_MAX_SIZE_BASE
- max_complexity = IC_COMPLEXITY_BASE
- var/obj/item/clothing/clothing = null
-
-/* SKYRAT PORT - NanoUI stuff commented out, idk if it will cause issues
-/obj/item/electronic_assembly/clothing/nano_host()
- return clothing
-
-/obj/item/electronic_assembly/clothing/resolve_nano_host()
- return clothing
-*/
-
-/obj/item/electronic_assembly/clothing/update_icon()
- ..()
- clothing.icon_state = icon_state
- // We don't need to update the mob sprite since it won't (and shouldn't) actually get changed.
-
-// This is 'small' relative to the size of regular clothing assemblies.
-/obj/item/electronic_assembly/clothing/small
- max_components = IC_MAX_SIZE_BASE / 2
- max_complexity = IC_COMPLEXITY_BASE / 2
- w_class = WEIGHT_CLASS_TINY
-
-// Ditto.
-/obj/item/electronic_assembly/clothing/large
- max_components = IC_MAX_SIZE_BASE * 2
- max_complexity = IC_COMPLEXITY_BASE * 2
- w_class = WEIGHT_CLASS_NORMAL
-
-/*
-// Integrated button for doing integrated button things
-*/
-
-/obj/item/integrated_circuit/built_in
- name = "integrated circuit"
- desc = "It's a tiny chip! This one doesn't seem to do much, however."
- icon_state = "template"
- size = -1
- w_class = WEIGHT_CLASS_TINY
- removable = FALSE // Determines if a circuit is removable from the assembly.
-
-// Triggered when clothing assembly's hud button is clicked (or used inhand).
-/obj/item/integrated_circuit/built_in/action_button
- name = "external trigger circuit"
- desc = "A built in chip that outputs a pulse when an external control event occurs."
- extended_desc = "This outputs a pulse if the assembly's HUD button is clicked while the assembly is closed."
- complexity = 0
- activators = list("on activation" = IC_PINTYPE_PULSE_OUT)
-
-/obj/item/integrated_circuit/built_in/action_button/do_work()
- activate_pin(1)
-
-/*
-// Extra vars for clothing here
-*/
-/obj/item/clothing/
- var/obj/item/electronic_assembly/clothing/integrated_circuit = null
- var/obj/item/integrated_circuit/built_in/action_button/action_circuit = null // This gets pulsed when someone clicks the button on the hud.
-
-// Does most of the repeatative setup.
-/obj/item/clothing/proc/setup_integrated_circuit(new_type)
- // Set up the internal circuit holder.
- integrated_circuit = new new_type(src)
- integrated_circuit.clothing = src
- integrated_circuit.name = name
-
- // Clothing assemblies can be triggered by clicking on the HUD. This allows that to occur.
- action_circuit = new(src.integrated_circuit)
- integrated_circuit.add_component(action_circuit)
-
-/datum/action/item_action/toggle_circuit
- name = "Toggle Integrated Circuit"
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/debugger.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/debugger.dm
deleted file mode 100644
index db5e525e2f5..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/debugger.dm
+++ /dev/null
@@ -1,109 +0,0 @@
-/obj/item/integrated_electronics/debugger
- name = "circuit debugger"
- desc = "This small tool allows one working with custom machinery to directly set data to a specific pin, useful for writing \
- settings to specific circuits, or for debugging purposes. It can also pulse activation pins."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_tools.dmi'
- icon_state = "debugger"
- flags_1 = CONDUCT_1
- item_flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_SMALL
- custom_materials = list(/datum/material/iron=200)
- var/data_to_write = null
- var/accepting_refs = FALSE
- var/copy_values = FALSE
- var/copy_id = FALSE
- var/datum/weakref/idlock = null
-
-/obj/item/integrated_electronics/debugger/attack_self(mob/user)
- var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref","copy","null","id lock")
- if(!ISADVANCEDTOOLUSER(user))
- return
-
- var/new_data = null
- switch(type_to_use)
- if("string")
- accepting_refs = FALSE
- copy_values = FALSE
- copy_id = FALSE
- new_data = stripped_input(user, "Now type in a string.","[src] string writing", no_trim = TRUE)
- if(istext(new_data) && ISADVANCEDTOOLUSER(user))
- data_to_write = new_data
- to_chat(user, "You set \the [src]'s memory to \"[new_data]\".")
- if("number")
- accepting_refs = FALSE
- copy_values = FALSE
- copy_id = FALSE
- new_data = input(user, "Now type in a number.","[src] number writing") as null|num
- if(isnum_safe(new_data) && ISADVANCEDTOOLUSER(user))
- data_to_write = new_data
- to_chat(user, "You set \the [src]'s memory to [new_data].")
- if("ref")
- accepting_refs = TRUE
- copy_values = FALSE
- copy_id = FALSE
- to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \
- an object for a ref of that object to save it in memory.")
- if("copy")
- accepting_refs = FALSE
- copy_values = TRUE
- copy_id = FALSE
- to_chat(user, "You turn \the [src]'s value copier on. Use it on a pin \
- to save its current value in memory.")
- if("null")
- data_to_write = null
- copy_values = FALSE
- to_chat(user, "You set \the [src]'s memory to absolutely nothing.")
- if("id lock")
- accepting_refs = FALSE
- copy_values = FALSE
- copy_id = TRUE
- to_chat(user, "You turn \the [src]'s id card scanner on. Use your own card \
- to store the identity and id-lock an assembly.")
-
-/obj/item/integrated_electronics/debugger/afterattack(atom/target, mob/living/user, proximity)
- . = ..()
- if(accepting_refs && proximity)
- data_to_write = WEAKREF(target)
- visible_message("[user] slides \a [src]'s over \the [target].")
- to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \
- now off.")
- accepting_refs = FALSE
-
- else if(copy_id && proximity)
- if(istype(target,/obj/item/card/id))
- idlock = WEAKREF(target)
- to_chat(user, "You set \the [src]'s card memory to [target.name]. The id card scanner is \
- now off.")
-
- else
- to_chat(user, "You turn the id card scanner is off.")
-
- copy_id = FALSE
- return
-
-/obj/item/integrated_electronics/debugger/proc/write_data(var/datum/integrated_io/io, mob/user)
- //If the pin can take data:
- if(io.io_type == DATA_CHANNEL)
- //If the debugger is set to copy, copy the data in the pin onto it
- if(copy_values)
- data_to_write = io.data
- to_chat(user, "You let the debugger copy the data.")
- copy_values = FALSE
- return
-
- //Else, write the data to the pin
- io.write_data_to_pin(data_to_write)
- var/data_to_show = data_to_write
- //This is only to convert a weakref into a name for better output
- if(isweakref(data_to_write))
- var/datum/weakref/w = data_to_write
- var/atom/A = w.resolve()
- data_to_show = A.name
- to_chat(user, "You write '[data_to_write ? data_to_show : "NULL"]' to the '[io]' pin of \the [io.holder].")
-
- //If the pin can only be pulsed
- else if(io.io_type == PULSE_CHANNEL)
- io.holder.check_then_do_work(io.ord,ignore_power = TRUE)
- to_chat(user, "You pulse \the [io.holder]'s [io].")
-
- io.holder.interact(user) // This is to update the UI.
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/detailer.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/detailer.dm
deleted file mode 100644
index 262b24b4064..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/detailer.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/obj/item/integrated_electronics/detailer
- name = "assembly detailer"
- desc = "A combination autopainter and flash anodizer designed to give electronic assemblies a colorful, wear-resistant finish."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_tools.dmi'
- icon_state = "detailer"
- flags_1 = CONDUCT_1
- item_flags = NOBLUDGEON
- w_class = WEIGHT_CLASS_SMALL
- custom_materials = list(/datum/material/iron=200)
- var/data_to_write = null
- var/accepting_refs = FALSE
- var/detail_color = COLOR_ASSEMBLY_WHITE
- var/list/color_list = list(
- "black" = COLOR_ASSEMBLY_BLACK,
- "gray" = COLOR_FLOORTILE_GRAY,
- "machine gray" = COLOR_ASSEMBLY_BGRAY,
- "white" = COLOR_ASSEMBLY_WHITE,
- "red" = COLOR_ASSEMBLY_RED,
- "orange" = COLOR_ASSEMBLY_ORANGE,
- "beige" = COLOR_ASSEMBLY_BEIGE,
- "brown" = COLOR_ASSEMBLY_BROWN,
- "gold" = COLOR_ASSEMBLY_GOLD,
- "yellow" = COLOR_ASSEMBLY_YELLOW,
- "gurkha" = COLOR_ASSEMBLY_GURKHA,
- "light green" = COLOR_ASSEMBLY_LGREEN,
- "green" = COLOR_ASSEMBLY_GREEN,
- "light blue" = COLOR_ASSEMBLY_LBLUE,
- "blue" = COLOR_ASSEMBLY_BLUE,
- "purple" = COLOR_ASSEMBLY_PURPLE
- )
-
-/obj/item/integrated_electronics/detailer/Initialize()
- .=..()
- update_icon()
-
-/obj/item/integrated_electronics/detailer/update_icon()
- cut_overlays()
- var/mutable_appearance/detail_overlay = mutable_appearance('modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_tools.dmi', "detailer-color")
- detail_overlay.color = detail_color
- add_overlay(detail_overlay)
- ..()
-
-/obj/item/integrated_electronics/detailer/attack_self(mob/user)
- var/color_choice = input(user, "Select color.", "Assembly Detailer") as null|anything in color_list
- if(!color_list[color_choice])
- return
- if(!in_range(src, user))
- return
- detail_color = color_list[color_choice]
- update_icon()
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/helpers.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/helpers.dm
deleted file mode 100644
index e9cbb346458..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/helpers.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/obj/item/integrated_circuit/proc/setup_io(list/io_list, io_type, list/io_default_list, pin_type)
- var/list/io_list_copy = io_list.Copy()
- io_list.Cut()
- for(var/i in 1 to io_list_copy.len)
- var/io_entry = io_list_copy[i]
- var/default_data = null
- var/io_type_override = null
-
- // Override the default data.
- if(length(io_default_list)) // List containing special pin types that need to be added.
- default_data = io_default_list["[i]"] // This is deliberately text because the index is a number in text form.
-
- // Override the pin type.
- if(io_list_copy[io_entry])
- io_type_override = io_list_copy[io_entry]
-
- if(io_type_override)
- io_list.Add(new io_type_override(src, io_entry, default_data, pin_type,i))
- else
- io_list.Add(new io_type(src, io_entry, default_data, pin_type,i))
-
-
-/obj/item/integrated_circuit/proc/set_pin_data(pin_type, pin_number, datum/new_data)
- if(islist(new_data))
- for(var/i in 1 to length(new_data))
- if (istype(new_data) && !isweakref(new_data))
- new_data[i] = WEAKREF(new_data[i])
- if (istype(new_data) && !isweakref(new_data))
- new_data = WEAKREF(new_data)
- var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
- return pin.write_data_to_pin(new_data)
-
-/obj/item/integrated_circuit/proc/get_pin_data(pin_type, pin_number)
- var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
- return pin.get_data()
-
-/obj/item/integrated_circuit/proc/get_pin_data_as_type(pin_type, pin_number, as_type)
- var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
- return pin.data_as_type(as_type)
-
-/obj/item/integrated_circuit/proc/activate_pin(pin_number)
- var/datum/integrated_io/activate/A = activators[pin_number]
- A.push_data()
-
-/obj/item/integrated_circuit/proc/get_pin_ref(pin_type, pin_number)
- switch(pin_type)
- if(IC_INPUT)
- if(pin_number > inputs.len)
- return
- return inputs[pin_number]
- if(IC_OUTPUT)
- if(pin_number > outputs.len)
- return
- return outputs[pin_number]
- if(IC_ACTIVATOR)
- if(pin_number > activators.len)
- return
- return activators[pin_number]
- return
-
-/datum/integrated_io/proc/get_data()
- if(islist(data))
- for(var/i in 1 to length(data))
- if(isweakref(data[i]))
- data[i] = data[i].resolve()
- if(isweakref(data))
- return data.resolve()
- return data
-
-
-// Returns a list of parameters necessary to locate a pin in the assembly: component number, pin type and pin number
-// Components list can be supplied from the outside, for use in savefiles
-/datum/integrated_io/proc/get_pin_parameters(list/components)
- if(!holder)
- return
-
- if(!components)
- if(!holder.assembly)
- return
- components = holder.assembly.assembly_components
-
- var/component_number = components.Find(holder)
-
- var/list/pin_holder_list
- switch(pin_type)
- if(IC_INPUT)
- pin_holder_list = holder.inputs
- if(IC_OUTPUT)
- pin_holder_list = holder.outputs
- if(IC_ACTIVATOR)
- pin_holder_list = holder.activators
- else
- return
-
- var/pin_number = pin_holder_list.Find(src)
-
- return list(component_number, pin_type, pin_number)
-
-
-// Locates a pin in the assembly when given component number, pin type and pin number
-// Components list can be supplied from the outside, for use in savefiles
-/obj/item/electronic_assembly/proc/get_pin_ref(component_number, pin_type, pin_number, list/components)
- if(!components)
- components = assembly_components
-
- if(component_number > components.len)
- return
-
- var/obj/item/integrated_circuit/component = components[component_number]
- return component.get_pin_ref(pin_type, pin_number)
-
-
-// Same as get_pin_ref, but takes in a list of 3 parameters (same format as get_pin_parameters)
-// and performs extra sanity checks on parameters list and index numbers
-/obj/item/electronic_assembly/proc/get_pin_ref_list(list/parameters, list/components)
- if(!components)
- components = assembly_components
-
- if(!islist(parameters) || parameters.len != 3)
- return
-
- // Those are supposed to be list indexes, check them for sanity
- if(!isnum_safe(parameters[1]) || parameters[1] % 1 || parameters[1] < 1)
- return
-
- if(!isnum_safe(parameters[3]) || parameters[3] % 1 || parameters[3] < 1)
- return
-
- return get_pin_ref(parameters[1], parameters[2], parameters[3], components)
-
-
-
-
-// Used to obfuscate object refs imported/exported as strings.
-// Not very secure, but if someone still finds a way to abuse refs, they deserve it.
-/proc/XorEncrypt(string, key)
- if(!string || !key ||!istext(string)||!istext(key))
- return
- var/r
- for(var/i = 1 to length(string))
- r += ascii2text(text2ascii(string,i) ^ text2ascii(key,((i-1)%length(string))+1))
- return r
diff --git a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/integrated_circuit.dm b/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/integrated_circuit.dm
deleted file mode 100644
index dbcdeca00e1..00000000000
--- a/modular_skyrat/modules/integrated_circuits/code/integrated_electronics/core/integrated_circuit.dm
+++ /dev/null
@@ -1,414 +0,0 @@
-/obj/item/integrated_circuit
- name = "integrated circuit"
- desc = "It's a tiny chip! This one doesn't seem to do much, however."
- icon = 'modular_skyrat/modules/integrated_circuits/icons/obj/assemblies/electronic_components.dmi'
- icon_state = "template"
- w_class = WEIGHT_CLASS_TINY
- custom_materials = list(/datum/material/iron=200)
- var/obj/item/electronic_assembly/assembly // Reference to the assembly holding this circuit, if any.
- var/extended_desc
- var/list/inputs = list()
- var/list/inputs_default = list()// Assoc list which will fill a pin with data upon creation. e.g. "2" = 0 will set input pin 2 to equal 0 instead of null.
- var/list/outputs = list()
- var/list/outputs_default =list()// Ditto, for output.
- var/list/activators = list()
- var/next_use = 0 // Uses world.time
- var/complexity = 1 // This acts as a limitation on building machines, more resource-intensive components cost more 'space'.
- var/size = 1 // This acts as a limitation on building machines, bigger components cost more 'space'. -1 for size 0
- var/cooldown_per_use = 1 // Circuits are limited in how many times they can be work()'d by this variable.
- var/ext_cooldown = 0 // Circuits are limited in how many times they can be work()'d with external world by this variable.
- var/power_draw_per_use = 0 // How much power is drawn when work()'d.
- var/power_draw_idle = 0 // How much power is drawn when doing nothing.
- var/spawn_flags // Used for world initializing, see the #defines above.
- var/action_flags = NONE // Used for telling circuits that can do certain actions from other circuits.
- var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places.
- var/removable = TRUE // Determines if a circuit is removable from the assembly.
- var/displayed_name = ""
- var/demands_object_input = FALSE
- var/can_input_object_when_closed = FALSE
- var/max_allowed = 0 // The maximum amount of components allowed inside an integrated circuit.
-
-
-/*
- Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows
-a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools.
-*/
-
-/obj/item/integrated_circuit/examine(mob/user)
- interact(user)
- external_examine(user)
- . = ..()
-
-// Can be called via electronic_assembly/attackby()
-/obj/item/integrated_circuit/proc/additem(var/obj/item/I, var/mob/living/user)
- attackby(I, user)
-
-// This should be used when someone is examining while the case is opened.
-/obj/item/integrated_circuit/proc/internal_examine(mob/user)
- to_chat(user, "This board has [inputs.len] input pin\s, [outputs.len] output pin\s and [activators.len] activation pin\s.")
- for(var/k in inputs)
- var/datum/integrated_io/I = k
- if(I.linked.len)
- to_chat(user, "The '[I]' is connected to [I.get_linked_to_desc()].")
- for(var/k in outputs)
- var/datum/integrated_io/O = k
- if(O.linked.len)
- to_chat(user, "The '[O]' is connected to [O.get_linked_to_desc()].")
- for(var/k in activators)
- var/datum/integrated_io/activate/A = k
- if(A.linked.len)
- to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].")
- any_examine(user)
- interact(user)
-
-// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED.
-/obj/item/integrated_circuit/proc/external_examine(mob/user)
- any_examine(user)
-
-/obj/item/integrated_circuit/proc/any_examine(mob/user)
- return
-
-/obj/item/integrated_circuit/proc/attackby_react(var/atom/movable/A,mob/user)
- return
-
-/obj/item/integrated_circuit/proc/sense(var/atom/movable/A,mob/user,prox)
- return
-
-/obj/item/integrated_circuit/proc/check_interactivity(mob/user)
- if(assembly)
- return assembly.check_interactivity(user)
- else
- return user.canUseTopic(src, BE_CLOSE)
-
-/obj/item/integrated_circuit/Initialize()
- . = ..()
- set_custom_materials(list(GET_MATERIAL_REF(/datum/material/iron)=w_class * SScircuit.cost_multiplier))
- displayed_name = name
- setup_io(inputs, /datum/integrated_io, inputs_default, IC_INPUT)
- setup_io(outputs, /datum/integrated_io, outputs_default, IC_OUTPUT)
- setup_io(activators, /datum/integrated_io/activate, null, IC_ACTIVATOR)
-
-
-/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit.
- return
-
-/obj/item/integrated_circuit/Destroy()
- . = ..()
- QDEL_LIST(inputs)
- QDEL_LIST(outputs)
- QDEL_LIST(activators)
-
-
-/obj/item/integrated_circuit/emp_act(severity)
- for(var/k in inputs)
- var/datum/integrated_io/I = k
- I.scramble()
- for(var/k in outputs)
- var/datum/integrated_io/O = k
- O.scramble()
- for(var/k in activators)
- var/datum/integrated_io/activate/A = k
- A.scramble()
-
-
-/obj/item/integrated_circuit/verb/rename_component()
- set name = "Rename Circuit"
- set category = "Object"
- set desc = "Rename your circuit, useful to stay organized."
-
- var/mob/M = usr
- if(!check_interactivity(M))
- return
-
- var/input = reject_bad_name(stripped_input(M, "What do you want to name this?", "Rename", name), TRUE)
- if(check_interactivity(M))
- if(!input)
- input = name
- if(CHAT_FILTER_CHECK(input))
- to_chat(M, "The circuit name contains prohibited words!")
- return
- to_chat(M, "The circuit '[name]' is now labeled '[input]'.")
- displayed_name = input
-
-/obj/item/integrated_circuit/interact(mob/user)
- ui_interact(user)
-
-/obj/item/integrated_circuit/ui_interact(mob/user)
- . = ..()
- if(!check_interactivity(user))
- return
-
- if(assembly)
- assembly.ui_interact(user, src)
- return
-
- var/table_edge_width = "30%"
- var/table_middle_width = "40%"
-
- var/datum/browser/popup = new(user, "scannernew", name, 800, 630) // Set up the popup browser window
- popup.add_stylesheet("scannernew", 'html/browser/assembly_ui.css')
-
- var/HTML = "| [words] | " - HTML += "||
| [words] | ||