diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 9258caf0cfb..5a371c50a06 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -160,7 +160,7 @@
"dd" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/awaymission/academy/classrooms)
"de" = (/turf/simulated/floor/greengrid,/area/awaymission/academy/classrooms)
"df" = (/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/classrooms)
-"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
+"dg" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: A+ Educator's Notes: Excellent form."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"dh" = (/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/awaymission/academy/classrooms)
"di" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms)
"dj" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{dir = 1; icon_state = "green"},/area/awaymission/academy/classrooms)
@@ -340,7 +340,7 @@
"gB" = (/obj/structure/grille,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/obj/structure/window/reinforced{dir = 5},/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
"gC" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
"gD" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/carpet,/area/awaymission/academy/academyaft)
-"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/toy/crossbow,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
+"gE" = (/obj/structure/table,/obj/item/weapon/paper{info = "Grade: B- Educator's Notes: Keep applying yourself, you're showing improvement."; name = "Summoning Midterm Exam"},/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"gG" = (/obj/structure/table,/turf/simulated/floor/plasteel{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/academy/classrooms)
"gH" = (/obj/structure/window/reinforced,/obj/item/ammo_casing,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/awaymission/academy/classrooms)
"gI" = (/mob/living/simple_animal/hostile/bear,/turf/simulated/floor/plating,/area/awaymission/academy/classrooms)
@@ -672,4 +672,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/_maps/map_files/RandomZLevels/spacehotel.dmm b/_maps/map_files/RandomZLevels/spacehotel.dmm
index 62503cc3dd1..ce1e5a290e9 100644
--- a/_maps/map_files/RandomZLevels/spacehotel.dmm
+++ b/_maps/map_files/RandomZLevels/spacehotel.dmm
@@ -189,7 +189,7 @@
"dJ" = (/obj/item/target/syndicate,/turf/simulated/floor/carpet,/area/awaymission)
"dK" = (/obj/item/trash/candy,/turf/simulated/floor/carpet,/area/awaymission)
"dL" = (/obj/item/toy/spinningtoy,/turf/simulated/floor/carpet,/area/awaymission)
-"dM" = (/obj/item/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission)
+"dM" = (/obj/item/weapon/gun/projectile/shotgun/toy/crossbow,/turf/simulated/floor/carpet,/area/awaymission)
"dN" = (/obj/structure/barricade/wooden,/obj/structure/barricade/wooden,/turf/simulated/floor/carpet,/area/awaymission)
"dO" = (/obj/machinery/door/airlock,/turf/simulated/floor/carpet,/area/awaymission)
"dP" = (/obj/effect/decal/cleanable/blood/old,/turf/simulated/wall,/area/awaymission)
@@ -322,4 +322,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabReWeXbDbDbDbDbDeSeSeSbDbDbDbDeYeUeVaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZbRfabDeSeWeSbDbDeRbDbDfbfceSeTeUeVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeZeNeMeHeIeNeLeLeLeNeMeHeIeNfdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/_maps/map_files/RandomZLevels/stationCollision.dmm b/_maps/map_files/RandomZLevels/stationCollision.dmm
index d91ef330c60..4934529dbf1 100644
--- a/_maps/map_files/RandomZLevels/stationCollision.dmm
+++ b/_maps/map_files/RandomZLevels/stationCollision.dmm
@@ -286,8 +286,8 @@
"fz" = (/obj/structure/table,/obj/item/device/analyzer,/obj/item/device/mass_spectrometer{pixel_x = 5; pixel_y = 5},/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research)
"fA" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/weapon/paper/sc_safehint_paper_caf,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"fB" = (/obj/structure/target_stake,/obj/item/weapon/grown/sunflower,/turf/simulated/floor/plasteel{icon_state = "showroomfloor"},/area/awaymission/research)
-"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
-"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"fC" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"fD" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"fE" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/airless,/area/awaymission/midblock)
"fF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched1"},/area/awaymission/midblock)
"fG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/awaymission/midblock)
@@ -315,7 +315,7 @@
"gc" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/awaymission/arrivalblock)
"gd" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock)
"ge" = (/obj/item/weapon/storage/secure/safe/sc_ssafe{pixel_x = 4; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/awaymission/northblock)
-"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/toy/crossbow/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
+"gf" = (/obj/effect/decal/remains/human{desc = "This guy seemed to have died in terrible way! Half his remains are dust."; icon_state = "remains"; name = "Syndicate agent remains"},/obj/item/ammo_casing/c10mm,/obj/item/clothing/under/syndicate,/obj/effect/decal/cleanable/blood/splatter,/obj/item/weapon/gun/projectile/shotgun/toy/tommygun,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"gg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plasteel/airless{icon_state = "floorscorched2"},/area/awaymission/midblock)
"gh" = (/obj/structure/closet/wardrobe/generic,/turf/simulated/floor/plasteel,/area/awaymission/midblock)
"gi" = (/turf/simulated/floor/plasteel,/area/awaymission/midblock)
@@ -689,4 +689,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzltlFlGlHhuhuhuiYlIkfkfkpkRjKlJjKlKiYlLlMlNlOlOlP
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaagzgzgzgzgzgzgzgziYlVlWlXiYkfkdlYlZmaiYjKjKjKmbmbmbmbmcjulCmdmejuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYiYjujujujujuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 00e7cc5cac1..674e111caae 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -6357,12 +6357,12 @@
"csm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/camera{c_tag = "Mechanic's Workshop East"; dir = 2; network = list("SS13")},/obj/machinery/space_heater,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
"csn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/engine/mechanic_workshop)
"cso" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engine/mechanic_workshop)
-"csp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"csq" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"csr" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"css" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"cst" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
-"csu" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Mechanic"; departmentType = 2; name = "Mechanic's Workshop Requests Console"; pixel_y = 30},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"csq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"css" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"cst" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"csu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csv" = (/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"; tag = "icon-pipe-j1 (WEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"csx" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
@@ -6419,11 +6419,11 @@
"ctw" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"ctx" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cty" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
-"ctz" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
-"ctA" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
+"ctz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
+"ctA" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-y"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"ctB" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"ctC" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
-"ctD" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"ctC" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/engine/mechanic_workshop)
+"ctD" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
"ctE" = (/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"ctF" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"ctG" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
@@ -7989,7 +7989,7 @@
"cXG" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/effect/decal/warning_stripes/west,/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXH" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{dir = 4; name = "station intercom (General)"; pixel_x = 28},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXI" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plating,/area/aisat)
-"cXJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
+"cXJ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance_hatch{name = "MiniSat Maintenance"; req_access_txt = "75"},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/effect/decal/warning_stripes/northeastcorner,/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXM" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/effect/decal/warning_stripes/north,/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel,/area/aisat/maintenance)
@@ -8003,7 +8003,7 @@
"cXU" = (/obj/structure/stool/bed/chair,/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
"cXW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor/plasteel,/area/aisat/maintenance)
-"cXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/aisat/maintenance)
+"cXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/wall,/area/aisat/maintenance)
"cXY" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/toxins/xenobiology)
"cXZ" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
"cYa" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel{dir = 10; icon_state = "yellow"},/area/aisat/maintenance)
@@ -8264,7 +8264,7 @@
"dcV" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "co2_in"; name = "Carbon Dioxide Supply Control"; output_tag = "co2_out"; sensors = list("co2_sensor" = "Tank")},/turf/simulated/floor/plasteel{icon_state = "caution"; dir = 4},/area/atmos)
"dcW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/turf/simulated/wall/r_wall,/area/engine/engineering)
"dcX" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 4; level = 2},/turf/simulated/floor/plasteel{dir = 6; icon_state = "caution"},/area/atmos)
-"dcY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/requests_console{department = "Mechanic"; departmentType = 2; name = "Mechanic's Workshop Requests Console"; pixel_y = 30},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
+"dcY" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"dcZ" = (/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/floor/plasteel,/area/hallway/primary/starboard/west)
"dda" = (/obj/machinery/camera/emp_proof{c_tag = "Engineering Singularity North-East"; dir = 2; network = list("Singularity","SS13")},/obj/machinery/power/grounding_rod{anchored = 1},/turf/simulated/floor/plating/airless,/area/engine/engineering)
"ddb" = (/obj/item/weapon/wrench,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "engineering_east_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = 20; req_access_txt = "10;13"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plating/airless,/area/engine/engineering)
@@ -8738,6 +8738,8 @@
"dmb" = (/obj/item/weapon/storage/fancy/donut_box,/obj/structure/table,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/wood,/area/bridge/meeting_room)
"dmc" = (/obj/structure/table/woodentable,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/coin/plasma,/obj/item/device/megaphone,/obj/item/weapon/book/manual/sop_general,/turf/simulated/floor/wood,/area/crew_quarters/captain)
"dmd" = (/obj/machinery/light{dir = 1},/obj/structure/bookcase,/obj/item/weapon/book/manual/sop_engineering,/obj/item/weapon/book/manual/sop_medical,/obj/item/weapon/book/manual/sop_science,/obj/item/weapon/book/manual/sop_security,/obj/item/weapon/book/manual/sop_service,/obj/item/weapon/book/manual/sop_supply,/obj/item/weapon/book/manual/sop_general,/obj/item/weapon/book/manual/sop_legal,/turf/simulated/floor/wood,/area/ntrep)
+"dme" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"dmf" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
(1,1,1) = {"
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
@@ -8902,8 +8904,8 @@ bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbi
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikcnHcpccpdcpecpfcmBcpgcphcpicmBcpjcpkcplcpmcjMbikcpncjOcpocjQcppcjScjScpqcprcpscptcpucpvcwqcobcgfcpycpzcpAcpBcpCciVcpDclAclAclAcpEciWbGybGycpFcpFcpGcpHcpIcpIcpIcyFcpJcpJcpJcpKcpFcpGcpMcqQcfdcrLcEjbjVcEYdbndbmcxNclRckDcoucpNcovckDbGycuscoAcoAaabaabbikbikbikbikbikbikbikbikbikbikbikcpRcpScpTcpUcpVcpWcpXcpXcpYcpXcpXcpXcpXcpXcpZcqacqbcqccqdbwocvvbXSbwobwoaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWhcqhcqicqjbWhbWhbXZbXZcqkbXZbXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikcnHcqlcnJcqmcnJcqncqocqpcqqcnNcqrcjKcqscelcejbikbikbikbikciEcqtcqucqvcqvciLcqwciLcqxcgdcbkcqycqzcqAcqBcqCcqCcqCcqDcqEclAcqFclAcqGciWbGybGycpFcqHcqIcqJcqKcqLcqMcpFcqLcqMcqKcqNdehcqPcpMczecyWczgcEjdbpdbodbrdbqdbsctcckDcpOcpPcpQckDbGycuscoAcvyaabaabaabbikbikbikbikbikbikbikbikbikbikcpRcqUcqVcqWcqXcqYcqZcracrbcpXcpXcrccpXcpXcpZcqbcqbcqbcrdbwocvzbxXbwoaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfcrhcribZvbWgbWhbWhbXZbYabXZbWhbWhaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcrjcrjcrkcrkcrkcrkcrkcjKcjKcjKcjKcjKcjKcjKcekcrlcrmcrmcrmcrmcrmciEciLciLciLciLciLciLciLcrncgdcbkcrocrpcrqcrrcrscrtcrucrvcrwcrxcrycrzcrAciWbGybGycpFcrBcrCcqJcqKcqKcrDcpFcrEcqKcqKcqNcqKcrFcpMbGwbGwbGwcEjdbudbtdbvdbmdbxctcdbydbydbycoAcoAbGycuscoDcwpbikaabaabaabbikbikbikbikbikbikbikbikbikcpRczNczPcoBcrOcrPcrQcrRcrScpXcpXcpXcpXcrTcrUcrVcrWcrXcrYbwocvzbxXbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaSecsdcsecsfcsgcsgcshcsidcYcskcslcsmcsncsocspcspcspcsqcsrcsscstcstcsucsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
-bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctuctvctwctvctxctyctzctActBctCctBctDctEctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikbikbikbikbikbikaSecsdcsecsfcsgcsgcshcsicspcskcslcsmcsncsocsrcsqcsqcsscsucstctzctzctAcsvcswcsxcsycsxcsxcsxcswcsxcsxcszcsAcsBcsCcgdcbkcsDcsEcsFcsGcgfcsHcmQcsIcsJcsKcsLcsMcsNcsObGybGycpFcsPcsQcsRcsScsTcsUcpFcsVcsTcsWcsXdlFcsYcwrbikbikbikcEjdbAdbzdbAdbAdbCdbBdbEdbDdbycwFbVibGycuscoDcwpbikbikaabaabaabbikbikbikbikbikbikbikbikctdckPcxGckSctdctfctgcthctictjctkctlcpXcpXctmctnctoctpctqbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikaahbikbikbikbikbikbikbikaabaabaabaabbikbikbikbikaabaabaabaabbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
+bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecsdctuctvctwctvctxctyctDctCdmedcYdmedmfcxnctEctFctEcgdctGcblcblctEctHctEctEctEctEctEctEctEctEctEctEctIctJctKctLctMctNctOctPctQctRctSctTctUctVctWctXciFctZcuacnqcubcuccudcuecufcugcuhcuicpFcujcqKcugcukcqKculcwrbikbikbikdbFcmkdbGdbJdbIdbCdbKdbMdbLdbOdbNceFceJdbPcoDcwpbikbikbikaabaabaabbikbikbikbikbikbikbikckPcurczQcutckPcnCcnCcnCcnCcnCcnCcuuctlcuvcuwcuxcuycnCcnCbwocvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikaSecuBctvcuCcuDcuEcuFcuGcuHcuIcuJcuKcuLcuMcuNcuOcuPcuQcuRceAcuSceAcuNcuTcuNcuNcuNcuNcuNcuNcuNcuNcuNcuNcuUctEcuVcuWcuXcuYcuZcvacvbcvccvdcvecvfcvgcvhcvicvjcvkcsLceJcvlcvmcvncqKcqJcqKcqKcvocpFcvpcqKcqKcqNcqKcyGcwrbikbikbikdbFdbRdbQdbTdbSdbVdbUdbXdbWdbybGychCcyHcuscoAbikbikbikbikbikaabckPckPckPckPckPckPckPckPckPcvucxScvwckPcxOcxOcyIckPaabcnCcnCcvAcnCcvBcvCcvDcnCcyKcyJcvzbxXcxHbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikadbabLcrjcrjcrjcrjcrjcrjcvFcvGcvGcvHctBdlXcrjcrmcvJcvKcvKcvLcvKcvMcvKcvKcvNcvOcvKcvKcvOcvOcvOcvKcvKcvKcvKcvPcvQcvRcvScvTcvUcvVcvWcvXcvWcvWcvWcvWcvZcwacwbcwccwdcsObGycvrcwecwfcwgcwhcwicwjcwkcpFcwlcwjcwmcqNcqKcwocpMbikbikbikdbFdbZdbYdcadbIdccdcbdbUczRdbycyObVibVicuscoAbikbikbikbikbikbikckPcwtcwucwvcwwcwxcwycwzcwAcwBczScwDckPcxOcBZcyPckPaabaabcwGcwHcwIcwJcwKcwLcwGbxXbxXcvzczfbwobikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
bikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikacGacGacGafxafxacGafxafxafxagiafxafxaabagiaqZbikaabaabcwNcwNcwNcrjcwOcwPcwQcwRcwScwTcwUcwVcwWcwXcwYcwZcxacxbcxccxdcxecxfcxgcvKcxfcxhcxicxjcxjcxkcvKcxlcxmcxncxocbkcxpcxqcxrcxscxtcxucxtcxvcxwcxxcxycxzcxAcsOcsOcvrcwecpMcpMcxBcpMcpMcxCcxDcxEcxEcxEcxFcxEcyUcpMbikbikbikdbFdbFdbFdbFdbFdbydcedcgdcfdbybGybGyczhcuscoAbikbikbikbikbikbikckPcxOcxPcxOcxQcxRcqUcxScwAcxTczicxTckPcxOcxOcMpckPaabbikcwGcxWcxXcwJcwJcxYcwGczjbxXcvzbzNczMbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbikbik
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 46e98f30d6c..46b1662d8d6 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -621,9 +621,11 @@
"lW" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"lX" = (/obj/structure/rack,/obj/item/clothing/under/color/green,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/head/helmet/swat,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/shield/energy,/obj/machinery/recharger/wallcharger{pixel_x = 3; pixel_y = -30},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena_source)
"lY" = (/obj/effect/landmark/abductor/agent{team = 3},/turf/unsimulated/floor/abductor,/area/abductor_ship)
+"lZ" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"ma" = (/obj/effect/decal/cleanable/molten_item,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/wizard_station)
"mb" = (/turf/unsimulated/wall/fakeglass,/area/wizard_station)
"mc" = (/obj/item/trash/chips,/obj/machinery/light/spot,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
+"md" = (/obj/machinery/computer/mech_bay_power_console,/obj/structure/cable,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
"me" = (/obj/effect/decal/cleanable/blood,/turf/unsimulated/floor{dir = 8; icon_state = "chapel"},/area/wizard_station)
"mg" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "diagonalWall3"},/area/shuttle/syndicate_elite/mothership)
"mh" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/shuttle/syndicate_elite/mothership)
@@ -694,7 +696,6 @@
"rK" = (/turf/unsimulated/wall/splashscreen,/area/start)
"rP" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/clusterbuster,/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rQ" = (/obj/structure/table/reinforced,/obj/item/weapon/grenade/chem_grenade/incendiary{name = "Incendiary Grenade"},/obj/machinery/light{dir = 1},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
-"rT" = (/obj/structure/closet/secure_closet/guncabinet,/obj/machinery/camera/motion{c_tag = "Gamma Armory Entrance"; network = list("SS13")},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/obj/item/weapon/gun/projectile/automatic/pistol{name = "pistol"},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rU" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/gun/energy/gun/nuclear,/obj/machinery/light{dir = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rV" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
"rW" = (/obj/structure/closet/secure_closet/guncabinet,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/weapon/gun/rocketlauncher,/turf/simulated/floor/engine,/area/shuttle/gamma/space)
@@ -716,7 +717,6 @@
"sm" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/shuttle/gamma/space)
"sn" = (/obj/structure/cable,/obj/machinery/mech_bay_recharge_port/upgraded,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
"so" = (/obj/mecha/combat/durand/loaded{operation_req_access = list(1)},/obj/machinery/light,/turf/simulated/floor/mech_bay_recharge_floor,/area/shuttle/gamma/space)
-"sp" = (/obj/machinery/computer/mech_bay_power_console,/obj/machinery/camera{c_tag = "Gamma Armory Mech Bay"; dir = 1; network = list("SS13")},/obj/structure/cable,/turf/simulated/floor/plasteel,/area/shuttle/gamma/space)
"sq" = (/turf/unsimulated/wall,/area/centcom/control)
"sr" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
"ss" = (/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/control)
@@ -1434,11 +1434,11 @@ aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaq
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNbZbZbZbZbZbZrPrQdebZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZcYrTrUrVrWrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZcYlZrUrVrWrXrXrXbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNbZrXrXrXrXrXrXrYrZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNbZsasbsbsbscsdsesbbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNsfsgsgsgsgsashsisjbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
-aNaNaNaNaNaNaNbZsgskslsmsasnsospbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
+aNaNaNaNaNaNaNbZsgskslsmsasnsomdbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaNbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNbZbZbZbZbZbZbZbZbZbZaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaN
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index b6fcfc104c8..7f1a33d0b33 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -220,4 +220,14 @@
#define R_HAND_LAYER 28
#define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system
#define FIRE_LAYER 30 //If you're on fire
-#define TOTAL_LAYERS 30
\ No newline at end of file
+#define TOTAL_LAYERS 30
+
+///Access Region Codes///
+#define REGION_ALL 0
+#define REGION_GENERAL 1
+#define REGION_SECURITY 2
+#define REGION_MEDBAY 3
+#define REGION_RESEARCH 4
+#define REGION_ENGINEERING 5
+#define REGION_SUPPLY 6
+#define REGION_COMMAND 7
\ No newline at end of file
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index f3117a67215..247d481f1be 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -1348,9 +1348,19 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/misc/mafia
name = "Mafia Supply Crate"
- contains = list(/obj/item/clothing/suit/browntrenchcoat =1,/obj/item/clothing/suit/blacktrenchcoat =1,/obj/item/clothing/head/fedora/whitefedora =1,
- /obj/item/clothing/head/fedora/brownfedora =1,/obj/item/clothing/head/fedora =1,/obj/item/clothing/under/flappers =1,/obj/item/clothing/under/mafia =1,/obj/item/clothing/under/mafia/vest =1,/obj/item/clothing/under/mafia/white =1,
- /obj/item/clothing/under/mafia/sue =1,/obj/item/clothing/under/mafia/tan =1, /obj/item/toy/crossbow/tommygun =2)
+ contains = list(/obj/item/clothing/suit/browntrenchcoat,
+ /obj/item/clothing/suit/blacktrenchcoat,
+ /obj/item/clothing/head/fedora/whitefedora,
+ /obj/item/clothing/head/fedora/brownfedora,
+ /obj/item/clothing/head/fedora,
+ /obj/item/clothing/under/flappers,
+ /obj/item/clothing/under/mafia,
+ /obj/item/clothing/under/mafia/vest,
+ /obj/item/clothing/under/mafia/white,
+ /obj/item/clothing/under/mafia/sue,
+ /obj/item/clothing/under/mafia/tan,
+ /obj/item/weapon/gun/projectile/shotgun/toy/tommygun,
+ /obj/item/weapon/gun/projectile/shotgun/toy/tommygun)
cost = 15
containername = "mafia supply crate"
@@ -1385,6 +1395,29 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
..()
+/datum/supply_packs/misc/foamforce
+ name = "Foam Force Crate"
+ contains = list(/obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy,
+ /obj/item/weapon/gun/projectile/shotgun/toy)
+ cost = 10
+ containername = "foam force crate"
+
+/datum/supply_packs/misc/foamforce/bonus
+ name = "Foam Force Pistols Crate"
+ contains = list(/obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/weapon/gun/projectile/automatic/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol,
+ /obj/item/ammo_box/magazine/toy/pistol)
+ cost = 40
+ containername = "foam force pistols crate"
+ contraband = 1
+
/datum/supply_packs/misc/randomised/contraband
num_contained = 5
contains = list(/obj/item/weapon/storage/pill_bottle/random_drug_bottle,
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index cf997f6f28d..ca41668e53a 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -407,6 +407,34 @@ var/list/uplink_items = list()
gamemodes = list(/datum/game_mode/nuclear)
surplus = 0
+/datum/uplink_item/dangerous/foamsmg
+ name = "Toy Submachine Gun"
+ desc = "A fully-loaded Donksoft bullpup submachine gun that fires riot grade rounds with a 20-round magazine."
+ reference = "FSMG"
+ item = /obj/item/weapon/gun/projectile/automatic/c20r/toy
+ cost = 5
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+/datum/uplink_item/dangerous/foammachinegun
+ name = "Toy Machine Gun"
+ desc = "A fully-loaded Donksoft belt-fed machine gun. This weapon has a massive 50-round magazine of devastating riot grade darts, that can briefly incapacitate someone in just one volley."
+ reference = "FLMG"
+ item = /obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ cost = 10
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+/datum/uplink_item/ammo/toydarts
+ name = "Box of Riot Darts"
+ desc = "A box of 40 Donksoft foam riot darts, for reloading any compatible foam dart gun. Don't forget to share!"
+ reference = "FOAM"
+ item = /obj/item/ammo_box/foambox/riot
+ cost = 2
+ gamemodes = list(/datum/game_mode/nuclear)
+ surplus = 0
+
+
//for refunding the syndieborg teleporter
/datum/uplink_item/dangerous/syndieborg/spawn_item()
var/obj/item/weapon/antag_spawner/borg_tele/T = ..()
@@ -550,6 +578,14 @@ var/list/uplink_items = list()
cost = 8
excludefrom = list(/datum/game_mode/nuclear)
+/datum/uplink_item/stealthy_weapons/foampistol
+ name = "Toy Gun (with Stun Darts)"
+ desc = "An innocent looking toy pistol designed to fire foam darts. Comes loaded with riot grade darts, to incapacitate a target."
+ reference = "FSPI"
+ item = /obj/item/weapon/gun/projectile/automatic/toy/pistol/riot
+ cost = 3
+ surplus = 10
+
/datum/uplink_item/stealthy_weapons/soap
name = "Syndicate Soap"
desc = "A sinister-looking surfactant used to clean blood stains to hide murders and prevent DNA analysis. You can also drop it underfoot to slip people."
@@ -1105,4 +1141,4 @@ var/list/uplink_items = list()
U.purchase_log += "\icon[C]"
for(var/item in bought_items)
new item(C)
- U.purchase_log += "\icon[item]"
\ No newline at end of file
+ U.purchase_log += "\icon[item]"
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 831e7004ad6..92c894cba10 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -110,11 +110,13 @@
/atom/movable/proc/forceMove(atom/destination)
var/turf/old_loc = loc
- if(old_loc)
- old_loc.Exited(src)
-
loc = destination
+ if(old_loc)
+ old_loc.Exited(src, destination)
+ for(var/atom/movable/AM in old_loc)
+ AM.Uncrossed(src)
+
if(destination)
destination.Entered(src)
for(var/atom/movable/AM in destination)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 0ca3c652a31..7d5028f4875 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -96,7 +96,7 @@
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/abductor/pad/P = target
- if(cameranet.checkTurfVis(remote_eye.loc) && !(remote_eye.loc in config.admin_levels))
+ if(cameranet.checkTurfVis(remote_eye.loc))
P.PadToLoc(remote_eye.loc)
/datum/action/teleport_out
@@ -123,7 +123,7 @@
var/mob/camera/aiEye/remote/remote_eye = C.remote_control
var/obj/machinery/abductor/pad/P = target
- if(cameranet.checkTurfVis(remote_eye.loc) && !(remote_eye.loc in config.admin_levels))
+ if(cameranet.checkTurfVis(remote_eye.loc))
P.MobToLoc(remote_eye.loc,C)
/datum/action/vest_mode_swap
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index d43d5e17e8f..e3649f5e445 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -249,43 +249,43 @@
/proc/get_absolutely_all_accesses()
return (get_all_accesses() | get_all_centcom_access() | get_all_syndicate_access() | get_all_misc_access())
-/proc/get_region_accesses(var/code)
+/proc/get_region_accesses(code)
switch(code)
- if(0)
+ if(REGION_ALL)
return get_all_accesses()
- if(1) //security
+ if(REGION_GENERAL) //station general
+ return list(access_kitchen, access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_magistrate, access_clown, access_mime)
+ if(REGION_SECURITY) //security
return list(access_sec_doors, access_weapons, access_security, access_brig, access_armory, access_forensics_lockers, access_court, access_pilot, access_hos)
- if(2) //medbay
+ if(REGION_MEDBAY) //medbay
return list(access_medical, access_genetics, access_morgue, access_chemistry, access_psychiatrist, access_virology, access_surgery, access_cmo, access_paramedic)
- if(3) //research
- return list(access_research, access_tox, access_tox_storage, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd)
- if(4) //engineering and maintenance
+ if(REGION_RESEARCH) //research
+ return list(access_research, access_tox, access_tox_storage, access_genetics, access_robotics, access_xenobiology, access_xenoarch, access_minisat, access_rd)
+ if(REGION_ENGINEERING) //engineering and maintenance
return list(access_construction, access_maint_tunnels, access_engine, access_engine_equip, access_external_airlocks, access_tech_storage, access_atmospherics, access_minisat, access_ce, access_mechanic)
- if(5) //command
- return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_blueshield, access_ntrep, access_hop, access_captain)
- if(6) //station general
- return list(access_kitchen,access_bar, access_hydroponics, access_janitor, access_chapel_office, access_crematorium, access_library, access_theatre, access_lawyer, access_magistrate, access_clown, access_mime)
- if(7) //supply
+ if(REGION_SUPPLY) //supply
return list(access_mailsorting, access_mining, access_mining_station, access_mineral_storeroom, access_cargo, access_qm)
+ if(REGION_COMMAND) //command
+ return list(access_heads, access_RC_announce, access_keycard_auth, access_change_ids, access_ai_upload, access_teleporter, access_eva, access_tcomsat, access_gateway, access_all_personal_lockers, access_heads_vault, access_blueshield, access_ntrep, access_hop, access_captain)
-/proc/get_region_accesses_name(var/code)
+/proc/get_region_accesses_name(code)
switch(code)
- if(0)
+ if(REGION_ALL)
return "All"
- if(1) //security
+ if(REGION_GENERAL) //station general
+ return "General"
+ if(REGION_SECURITY) //security
return "Security"
- if(2) //medbay
+ if(REGION_MEDBAY) //medbay
return "Medbay"
- if(3) //research
+ if(REGION_RESEARCH) //research
return "Research"
- if(4) //engineering and maintenance
+ if(REGION_ENGINEERING) //engineering and maintenance
return "Engineering"
- if(5) //command
- return "Command"
- if(6) //station general
- return "Station General"
- if(7) //supply
+ if(REGION_SUPPLY) //supply
return "Supply"
+ if(REGION_COMMAND) //command
+ return "Command"
/proc/get_access_desc(A)
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 43c42ac19bf..6b13dbe95e3 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -445,6 +445,39 @@ to destroy them and players will be able to make replacements.
origin_tech = "programming=1"
req_components = list(
/obj/item/weapon/stock_parts/matter_bin = 1)
+ var/list/fridge_names_paths = list(
+ "\improper SmartFridge" = /obj/machinery/smartfridge,
+ "\improper MegaSeed Servitor" = /obj/machinery/smartfridge/seeds,
+ "\improper Refrigerated Medicine Storage" = /obj/machinery/smartfridge/medbay,
+ "\improper Slime Extract Storage" = /obj/machinery/smartfridge/secure/extract,
+ "\improper Secure Refrigerated Medicine Storage" = /obj/machinery/smartfridge/secure/medbay,
+ "\improper Smart Chemical Storage" = /obj/machinery/smartfridge/secure/chemistry,
+ "smart virus storage" = /obj/machinery/smartfridge/secure/chemistry/virology,
+ "\improper Drink Showcase" = /obj/machinery/smartfridge/drinks
+ )
+
+
+
+/obj/item/weapon/circuitboard/smartfridge/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ set_type(null, user)
+
+/obj/item/weapon/circuitboard/smartfridge/proc/set_type(typepath, mob/user)
+ var/new_name = ""
+ if(!typepath)
+ new_name = input("Circuit Setting", "What would you change the board setting to?") in fridge_names_paths
+ typepath = fridge_names_paths[new_name]
+ else
+ for(var/name in fridge_names_paths)
+ if(fridge_names_paths[name] == typepath)
+ new_name = name
+ break
+ build_path = typepath
+ name = new_name
+ if(findtextEx(new_name, "\improper"))
+ new_name = replacetext(new_name, "\improper", "")
+ if(user)
+ to_chat(user, "You set the board to [new_name].")
/obj/item/weapon/circuitboard/monkey_recycler
name = "circuit board (Monkey Recycler)"
diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm
index d1dda0bc558..b17b09d5419 100644
--- a/code/game/machinery/kitchen/smartfridge.dm
+++ b/code/game/machinery/kitchen/smartfridge.dm
@@ -26,7 +26,9 @@
/obj/machinery/smartfridge/New()
..()
component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/smartfridge(null)
+ var/obj/item/weapon/circuitboard/smartfridge/board = new(null)
+ board.set_type(type)
+ component_parts += board
component_parts += new /obj/item/weapon/stock_parts/matter_bin(null)
RefreshParts()
@@ -150,10 +152,8 @@
/obj/item/weapon/reagent_containers/glass/bottle/plasma = 1,
/obj/item/weapon/reagent_containers/glass/bottle/diphenhydramine = 1)
-/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(obj/item/O)
- if(..(O))
- return 1
- if(istype(O, /obj/item/weapon/reagent_containers/syringe))
+/obj/machinery/smartfridge/secure/chemistry/virology/accept_check(var/obj/item/O as obj)
+ if(istype(O, /obj/item/weapon/reagent_containers/syringe) || istype(O, /obj/item/weapon/reagent_containers/glass/bottle) || istype(O, /obj/item/weapon/reagent_containers/glass/beaker))
return 1
return 0
diff --git a/code/game/objects/items/control_wand.dm b/code/game/objects/items/control_wand.dm
new file mode 100644
index 00000000000..86f6fd5a74d
--- /dev/null
+++ b/code/game/objects/items/control_wand.dm
@@ -0,0 +1,104 @@
+#define WAND_OPEN "Open Door"
+#define WAND_BOLT "Toggle Bolts"
+#define WAND_EMERGENCY "Toggle Emergency Access"
+
+/obj/item/weapon/door_remote
+ icon_state = "gangtool-white"
+ item_state = "electronic"
+ icon = 'icons/obj/device.dmi'
+ name = "control wand"
+ desc = "Remotely controls airlocks."
+ w_class = 1
+ var/mode = WAND_OPEN
+ var/region_access = 1 //See access.dm
+ var/obj/item/weapon/card/id/ID
+
+/obj/item/weapon/door_remote/New()
+ ..()
+ ID = new /obj/item/weapon/card/id
+ ID.access = get_region_accesses(region_access)
+
+/obj/item/weapon/door_remote/attack_self(mob/user)
+ switch(mode)
+ if(WAND_OPEN)
+ mode = WAND_BOLT
+ if(WAND_BOLT)
+ mode = WAND_EMERGENCY
+ if(WAND_EMERGENCY)
+ mode = WAND_OPEN
+ to_chat(user, "Now in mode: [mode].")
+
+/obj/item/weapon/door_remote/afterattack(obj/machinery/door/airlock/D, mob/user)
+ if(!istype(D))
+ return
+ if(!(D.arePowerSystemsOn()))
+ to_chat(user, "[D] has no power!")
+ return
+ if(!D.requiresID())
+ to_chat(user, "[D]'s ID scan is disabled!")
+ return
+ if(D.check_access(src.ID))
+ switch(mode)
+ if(WAND_OPEN)
+ if(D.density)
+ D.open()
+ else
+ D.close()
+ if(WAND_BOLT)
+ if(D.locked)
+ D.unlock()
+ else
+ D.lock()
+ if(WAND_EMERGENCY)
+ if(D.emergency)
+ D.emergency = 0
+ else
+ D.emergency = 1
+ D.update_icon()
+ else
+ to_chat(user, "[src] does not have access to this door.")
+
+/obj/item/weapon/door_remote/omni
+ name = "omni door remote"
+ desc = "This control wand can access any door on the station."
+ icon_state = "gangtool-yellow"
+ region_access = REGION_ALL
+
+/obj/item/weapon/door_remote/captain
+ name = "command door remote"
+ icon_state = "gangtool-yellow"
+ region_access = REGION_COMMAND
+
+/obj/item/weapon/door_remote/chief_engineer
+ name = "engineering door remote"
+ icon_state = "gangtool-orange"
+ region_access = REGION_ENGINEERING
+
+/obj/item/weapon/door_remote/research_director
+ name = "research door remote"
+ icon_state = "gangtool-purple"
+ region_access = REGION_RESEARCH
+
+/obj/item/weapon/door_remote/head_of_security
+ name = "security door remote"
+ icon_state = "gangtool-red"
+ region_access = REGION_SECURITY
+
+/obj/item/weapon/door_remote/quartermaster
+ name = "supply door remote"
+ icon_state = "gangtool-green"
+ region_access = REGION_SUPPLY
+
+/obj/item/weapon/door_remote/chief_medical_officer
+ name = "medical door remote"
+ icon_state = "gangtool-blue"
+ region_access = REGION_MEDBAY
+
+/obj/item/weapon/door_remote/civillian
+ name = "civillian door remote"
+ icon_state = "gangtool-white"
+ region_access = REGION_GENERAL
+
+#undef WAND_OPEN
+#undef WAND_BOLT
+#undef WAND_EMERGENCY
\ No newline at end of file
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index f46e2361192..7e15df8676c 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -5,7 +5,7 @@
name = "Random Toy"
New()
..()
- var/list/types = list(/obj/item/toy/crossbow,/obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
+ var/list/types = list(/obj/item/weapon/gun/projectile/shotgun/toy/crossbow, /obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + subtypesof(/obj/item/toy/prize)
var/T = pick(types)
new T(loc)
spawn(1)
@@ -332,4 +332,4 @@
new nade3(src)
new nade4(src)
new nade5(src)
- new nade6(src)
\ No newline at end of file
+ new nade6(src)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 8911a3e60f6..6a863bcc60f 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -3,8 +3,6 @@
* Balloons
* Fake telebeacon
* Fake singularity
- * Toy crossbow
- * Toy Tommy Gun
* Toy swords
* Toy mechs
* Snap pops
@@ -132,142 +130,6 @@
icon = 'icons/obj/singularity.dmi'
icon_state = "singularity_s1"
-
-/*
- * Toy crossbow
- */
-
-/obj/item/toy/crossbow
- name = "foam dart crossbow"
- desc = "A weapon favored by many overactive children. Ages 8 and up."
- icon = 'icons/obj/gun.dmi'
- icon_state = "crossbow"
- item_state = "crossbow"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- w_class = 2.0
- attack_verb = list("attacked", "struck", "hit")
- var/bullets = 5
-
-/obj/item/toy/crossbow/examine(mob/user)
- ..(user)
- if (bullets)
- to_chat(user, "It is loaded with [bullets] foam darts!")
-
-/obj/item/toy/crossbow/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 4)
- user.drop_item()
- qdel(I)
- bullets++
- to_chat(user, "You load the foam dart into the crossbow.")
- else
- to_chat(usr, "It's already fully loaded.")
-
-
-/obj/item/toy/crossbow/afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if(!isturf(target.loc) || target == user) return
- if(flag) return
-
- if (locate (/obj/structure/table, src.loc))
- return
- else if (bullets)
- var/turf/trg = get_turf(target)
- var/obj/effect/foam_dart_dummy/D = new/obj/effect/foam_dart_dummy(get_turf(src))
- bullets--
- D.icon_state = "foamdart"
- D.name = "foam dart"
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
-
- for(var/i=0, i<6, i++)
- if (D)
- if(D.loc == trg) break
- step_towards(D,trg)
-
- for(var/mob/living/M in D.loc)
- if(!istype(M,/mob/living)) continue
- if(M == user) continue
- D.visible_message("[M] was hit by the foam dart!")
- new /obj/item/toy/ammo/crossbow(M.loc)
- qdel(D)
- return
-
- for(var/atom/A in D.loc)
- if(A == user) continue
- if(A.density)
- new /obj/item/toy/ammo/crossbow(A.loc)
- qdel(D)
-
- sleep(1)
-
- spawn(10)
- if(D)
- new /obj/item/toy/ammo/crossbow(D.loc)
- qdel(D)
-
- return
- else if (bullets == 0)
- user.Weaken(5)
- user.visible_message("[user] realized they were out of ammo and starting scrounging for some!")
-
-
-
-/obj/item/toy/crossbow/attack(mob/M as mob, mob/user as mob)
- add_fingerprint(user)
-
-// ******* Check
-
- if (bullets > 0 && M.lying)
- visible_message("[user] casually lines up a shot with [M]'s head and pulls the trigger!", "You hear the sound of foam against skull.")
- M.visible_message("[M] was hit in the head by the foam dart!")
- playsound(user.loc, 'sound/items/syringeproj.ogg', 50, 1)
- new /obj/item/toy/ammo/crossbow(M.loc)
- bullets--
- else if (M.lying && bullets == 0)
- visible_message("[user] casually lines up a shot with [M]'s head, pulls the trigger, then realizes they are out of ammo and drops to the floor in search of some!", "You hear someone fall.")
- user.Weaken(5)
- return
-
-/obj/item/toy/ammo/crossbow
- name = "foam dart"
- desc = "Its nerf or nothing! Ages 8 and up."
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamdart"
- w_class = 1.0
-
-/obj/effect/foam_dart_dummy
- name = ""
- desc = ""
- icon = 'icons/obj/toy.dmi'
- icon_state = "null"
- anchored = 1
- density = 0
-
-
-/*
- * Tommy gun
- */
-
-/obj/item/toy/crossbow/tommygun
- name = "tommy gun"
- desc = "Looks almost like the real thing! Great for practicing Drive-bys"
- icon_state = "tommy"
- item_state = "tommy"
- flags = CONDUCT
- w_class = 1.0
- attack_verb = list("struck", "hammered", "hit", "bashed")
- bullets = 20.0
-
-/obj/item/toy/crossbow/tommygun/attackby(obj/item/I as obj, mob/user as mob, params)
- if(istype(I, /obj/item/toy/ammo/crossbow))
- if(bullets <= 19)
- user.drop_item()
- qdel(I)
- bullets++
- to_chat(user, "You load the foam dart into the tommy gun.")
- else
- to_chat(user, "It's already fully loaded.")
-
/*
* Toy swords
*/
@@ -1777,4 +1639,4 @@ obj/item/toy/cards/deck/syndicate/black
desc = "All hail the Magic Conch!"
icon_state = "conch"
use_action = "pulls the string"
- possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
\ No newline at end of file
+ possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index 208b93c0c53..3e2448fa8fe 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -91,14 +91,15 @@
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/head/C = H.organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[C.model]
if(user.zone_sel.selecting == "mouth")
if(!get_location_accessible(H, "mouth"))
to_chat(user, "The mask is in the way.")
return
- if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one...
- if(!H.client.prefs.rlimb_data["head"])
- to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.")
- return
+ if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.")
+ return
if(H.f_style == "Shaved")
to_chat(user, "Already clean-shaven.")
return
@@ -127,10 +128,9 @@
if(!get_location_accessible(H, "head"))
to_chat(user, "The headgear is in the way.")
return
- if(H.species && H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, but doesn't have one...
- if(!H.client.prefs.rlimb_data["head"])
- to_chat(user, "You find yourself disappointed at the appalling lack of hair.")
- return
+ if((H.species && H.species.flags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ to_chat(user, "You find yourself disappointed at the appalling lack of hair.")
+ return
if(H.h_style == "Bald" || H.h_style == "Balding Hair" || H.h_style == "Skinhead")
to_chat(user, "There is not enough hair left to shave...")
return
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 00433885ad5..1b819bb0a0d 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -80,7 +80,7 @@
/obj/item/weapon/banhammer,
/obj/item/toy/balloon,
/obj/item/toy/blink,
- /obj/item/toy/crossbow,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow,
/obj/item/weapon/gun/projectile/revolver/capgun,
/obj/item/toy/katana,
/obj/random/mech,
@@ -115,7 +115,7 @@
/obj/item/toy/AI,
/obj/item/clothing/under/syndicate/tacticool,
/obj/item/weapon/storage/box/fakesyndiesuit,
- /obj/item/toy/crossbow/tommygun,
+ /obj/item/weapon/gun/projectile/shotgun/toy/tommygun,
/obj/item/stack/tile/fakespace/loaded,
)
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index d2598a4036f..62f60a91bc4 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -16,10 +16,18 @@
materials = list(MAT_METAL=700, MAT_GLASS=50)
var/rigged = 0 // true if rigged to explode
var/minor_fault = 0 //If not 100% reliable, it will build up faults.
+ var/chargerate = 1000 //how much power is given every tick in a recharger
+ var/self_recharge = 0 //does it self recharge, over time, or not?
- suicide_act(mob/user)
- to_chat(viewers(user), "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.")
- return (FIRELOSS)
+/obj/item/weapon/stock_parts/cell/suicide_act(mob/user)
+ to_chat(viewers(user), "[user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide.")
+ return (FIRELOSS)
+
+/obj/item/weapon/stock_parts/cell/process()
+ if(self_recharge)
+ give(chargerate * 0.25)
+ else
+ return PROCESS_KILL
/obj/item/weapon/stock_parts/cell/crap
name = "\improper Nanotrasen brand rechargable AA battery"
@@ -51,6 +59,7 @@
maxcharge = 15000
rating = 3
materials = list(MAT_GLASS=60)
+ chargerate = 1500
/obj/item/weapon/stock_parts/cell/high/empty/New()
..()
@@ -63,6 +72,7 @@
maxcharge = 20000
materials = list(MAT_GLASS=70)
rating = 4
+ chargerate = 2000
/obj/item/weapon/stock_parts/cell/super/empty/New()
..()
@@ -75,6 +85,7 @@
maxcharge = 30000
rating = 5
materials = list(MAT_GLASS=80)
+ chargerate = 3000
/obj/item/weapon/stock_parts/cell/hyper/empty/New()
..()
@@ -87,6 +98,7 @@
maxcharge = 40000
materials = list(MAT_GLASS=80)
rating = 6
+ chargerate = 4000
/obj/item/weapon/stock_parts/cell/bluespace/empty/New()
..()
@@ -99,8 +111,10 @@
maxcharge = 30000
rating = 6
materials = list(MAT_GLASS=80)
- use()
- return 1
+ chargerate = 30000
+
+/obj/item/weapon/stock_parts/cell/infinite/use()
+ return 1
/obj/item/weapon/stock_parts/cell/potato
name = "potato battery"
@@ -122,6 +136,7 @@
icon = 'icons/mob/slimes.dmi'
icon_state = "yellow slime extract"
materials = list()
+ self_recharge = 1 // Infused slime cores self-recharge, over time
/obj/item/weapon/stock_parts/cell/pulse/carbine
name = "pulse carbine power cell"
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 34b700d440d..a5e0081e723 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -30,17 +30,26 @@
//this is largely copypasted from there.
//handle facial hair (if necessary)
var/list/species_facial_hair = list()
+ var/obj/item/organ/external/head/C = H.organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[C.model]
if(H.gender == MALE || H.get_species() == "Vulpkanin")
if(H.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
if(H.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
+ if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(robohead.is_monitor)
+ to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
+ return
+ continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
- if(H.species.flags & ALL_RPARTS)
- if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_facial.species_allowed))
- species_facial_hair += i
- else
+ if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(!robohead.is_monitor)
+ if("Human" in tmp_facial.species_allowed)
+ species_facial_hair += i
+ else //Otherwise, they won't be getting any hairstyles.
+ to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
return
else
species_facial_hair = facial_hair_styles_list
@@ -51,14 +60,19 @@
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
if(H.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
- if((H.species.flags & ALL_RPARTS) && !("head" in H.client.prefs.rlimb_data))
- return
+ if(H.species.flags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(robohead.is_monitor)
+ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
+ return
+ continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
- if(H.species.flags & ALL_RPARTS)
- if(("head" in H.client.prefs.rlimb_data) && ("Human" in tmp_hair.species_allowed))
- species_facial_hair += i
- else
+ if(H.species.flags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(!robohead.is_monitor)
+ if("Human" in tmp_hair.species_allowed)
+ species_hair += i
+ else //Otherwise, they won't be getting any hairstyles.
+ to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
return
else
species_hair = hair_styles_list
@@ -103,7 +117,7 @@
playsound(loc, "sound/items/Wirecutter.ogg", 50, 1, -1)
if(do_after(user, 50, target = H))
playsound(loc, "sound/weapons/bladeslice.ogg", 50, 1, -1)
- user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!")
+ user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top.
H.losebreath += 10 //30 Oxy damage over time
H.apply_damage(18, BRUTE, "head", sharp =1, edge =1, used_weapon = "scissors")
var/turf/location = get_turf(H)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index b93fc3b06b1..ce1e6aad9bb 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -685,14 +685,3 @@
new /obj/item/weapon/lipstick/green(src)
new /obj/item/weapon/lipstick/blue(src)
new /obj/item/weapon/lipstick/white(src)
-
-/obj/item/weapon/storage/box/foam_darts
- name = "Foam Dart Pack"
- desc = "Extra ammo for foam dart launchers. Contains 10 darts."
- storage_slots = 10
- max_combined_w_class = 10
-
-/obj/item/weapon/storage/box/foam_darts/New()
- ..()
- for(var/i=1; i <= storage_slots; i++)
- new /obj/item/toy/ammo/crossbow(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 945f4f4d818..51f01d874a8 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -39,4 +39,5 @@
new /obj/item/weapon/tank/emergency_oxygen(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/clothing/glasses/meson(src)
- new /obj/item/clothing/head/soft(src)
\ No newline at end of file
+ new /obj/item/clothing/head/soft(src)
+ new /obj/item/weapon/door_remote/quartermaster(src)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index d7fd20b6d37..1746211e248 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -31,6 +31,7 @@
new /obj/item/device/flash(src)
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/head/beret/eng(src)
+ new /obj/item/weapon/door_remote/chief_engineer(src)
/obj/structure/closet/secure_closet/engineering_electrical
name = "electrical supplies locker"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index ad76cfc9409..17f208e28e9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -175,6 +175,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/reagent_containers/hypospray/CMO(src)
new /obj/item/organ/internal/cyberimp/eyes/hud/medical(src)
+ new /obj/item/weapon/door_remote/chief_medical_officer(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
index 321b71b6eaa..488a422af86 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm
@@ -49,6 +49,7 @@
new /obj/item/clothing/suit/armor/reactive(src)
new /obj/item/device/flash(src)
new /obj/item/device/laser_pointer(src)
+ new /obj/item/weapon/door_remote/research_director(src)
/obj/structure/closet/secure_closet/research_reagents
name = "research chemical storage closet"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 05f077e64d1..4a2ced79339 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -26,6 +26,7 @@
new /obj/item/device/radio/headset/heads/captain/alt(src)
new /obj/item/clothing/gloves/color/captain(src)
new /obj/item/weapon/gun/energy/gun(src)
+ new /obj/item/weapon/door_remote/captain(src)
@@ -52,6 +53,7 @@
new /obj/item/device/flash(src)
new /obj/item/weapon/mining_voucher(src)
new /obj/item/clothing/accessory/petcollar(src)
+ new /obj/item/weapon/door_remote/civillian(src)
/obj/structure/closet/secure_closet/hop2
name = "head of personnel's attire"
@@ -114,6 +116,7 @@
new /obj/item/weapon/storage/belt/security/sec(src)
new /obj/item/taperoll/police(src)
new /obj/item/weapon/gun/energy/hos(src)
+ new /obj/item/weapon/door_remote/head_of_security(src)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 2194fb20bf3..5cbb8dd26d5 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -2,8 +2,8 @@
set name = "Jump to Area"
set desc = "Area to jump to"
set category = "Admin"
-
- if(!check_rights(R_ADMIN))
+
+ if(!check_rights(R_ADMIN))
return
if(!A)
@@ -21,7 +21,7 @@
if(!T)
to_chat(src, "Nowhere to jump to!")
return
-
+
admin_forcemove(usr, T)
log_admin("[key_name(usr)] jumped to [A]")
message_admins("[key_name_admin(usr)] jumped to [A]")
@@ -30,13 +30,13 @@
/client/proc/jumptoturf(var/turf/T in world)
set name = "Jump to Turf"
set category = "Admin"
-
- if(!check_rights(R_ADMIN))
+
+ if(!check_rights(R_ADMIN))
return
log_admin("[key_name(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]")
message_admins("[key_name_admin(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]", 1)
- usr.loc = T
+ admin_forcemove(usr, T)
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -44,7 +44,7 @@
set category = "Admin"
set name = "Jump to Mob"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN))
return
log_admin("[key_name(usr)] jumped to [key_name(M)]")
@@ -62,14 +62,12 @@
set category = "Admin"
set name = "Jump to Coordinate"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN))
return
- if(src.mob)
- var/mob/A = src.mob
- A.x = tx
- A.y = ty
- A.z = tz
+ var/turf/T = locate(tx, ty, tz)
+ if(T)
+ admin_forcemove(usr, T)
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
@@ -77,7 +75,7 @@
set category = "Admin"
set name = "Jump to Key"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN))
return
var/list/keys = list()
@@ -90,7 +88,7 @@
var/mob/M = selection:mob
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
-
+
admin_forcemove(usr, M.loc)
feedback_add_details("admin_verb","JK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -99,8 +97,8 @@
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
-
- if(!check_rights(R_ADMIN))
+
+ if(!check_rights(R_ADMIN))
return
log_admin("[key_name(usr)] teleported [key_name(M)]")
@@ -113,7 +111,7 @@
set name = "Get Key"
set desc = "Key to teleport"
- if(!check_rights(R_ADMIN))
+ if(!check_rights(R_ADMIN))
return
var/list/keys = list()
@@ -130,16 +128,16 @@
message_admins("[key_name_admin(usr)] teleported [key_name(M)]", 1)
if(M)
admin_forcemove(M, get_turf(usr))
- usr.loc = M.loc
+ admin_forcemove(usr, M.loc)
feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/sendmob(var/mob/M in mob_list)
set category = "Admin"
set name = "Send Mob"
-
- if(!check_rights(R_ADMIN))
+
+ if(!check_rights(R_ADMIN))
return
-
+
var/area/A = input(usr, "Pick an area.", "Pick an area") in return_sorted_areas()
if(A)
admin_forcemove(M, pick(get_area_turfs(A)))
@@ -148,7 +146,7 @@
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]", 1)
/proc/admin_forcemove(mob/mover, atom/newloc)
- mover.loc = newloc
+ mover.forceMove(newloc)
mover.on_forcemove(newloc)
/mob/proc/on_forcemove(atom/newloc)
diff --git a/code/modules/arcade/prize_datums.dm b/code/modules/arcade/prize_datums.dm
index d67adf97bcb..da78a7806ef 100644
--- a/code/modules/arcade/prize_datums.dm
+++ b/code/modules/arcade/prize_datums.dm
@@ -93,8 +93,8 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/foam_darts
name = "Pack of Foam Darts"
- desc = "A refill pack of 10 foam darts."
- typepath = /obj/item/weapon/storage/box/foam_darts
+ desc = "A refill pack with foam darts."
+ typepath = /obj/item/ammo_box/foambox
cost = 20
/datum/prize_item/minigibber
@@ -174,9 +174,10 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/crossbow
name = "Foam Dart Crossbow"
desc = "A toy crossbow that fires foam darts."
- typepath = /obj/item/toy/crossbow
+ typepath = /obj/item/weapon/gun/projectile/shotgun/toy/crossbow
cost = 100
+
/datum/prize_item/toy_xeno
name = "Xeno Action Figure"
desc = "A lifelike replica of the horrific xeno scourge."
@@ -252,7 +253,7 @@ var/global/datum/prizes/global_prizes = new
/datum/prize_item/tommygun
name = "Tommygun"
desc = "A replica tommygun that fires foam darts."
- typepath = /obj/item/toy/crossbow/tommygun
+ typepath = /obj/item/weapon/gun/projectile/shotgun/toy/tommygun
cost = 175
/datum/prize_item/esword
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index cdf3fd1f865..3ece1b8f059 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1189,8 +1189,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("hair")
if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell" || species == "Machine" || species == "Vulpkanin")
var/input = "Choose your character's hair colour:"
- if(species == "Machine" && !("head" in rlimb_data))
- input = "Choose your character's frame colour:"
var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
if(new_hair)
r_hair = hex2num(copytext(new_hair, 2, 4))
@@ -1202,18 +1200,25 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
if(species == "Machine") //Species that can use prosthetic heads.
- if(species in S.species_allowed)
- if(!rlimb_data["head"])
- valid_hairstyles[hairstyle] = S
- continue
- else
- continue
+ var/obj/item/organ/external/head/H = new()
+ if(S.name == "Bald")
+ valid_hairstyles[hairstyle] = S
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
else
- if(!rlimb_data["head"])
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor && (robohead.company in S.models_allowed)) //If the Machine character has the default Morpheus screen head or another screen head
+ //and said head is in the hair style's allowed models list...
+ valid_hairstyles[hairstyle] = S //Allow them to select the hairstyle.
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human hairstyles).
continue
- else if("Human" in S.species_allowed)
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
valid_hairstyles[hairstyle] = S
- continue
+ continue
else
if(!(species in S.species_allowed))
continue
@@ -1225,7 +1230,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
h_style = new_h_style
if("headaccessory")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) // Species with head accessories
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
var/input = "Choose the colour of your your character's head accessory:"
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
if(new_head_accessory)
@@ -1234,7 +1239,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
if("ha_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) // Species with head accessories
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with head accessories.
var/list/valid_head_accessory_styles = list()
for(var/head_accessory_style in head_accessory_styles_list)
var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
@@ -1248,7 +1253,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
ha_style = new_head_accessory_style
if("markings")
- if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) // Species with markings
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
var/input = "Choose the colour of your your character's markings:"
var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
if(new_markings)
@@ -1257,7 +1262,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
b_markings = hex2num(copytext(new_markings, 6, 8))
if("m_style")
- if(species in list("Unathi", "Vulpkanin", "Tajaran")) // Species with markings
+ if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine")) //Species with markings.
var/list/valid_markings = list()
for(var/markingstyle in marking_styles_list)
var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
@@ -1265,10 +1270,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
continue
if(species == "Machine") //Species that can use prosthetic heads.
- if(!("head" in rlimb_data) && M.name != "None") //If the character can have prosthetic heads and they have the default head (with screen), no optic markings.
- continue
- else if(("head" in rlimb_data) && M.name == "None") //Otherwise, if they DON'T have the default head and since they must have optics, give them a list of styles excluding the "None" option.
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
+ else
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(robohead.is_monitor && M.name != "None") //If the character can have prosthetic heads and they have the default Morpheus head (or another monitor-head), no optic markings.
continue
+ else if(!robohead.is_monitor && M.name != "None") //Otherwise, if they DON'T have the default head and the head's not a monitor but the head's not in the style's list of allowed models, skip.
+ if(!(robohead.company in M.models_allowed))
+ continue
valid_markings[markingstyle] = marking_styles_list[markingstyle]
@@ -1304,25 +1316,29 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ if(S.name == "Shaved")
+ valid_facialhairstyles[facialhairstyle] = S
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
continue
if(species == "Machine") //Species that can use prosthetic heads.
- if(species in S.species_allowed)
- if(!rlimb_data["head"])
- valid_facialhairstyles[facialhairstyle] = S
- continue
- else
- continue
+ var/obj/item/organ/external/head/H = new()
+ if(!rlimb_data["head"]) //Handle situations where the head is default.
+ H.model = "Morpheus Cyberkinetics"
else
- if(!rlimb_data["head"])
- continue
- else if("Human" in S.species_allowed)
+ H.model = rlimb_data["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(species in S.species_allowed)
+ if(robohead.is_monitor) //If the Machine character has the default Morpheus screen head or another screen head and they're allowed to have the style, let them have it.
valid_facialhairstyles[facialhairstyle] = S
+ continue
+ else
+ if(robohead.is_monitor) //Monitors (incl. the default morpheus head) cannot have wigs (human facial hairstyles).
continue
- else
- continue
+ else if(!robohead.is_monitor && ("Human" in S.species_allowed))
+ valid_facialhairstyles[facialhairstyle] = S
+ continue
else
if(!(species in S.species_allowed))
continue
@@ -1493,18 +1509,51 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
organ_data[second_limb] = "amputated"
rlimb_data[second_limb] = null
if("Prosthesis")
- var/choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in chargen_robolimbs
+ var/choice
+ var/subchoice
+ var/datum/robolimb/R = new()
+ var/in_model
+ var/robolimb_companies = list()
+ for(var/limb_type in typesof(/datum/robolimb)) //This loop populates a list of companies that offer the limb the user selected previously as one of their cybernetic products.
+ R = new limb_type()
+ if(!R.unavailable_at_chargen && (limb in R.parts) && R.has_subtypes) //Ensures users can only choose companies that offer the parts they want, that singular models get added to the list as well companies that offer more than one model, and...
+ robolimb_companies[R.company] = R //List only main brands that have the parts we're looking for.
+ R = new() //Re-initialize R.
+
+ choice = input(user, "Which manufacturer do you wish to use for this limb?") as null|anything in robolimb_companies //Choose from a list of companies that offer the part the user wants.
if(!choice)
return
+ R.company = choice
+ R = all_robolimbs[R.company]
+ if(R.has_subtypes == 1) //If the company the user selected provides more than just one base model, lets handle it.
+ var/list/robolimb_models = list()
+ for(var/limb_type in typesof(R)) //Handling the different models of parts that manufacturers can provide.
+ var/datum/robolimb/L = new limb_type()
+ if(limb in L.parts) //Make sure that only models that provide the parts the user needs populate the list.
+ robolimb_models[L.company] = L
+ if(robolimb_models.len == 1) //If there's only one model available in the list, autoselect it to avoid having to bother the user with a dialog that provides only one option.
+ subchoice = L.company //If there ends up being more than one model populating the list, subchoice will be overwritten later anyway, so this isn't a problem.
+ if(second_limb in L.parts) //If the child limb of the limb the user selected is also present in the model's parts list, state it's been found so the second limb can be set later.
+ in_model = 1
+ if(robolimb_models.len > 1) //If there's more than one model in the list that can provide the part the user wants, let them choose.
+ subchoice = input(user, "Which model of [choice] [limb_name] do you wish to use?") as null|anything in robolimb_models
+ if(subchoice)
+ choice = subchoice
if(limb == "head")
- m_style = "Humanoid Optics"
ha_style = "None"
h_style = hair_styles_list["Bald"]
+ f_style = facial_hair_styles_list["Shaved"]
+ m_style = "None"
rlimb_data[limb] = choice
organ_data[limb] = "cyborg"
if(second_limb)
- rlimb_data[second_limb] = choice
- organ_data[second_limb] = "cyborg"
+ if(subchoice)
+ if(in_model)
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
+ else
+ rlimb_data[second_limb] = choice
+ organ_data[second_limb] = "cyborg"
if("organs")
var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes")
diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm
index a99c05410ae..6949bfff107 100644
--- a/code/modules/computer3/computers/arcade.dm
+++ b/code/modules/computer3/computers/arcade.dm
@@ -7,8 +7,8 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/weapon/gun/projectile/revolver/capgun = 2,
- /obj/item/toy/crossbow = 2,
+ /obj/item/weapon/gun/projectile/revolver/capgun = 2,
+ /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
@@ -177,4 +177,4 @@
if(interactable())
computer.updateUsrDialog()
blocked = 0
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index d74dcbd54c4..8264db804fd 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -179,16 +179,17 @@
continue
if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/obj/item/organ/external/head/H = organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
if(!H)
return
if(species.name in S.species_allowed) //If this is a hairstyle native to the user's species...
- if(H.model == "Morpheus Cyberkinetics") //Check to see if they have the default head.
+ if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
continue
else //If they don't have the default head, they shouldn't be getting any hairstyles they wouldn't normally.
continue
else
- if(H.model == "Morpheus Cyberkinetics") //If the hairstyle is not native to the user's species, and they're using the default head, don't let them access it.
+ if(robohead.is_monitor) //If the hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
continue
else
if("Human" in S.species_allowed) //If the user has a robotic head and the hairstyle can fit humans, let them use it as a wig for their humanoid robot head.
@@ -212,17 +213,18 @@
continue
if(species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/obj/item/organ/external/head/H = organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
if(!H)
continue // No head, no hair
if(species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if(H.model == "Morpheus Cyberkinetics") //Check to see if they have the default head.
+ if(robohead.is_monitor && (robohead.company in S.models_allowed)) //Check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hair styles if they do.
continue
else //If they don't have the default head, they shouldn't be getting any facial hair styles they wouldn't normally.
continue
else
- if(H.model == "Morpheus Cyberkinetics") //If the facial hair style is not native to the user's species, and they're using the default head, don't let them access it.
+ if(robohead.is_monitor) //If the facial hair style is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
continue
else
if("Human" in S.species_allowed) //If the user has a robotic head and the facial hair style can fit humans, let them use it as a postiche for their humanoid robot head.
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b956b4854d6..714e9c45146 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -60,6 +60,8 @@
msg += "!\n" //omit the species when examining
else if (species.name == "Slime People") //snowflakey because Slime People are defined as a plural
msg += ", a slime person!\n"
+ else if (species.name == "Unathi") //DAMN YOU, VOWELS
+ msg += ", a unathi!\n"
else
msg += ", \a [lowertext(species.name)]!\n"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ee9388ac962..40fd94c4052 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1591,24 +1591,37 @@
to_chat(src, "You cannot change your monitor or optical display in your current state.")
return
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
+ to_chat(src, "Where's your head at? Can't change your monitor/display without one.")
+ return
+
if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body...
- if(client.prefs.rlimb_data["head"]) //If head is present here, that means it's not the default Morpheus. Thus, no screen to adjust. Instead, let them change the colour of their optics!
+ var/obj/item/organ/external/head/H = organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(!H)
+ return
+ if(!robohead.is_monitor) //If they've got a prosthetic head and it isn't a monitor, they've no screen to adjust. Instead, let them change the colour of their optics!
var/optic_colour = input(src, "Select optic colour", rgb(r_markings, g_markings, b_markings)) as color|null
+ if(incapacitated())
+ to_chat(src, "You were interrupted while changing the colour of your optics.")
+ return
if(optic_colour)
r_markings = hex2num(copytext(optic_colour, 2, 4))
g_markings = hex2num(copytext(optic_colour, 4, 6))
b_markings = hex2num(copytext(optic_colour, 6, 8))
update_markings()
- else if(!client.prefs.rlimb_data["head"])//Means that the character has the default Morpheus head, which has a screen. Time to customize.
+ else if(robohead.is_monitor) //Means that the character's head is a monitor (has a screen). Time to customize.
var/list/hair = list()
for(var/i in hair_styles_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i]
- if(species.name in tmp_hair.species_allowed)
+ if((species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", h_style) as null|anything in hair
if(incapacitated())
+ to_chat(src, "You were interrupted while changing your monitor display.")
return
if(new_style)
h_style = new_style
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index c0e58942cfc..cf47ee3b5d0 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -20,7 +20,7 @@
if(species.can_revive_by_healing)
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
if(B)
- if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD)
+ if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD && getBrainLoss()<120)
update_revive()
if(stat == CONSCIOUS && (src in dead_mob_list)) //Defib fix
update_revive()
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index ed15138b602..03091a7e50f 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -646,11 +646,11 @@
H.healthdoll.overlays += image('icons/mob/screen_gen.dmi',"[O.limb_name][icon_num]")
switch(H.nutrition)
- if(450 to INFINITY)
+ if(NUTRITION_LEVEL_FULL to INFINITY)
H.throw_alert("nutrition", /obj/screen/alert/fat)
- if(350 to 450)
+ if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
H.clear_alert("nutrition")
- if(250 to 350)
+ if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY)
H.throw_alert("nutrition", /obj/screen/alert/hungry)
else
H.throw_alert("nutrition", /obj/screen/alert/starving)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 24c07563644..004f54a45ba 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -361,6 +361,9 @@ var/global/list/damage_icon_parts = list()
if(m_style && m_style != "None")
var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
if(marking_style)
+ var/obj/item/organ/external/head/head_organ = get_organ("head")
+ if((!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) && marking_style.marking_location == "head")
+ return //If the head is destroyed and it is the organ the marking is located on, get us out of here. This prevents floating optical markings on decapitated IPCs, for example.
var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
if(marking_style.do_colouration)
markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
@@ -397,7 +400,8 @@ var/global/list/damage_icon_parts = list()
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD)
- head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY)
+ head_accessory_standing = head_accessory_s //head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY)
+ //Having it this way preserves animations. Useful for animated antennae.
else
//warning("Invalid ha_style for [species.name]: [ha_style]")
@@ -437,7 +441,8 @@ var/global/list/damage_icon_parts = list()
else if(hair_style.do_colouration)
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
- hair_standing.Blend(hair_s, ICON_OVERLAY)
+ hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
+ //Having it this way preserves animations. Useful for IPC screens.
else
//warning("Invalid h_style for [species.name]: [h_style]")
//hair_standing.Blend(debrained_s, ICON_OVERLAY)//how does i overlay for fish?
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 37b326dc4c5..dd47a9cbcb6 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -327,10 +327,13 @@
if (C.handcuffed && !initial(C.handcuffed))
C.unEquip(C.handcuffed)
C.handcuffed = initial(C.handcuffed)
+ C.update_handcuffed()
if (C.legcuffed && !initial(C.legcuffed))
C.unEquip(C.legcuffed)
C.legcuffed = initial(C.legcuffed)
+ C.update_inv_legcuffed()
+
if(C.reagents)
for(var/datum/reagent/R in C.reagents.reagent_list)
C.reagents.clear_reagents()
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index b6066635fa5..e0fbfcdf91b 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -43,6 +43,8 @@
// Restrict some styles to specific species
var/list/species_allowed = list("Human", "Slime People")
+ var/models_allowed = list() //Specifies which, if any, hairstyles can be accessed by which prosthetics. Should equal the manufacturing company name in robolimbs.dm.
+ var/marking_location //Specifies which bodypart a body marking is located on.
// Whether or not the accessory can be affected by colouration
var/do_colouration = 1
@@ -57,7 +59,6 @@
*/
/datum/sprite_accessory/hair
-
icon = 'icons/mob/human_face.dmi' // default icon for all hairs
bald
@@ -384,105 +385,169 @@
//////END VG HAIRSTYLES///////
//////////////////////////////
+
ipc_screen_pink
- name = "pink IPC screen"
+ name = "Pink IPC Screen"
icon_state = "ipc_pink"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_red
- name = "red IPC screen"
+ name = "Red IPC Screen"
icon_state = "ipc_red"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_green
- name = "green IPC screen"
+ name = "Green IPC Screen"
icon_state = "ipc_green"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_blue
- name = "blue IPC screen"
+ name = "Blue IPC Screen"
icon_state = "ipc_blue"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_breakout
- name = "breakout IPC screen"
+ name = "Breakout IPC Screen"
icon_state = "ipc_breakout"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_eight
- name = "eight IPC screen"
+ name = "Eight IPC Screen"
icon_state = "ipc_eight"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_rainbow
- name = "rainbow IPC screen"
+ name = "Rainbow IPC Screen"
icon_state = "ipc_rainbow"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_goggles
- name = "goggles IPC screen"
+ name = "Goggles IPC Screen"
icon_state = "ipc_goggles"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_heart
- name = "heart IPC screen"
+ name = "Heart IPC Screen"
icon_state = "ipc_heart"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_monoeye
- name = "monoeye IPC screen"
+ name = "Monoeye IPC Screen"
icon_state = "ipc_monoeye"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_nature
- name = "nature IPC screen"
+ name = "Nature IPC Screen"
icon_state = "ipc_nature"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_orange
- name = "orange IPC screen"
+ name = "Orange IPC Screen"
icon_state = "ipc_orange"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_purple
- name = "purple IPC screen"
+ name = "Purple IPC Screen"
icon_state = "ipc_purple"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_shower
- name = "shower IPC screen"
+ name = "Shower IPC Screen"
icon_state = "ipc_shower"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_static
- name = "static IPC screen"
+ name = "Static IPC Screen"
icon_state = "ipc_static"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_yellow
- name = "yellow IPC screen"
+ name = "Yellow IPC Screen"
icon_state = "ipc_yellow"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_scrolling
- name = "scanline IPC screen"
+ name = "Scanline IPC Screen"
icon_state = "ipc_scroll"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_console
- name = "console IPC screen"
+ name = "Console IPC Screen"
icon_state = "ipc_console"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_rgb
- name = "rgb IPC screen"
+ name = "RGB IPC Screen"
icon_state = "ipc_rgb"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
ipc_screen_glider
- name = "glider IPC screen"
+ name = "Glider IPC Screen"
icon_state = "ipc_gol_glider"
species_allowed = list("Machine")
+ models_allowed = list("Bishop Cybernetics mtr.", "Hesphiastos Industries mtr.", "Morpheus Cyberkinetics", "Ward-Takahashi mtr.", "Xion Manufacturing Group mtr.")
+
+ hesphiastos_alt_off
+ name = "Dark Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_off"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_pink
+ name = "Pink Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_pink"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_orange
+ name = "Orange Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_orange"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_goggle
+ name = "Goggles Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_goggles"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_scroll
+ name = "Scrolling Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_scroll"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_rgb
+ name = "RGB Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rgb"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
+ hesphiastos_alt_rainbow
+ name = "Rainbow Hesphiastos Screen"
+ icon_state = "hesphiastos_alt_rainbow"
+ species_allowed = list("Machine")
+ models_allowed = list("Hesphiastos Industries alt.")
+
/*
///////////////////////////////////
@@ -501,8 +566,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Machine", "Vulpkanin", "Slime People")
-
+ species_allowed = list("Human", "Unathi", "Tajaran", "Skrell", "Vox", "Diona", "Kidan", "Greys", "Vulpkanin", "Slime People")
watson
name = "Watson Mustache"
@@ -1790,6 +1854,21 @@
icon_state = "antennae"
species_allowed = list("Machine")
+/datum/sprite_accessory/head_accessory/ipc_tv_antennae
+ name = "T.V. Antennae"
+ icon_state = "tvantennae"
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc_tesla_antennae
+ name = "Tesla Antennae"
+ icon_state = "tesla"
+ species_allowed = list("Machine")
+
+/datum/sprite_accessory/head_accessory/ipc_light
+ name = "Head Light"
+ icon_state = "light"
+ species_allowed = list("Machine")
+
/* BODY MARKINGS */
@@ -1837,6 +1916,32 @@
name = "Humanoid Optics"
species_allowed = list("Machine")
icon_state = "optics"
+ models_allowed = list("Bishop Cybernetics", "Hesphiastos Industries", "Ward-Takahashi", "Xion Manufacturing Group", "Zeng-Hu Pharmaceuticals") //Should be the same as the manufacturing company of the limb in robolimbs.dm
+ marking_location = "head"
+
+/datum/sprite_accessory/body_markings/optics/bishop_alt
+ name = "Bishop Alt. Optics"
+ species_allowed = list("Machine")
+ icon_state = "bishop_alt_optics"
+ models_allowed = list("Bishop Cybernetics alt.")
+
+/datum/sprite_accessory/body_markings/optics/morpheus_alt
+ name = "Morpheus Alt. Optics"
+ species_allowed = list("Machine")
+ icon_state = "morpheus_alt_optics"
+ models_allowed = list("Morpheus Cyberkinetics alt.")
+
+/datum/sprite_accessory/body_markings/optics/wardtakahashi_alt
+ name = "Ward-Takahashi Alt. Optics"
+ species_allowed = list("Machine")
+ icon_state = "wardtakahashi_alt_optics"
+ models_allowed = list("Ward-Takahashi alt.")
+
+/datum/sprite_accessory/body_markings/optics/xion_alt
+ name = "Xion Alt. Optics"
+ species_allowed = list("Machine")
+ icon_state = "xion_alt_optics"
+ models_allowed = list("Xion Manufacturing Group alt.")
/datum/sprite_accessory/body_markings/tattoo // Tattoos applied post-round startup with tattoo guns in item_defines.dm
name = "base tattoo"
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index 7dda66629d7..6e61be2a257 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -5,11 +5,16 @@
/obj/item/weapon/stock_parts/cell/New()
..()
+ processing_objects.Add(src)
charge = maxcharge
spawn(5)
updateicon()
+/obj/item/weapon/stock_parts/cell/Destroy()
+ processing_objects.Remove(src)
+ return ..()
+
/obj/item/weapon/stock_parts/cell/proc/updateicon()
if(isnull(src.overlay_image))
src.overlay_image = image('icons/obj/power.dmi')
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 0022a4e1f80..45670ec70b0 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -38,22 +38,41 @@
var/tmp_label = ""
var/label_text = sanitize(input(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label))
if(length(label_text) > 20)
- to_chat(user, "\red The inscription can be at most 20 characters long.")
+ to_chat(user, "The inscription can be at most 20 characters long.")
else
if(label_text == "")
- to_chat(user, "\blue You scratch the inscription off of [initial(BB)].")
+ to_chat(user, "You scratch the inscription off of [initial(BB)].")
BB.name = initial(BB.name)
else
- to_chat(user, "\blue You inscribe \"[label_text]\" into \the [initial(BB.name)].")
+ to_chat(user, "You inscribe \"[label_text]\" into \the [initial(BB.name)].")
BB.name = "[initial(BB.name)] \"[label_text]\""
else
- to_chat(user, "\blue You can only inscribe a metal bullet.")//because inscribing beanbags is silly
+ to_chat(user, "You can only inscribe a metal bullet.")//because inscribing beanbags is silly
else
- to_chat(user, "\blue There is no bullet in the casing to inscribe anything into.")
+ to_chat(user, "There is no bullet in the casing to inscribe anything into.")
+
+/obj/item/ammo_casing/attackby(obj/item/ammo_box/box as obj, mob/user as mob, params)
+ if(!istype(box, /obj/item/ammo_box))
+ return
+ if(isturf(loc))
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/pew in loc)
+ if(box.stored_ammo.len >= box.max_ammo)
+ break
+ if(pew.BB)
+ if(box.give_round(pew))
+ boolets++
+ else
+ continue
+ if(boolets > 0)
+ box.update_icon()
+ to_chat(user, "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.")
+ else
+ to_chat(user, "You fail to collect anything.")
/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!).
- if (!BB)
+ if(!BB)
BB = new projectile_type(src)
return
@@ -85,19 +104,19 @@
update_icon()
/obj/item/ammo_box/proc/get_round(var/keep = 0)
- if (!stored_ammo.len)
+ if(!stored_ammo.len)
return null
else
var/b = stored_ammo[stored_ammo.len]
stored_ammo -= b
- if (keep)
+ if(keep)
stored_ammo.Insert(1,b)
return b
/obj/item/ammo_box/proc/give_round(var/obj/item/ammo_casing/r)
var/obj/item/ammo_casing/rb = r
- if (rb)
- if (stored_ammo.len < max_ammo && rb.caliber == caliber)
+ if(rb)
+ if(stored_ammo.len < max_ammo && rb.caliber == caliber)
stored_ammo += rb
rb.loc = src
return 1
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 8fc29a6ce7b..e337742549a 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -255,4 +255,42 @@
desc = "A cased high explosive grenade that can only be activated once fired out of a grenade launcher."
caliber = "40mm"
icon_state = "40mmHE"
- projectile_type = "/obj/item/projectile/bullet/a40mm"
\ No newline at end of file
+ projectile_type = "/obj/item/projectile/bullet/a40mm"
+
+//FOAM DARTS
+/obj/item/ammo_casing/caseless/foam_dart
+ name = "foam dart"
+ desc = "It's nerf or nothing! Ages 8 and up."
+ projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart"
+ caliber = "foam_force"
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foamdart"
+ var/modified = 0
+
+/obj/item/ammo_casing/caseless/foam_dart/update_icon()
+ if(modified)
+ icon_state = "foamdart_empty"
+
+/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/weapon/A as obj, mob/user as mob, params)
+ ..()
+ if(istype(A, /obj/item/weapon/screwdriver) && !modified)
+ modified = 1
+ BB.damage_type = BRUTE
+ icon_state = "foamdart_empty"
+ desc = "It's nerf or nothing! ...Although, this one doesn't look too safe."
+ to_chat(user, "You pop the safety cap off of [src].")
+ else if((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
+ if(!user.unEquip(A))
+ return
+ A.forceMove(BB)
+ BB.damage = 5
+ BB.nodamage = 0
+ to_chat(user, "You insert [A] into [src].")
+ return
+
+
+/obj/item/ammo_casing/caseless/foam_dart/riot
+ name = "riot foam dart"
+ desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
+ projectile_type = "/obj/item/projectile/bullet/reusable/foam_dart/riot"
+ icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 96f8cca31c0..eb998823b6a 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -86,4 +86,16 @@
name = "Ammunition Box (tranquilizer darts)"
icon_state = "45box"
ammo_type = /obj/item/ammo_casing/shotgun/tranquilizer
- materials = list(MAT_METAL=1750)
\ No newline at end of file
+ materials = list(MAT_METAL=1750)
+
+//FOAM DARTS
+/obj/item/ammo_box/foambox
+ name = "ammo box (Foam Darts)"
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foambox"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ max_ammo = 40
+
+/obj/item/ammo_box/foambox/riot
+ icon_state = "foambox_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 7cf8e9fcdb0..32c3eeaa37c 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -101,6 +101,17 @@
max_ammo = 5
multiload = 1
+/obj/item/ammo_box/magazine/internal/shot/toy
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
+ caliber = "foam_force"
+ max_ammo = 4
+
+/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
+ max_ammo = 5
+
+/obj/item/ammo_box/magazine/internal/shot/toy/tommygun
+ max_ammo = 10
+
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -290,4 +301,49 @@
/obj/item/ammo_box/magazine/m12g/dragon
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
- ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath"
\ No newline at end of file
+ ammo_type = "/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath"
+
+//FOAM DARTS
+/obj/item/ammo_box/magazine/toy
+ name = "foam force META magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart"
+ caliber = "foam_force"
+
+/obj/item/ammo_box/magazine/toy/smg
+ name = "foam force SMG magazine"
+ icon_state = "smg9mm-30"
+ max_ammo = 30
+
+/obj/item/ammo_box/magazine/toy/smg/update_icon()
+ ..()
+ icon_state = "smg9mm-[round(ammo_count(),6)]"
+
+/obj/item/ammo_box/magazine/toy/smg/riot
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+
+/obj/item/ammo_box/magazine/toy/pistol
+ name = "foam force pistol magazine"
+ icon_state = "9x19p"
+ max_ammo = 8
+ multiple_sprites = 2
+
+/obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+
+/obj/item/ammo_box/magazine/toy/smgm45
+ name = "donksoft SMG magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+ max_ammo = 20
+
+/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
+ ..()
+ icon_state = "c20r45-[round(ammo_count(),2)]"
+
+/obj/item/ammo_box/magazine/toy/m762
+ name = "donksoft box magazine"
+ ammo_type = "/obj/item/ammo_casing/caseless/foam_dart/riot"
+ max_ammo = 50
+
+/obj/item/ammo_box/magazine/toy/m762/update_icon()
+ ..()
+ icon_state = "a762-[round(ammo_count(),10)]"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 2b53068bcf6..edb281616d2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -276,19 +276,19 @@
//Suicide handling.
if (M == user && user.zone_sel.selecting == "mouth" && !mouthshoot)
mouthshoot = 1
- M.visible_message("\red [user] sticks their gun in their mouth, ready to pull the trigger...")
+ M.visible_message(" [user] sticks their gun in their mouth, ready to pull the trigger...")
if(!do_after(user, 40, target = M))
- M.visible_message("\blue [user] decided life was worth living")
+ M.visible_message(" [user] decided life was worth living")
mouthshoot = 0
return
if (process_chambered())
- user.visible_message("[user] pulls the trigger.")
+ user.visible_message("[user] pulls the trigger.")
if(silenced)
playsound(user, fire_sound, 10, 1)
else
playsound(user, fire_sound, 50, 1)
- if(istype(in_chamber, /obj/item/projectile/lasertag))
- user.show_message("You feel rather silly, trying to commit suicide with a toy.")
+ if(istype(in_chamber, /obj/item/projectile/lasertag) || istype(in_chamber, /obj/item/projectile/bullet/reusable/foam_dart))
+ user.show_message("You feel rather silly, trying to commit suicide with a toy.")
mouthshoot = 0
return
in_chamber.on_hit(M)
@@ -296,7 +296,7 @@
user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]", sharp=1)
user.death()
else
- to_chat(user, "Ow...")
+ to_chat(user, "Ow...")
user.apply_effect(110,STAMINA,0)
del(in_chamber)
mouthshoot = 0
@@ -380,4 +380,4 @@
update_icon()
else
set_light(0)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index d6fb9d9aff0..ffe2cd269b5 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -16,15 +16,18 @@
+
+
/obj/item/weapon/gun/projectile/New()
..()
- magazine = new mag_type(src)
+ if(!magazine)
+ magazine = new mag_type(src)
chamber_round()
update_icon()
return
-/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1)
+/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1 )
// if(in_chamber)
// return 1
@@ -50,9 +53,9 @@
/obj/item/weapon/gun/projectile/proc/chamber_round()
- if (chambered || !magazine)
+ if(chambered || !magazine)
return
- else if (magazine.ammo_count())
+ else if(magazine.ammo_count())
chambered = magazine.get_round()
chambered.loc = src
return
@@ -60,9 +63,9 @@
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
- if (istype(A, /obj/item/ammo_box/magazine))
+ if(istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
- if (!magazine && istype(AM, text2path(mag_type)))
+ if(!magazine && istype(AM, text2path(mag_type)))
user.remove_from_mob(AM)
magazine = AM
magazine.loc = src
@@ -71,7 +74,7 @@
A.update_icon()
update_icon()
return 1
- else if (magazine)
+ else if(magazine)
to_chat(user, "There's already a magazine in \the [src].")
if(istype(A, /obj/item/weapon/suppressor))
var/obj/item/weapon/suppressor/S = A
@@ -132,9 +135,9 @@
/obj/item/weapon/gun/projectile/proc/get_ammo(var/countchambered = 1)
var/boolets = 0 //mature var names for mature people
- if (chambered && countchambered)
+ if(chambered && countchambered)
boolets++
- if (magazine)
+ if(magazine)
boolets += magazine.ammo_count()
return boolets
@@ -146,4 +149,4 @@
item_state = "suppressor"
w_class = 2
var/oldsound = null
- var/initial_w_class = null
\ No newline at end of file
+ var/initial_w_class = null
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
new file mode 100644
index 00000000000..7bb290f4f46
--- /dev/null
+++ b/code/modules/projectiles/guns/projectile/toy.dm
@@ -0,0 +1,100 @@
+/obj/item/weapon/gun/projectile/automatic/toy
+ name = "foam force SMG"
+ desc = "A prototype three-round burst toy submachine gun. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "saber"
+ item_state = "gun"
+ mag_type = "/obj/item/ammo_box/magazine/toy/smg"
+ force = 0
+ throwforce = 0
+ burst_size = 3
+ can_suppress = 0
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/automatic/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol
+ name = "foam force pistol"
+ desc = "A small, easily concealable toy handgun. Ages 8 and up."
+ icon_state = "pistol"
+ w_class = 2
+ mag_type = "/obj/item/ammo_box/magazine/toy/pistol"
+ fire_sound = 'sound/weapons/Gunshot.ogg'
+ can_suppress = 0
+ burst_size = 1
+ fire_delay = 0
+ action_button_name = null
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon()
+ ..()
+ icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot
+ name = "foam force riot pistol"
+ desc = "RIOT! Ages 8 and up."
+
+/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/New()
+ magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
+ ..()
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy
+ name = "donksoft SMG"
+ desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = "/obj/item/ammo_box/magazine/toy/smgm45"
+
+/obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chambered()
+ return ..(0, 1)
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy
+ name = "donksoft LMG"
+ desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ can_suppress = 0
+ needs_permit = 0
+ mag_type = "/obj/item/ammo_box/magazine/toy/m762"
+
+/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chambered()
+ return ..(0, 1)
+
+
+
+/obj/item/weapon/gun/projectile/shotgun/toy
+ name = "foam force shotgun"
+ desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
+ icon = 'icons/obj/toyguns.dmi'
+ force = 0
+ throwforce = 0
+ origin_tech = null
+ mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy"
+ clumsy_check = 0
+ needs_permit = 0
+
+/obj/item/weapon/gun/projectile/shotgun/toy/pump_unload()
+ if(chambered)//We have a shell in the chamber
+ chambered = null
+ if(in_chamber)
+ in_chamber = null
+
+/obj/item/weapon/gun/projectile/shotgun/toy/crossbow
+ name = "foam force crossbow"
+ desc = "A weapon favored by many overactive children. Ages 8 and up."
+ icon_state = "crossbow"
+ item_state = "crossbow"
+ mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy/crossbow"
+ fire_sound = 'sound/items/syringeproj.ogg'
+ slot_flags = SLOT_BELT
+ w_class = 2
+
+/obj/item/weapon/gun/projectile/shotgun/toy/tommygun
+ name = "tommy gun"
+ desc = "Looks almost like the real thing! Great for practicing Drive-bys. Ages 8 and up."
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "tommy"
+ item_state = "shotgun"
+ mag_type = "/obj/item/ammo_box/magazine/internal/shot/toy/tommygun"
+ w_class = 2
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
new file mode 100644
index 00000000000..81defd55743
--- /dev/null
+++ b/code/modules/projectiles/projectile/reusable.dm
@@ -0,0 +1,45 @@
+/obj/item/projectile/bullet/reusable
+ name = "reusable bullet"
+ desc = "How do you even reuse a bullet?"
+ var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
+ var/hit = 0
+
+/obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0)
+ if(!proj_hit)
+ proj_hit = 1
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/on_range()
+ if(!proj_hit)
+ if (src.contents.len)
+ var/obj/content
+ for(content in src.contents)
+ content.loc = src.loc
+ else
+ new ammo_type(src.loc)
+ ..()
+
+/obj/item/projectile/bullet/reusable/foam_dart
+ name = "foam dart"
+ desc = "I hope you're wearing eye protection."
+ damage = 0 // It's a damn toy.
+ damage_type = OXY
+ nodamage = 1
+ edge = 0
+ embed = 0
+ icon = 'icons/obj/toyguns.dmi'
+ icon_state = "foamdart"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+ range = 10
+
+/obj/item/projectile/bullet/reusable/foam_dart/riot
+ name = "riot foam dart"
+ icon_state = "foamdart_riot"
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+ stamina = 25
diff --git a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
index 3a08a28a741..e9dd50dcf67 100644
--- a/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
+++ b/code/modules/reagents/oldchem/chemical_reaction/chemical_reaction_slime.dm
@@ -661,4 +661,4 @@
var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
S.forceMove(get_turf(holder.my_atom))
- S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
\ No newline at end of file
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 663b394efb6..b5d44579d07 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -323,6 +323,14 @@
build_path = /obj/item/weapon/canvas/twentythreeXnineteen
category = list("initial", "Miscellaneous")
+/datum/design/foambox
+ name = "Box of Foam Force darts"
+ id = "foamforce"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 2000)
+ build_path = /obj/item/ammo_box/foambox
+ category = list("initial", "Miscellaneous")
+
/datum/design/canvas/twentythreeXtwentythree
name = "23px by 23px Canvas"
id = "canvas23x23"
diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm
index afb1e09b40f..d2da596b692 100644
--- a/code/modules/research/designs/machine_designs.dm
+++ b/code/modules/research/designs/machine_designs.dm
@@ -492,6 +492,17 @@
build_path = /obj/item/weapon/circuitboard/prize_counter
category = list("Misc. Machinery")
+/datum/design/gameboard
+ name = "Machine Design (Virtual Gameboard)"
+ desc = "The circuit board for a Virtual Gameboard."
+ id = "gameboard"
+ req_tech = list("programming" = 2)
+ build_type = IMPRINTER
+ materials = list(MAT_GLASS=1000, "sacid"=20)
+ build_path = /obj/item/weapon/circuitboard/gameboard
+ category = list("Misc. Machinery")
+
+
/datum/design/botany_extractor
name = "Machine Design (Lysis-Isolation Centrifuge)"
desc = "The circuit board for a lysis-isolation centrifuge."
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 45ed8f0a08b..f34b727c354 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -223,7 +223,6 @@
being_used = 0
..()
-
/obj/item/slimepotion/steroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a baby slime to generate more extract."
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index e9464fab9a1..3386f4b9366 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -97,7 +97,10 @@
E.forceMove(target)
if(target.get_species() == "Machine")//as this is the only step needed for ipc put togethers
if(target_zone == "head")
- target.h_style = ""
+ var/obj/item/organ/external/head/H = target.organs_by_name["head"]
+ var/datum/robolimb/robohead = all_robolimbs[H.model]
+ if(robohead.is_monitor) //Ensures that if an IPC gets a head that's got a human hair wig attached to their body, the hair won't wipe.
+ target.h_style = ""
E.status &= ~ORGAN_DESTROYED
if(E.children)
for(var/obj/item/organ/external/C in E.children)
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index ee0e450ae15..db6ffd81a2a 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -71,6 +71,14 @@ var/global/list/limb_icon_cache = list()
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
+ if(owner.m_style)
+ var/datum/sprite_accessory/marking_style = marking_styles_list[owner.m_style]
+ if(marking_style && marking_style.species_allowed && (species.name in marking_style.species_allowed) && marking_style.marking_location == "head")
+ var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
+ if(marking_style.do_colouration)
+ markings_s.Blend(rgb(owner.r_markings, owner.g_markings, owner.b_markings), ICON_ADD)
+ overlays |= markings_s
+
if(owner.ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[owner.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed && (species.name in head_accessory_style.species_allowed))
@@ -81,7 +89,7 @@ var/global/list/limb_icon_cache = list()
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
- if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed))
+ if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.flags & ALL_RPARTS)))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(species.name == "Slime People") // I am el worstos
facial_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND)
@@ -91,7 +99,7 @@ var/global/list/limb_icon_cache = list()
if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
- if(hair_style && (species.name in hair_style.species_allowed))
+ if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.flags & ALL_RPARTS)))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(species.name == "Slime People") // I am el worstos
hair_s.Blend(rgb(owner.r_skin, owner.g_skin, owner.b_skin, 160), ICON_AND)
diff --git a/code/modules/surgery/organs/robolimbs.dm b/code/modules/surgery/organs/robolimbs.dm
index bcebd7e1e64..0229ee80cae 100644
--- a/code/modules/surgery/organs/robolimbs.dm
+++ b/code/modules/surgery/organs/robolimbs.dm
@@ -1,4 +1,5 @@
var/global/list/all_robolimbs = list()
+var/global/list/robolimb_data = list()
var/global/list/chargen_robolimbs = list()
var/global/datum/robolimb/basic_robolimb
@@ -9,41 +10,114 @@ var/global/datum/robolimb/basic_robolimb
all_robolimbs[R.company] = R
if(!R.unavailable_at_chargen)
if(R != "head" && R != "chest" && R != "groin" ) //Part of the method that ensures only IPCs can access head, chest and groin prosthetics.
- chargen_robolimbs[R.company] = R
+ if(R.has_subtypes) //Ensures solos get added to the list as well be incorporating has_subtypes == 1 and has_subtypes == 2.
+ chargen_robolimbs[R.company] = R //List only main brands and solo parts.
/datum/robolimb
var/company = "Unbranded" // Shown when selecting the limb.
var/desc = "A generic unbranded robotic prosthesis." // Seen when examining a limb.
var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from.
var/unavailable_at_chargen // If set, not available at chargen.
+ var/is_monitor // If set, limb is a monitor and should be getting monitor styles.
+ var/has_subtypes = 2 // If null, object is a model. If 1, object is a brand (that serves as the default model) with child models. If 2, object is a brand that has no child models and thus also serves as the model..
+ var/parts = list("chest", "groin", "head", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "l_arm", "l_hand") //Defines what parts said brand can replace on a body.
/datum/robolimb/bishop
company = "Bishop Cybernetics"
desc = "This limb has a white polymer casing with blue holo-displays."
- icon = 'icons/mob/human_races/cyberlimbs/bishop.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi'
+ has_subtypes = 1
-/datum/robolimb/hesphaistos
+/datum/robolimb/bishop/alt1
+ company = "Bishop Cybernetics alt."
+ icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi'
+ parts = list("head")
+ has_subtypes = null
+
+/datum/robolimb/bishop/monitor
+ company = "Bishop Cybernetics mtr."
+ icon = 'icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
+
+/datum/robolimb/hesphiastos
company = "Hesphiastos Industries"
desc = "This limb has a militaristic black and green casing with gold stripes."
- icon = 'icons/mob/human_races/cyberlimbs/hesphaistos.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi'
+ has_subtypes = 1
-/datum/robolimb/ipc
+/datum/robolimb/hesphiastos/alt1
+ company = "Hesphiastos Industries alt."
+ icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
+
+/datum/robolimb/hesphiastos/monitor
+ company = "Hesphiastos Industries mtr."
+ icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
+
+/datum/robolimb/morpheus
company = "Morpheus Cyberkinetics"
desc = "This limb is simple and functional; no effort has been made to make it look human."
- icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi'
unavailable_at_chargen = 1
+ is_monitor = 1
+ has_subtypes = 1
+
+/datum/robolimb/morpheus/alt1
+ company = "Morpheus Cyberkinetics alt."
+ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi'
+ parts = list("head")
+ unavailable_at_chargen = null
+ is_monitor = null
+ has_subtypes = 2 //Edge case. We want to be able to pick this one, and if we had it left as null for has_subtypes we'd be assuming it'll be chosen as a child model,
+ //and since the parent is unavailable at chargen, we wouldn't be able to see it in the list anyway. Now, we'll be able to select the Morpheus Ckt. Alt. head as a solo-model.
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
- icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi'
+ has_subtypes = 1
+
+/datum/robolimb/wardtakahashi/alt1
+ company = "Ward-Takahashi alt."
+ icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi'
+ parts = list("head")
+ has_subtypes = null
+
+/datum/robolimb/wardtakahashi/monitor
+ company = "Ward-Takahashi mtr."
+ icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
/datum/robolimb/xion
company = "Xion Manufacturing Group"
desc = "This limb has a minimalist black and red casing."
- icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi'
+ has_subtypes = 1
+
+/datum/robolimb/xion/alt1
+ company = "Xion Manufacturing Group alt."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi'
+ parts = list("head")
+ has_subtypes = null
+
+/datum/robolimb/xion/monitor
+ company = "Xion Manufacturing Group mtr."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi'
+ parts = list("head")
+ is_monitor = 1
+ has_subtypes = null
/datum/robolimb/zenghu
company = "Zeng-Hu Pharmaceuticals"
desc = "This limb has a rubbery fleshtone covering with visible seams."
- icon = 'icons/mob/human_races/cyberlimbs/zenghu.dmi'
\ No newline at end of file
+ icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi'
+ has_subtypes = 2
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-4189.yml b/html/changelogs/AutoChangeLog-pr-4189.yml
new file mode 100644
index 00000000000..ae3c546108d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4189.yml
@@ -0,0 +1,4 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - rscadd: "Slime batteries now self-recharge."
diff --git a/html/changelogs/AutoChangeLog-pr-4258.yml b/html/changelogs/AutoChangeLog-pr-4258.yml
new file mode 100644
index 00000000000..c8511011210
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4258.yml
@@ -0,0 +1,5 @@
+author: pinatacolada
+delete-after: True
+changes:
+ - tweak: "Makes fridge boards be selectable by screwdriving them"
+ - bugfix: "Virology fridge now accepts syringes, beakers, and bottles"
diff --git a/html/changelogs/AutoChangeLog-pr-4262.yml b/html/changelogs/AutoChangeLog-pr-4262.yml
new file mode 100644
index 00000000000..72bc64e4537
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4262.yml
@@ -0,0 +1,14 @@
+author: KasparoVy
+delete-after: True
+changes:
+ - bugfix: "Disembodied prosthetic heads that aren't monitors won't make you go bald when they're re-attached."
+ - bugfix: "'Optic' markings will disappear when your head gets removed, and reappear if it gets re-attached."
+ - bugfix: "Disembodied prosthetic heads that aren't monitors will now be rendered with hair & facial hair."
+ - bugfix: "Disembodied prosthetic heads with optical markings (markings with the head set as the origin) will be rendered with those markings."
+ - bugfix: "Animated hair styles (e.g. screens) and head accessories (e.g. 2/3 new antennae) will now be animated properly."
+ - rscadd: "3 more antennae."
+ - rscadd: "An alt. and monitor head model for every prosthetic brand but Zeng-hu. Morpheus only gets an alt model, not another monitor."
+ - rscadd: "Animated optical markings to fit the new alt. heads."
+ - rscadd: "Screen styles for the alt. Hesphiastos head."
+ - tweak: "Companies that make prosthetic body parts can (and do) now offer separate models for qualified recipients."
+ - tweak: "Removed the frames from screen styles in order to allow the same styles to be applied to all monitor heads."
diff --git a/html/changelogs/AutoChangeLog-pr-4270.yml b/html/changelogs/AutoChangeLog-pr-4270.yml
new file mode 100644
index 00000000000..c46542d69f8
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4270.yml
@@ -0,0 +1,4 @@
+author: FlattestGuitar
+delete-after: True
+changes:
+ - rscadd: "ports /tg/ Foam Force guns, now you can shoot foam at your enemies /with style/"
diff --git a/html/changelogs/AutoChangeLog-pr-4282.yml b/html/changelogs/AutoChangeLog-pr-4282.yml
new file mode 100644
index 00000000000..1049f7ff047
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4282.yml
@@ -0,0 +1,4 @@
+author: QuinnAggeler
+delete-after: True
+changes:
+ - bugfix: "Adds a check for brain death (brain damage of 120 or more) to the proc responsible for reviving IPCs"
diff --git a/html/changelogs/AutoChangeLog-pr-4285.yml b/html/changelogs/AutoChangeLog-pr-4285.yml
new file mode 100644
index 00000000000..3bdc7140b0d
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4285.yml
@@ -0,0 +1,4 @@
+author: Norgad
+delete-after: True
+changes:
+ - rscadd: "Adds a disposals chute to the Mechanic's Workshop"
diff --git a/html/changelogs/AutoChangeLog-pr-4288.yml b/html/changelogs/AutoChangeLog-pr-4288.yml
new file mode 100644
index 00000000000..dd83c5181da
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4288.yml
@@ -0,0 +1,5 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - rscadd: "Adds in door wands--control doors from range"
+ - rscadd: "Each head of staff (and the QM) starts off with a door wand to control the doors in their respective departments"
diff --git a/html/changelogs/AutoChangeLog-pr-4292.yml b/html/changelogs/AutoChangeLog-pr-4292.yml
new file mode 100644
index 00000000000..3a713925e7a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4292.yml
@@ -0,0 +1,4 @@
+author: Fox McCloud
+delete-after: True
+changes:
+ - bugfix: "Fixes nutrition alert icon kicking in too early"
diff --git a/icons/mob/body_accessory.dmi b/icons/mob/body_accessory.dmi
index 16d6b2f03f9..c315fbbdc2f 100644
Binary files a/icons/mob/body_accessory.dmi and b/icons/mob/body_accessory.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 26e8ff29a12..4636afa8d15 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi
new file mode 100644
index 00000000000..3443d18b0a3
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/bishop/bishop_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/bishop.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/bishop.dmi
rename to icons/mob/human_races/cyberlimbs/bishop/bishop_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi b/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi
new file mode 100644
index 00000000000..45d5ba48841
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/bishop/bishop_monitor.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi
new file mode 100644
index 00000000000..4e8e5658f4f
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/hesphaistos.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/hesphaistos.dmi
rename to icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi
new file mode 100644
index 00000000000..cc46f848343
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi
new file mode 100644
index 00000000000..685871568a7
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/ipc.dmi
rename to icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi
new file mode 100644
index 00000000000..54e7295cd39
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/wardtakahashi.dmi
rename to icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi
new file mode 100644
index 00000000000..06e518be95b
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_monitor.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi
new file mode 100644
index 00000000000..9f5b8f3cd15
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt1.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_main.dmi
similarity index 100%
rename from icons/mob/human_races/cyberlimbs/xion.dmi
rename to icons/mob/human_races/cyberlimbs/xion/xion_main.dmi
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi
new file mode 100644
index 00000000000..dee73558711
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_monitor.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/zenghu.dmi b/icons/mob/human_races/cyberlimbs/zenghu.dmi
deleted file mode 100644
index 85f49f50873..00000000000
Binary files a/icons/mob/human_races/cyberlimbs/zenghu.dmi and /dev/null differ
diff --git a/icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi b/icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi
new file mode 100644
index 00000000000..0d74250a3ea
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 37026b153be..46a4a974316 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/toyguns.dmi b/icons/obj/toyguns.dmi
new file mode 100644
index 00000000000..bd2ff273a40
Binary files /dev/null and b/icons/obj/toyguns.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 6f4d9659940..b9b84d17cef 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -699,6 +699,7 @@
#include "code\game\objects\items\candle.dm"
#include "code\game\objects\items\changestone.dm"
#include "code\game\objects\items\contraband.dm"
+#include "code\game\objects\items\control_wand.dm"
#include "code\game\objects\items\crayons.dm"
#include "code\game\objects\items\dehy_carp.dm"
#include "code\game\objects\items\documents.dm"
@@ -1774,11 +1775,13 @@
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\rocket.dm"
#include "code\modules\projectiles\guns\projectile\shotgun.dm"
+#include "code\modules\projectiles\guns\projectile\toy.dm"
#include "code\modules\projectiles\projectile\beams.dm"
#include "code\modules\projectiles\projectile\bullets.dm"
#include "code\modules\projectiles\projectile\energy.dm"
#include "code\modules\projectiles\projectile\force.dm"
#include "code\modules\projectiles\projectile\magic.dm"
+#include "code\modules\projectiles\projectile\reusable.dm"
#include "code\modules\projectiles\projectile\special.dm"
#include "code\modules\reagents\Chemistry-Colours.dm"
#include "code\modules\reagents\Chemistry-Holder.dm"