diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index e04d48bfe0a..9111c52665f 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -258,6 +258,10 @@ /obj/item/target, /obj/item/target, /obj/item/target, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/syndicate, +/obj/item/target/syndicate, /turf/simulated/floor/plasteel, /area/station/security/range) "acD" = ( @@ -453,7 +457,6 @@ /obj/machinery/camera{ c_tag = "Firing Range" }, -/obj/machinery/syndicatebomb/training, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) @@ -466,7 +469,7 @@ name = "east bump"; pixel_x = 24 }, -/turf/simulated/floor/plating, +/turf/simulated/floor/plasteel, /area/station/security/range) "adn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -522,9 +525,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/item/radio/intercom/department/security{ - pixel_y = -28 - }, +/obj/machinery/nuclearbomb/training, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "adE" = ( @@ -537,13 +539,34 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, +/obj/machinery/syndicatebomb/training, /turf/simulated/floor/plasteel, /area/station/security/range) "adG" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, /turf/simulated/floor/plasteel, /area/station/security/range) "adH" = ( @@ -1696,10 +1719,22 @@ /area/station/command/office/hos) "aij" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/target/syndicate, -/obj/item/target/syndicate, -/obj/item/target/syndicate, +/obj/item/storage/toolbox/mechanical{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/item/multitool{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/item/clothing/head/welding{ + pixel_y = -2; + pixel_x = -6 + }, +/obj/structure/table/reinforced, +/obj/item/radio/intercom/department/security{ + pixel_x = 28 + }, /turf/simulated/floor/plasteel, /area/station/security/range) "aio" = ( diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index 0eba8dd99f6..5ec69548777 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -2486,13 +2486,6 @@ /obj/machinery/ai_status_display, /turf/simulated/wall/r_wall, /area/station/turret_protected/aisat/interior) -"apu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" - }, -/area/station/maintenance/fore2) "apw" = ( /obj/structure/table, /obj/item/storage/toolbox/emergency, @@ -2752,37 +2745,41 @@ /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/fpmaint) "ard" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 9 }, -/area/station/security/permabrig) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/syndicatebomb/training, +/obj/machinery/light, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "arh" = ( -/obj/item/vending_refill/cola, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/grouped_spawner{ - group_id = "tunnelbats"; - max_per_spawner = 1; - name = "bat spawner"; - path_to_spawn = /mob/living/simple_animal/hostile/scarybat; - total_amount = 20 +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 }, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 }, -/area/station/maintenance/fore2) -"ark" = ( -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 }, -/area/station/maintenance/fore2) -"arl" = ( -/obj/structure/closet/emcloset, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/turf/simulated/floor/plasteel{ + icon_state = "redcorner" + }, +/area/station/security/defusal) "arm" = ( /obj/machinery/door/airlock/maintenance{ name = "Fore Asteroid Maintenance Access" @@ -5829,6 +5826,13 @@ "aMC" = ( /turf/simulated/mineral/ancient, /area/station/medical/break_room) +"aME" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "aMJ" = ( /obj/machinery/firealarm{ dir = 1; @@ -12062,19 +12066,21 @@ pixel_x = -3; pixel_y = -2 }, -/obj/item/clothing/glasses/sunglasses, +/turf/simulated/floor/plasteel, +/area/station/security/range) +"bsP" = ( +/obj/item/radio/intercom{ + pixel_y = -28; + name = "custom placement" + }, +/obj/structure/table/reinforced, /obj/item/clothing/glasses/sunglasses{ pixel_x = 3; pixel_y = 3 }, -/turf/simulated/floor/plasteel, -/area/station/security/range) -"bsP" = ( -/obj/machinery/syndicatebomb/training, -/obj/structure/closet/bombclosetsecurity, -/obj/item/radio/intercom{ - pixel_y = -28; - name = "custom placement" +/obj/item/clothing/glasses/sunglasses, +/obj/item/storage/box/flashbangs{ + pixel_x = -16 }, /turf/simulated/floor/plasteel, /area/station/security/range) @@ -25812,13 +25818,16 @@ /turf/simulated/floor/wood, /area/station/legal/magistrate) "cKZ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/obj/item/radio/intercom{ + name = "custom placement"; + pixel_y = 28 }, -/area/station/maintenance/fore2) +/obj/machinery/camera{ + c_tag = "Defusal Workshop" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "cLa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -28999,6 +29008,23 @@ icon_state = "darkyellow" }, /area/station/engineering/atmos) +"cZi" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 + }, +/obj/structure/cable/orange{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/directional/west, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "redcorner" + }, +/area/station/security/defusal) "cZr" = ( /obj/structure/chair{ dir = 8 @@ -29371,13 +29397,11 @@ /area/station/security/prison/cell_block/A) "ddl" = ( /obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, -/obj/structure/cable/orange, /obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d2 = 4; + icon_state = "0-4" + }, /turf/simulated/floor/plating, /area/station/security/permabrig) "ddn" = ( @@ -33955,6 +33979,17 @@ icon_state = "yellowcorner" }, /area/station/hallway/primary/central/east) +"dEa" = ( +/obj/machinery/light_switch{ + name = "north bump"; + pixel_y = 24 + }, +/obj/machinery/alarm/directional/west, +/turf/simulated/floor/plasteel{ + dir = 1; + icon_state = "redcorner" + }, +/area/station/security/defusal) "dEi" = ( /obj/structure/table/wood, /obj/item/ammo_box/shotgun/beanbag, @@ -34819,6 +34854,24 @@ icon_state = "bluered" }, /area/station/hallway/secondary/entry/west) +"dQG" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Defusal Workshop" + }, +/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "red" + }, +/area/station/security/defusal) "dQR" = ( /obj/machinery/door/airlock/maintenance{ name = "Aft Asteroid Maintenance" @@ -36720,15 +36773,6 @@ /obj/machinery/hologram/holopad, /turf/simulated/floor/plasteel, /area/station/hallway/secondary/exit) -"eAn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/obj/item/crowbar/red, -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) "eAu" = ( /obj/effect/turf_decal/delivery, /obj/machinery/recharge_station, @@ -41487,6 +41531,25 @@ /obj/effect/spawner/random_spawners/dirt_often, /turf/simulated/floor/transparent/glass/reinforced, /area/station/maintenance/apmaint) +"gmV" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/head/welding{ + pixel_x = 12; + pixel_y = 6 + }, +/obj/item/multitool{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "gmZ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -42842,6 +42905,21 @@ icon_state = "whitebluecorner" }, /area/station/medical/surgery/secondary) +"gLb" = ( +/obj/item/vending_refill/cola, +/obj/item/multitool, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/grouped_spawner{ + group_id = "tunnelbats"; + max_per_spawner = 1; + name = "bat spawner"; + path_to_spawn = /mob/living/simple_animal/hostile/scarybat; + total_amount = 20 + }, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "gLj" = ( /obj/structure/table/wood, /obj/effect/spawner/lootdrop/maintenance/eight, @@ -43849,6 +43927,15 @@ icon_state = "red" }, /area/station/security/storage) +"hcm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/obj/item/crowbar/red, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "hco" = ( /obj/structure/cable/orange{ d1 = 4; @@ -44431,6 +44518,14 @@ /obj/effect/spawner/window/reinforced/grilled, /turf/simulated/floor/plating, /area/station/turret_protected/aisat/interior/secondary) +"hnL" = ( +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/firealarm{ + name = "north bump"; + pixel_y = 24 + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "hoa" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -50739,12 +50834,12 @@ /turf/simulated/floor/plating, /area/station/hallway/primary/central/west) "jjh" = ( -/obj/structure/cable/orange{ - d1 = 2; - d2 = 8; - icon_state = "2-8" - }, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, /turf/simulated/floor/plasteel, /area/station/security/permabrig) "jjp" = ( @@ -53865,20 +53960,6 @@ temperature = 80 }, /area/station/science/xenobiology) -"khV" = ( -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/station/security/brig) "kic" = ( /obj/structure/closet/wardrobe/grey, /turf/simulated/floor/mineral/titanium/blue, @@ -59525,6 +59606,15 @@ icon_state = "cafeteria" }, /area/station/service/kitchen) +"lQa" = ( +/obj/effect/spawner/window/reinforced/grilled, +/obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "lQy" = ( /obj/machinery/optable, /obj/machinery/light{ @@ -60954,11 +61044,6 @@ /obj/effect/spawner/random_spawners/dirt_often, /turf/simulated/floor/plating, /area/station/maintenance/disposal/external/southwest) -"moQ" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating, -/area/station/maintenance/fore2) "moY" = ( /obj/structure/closet/secure_closet/medical3, /obj/machinery/light, @@ -62522,15 +62607,6 @@ }, /turf/simulated/floor/plating, /area/station/security/brig) -"mSf" = ( -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/obj/machinery/door/firedoor, -/turf/simulated/floor/plating, -/area/station/security/permabrig) "mSh" = ( /obj/structure/girder, /turf/simulated/floor/plating, @@ -62825,13 +62901,12 @@ /turf/simulated/floor/plating, /area/station/maintenance/maintcentral) "mVr" = ( -/obj/item/clothing/shoes/orange, -/obj/item/clothing/under/color/orange/prison, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/machinery/nuclearbomb/training, +/turf/simulated/floor/plasteel{ + dir = 4; + icon_state = "redcorner" }, -/area/station/maintenance/fore2) +/area/station/security/defusal) "mVs" = ( /obj/structure/disposalpipe/segment/corner{ dir = 8; @@ -63272,6 +63347,16 @@ /obj/structure/sign/securearea, /turf/simulated/wall, /area/station/engineering/tech_storage) +"nde" = ( +/obj/structure/cable/orange{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "floorgrime" + }, +/area/station/security/permabrig) "ndl" = ( /obj/effect/spawner/window/reinforced/polarized/grilled{ id = "rd" @@ -65368,6 +65453,11 @@ icon_state = "neutralcorner" }, /area/station/hallway/primary/fore/east) +"nNB" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "nNF" = ( /obj/machinery/door/airlock/maintenance{ name = "Service SMES Access" @@ -65403,6 +65493,10 @@ }, /turf/simulated/floor/plating, /area/station/hallway/primary/port/north) +"nOr" = ( +/obj/structure/closet/emcloset, +/turf/simulated/floor/plating, +/area/station/security/permabrig) "nOu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -69524,6 +69618,9 @@ icon_state = "dark" }, /area/station/turret_protected/ai) +"peU" = ( +/turf/simulated/wall/r_wall, +/area/station/security/defusal) "pfe" = ( /obj/structure/chair/wood{ dir = 1 @@ -77318,6 +77415,30 @@ }, /turf/simulated/floor/plasteel, /area/station/public/locker) +"rGv" = ( +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/security/brig) "rGw" = ( /obj/structure/disposalpipe/segment/corner, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ @@ -83573,16 +83694,18 @@ /area/station/maintenance/port) "tFL" = ( /obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable/orange{ - d2 = 8; - icon_state = "0-8" - }, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/machinery/door/firedoor, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable/orange{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/orange, /turf/simulated/floor/plating, /area/station/security/permabrig) "tFY" = ( @@ -91618,6 +91741,14 @@ icon_state = "darkyellow" }, /area/station/engineering/control) +"weh" = ( +/obj/item/clothing/shoes/orange, +/obj/item/clothing/under/color/orange/prison, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "weN" = ( /obj/structure/cable{ d1 = 4; @@ -92002,6 +92133,13 @@ }, /turf/simulated/floor/plasteel, /area/station/hallway/primary/aft/west) +"wiU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/lootdrop/maintenance, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/security/permabrig) "wiV" = ( /obj/structure/mirror{ pixel_x = -28 @@ -98575,6 +98713,7 @@ /obj/machinery/light/small{ dir = 4 }, +/obj/structure/closet/bombclosetsecurity, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -118888,7 +119027,7 @@ rHj cDb rHj aQL -aQL +nde tFL rNK rNK @@ -119146,10 +119285,10 @@ gLk cVR amO myY -tFL +lQa rNK rNK -khV +lPn yfX fOj awv @@ -119403,11 +119542,11 @@ dpC rHj adc rHj -mSf -rNK -rNK -lPn -yfX +peU +peU +peU +peU +wGz uaJ awB uqz @@ -119660,12 +119799,12 @@ rHj rHj vNP sFU -afd -afd -afd -afd -wGz -uaJ +peU +dEa +cZi +dQG +dsy +rGv dtr uqz aLp @@ -119917,10 +120056,10 @@ rHj cgX tkn dqz -tkn -rHj +peU +hnL ard -afd +peU daG sVX daG @@ -120170,13 +120309,13 @@ aTz afd aTz aTz -rHj -aTz -aTz afd afd -cKZ +aME mYJ +peU +cKZ +gmV fqh eBm krP @@ -120427,11 +120566,11 @@ afd afd aTz aTz -aTz -aTz -aTz afd -vXM +tkn +weh +gLb +peU mVr arh fqh @@ -120684,13 +120823,13 @@ abW abW afd aTz -aTz -aTz -aTz afd -eAn -moQ -ark +hcm +nNB +adc +peU +peU +peU fqh xax pZs @@ -120939,15 +121078,15 @@ rNK cRv abW abW -abW +afd +aTz +afd +vNP +wiU +nOr afd aTz aTz -aTz -afd -vrQ -apu -arl asu atc eZh @@ -121196,15 +121335,15 @@ rNK cRv cRv cRv -abW afd aTz aTz -aTz -aTz afd afd aTz +afd +aTz +aTz fqh bOR gyQ diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index b9bbeef06f0..2c1a42832b3 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -28019,6 +28019,34 @@ icon_state = "neutralfull" }, /area/station/hallway/primary/port/north) +"bDD" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, +/obj/structure/table/reinforced, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/machinery/alarm/directional/south, +/turf/simulated/floor/plasteel, +/area/station/security/range) "bDE" = ( /obj/item/kirbyplants, /obj/machinery/status_display{ @@ -35212,7 +35240,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/table, -/obj/machinery/syndicatebomb/training, +/obj/item/toy/figure/crew/secofficer, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -40235,6 +40263,16 @@ /turf/simulated/floor/plasteel, /area/station/security/range) "cju" = ( +/obj/machinery/syndicatebomb/training, +/turf/simulated/floor/plasteel, +/area/station/security/range) +"cjv" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/station/security/range) +"cjw" = ( /obj/structure/table/reinforced, /obj/machinery/recharger{ pixel_x = -6; @@ -40247,27 +40285,8 @@ pixel_x = 7; pixel_y = 3 }, -/obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/plasteel, /area/station/security/range) -"cjv" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/simulated/floor/plating, -/area/station/security/range) -"cjw" = ( -/obj/structure/sign/securearea{ - pixel_y = 32 - }, -/turf/simulated/floor/plating, -/area/station/security/range) -"cjx" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/plating, -/area/station/security/range) "cjy" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/plating, @@ -40863,9 +40882,6 @@ icon_state = "4-8" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -40901,10 +40917,13 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "clf" = ( @@ -41413,7 +41432,6 @@ icon_state = "1-2" }, /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, /area/station/security/range) "cmC" = ( @@ -41437,18 +41455,8 @@ /turf/simulated/floor/plating, /area/station/security/range) "cmF" = ( -/obj/structure/table/reinforced, -/obj/machinery/alarm/directional/south, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/ears/earmuffs, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, +/obj/machinery/nuclearbomb/training, +/obj/effect/decal/cleanable/dirt, /turf/simulated/floor/plasteel, /area/station/security/range) "cmG" = ( @@ -44275,13 +44283,6 @@ icon_state = "neutralfull" }, /area/station/hallway/primary/starboard/south) -"cut" = ( -/obj/machinery/light, -/obj/structure/sign/securearea{ - pixel_y = -32 - }, -/turf/simulated/floor/plating, -/area/station/security/range) "cuu" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -59862,6 +59863,14 @@ icon_state = "whitebluefull" }, /area/station/maintenance/starboard) +"dxV" = ( +/obj/structure/table/reinforced, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/ears/earmuffs, +/turf/simulated/floor/plasteel, +/area/station/security/range) "dyb" = ( /turf/simulated/floor/plating, /area/station/maintenance/theatre) @@ -67079,6 +67088,23 @@ /obj/structure/cable, /turf/simulated/floor/plasteel/white, /area/station/science/explab) +"eOg" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/item/clothing/head/welding{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/item/multitool{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = -2; + pixel_x = -3 + }, +/turf/simulated/floor/plasteel, +/area/station/security/range) "eOt" = ( /obj/structure/table/glass, /obj/structure/cable{ @@ -69896,6 +69922,19 @@ dir = 5 }, /area/space/nearstation) +"gAP" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, +/area/station/security/range) "gAR" = ( /obj/structure/closet/wardrobe/pjs, /obj/structure/cable{ @@ -80599,7 +80638,6 @@ "ngl" = ( /obj/structure/table, /obj/item/storage/fancy/donut_box, -/obj/item/toy/figure/crew/secofficer, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -92501,7 +92539,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/turf/simulated/floor/plating, +/obj/effect/decal/cleanable/dirt, +/turf/simulated/floor/plasteel, /area/station/security/range) "tVV" = ( /turf/simulated/floor/plasteel{ @@ -152270,9 +152309,9 @@ cgr hFc cgr jIs -cjv -iCU -cjv +eOg +gAP +bDD cjr brS bHF @@ -152529,7 +152568,7 @@ ccL jIs cjw tVO -cjz +dxV cjr eeN lnU @@ -152784,9 +152823,9 @@ ccM ceC cgo jIs -cjx -tVO -cut +cjv +iCU +cjv cjr cpa cqI diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index 82aac31c65a..a33e90f850e 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -47039,13 +47039,25 @@ /turf/simulated/floor/wood, /area/station/service/bar) "exm" = ( -/obj/effect/spawner/window/reinforced/grilled, -/obj/structure/cable{ - d2 = 8; - icon_state = "0-8" +/obj/machinery/door/airlock/security/glass, +/obj/effect/mapping_helpers/airlock/autoname, +/obj/effect/mapping_helpers/airlock/access/any/security/general, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 }, -/turf/simulated/floor/plating, -/area/station/security/main) +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "redfull" + }, +/area/station/security/defusal) "exI" = ( /obj/structure/table/glass, /obj/item/hand_labeler, @@ -48601,6 +48613,37 @@ }, /turf/simulated/floor/carpet, /area/station/legal/lawoffice) +"ffH" = ( +/obj/item/disk/nuclear/training{ + pixel_y = -2; + pixel_x = -7 + }, +/obj/item/paper/nuclear_guide_spacing{ + pixel_x = 10; + pixel_y = 7 + }, +/obj/item/paper/nuclear_guide_defusing{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/disk/nuclear/training{ + pixel_x = -5 + }, +/obj/item/paper/nuclear_guide_operating{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/structure/table, +/obj/machinery/camera{ + c_tag = "Defusal Workshop" + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24; + name = "east bump" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "fga" = ( /obj/machinery/door/firedoor, /obj/structure/disposalpipe/segment{ @@ -49971,6 +50014,24 @@ /obj/effect/decal/cleanable/blood, /turf/simulated/floor/bluegrid, /area/station/maintenance/starboard) +"fFo" = ( +/obj/structure/table, +/obj/item/radio/intercom{ + name = "south bump"; + pixel_y = -28 + }, +/obj/item/clothing/head/welding{ + pixel_x = -4; + pixel_y = 19 + }, +/obj/item/multitool{ + pixel_x = 7; + pixel_y = 13 + }, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/alarm/directional/east, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "fFL" = ( /obj/machinery/atmospherics/meter, /obj/machinery/atmospherics/pipe/simple/visible/yellow, @@ -50216,12 +50277,12 @@ /area/station/hallway/primary/central/north) "fJr" = ( /obj/machinery/disposal, -/obj/structure/cable{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, /obj/structure/disposalpipe/trunk, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -59769,6 +59830,23 @@ "jKj" = ( /turf/simulated/wall/r_wall, /area/station/engineering/ai_transit_tube) +"jKG" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 10 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "jKP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -60570,6 +60648,14 @@ }, /turf/simulated/floor/plating, /area/station/medical/virology) +"jXY" = ( +/obj/machinery/nuclearbomb/training, +/obj/machinery/atmospherics/unary/vent_scrubber/on, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "jYj" = ( /obj/machinery/atmospherics/pipe/manifold/visible/cyan{ dir = 8; @@ -69542,6 +69628,9 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/external, /turf/simulated/floor/plating, /area/station/engineering/control) +"nEV" = ( +/turf/simulated/wall/r_wall, +/area/station/security/defusal) "nFf" = ( /obj/structure/table/glass, /obj/item/reagent_containers/dropper, @@ -79380,6 +79469,21 @@ icon_state = "dark" }, /area/station/security/permabrig) +"rOj" = ( +/obj/machinery/syndicatebomb/training, +/obj/machinery/light_switch{ + dir = 4; + name = "west bump"; + pixel_x = -24 + }, +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 + }, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "red" + }, +/area/station/security/defusal) "rOp" = ( /obj/machinery/door/airlock/tranquillite{ name = "Old Mime's Storage" @@ -79608,6 +79712,22 @@ icon_state = "whitebluefull" }, /area/station/medical/exam_room) +"rUg" = ( +/obj/structure/table, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/book/manual/wiki/hacking{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/machinery/power/apc/directional/east, +/obj/structure/cable{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/plasteel, +/area/station/security/defusal) "rUl" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/simple/heat_exchanging{ @@ -83827,10 +83947,6 @@ icon_state = "cafeteria" }, /area/station/service/kitchen) -"tNe" = ( -/obj/effect/spawner/random_spawners/wall_rusted_probably, -/turf/simulated/wall/r_wall, -/area/station/maintenance/fore) "tNg" = ( /obj/machinery/door/firedoor, /turf/simulated/floor/plasteel{ @@ -88699,15 +88815,6 @@ }, /area/station/medical/surgery/observation) "vVR" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_x = -2; - pixel_y = 18 - }, -/obj/item/wirecutters{ - pixel_y = 5 - }, -/obj/machinery/syndicatebomb/training, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "red" @@ -124916,7 +125023,7 @@ aaa aaa laH aaa -apO +sRw fJr hwP vgv @@ -125174,11 +125281,11 @@ aaa laH abq apO -jSU -apO +nEV +nEV exm -apO -apO +nEV +nEV xyP apO apO @@ -125431,11 +125538,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -tNe +nEV +jXY +jKG +rOj +nEV oQV ajg jiR @@ -125688,11 +125795,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -ahH +nEV +ffH +rUg +fFo +nEV alW akR aDY @@ -125945,11 +126052,11 @@ aaa aaa aaa laH -aaa -aaa -aaa -aaa -ahH +nEV +nEV +nEV +nEV +nEV aDY wLB cnV @@ -126207,8 +126314,8 @@ abq abq abq ajg -ajg -aVY +ahH +ahH ajg aWv cXu diff --git a/code/__DEFINES/wires_defines.dm b/code/__DEFINES/wires_defines.dm index ef149154212..c1d1160bbb0 100644 --- a/code/__DEFINES/wires_defines.dm +++ b/code/__DEFINES/wires_defines.dm @@ -46,9 +46,11 @@ #define WIRE_BOMB_ACTIVATE "Activate" // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut. // Nuclear bomb -#define WIRE_BOMB_LIGHT "Bomb Light" -#define WIRE_BOMB_TIMING "Bomb Timing" -#define WIRE_BOMB_SAFETY "Bomb Safety" +#define WIRE_NUKE_SAFETY "Safety" +#define WIRE_NUKE_DETONATOR "Detonator" +#define WIRE_NUKE_DISARM "Disarm" +#define WIRE_NUKE_LIGHT "Lights" +#define WIRE_NUKE_CONTROL "Control Panel" // Particle accelerator #define WIRE_PARTICLE_POWER "Power Toggle" // Toggles whether the PA is on or not. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 7d9cf49c61f..f918fe47277 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -35,6 +35,9 @@ GLOBAL_LIST_EMPTY(beacons) GLOBAL_LIST_EMPTY(shuttle_caller_list) //list of all communication consoles, comms consoles circuit and AIs, for automatic shuttle calls when there are none. GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once. +GLOBAL_LIST_EMPTY(nuke_list) //list of (real) nukes +GLOBAL_LIST_EMPTY(syndi_nuke_list) //list of syndicate nukes +GLOBAL_LIST_EMPTY(nad_list) //list of (real) nuclear authentication disks GLOBAL_LIST_EMPTY(nuclear_uplink_list) //list of all existing nuke ops uplinks GLOBAL_LIST_EMPTY(abductor_equipment) //list of all abductor equipment GLOBAL_LIST_EMPTY(global_intercoms) //list of all intercomms, across all z-levels diff --git a/code/datums/wires/nuclearbomb_wires.dm b/code/datums/wires/nuclearbomb_wires.dm index c997e183d7c..0fe19c82952 100644 --- a/code/datums/wires/nuclearbomb_wires.dm +++ b/code/datums/wires/nuclearbomb_wires.dm @@ -1,11 +1,12 @@ /datum/wires/nuclearbomb holder_type = /obj/machinery/nuclearbomb + labelled = TRUE randomize = TRUE - wire_count = 7 // 3 actual, 4 duds. + wire_count = 5 proper_name = "Nuclear bomb" /datum/wires/nuclearbomb/New(atom/_holder) - wires = list(WIRE_BOMB_LIGHT, WIRE_BOMB_TIMING, WIRE_BOMB_SAFETY) + wires = list(WIRE_NUKE_SAFETY, WIRE_NUKE_DETONATOR, WIRE_NUKE_DISARM, WIRE_NUKE_LIGHT, WIRE_NUKE_CONTROL) return ..() /datum/wires/nuclearbomb/interactable(mob/user) @@ -18,39 +19,64 @@ . = ..() var/obj/machinery/nuclearbomb/N = holder . += "The device is [N.timing ? "shaking!" : "still."]" - . += "The device is [N.safety ? "quiet" : "whirring"]." - . += "The lights are [N.lighthack ? "static" : "functional"]." + . += "The control panel is [is_cut(WIRE_NUKE_CONTROL) ? "turned off" : "functional"]." + . += "The disarm controls are [is_cut(WIRE_NUKE_DISARM) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]." + . += "The safety controls are [is_cut(WIRE_NUKE_SAFETY) || is_cut(WIRE_NUKE_CONTROL) ? "disabled" : "functional"]." + . += "The lights are [is_cut(WIRE_NUKE_LIGHT) ? "static" : "functional"]." /datum/wires/nuclearbomb/on_pulse(wire) var/obj/machinery/nuclearbomb/N = holder switch(wire) - if(WIRE_BOMB_LIGHT) - N.lighthack = !N.lighthack - addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_lighthack_callback)), 10 SECONDS) + if(WIRE_NUKE_SAFETY) + if(!is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The safety controls flicker.", hearing_distance = 1) - if(WIRE_BOMB_TIMING) + if(WIRE_NUKE_DETONATOR) if(N.timing) - message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP)") + if(!N.training) + message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonator wire, causing it to explode (JMP)") N.explode() + else + N.audible_message("[N] whirrs ominously.", hearing_distance = 1) - if(WIRE_BOMB_SAFETY) - N.safety = !N.safety - addtimer(CALLBACK(N, TYPE_PROC_REF(/obj/machinery/nuclearbomb, reset_safety_callback)), 10 SECONDS) + if(WIRE_NUKE_DISARM) + if(N.timing && is_cut(WIRE_NUKE_CONTROL)) + if(!is_cut(WIRE_NUKE_LIGHT)) + N.icon_state = N.sprite_prefix + "nuclearbomb1" + N.timing = FALSE + N.audible_message("The timer on [N] stops!", hearing_distance = 1) + N.update_icon(UPDATE_OVERLAYS) + if(!N.training) + GLOB.bomb_set = FALSE + if(!N.is_syndicate && !N.training) + SSsecurity_level.set_level(N.previous_level) + else if(N.timing && !is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The disarm controls flash with an error. You need to disable the control panel first!", hearing_distance = 1) + else if(!is_cut(WIRE_NUKE_CONTROL)) + N.audible_message("The disarm controls flicker.", hearing_distance = 1) + + if(WIRE_NUKE_LIGHT) + N.audible_message("The lights on [N] flicker.", hearing_distance = 1) + flick(N.sprite_prefix + "nuclearbombc", N) + + if(WIRE_NUKE_CONTROL) + N.audible_message("[N]'s control panel flickers.", hearing_distance = 1) /datum/wires/nuclearbomb/on_cut(wire, mend) var/obj/machinery/nuclearbomb/N = holder switch(wire) - if(WIRE_BOMB_SAFETY) - if(N.timing) - message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP)") + if(WIRE_NUKE_DETONATOR) + if(N.timing && !mend) + if(!N.training) + message_admins("[key_name_admin(usr)] cut a nuclear bomb's detonator wire, causing it to explode (JMP)") N.explode() - if(WIRE_BOMB_TIMING) - if(!N.lighthack) - if(N.icon_state == "nuclearbomb2") - N.icon_state = "nuclearbomb1" - N.timing = FALSE - GLOB.bomb_set = FALSE - - if(WIRE_BOMB_LIGHT) - N.lighthack = !N.lighthack + if(WIRE_NUKE_LIGHT) + if(!mend) + N.icon_state = N.sprite_prefix + "nuclearbomb0" + if(mend) + if(N.timing) + N.icon_state = N.sprite_prefix + "nuclearbomb2" + else + N.icon_state = N.sprite_prefix + "nuclearbomb1" + N.update_icon(UPDATE_OVERLAYS) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 58fc524c8c0..3584e408978 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -2,6 +2,8 @@ /datum/wires /// TRUE if the wires will be different every time a new wire datum is created. var/randomize = FALSE + /// TRUE if the wires are labelled for every user + var/labelled = FALSE /// The atom the wires belong too. For example: an airlock. var/atom/holder /// The holder type; used to make sure that the holder is the correct type. @@ -281,6 +283,8 @@ var/can_probably_see_wires = FALSE var/obj/item/held_item = user.get_active_hand() var/obj/item/offhand = user.get_inactive_hand() + if(labelled) + can_probably_see_wires = TRUE if(istype(held_item) && HAS_TRAIT(held_item, TRAIT_SHOW_WIRE_INFO)) can_probably_see_wires = TRUE if(istype(offhand) && HAS_TRAIT(offhand, TRAIT_SHOW_WIRE_INFO)) diff --git a/code/game/area/ss13_areas/security_areas.dm b/code/game/area/ss13_areas/security_areas.dm index 4729423116c..fc465472ee6 100644 --- a/code/game/area/ss13_areas/security_areas.dm +++ b/code/game/area/ss13_areas/security_areas.dm @@ -106,6 +106,10 @@ name = "\improper Firing Range" icon_state = "firingrange" +/area/station/security/defusal + name = "\improper Defusal Workshop" + icon_state = "defusal" + // Checkpoints /area/station/security/checkpoint diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 8d4b34139fa..921040d015d 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -15,7 +15,7 @@ GLOBAL_VAR(bomb_set) name = "\improper Nuclear Fission Explosive" desc = "Uh oh. RUN!!!!" icon = 'icons/obj/nuclearbomb.dmi' - icon_state = "nuclearbomb0" + icon_state = "nuclearbomb1" density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF flags_2 = NO_MALF_EFFECT_2 | CRITICAL_ATOM_2 @@ -25,8 +25,6 @@ GLOBAL_VAR(bomb_set) /// Are our bolts *supposed* to be in the floor, may not actually cause anchoring if the bolts are cut var/extended = TRUE - /// If true, prevents the lights on the nuke - var/lighthack = FALSE /// Countdown to boom var/timeleft = 120 /// Are we counting down? @@ -55,6 +53,10 @@ GLOBAL_VAR(bomb_set) var/core_stage = NUKE_CORE_EVERYTHING_FINE ///How many sheets of various metals we need to fix it var/sheets_to_fix = 5 + /// Is this a training bomb? + var/training = FALSE + /// Prefix to add, if any, on icon states for this bomb + var/sprite_prefix = "" ///Bombs Internal Radio var/obj/item/radio/radio @@ -70,9 +72,10 @@ GLOBAL_VAR(bomb_set) . = ..() r_code = rand(10000, 99999) // Creates a random code upon object spawn. wires = new/datum/wires/nuclearbomb(src) - ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT) previous_level = SSsecurity_level.get_current_level_as_text() - GLOB.poi_list |= src + if(!training) + GLOB.poi_list |= src + GLOB.nuke_list |= src core = new /obj/item/nuke_core/plutonium(src) STOP_PROCESSING(SSobj, core) //Let us not irradiate the vault by default. update_icon(UPDATE_OVERLAYS) @@ -81,14 +84,26 @@ GLOBAL_VAR(bomb_set) radio.follow_target = src radio.config(list("Special Ops" = 0)) +/obj/machinery/nuclearbomb/syndicate/Initialize() + . = ..() + wires.labelled = FALSE + ADD_TRAIT(src, TRAIT_OBSCURED_WIRES, ROUNDSTART_TRAIT) + GLOB.syndi_nuke_list |= src + /obj/machinery/nuclearbomb/Destroy() SStgui.close_uis(wires) QDEL_NULL(wires) QDEL_NULL(core) QDEL_NULL(radio) - GLOB.poi_list.Remove(src) + if(!training) + GLOB.poi_list.Remove(src) + GLOB.nuke_list.Remove(src) return ..() +/obj/machinery/nuclearbomb/syndicate/Destroy() + GLOB.syndi_nuke_list.Remove(src) + . = ..() + /obj/machinery/nuclearbomb/process() if(timing) GLOB.bomb_set = TRUE // So long as there is one nuke timing, it means one nuke is armed. @@ -99,6 +114,8 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/examine(mob/user) . = ..() + if(training) + . += "Alt-Click to reset the bomb." if(!panel_open) . += "The outer panel is screwed shut." switch(removal_stage) @@ -126,15 +143,15 @@ GLOBAL_VAR(bomb_set) underlays.Cut() set_light(0) - if(!lighthack) - underlays += emissive_appearance(icon, "nuclearbomb_lightmask") + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + underlays += emissive_appearance(icon, sprite_prefix + "nukelights_lightmask") set_light(1, LIGHTING_MINIMUM_POWER) if(panel_open) - . += "hackpanel_open" + . += sprite_prefix + "hackpanel_open" if(anchored) // Using anchored due to removal_stage deanchoring having multiple steps - . += "nukebolts" + . += sprite_prefix + "nukebolts" // Selected stage lets us show the open core, even if the front panel is closed var/selected_stage = removal_stage @@ -151,6 +168,12 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/disk/nuclear)) if(extended) + if(auth) + to_chat(user, "There's already a disk in the slot!") + return + if((istype(O, /obj/item/disk/nuclear/training) && !training) || (training && !istype(O, /obj/item/disk/nuclear/training))) + to_chat(user, "[O] doesn't fit into [src]!") + return if(!user.drop_item()) to_chat(user, "[O] is stuck to your hand!") return @@ -212,12 +235,15 @@ GLOBAL_VAR(bomb_set) if(!I.tool_use_check(user, 0)) return if(removal_stage == NUKE_COVER_OFF) - user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...") + user.visible_message("[user] starts forcing open the bolt covers on [src].", "You start forcing open the anchoring bolt covers with [I]...") if(!I.use_tool(src, user, 15, volume = I.tool_volume) || removal_stage != NUKE_COVER_OFF) return - user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") + user.visible_message("[user] forces open the bolt covers on [src].", "You force open the bolt covers.") removal_stage = NUKE_COVER_OPEN if(removal_stage == NUKE_CORE_EVERYTHING_FINE) + if(training) + to_chat(user, "This is where you'd take off the plate to access the internal core, but this training bomb doesn't have one.") + return user.visible_message("[user] starts removing [src]'s outer core plate...", "You start removing [src]'s outer core plate...") if(!I.use_tool(src, user, 4 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_CORE_EVERYTHING_FINE) return @@ -235,10 +261,10 @@ GLOBAL_VAR(bomb_set) if(core) START_PROCESSING(SSobj, core) if(removal_stage == NUKE_UNWRENCHED) - user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") + user.visible_message("[user] begins lifting [src] off of the anchors.", "You begin lifting the device off the anchors...") if(!I.use_tool(src, user, 8 SECONDS, volume = I.tool_volume) || removal_stage != NUKE_UNWRENCHED) return - user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") + user.visible_message("[user] crowbars [src] off of the anchors. It can now be moved.", "You jam the crowbar under the nuclear device and lift it off its anchors. You can now move it!") anchored = FALSE removal_stage = NUKE_MOBILE update_icon(UPDATE_OVERLAYS) @@ -251,10 +277,10 @@ GLOBAL_VAR(bomb_set) . = TRUE if(!I.tool_use_check(user, 0)) return - user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") + user.visible_message("[user] begins unwrenching the anchoring bolts on [src].", "You begin unwrenching the anchoring bolts...") if(!I.use_tool(src, user, 50, volume = I.tool_volume) || removal_stage != NUKE_SEALANT_OPEN) return - user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") + user.visible_message("[user] unwrenches the anchoring bolts on [src].", "You unwrench the anchoring bolts.") removal_stage = NUKE_UNWRENCHED update_icon(UPDATE_OVERLAYS) @@ -273,23 +299,23 @@ GLOBAL_VAR(bomb_set) if(auth || (istype(I, /obj/item/screwdriver/nuke) && !is_syndicate)) if(!panel_open) panel_open = TRUE - to_chat(user, "You unscrew the control panel of [src].") + to_chat(user, "You unscrew the control panel of [src].") anchor_stage = removal_stage removal_stage = core_stage else panel_open = FALSE - to_chat(user, "You screw the control panel of [src] back on.") + to_chat(user, "You screw the control panel of [src] back on.") core_stage = removal_stage removal_stage = anchor_stage else if(!panel_open) - to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") + to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.") if(panel_open) panel_open = FALSE - to_chat(user, "You screw the control panel of [src] back on.") + to_chat(user, "You screw the control panel of [src] back on.") core_stage = removal_stage removal_stage = anchor_stage - flick("nuclearbombc", src) + flick(sprite_prefix + "nuclearbombc", src) update_icon(UPDATE_OVERLAYS) /obj/machinery/nuclearbomb/wirecutter_act(mob/user, obj/item/I) @@ -397,6 +423,8 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/proc/is_auth(mob/user) if(auth) + if(istype(auth, /obj/item/disk/nuclear/training) && !training) + return FALSE return TRUE else if(user.can_admin_interact()) return TRUE @@ -409,6 +437,9 @@ GLOBAL_VAR(bomb_set) . = TRUE if(exploded) return + if(wires.is_cut(WIRE_NUKE_CONTROL)) + to_chat(usr, "The control panel isn't responding! Something must be wrong with its wiring!") + return FALSE switch(action) if("deploy") if(removal_stage != NUKE_MOBILE) @@ -416,9 +447,9 @@ GLOBAL_VAR(bomb_set) visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else visible_message("[src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - if(!lighthack) - flick("nuclearbombc", src) - icon_state = "nuclearbomb1" + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + flick(sprite_prefix + "nuclearbombc", src) + icon_state = sprite_prefix + "nuclearbomb1" update_icon(UPDATE_OVERLAYS) extended = TRUE return @@ -433,6 +464,8 @@ GLOBAL_VAR(bomb_set) else var/obj/item/I = usr.get_active_hand() if(istype(I, /obj/item/disk/nuclear)) + if((istype(I, /obj/item/disk/nuclear/training) && !training) || (training && !istype(I, /obj/item/disk/nuclear/training))) + return usr.drop_item() I.forceMove(src) auth = I @@ -491,43 +524,57 @@ GLOBAL_VAR(bomb_set) return timeleft = time if("toggle_safety") + if(wires.is_cut(WIRE_NUKE_SAFETY)) + to_chat(usr, "The safety isn't responding! Something must be wrong with its wiring!") + return FALSE safety = !(safety) if(safety) - if(!is_syndicate) + if(!is_syndicate && !training) SSsecurity_level.set_level(previous_level) timing = FALSE - GLOB.bomb_set = FALSE + if(!training) + GLOB.bomb_set = FALSE if("toggle_armed") if(safety) to_chat(usr, "The safety is still on.") return - if(!core) + if(!core && !training) to_chat(usr, "[src]'s screen blinks red! There is no plutonium core in [src]!") return - timing = !(timing) - if(timing) - if(!lighthack) - icon_state = "nuclearbomb2" + if(!timing) + if(wires.is_cut(WIRE_NUKE_DETONATOR)) + to_chat(usr, "[src] isn't arming! Something must be wrong with its wiring!") + return FALSE + timing = TRUE + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb2" update_icon(UPDATE_OVERLAYS) - if(!safety) + if(!safety && !training) message_admins("[key_name_admin(usr)] engaged a nuclear bomb [ADMIN_JMP(src)]") if(!is_syndicate && SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_EPSILON) SSsecurity_level.set_level(SEC_LEVEL_DELTA) GLOB.bomb_set = TRUE // There can still be issues with this resetting when there are multiple bombs. Not a big deal though for Nuke if(SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_EPSILON) radio.autosay("The Nuclear Bomb has been armed, retreat from the station immediately!", name, "Special Ops") - else + else if(!training) GLOB.bomb_set = TRUE else - if(!is_syndicate) + if(wires.is_cut(WIRE_NUKE_DISARM)) + to_chat(usr, "[src] isn't disarming! Something must be wrong with its wiring!") + return FALSE + timing = FALSE + if(!is_syndicate && !training) SSsecurity_level.set_level(previous_level) - GLOB.bomb_set = FALSE - if(!lighthack) - icon_state = "nuclearbomb1" + if(!training) + GLOB.bomb_set = FALSE + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb1" update_icon(UPDATE_OVERLAYS) - /obj/machinery/nuclearbomb/blob_act(obj/structure/blob/B) + if(training) + qdel(src) + return if(exploded) return if(timing) //boom @@ -567,16 +614,19 @@ GLOBAL_VAR(bomb_set) /obj/machinery/nuclearbomb/proc/explode() + if(training) + atom_say("You've triggered the detonate wire. You are dead.") + return if(safety) timing = FALSE return exploded = TRUE yes_code = FALSE safety = TRUE - if(!lighthack) - icon_state = "nuclearbomb3" + if(!wires.is_cut(WIRE_NUKE_LIGHT)) + icon_state = sprite_prefix + "nuclearbomb3" update_icon(UPDATE_OVERLAYS) - playsound(src,'sound/machines/alarm.ogg',100,0,5) + playsound(src, 'sound/machines/alarm.ogg', 100, FALSE, 5) if(SSticker && SSticker.mode) SSticker.mode.explosion_in_progress = TRUE SSticker.event_blackbox(outcome = ROUND_END_NUCLEAR) @@ -618,23 +668,6 @@ GLOBAL_VAR(bomb_set) return return -/obj/machinery/nuclearbomb/proc/reset_lighthack_callback() - lighthack = !lighthack - -/obj/machinery/nuclearbomb/proc/reset_safety_callback() - safety = !safety - if(safety == 1) - if(!is_syndicate) - SSsecurity_level.set_level(previous_level) - visible_message("[src] quiets down.") - if(!lighthack) - if(icon_state == "nuclearbomb2") - icon_state = "nuclearbomb1" - update_icon(UPDATE_OVERLAYS) - - else - visible_message("[src] emits a quiet whirling noise!") - //==========DAT FUKKEN DISK=============== /obj/item/disk/nuclear name = "nuclear authentication disk" @@ -645,6 +678,8 @@ GLOBAL_VAR(bomb_set) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF /// Is the disk restricted to the station? If true, also respawns the disk when deleted var/restricted_to_station = TRUE + /// Is this a training disk? + var/training = FALSE /obj/item/disk/nuclear/unrestricted name = "unrestricted nuclear authentication disk" @@ -655,7 +690,9 @@ GLOBAL_VAR(bomb_set) ..() if(restricted_to_station) START_PROCESSING(SSobj, src) - GLOB.poi_list |= src + if(!training) + GLOB.poi_list |= src + GLOB.nad_list |= src /obj/item/disk/nuclear/process() if(!restricted_to_station) @@ -682,26 +719,32 @@ GLOBAL_VAR(bomb_set) /obj/item/disk/nuclear/Destroy(force) var/turf/diskturf = get_turf(src) + if(training) + return ..() + if(force) - message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") + message_admins("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]).") log_game("[src] has been !!force deleted!! in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]).") GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) STOP_PROCESSING(SSobj, src) return ..() if(!restricted_to_station) // Non-restricted NADs should be allowed to be deleted, otherwise it becomes a restricted NAD when teleported - message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]). It will not respawn.") + message_admins("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z] - JMP":"nonexistent location"]). It will not respawn.") log_game("[src] (unrestricted) has been deleted in ([diskturf ? "[diskturf.x], [diskturf.y] ,[diskturf.z]":"nonexistent location"]). It will not respawn.") GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) STOP_PROCESSING(SSobj, src) return ..() var/turf/new_spawn = find_respawn() if(new_spawn) GLOB.poi_list.Remove(src) + GLOB.nad_list.Remove(src) var/obj/item/disk/nuclear/NEWDISK = new(new_spawn) transfer_fingerprints_to(NEWDISK) - message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") + message_admins("[src] has been destroyed at ([diskturf.x], [diskturf.y], [diskturf.z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") log_game("[src] has been destroyed in ([diskturf.x], [diskturf.y], [diskturf.z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") ..() return QDEL_HINT_HARDDEL_NOW // We want this to be deleted ASAP, but we want refs properly cleared too @@ -720,6 +763,54 @@ GLOBAL_VAR(bomb_set) if(length(open_turfs)) return pick(open_turfs) +/// MARK: TRAINING NUKE + +/obj/machinery/nuclearbomb/training + name = "training nuclear bomb" + desc = "A fake nuke used to practice nuclear device operations. \ + The '1' key on the keypad appears to be significantly more worn than the other keys." + icon_state = "t_nuclearbomb1" + resistance_flags = null + training = TRUE + sprite_prefix = "t_" + +/obj/machinery/nuclearbomb/training/Initialize() + . = ..() + r_code = 11111 //Uuh.. one! + qdel(core) + +/obj/machinery/nuclearbomb/training/process() + if(timing) + timeleft = max(timeleft - 2, 0) // 2 seconds per process() + if(timeleft <= 0) + INVOKE_ASYNC(src, PROC_REF(training_detonation)) + +/obj/machinery/nuclearbomb/training/blob_act(obj/structure/blob/B) + qdel(src) + +/obj/machinery/nuclearbomb/training/AltClick(mob/user) + . = ..() + to_chat(user, "You hit the reset button on [src].") + training_reset() + +/obj/machinery/nuclearbomb/training/proc/training_detonation() + atom_say("Nuclear device detonated. Resetting...") + training_reset() + +/obj/machinery/nuclearbomb/training/proc/training_reset() + if(auth) + auth.forceMove(get_turf(src)) + new /obj/machinery/nuclearbomb/training(get_turf(src)) + qdel(src) + +/obj/item/disk/nuclear/training + name = "training authentication disk" + desc = "The code is 11111." + icon_state = "trainingdisk" + resistance_flags = null + restricted_to_station = FALSE + training = TRUE + #undef NUKE_INTACT #undef NUKE_COVER_OFF #undef NUKE_COVER_OPEN diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index c988d1709eb..f5f8487e1b2 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -96,15 +96,15 @@ /obj/item/pinpointer/proc/scandisk() if(!the_disk) - the_disk = locate() in GLOB.poi_list + the_disk = locate() in GLOB.nad_list /obj/item/pinpointer/proc/scanbomb() if(!syndicate) if(!the_bomb) - the_bomb = locate() in GLOB.poi_list + the_bomb = locate() in GLOB.nuke_list else if(!the_s_bomb) - the_s_bomb = locate() in GLOB.poi_list + the_s_bomb = locate() in GLOB.syndi_nuke_list /obj/item/pinpointer/proc/point_at_target(atom/target) if(!target) diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm index ca40f18d0bc..daf72168235 100644 --- a/code/game/gamemodes/steal_items.dm +++ b/code/game/gamemodes/steal_items.dm @@ -106,6 +106,11 @@ protected_jobs = list("Captain") location_override = "the Captain's Office" +/datum/theft_objective/nukedisc/check_special_completion(obj/item/I) + if(istype(I, /obj/item/disk/nuclear/training)) //Haha no + return FALSE + return TRUE + /datum/theft_objective/reactive name = "any type of reactive armor" typepath = /obj/item/clothing/suit/armor/reactive diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 7035e9cf2d6..3e6fa6919be 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -660,6 +660,42 @@ header = "


Official Expedited Memorandum