From cddfdfbac5dd85d4dd06ed41b6c96d2de585b8bc Mon Sep 17 00:00:00 2001 From: someone543 <95106800+someone543@users.noreply.github.com> Date: Wed, 22 May 2024 01:55:52 +0800 Subject: [PATCH] [UPSTREAM] Ports Genpop from NSV to BeeStation to NSV (#2620) Co-authored-by: Haliris <97298717+Haliris@users.noreply.github.com> Co-authored-by: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Co-authored-by: TsunamiAnt Co-authored-by: PestoVerde322 <75247747+PestoVerde322@users.noreply.github.com> Co-authored-by: PigeonVerde322 --- _maps/holodeck/workshop/donut.dmm | 260 +++ _maps/holodeck/workshop/offline.dmm | 58 + _maps/holodeck/workshop/plush.dmm | 174 ++ _maps/map_files/Atlas/atlas.dmm | 10 +- _maps/map_files/Galactica/Galactica2.dmm | 8 +- _maps/map_files/Gladius/Gladius1.dmm | 1757 ++++++++--------- _maps/map_files/Hammerhead/Hammerhead.dmm | 1095 ++++++---- _maps/map_files/Serendipity/Serendipity1.dmm | 4 +- _maps/map_files/Tycoon/Tycoon1.dmm | 8 +- _maps/map_files/Tycoon/Tycoon2.dmm | 18 +- code/__DEFINES/access.dm | 2 +- code/__DEFINES/construction.dm | 5 + code/__DEFINES/obj_flags.dm | 1 + code/_globalvars/bitfields.dm | 2 + code/datums/components/crafting/crafting.dm | 6 +- .../weather/weather_types/radiation_storm.dm | 2 +- code/game/area/areas/holodeck.dm | 6 + .../machinery/computer/prisoner/_prisoner.dm | 8 +- code/game/machinery/gulag_item_reclaimer.dm | 4 +- .../objects/effects/spawners/structure.dm | 7 +- code/game/objects/items/cards_ids.dm | 32 +- .../items/stacks/sheets/sheet_types.dm | 4 + code/game/objects/items/storage/boxes.dm | 14 +- code/game/objects/items/toys.dm | 26 + code/game/objects/structures/grille.dm | 40 + code/game/turfs/open/floor/plating.dm | 17 + code/game/turfs/open/floor/prison_floor.dm | 73 + code/modules/holodeck/computer.dm | 8 +- .../holodeck/holodeck_map_templates.dm | 78 +- code/modules/holodeck/turfs.dm | 15 + code/modules/mining/laborcamp/laborstacker.dm | 12 +- .../research/designs/machine_designs.dm | 16 + code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/security/crimes.dm | 274 +++ code/modules/security/genpop.dm | 741 +++++++ code/modules/security/prison_scanner.dm | 57 + code/modules/security/workshop.dm | 107 + config/space_law.json | 290 +++ .../obj/machines/genpop_display.dmi | Bin icons/obj/machines/turnstile.dmi | Bin 0 -> 8179 bytes icons/turf/prisonfloor.dmi | Bin 0 -> 1006 bytes nsv13.dme | 6 +- .../spawners/custom_window_spawners.dm | 4 + nsv13/code/modules/Security/genpop.dm | 432 ---- .../ammunition/missiles/missile_types.dm | 4 +- .../torpedos/torpedo_construction.dm | 2 +- .../ammunition/torpedos/torpedo_types.dm | 6 +- nsv13/icons/obj/objects.dmi | Bin 6633 -> 1197 bytes tgui/packages/tgui/interfaces/GenPop.js | 237 ++- tgui/packages/tgui/interfaces/Workshop.js | 33 + 50 files changed, 4065 insertions(+), 1900 deletions(-) create mode 100644 _maps/holodeck/workshop/donut.dmm create mode 100644 _maps/holodeck/workshop/offline.dmm create mode 100644 _maps/holodeck/workshop/plush.dmm create mode 100644 code/game/turfs/open/floor/prison_floor.dm create mode 100644 code/modules/security/crimes.dm create mode 100644 code/modules/security/genpop.dm create mode 100644 code/modules/security/prison_scanner.dm create mode 100644 code/modules/security/workshop.dm create mode 100644 config/space_law.json rename nsv13/icons/obj/status_display.dmi => icons/obj/machines/genpop_display.dmi (100%) create mode 100644 icons/obj/machines/turnstile.dmi create mode 100644 icons/turf/prisonfloor.dmi delete mode 100644 nsv13/code/modules/Security/genpop.dm create mode 100644 tgui/packages/tgui/interfaces/Workshop.js diff --git a/_maps/holodeck/workshop/donut.dmm b/_maps/holodeck/workshop/donut.dmm new file mode 100644 index 00000000000..4db94446ce4 --- /dev/null +++ b/_maps/holodeck/workshop/donut.dmm @@ -0,0 +1,260 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"b" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"f" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/soap, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"h" = ( +/turf/open/floor/holofloor/monotile/light, +/area/template_noop) +"r" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/chem_heater, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"t" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/structure/sign/poster/official/moth1{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"u" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"v" = ( +/obj/structure/table/reinforced, +/obj/machinery/reagentgrinder{ + pixel_x = -1; + pixel_y = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/item/reagent_containers/food/snacks/grown/apple, +/obj/item/reagent_containers/food/snacks/grown/apple, +/obj/item/reagent_containers/food/snacks/grown/apple, +/obj/item/reagent_containers/food/snacks/grown/apple, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"w" = ( +/obj/structure/closet/crate/freezer, +/obj/effect/turf_decal/bot, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/item/reagent_containers/food/snacks/grown/berries, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"x" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"B" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"F" = ( +/obj/machinery/light/floor, +/turf/open/floor/holofloor/monotile/light, +/area/template_noop) +"G" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/closet/crate/freezer, +/obj/item/storage/fancy/egg_box, +/obj/item/storage/fancy/egg_box, +/turf/open/floor/holofloor/monotile/light, +/area/template_noop) +"H" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"I" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -8; + pixel_y = 11 + }, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -9; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/sugar, +/obj/item/reagent_containers/food/condiment/sugar, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"J" = ( +/obj/effect/turf_decal/caution/stand_clear/white, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"K" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard{ + name = "menu" + }, +/obj/item/paper, +/obj/item/hand_labeler, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"M" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/snacks/piedough, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/item/kitchen/rollingpin{ + pixel_x = 3; + pixel_y = 5 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"N" = ( +/obj/structure/table/reinforced, +/obj/item/toy/figure/chef, +/obj/item/reagent_containers/food/condiment/enzyme, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"P" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"Q" = ( +/obj/structure/rack, +/obj/item/kitchen/knife, +/obj/item/kitchen/knife, +/obj/item/lighter, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"V" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, +/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, +/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, +/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, +/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"Y" = ( +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/milk, +/obj/item/reagent_containers/food/condiment/soymilk, +/obj/item/reagent_containers/food/condiment/soymilk, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) + +(1,1,1) = {" +v +M +f +P +K +"} +(2,1,1) = {" +b +F +h +h +G +"} +(3,1,1) = {" +N +h +r +h +a +"} +(4,1,1) = {" +h +h +I +h +J +"} +(5,1,1) = {" +w +h +x +h +a +"} +(6,1,1) = {" +Y +F +h +h +u +"} +(7,1,1) = {" +t +H +B +Q +V +"} diff --git a/_maps/holodeck/workshop/offline.dmm b/_maps/holodeck/workshop/offline.dmm new file mode 100644 index 00000000000..ebdbac6ac85 --- /dev/null +++ b/_maps/holodeck/workshop/offline.dmm @@ -0,0 +1,58 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/holofloor/plating, +/area/template_noop) +"U" = ( +/obj/structure/holosign/barrier, +/turf/open/floor/holofloor/plating, +/area/template_noop) + +(1,1,1) = {" +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +U +"} +(4,1,1) = {" +a +a +a +a +U +"} +(5,1,1) = {" +a +a +a +a +U +"} +(6,1,1) = {" +a +a +a +a +a +"} +(7,1,1) = {" +a +a +a +a +a +"} diff --git a/_maps/holodeck/workshop/plush.dmm b/_maps/holodeck/workshop/plush.dmm new file mode 100644 index 00000000000..b0cd66ef347 --- /dev/null +++ b/_maps/holodeck/workshop/plush.dmm @@ -0,0 +1,174 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/caution, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"b" = ( +/obj/structure/table/reinforced, +/obj/item/pen, +/obj/item/paper{ + name = "plushes 101"; + default_raw_text = "**How to make plushes**

Step 1: make a plush fabric with 2 sheets of cloth. You can acquire cloth by cutting bedsheets or gauzes with wirecutters, or by weaving cotton with the loom.

Step 2: stuff the plush fabric with cotton, and you're done!" + }, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"d" = ( +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"e" = ( +/obj/structure/loom, +/obj/item/stack/sheet/cotton, +/obj/item/stack/sheet/cotton, +/obj/item/stack/sheet/cotton, +/obj/item/stack/sheet/cotton, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"n" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"o" = ( +/obj/structure/table/reinforced, +/obj/item/stack/sheet/cotton/cloth, +/obj/item/stack/sheet/cotton/cloth, +/obj/item/stack/sheet/cotton, +/obj/item/stack/sheet/cotton, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"w" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"z" = ( +/obj/effect/turf_decal/loading_area, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"D" = ( +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"E" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/cotton, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"F" = ( +/obj/structure/rack, +/obj/item/bedsheet, +/obj/item/bedsheet, +/obj/item/bedsheet, +/obj/item/bedsheet/cmo, +/obj/item/bedsheet/cmo, +/obj/item/bedsheet/double/blue, +/obj/item/bedsheet/double/blue, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"L" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"M" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/seeds/cotton, +/obj/item/shovel/spade{ + pixel_x = -5; + pixel_y = -4 + }, +/obj/item/cultivator{ + pixel_x = -2; + pixel_y = -1 + }, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"O" = ( +/obj/machinery/light/floor, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"P" = ( +/obj/structure/closet/crate, +/obj/item/toy/plush/beeplushie, +/obj/effect/turf_decal/delivery, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"R" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"U" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/obj/item/stack/medical/gauze, +/turf/open/floor/holofloor/monotile/dark, +/area/template_noop) +"W" = ( +/obj/structure/closet/crate, +/obj/effect/turf_decal/delivery, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) +"Z" = ( +/obj/structure/rack, +/obj/item/wirecutters, +/obj/item/wirecutters, +/obj/item/wirecutters, +/turf/open/floor/holofloor/monotile/steel, +/area/template_noop) + +(1,1,1) = {" +L +E +M +E +Z +"} +(2,1,1) = {" +d +O +D +D +d +"} +(3,1,1) = {" +n +D +z +U +d +"} +(4,1,1) = {" +d +D +w +b +a +"} +(5,1,1) = {" +e +D +w +o +d +"} +(6,1,1) = {" +e +O +D +R +d +"} +(7,1,1) = {" +F +d +W +P +d +"} diff --git a/_maps/map_files/Atlas/atlas.dmm b/_maps/map_files/Atlas/atlas.dmm index efd857ea4cc..d8dc782f14e 100644 --- a/_maps/map_files/Atlas/atlas.dmm +++ b/_maps/map_files/Atlas/atlas.dmm @@ -7413,9 +7413,6 @@ /turf/open/floor/plating, /area/engine/atmos) "xr" = ( -/obj/machinery/turnstile{ - dir = 4 - }, /obj/effect/turf_decal/loading_area{ dir = 8 }, @@ -7426,6 +7423,9 @@ dir = 8 }, /obj/effect/landmark/zebra_interlock_point, +/obj/machinery/turnstile{ + dir = 8 + }, /turf/open/floor/durasteel/alt, /area/security/brig) "xs" = ( @@ -7680,7 +7680,6 @@ /turf/open/floor/carpet/royalblack, /area/chapel/main) "ym" = ( -/obj/machinery/turnstile, /obj/effect/turf_decal/loading_area{ dir = 1 }, @@ -7688,6 +7687,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/machinery/turnstile{ + dir = 1 + }, /turf/open/floor/durasteel/techfloor_grid, /area/security/prison) "yq" = ( diff --git a/_maps/map_files/Galactica/Galactica2.dmm b/_maps/map_files/Galactica/Galactica2.dmm index a5decd02d2d..ce6200b19f0 100644 --- a/_maps/map_files/Galactica/Galactica2.dmm +++ b/_maps/map_files/Galactica/Galactica2.dmm @@ -8320,7 +8320,7 @@ icon_state = "4-8" }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/structure/cable{ icon_state = "0-4" @@ -32980,9 +32980,7 @@ icon_state = "1-2" }, /obj/machinery/door/firedoor/border_only/directional/south, -/obj/machinery/turnstile{ - dir = 1 - }, +/obj/machinery/turnstile, /obj/structure/cable{ icon_state = "2-8"; tag = "" @@ -41180,7 +41178,7 @@ /obj/machinery/door/firedoor/border_only/directional/west, /obj/machinery/door/firedoor/border_only/directional/east, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/structure/cable, /turf/open/floor/monotile/steel, diff --git a/_maps/map_files/Gladius/Gladius1.dmm b/_maps/map_files/Gladius/Gladius1.dmm index 560ae1f443e..cdcb8d38d42 100644 --- a/_maps/map_files/Gladius/Gladius1.dmm +++ b/_maps/map_files/Gladius/Gladius1.dmm @@ -421,9 +421,12 @@ /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) "alx" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, /turf/open/floor/monotile/steel, /area/security/prison) @@ -818,8 +821,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 6 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "avE" = ( /obj/structure/sign/poster/contraband/syndicate_recruitment, /turf/closed/wall/ship, @@ -1127,15 +1133,19 @@ /turf/open/floor/monotile/light, /area/medical/medbay/lobby) "aCt" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/cultivator, -/obj/item/seeds/ambrosia, /obj/effect/turf_decal/tile/red{ dir = 1 }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/structure/table, +/obj/item/reagent_containers/glass/bowl, +/obj/item/kitchen/rollingpin, +/obj/item/storage/box/donkpockets{ + pixel_x = 2; + pixel_y = 1 + }, /obj/structure/cable{ icon_state = "4-8" }, @@ -1184,7 +1194,7 @@ req_access_txt = "63" }, /obj/machinery/button/door{ - id = "Prison Gate"; + id = "Prisongate"; name = "Prison Lockdown"; pixel_x = -38; pixel_y = -36; @@ -1405,7 +1415,10 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/weightmachine/weightlifter, +/obj/structure/easel, +/obj/machinery/light{ + dir = 8 + }, /obj/machinery/flasher{ id = "PCell 2"; pixel_x = -28 @@ -1963,17 +1976,6 @@ /obj/item/clothing/under/ship/decktech, /turf/open/floor/monotile/steel, /area/nsv/hanger/notkmcstupidhanger/pilot) -"aZQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/vending/sustenance{ - desc = "A vending machine normally reserved for work camps."; - name = "\improper sustenance vendor"; - product_slogans = "Enjoy your meal.;Enough calories to support any worker." - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "aZR" = ( /obj/effect/spawner/structure/window/reinforced/ship, /turf/open/floor/plating, @@ -2211,20 +2213,6 @@ }, /turf/open/floor/monotile/steel, /area/science/test_area) -"bfX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "bgi" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2376,6 +2364,22 @@ }, /turf/open/floor/monotile/steel, /area/nsv/hanger/notkmcstupidhanger/pilot) +"bjn" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom"; + pixel_x = -28; + prison_radio = 1 + }, +/obj/structure/table, +/obj/item/storage/crayons, +/obj/item/paper/guides/jobs/hydroponics, +/turf/open/floor/monotile/steel, +/area/security/prison) "bjw" = ( /turf/open/openspace, /area/shuttle/turbolift/secondary) @@ -2454,7 +2458,6 @@ /turf/open/floor/plating, /area/security/brig) "bkO" = ( -/obj/effect/spawner/structure/window/reinforced/ship, /obj/structure/cable{ icon_state = "0-8" }, @@ -2464,6 +2467,10 @@ /obj/structure/cable{ icon_state = "2-8" }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, /turf/open/floor/plating, /area/security/prison) "blo" = ( @@ -2702,6 +2709,18 @@ }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"bqB" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/turf/open/floor/monotile/dark, +/area/security/prison) "bre" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2858,12 +2877,18 @@ dir = 4 }, /obj/machinery/turnstile{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/loading_area{ dir = 4 }, /obj/effect/landmark/zebra_interlock_point, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/monotile/dark, /area/security/prison) "bwm" = ( @@ -3047,15 +3072,6 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port) -"bCz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "bCP" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile/neutral{ @@ -3952,6 +3968,12 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/aft) +"bXA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "bXB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -3984,14 +4006,21 @@ /turf/open/floor/plating, /area/maintenance/nsv/deck1/central) "bYs" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/plant_analyzer, +/obj/structure/table, /obj/effect/turf_decal/tile/red{ - dir = 1 + dir = 8 }, /obj/effect/turf_decal/tile/red{ - dir = 8 + dir = 1 }, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/clothing/head/chefhat, /turf/open/floor/monotile/steel, /area/security/prison) "bYN" = ( @@ -4328,12 +4357,12 @@ /turf/open/floor/monotile/dark, /area/science/server) "cfB" = ( -/obj/structure/window/reinforced, /obj/effect/turf_decal/stripes/line{ - dir = 10 + dir = 4 }, -/turf/open/floor/plating, -/area/security/range) +/obj/item/ship_weapon/ammunition/torpedo/freight, +/turf/open/floor/monotile/steel, +/area/security/execution/transfer) "cfT" = ( /obj/effect/spawner/structure/window/reinforced/ship, /obj/structure/cable{ @@ -4504,6 +4533,12 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/aft) +"cjH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "cjM" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 8 @@ -4587,16 +4622,6 @@ /turf/open/space/basic, /area/space/nearstation) "cld" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/electrical, -/obj/item/screwdriver{ - pixel_y = 5 - }, -/obj/item/multitool, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -4604,6 +4629,12 @@ /obj/machinery/camera/autoname{ dir = 8 }, +/obj/machinery/computer/holodeck/prison{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, /turf/open/floor/monotile/steel, /area/security/warden) "cln" = ( @@ -4622,13 +4653,6 @@ }, /turf/open/floor/plating/airless, /area/nsv/hanger) -"clE" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "clW" = ( /obj/machinery/power/turbine{ dir = 1 @@ -4743,10 +4767,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) -"cpS" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "cpY" = ( /obj/machinery/door/airlock/ship/maintenance/defaultaccess, /obj/machinery/door/firedoor/border_only{ @@ -5640,12 +5660,6 @@ /obj/machinery/advanced_airlock_controller/directional/north, /turf/open/floor/plating, /area/maintenance/nsv/hangar) -"cIJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "cIW" = ( /obj/effect/landmark/start/air_traffic_controller, /turf/open/floor/carpet/blue, @@ -5761,12 +5775,11 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/storage/satellite) "cMC" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 }, +/obj/structure/table, +/obj/item/toy/cards/deck, /turf/open/floor/monotile/dark, /area/security/prison) "cMJ" = ( @@ -6224,8 +6237,11 @@ /area/science/robotics/lab) "dak" = ( /obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "daq" = ( /obj/machinery/door/airlock/highsecurity/ship{ name = "Weapons Bay"; @@ -6375,24 +6391,14 @@ /turf/open/floor/plating, /area/maintenance/disposal/incinerator) "ddA" = ( -/obj/structure/table, /obj/machinery/light/small{ dir = 8 }, -/obj/machinery/magnetic_controller{ - autolink = 1; - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/glasses/sunglasses/advanced{ - pixel_x = 3; - pixel_y = 3 - }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/monotile/steel, -/area/security/range) +/area/security/execution/transfer) "ddC" = ( /obj/effect/turf_decal/tile/ship/half/green, /turf/open/floor/monotile/steel, @@ -6651,12 +6657,10 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/monotile/dark, /area/security/prison) "dhJ" = ( @@ -6675,11 +6679,10 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/easel, +/obj/machinery/computer/arcade, /obj/machinery/light{ dir = 8 }, -/obj/machinery/newscaster/directional/west, /turf/open/floor/monotile/steel, /area/security/prison) "diu" = ( @@ -6823,8 +6826,9 @@ /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/starboard) "dlI" = ( -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) +/obj/structure/curtain/obscuring/grey, +/turf/open/floor/monotile/light, +/area/security/prison) "dme" = ( /obj/item/wrench, /obj/structure/cable{ @@ -8161,14 +8165,12 @@ /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) "dWw" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/blindfold, -/obj/effect/turf_decal/stripes/line{ - dir = 4 +/obj/machinery/shower{ + dir = 1 }, -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/structure/curtain, +/turf/open/floor/monotile/light, +/area/security/prison) "dWy" = ( /obj/effect/turf_decal/loading_area{ dir = 8 @@ -8295,6 +8297,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/monotile/dark, /area/nsv/briefingroom) +"ebd" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/microwave, +/turf/open/floor/monotile/steel, +/area/security/prison) "ebg" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/turf_decal/delivery, @@ -8410,6 +8420,12 @@ }, /turf/open/floor/monotile/dark, /area/security/main) +"ecR" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "edg" = ( /obj/machinery/computer/prisoner/management, /obj/machinery/computer/ship/viewscreen, @@ -8717,7 +8733,7 @@ dir = 4 }, /turf/open/floor/monotile/steel, -/area/security/range) +/area/security/execution/transfer) "ejW" = ( /obj/machinery/light, /obj/machinery/conveyor/slow{ @@ -8921,13 +8937,16 @@ }, /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) +"eom" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "eoF" = ( /turf/template_noop, /area/maintenance/department/security/brig) -"eoL" = ( -/obj/effect/turf_decal/bot_red/left, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "eoR" = ( /obj/structure/cable{ icon_state = "0-4" @@ -9414,15 +9433,6 @@ }, /turf/open/floor/monotile/light, /area/medical/medbay/central) -"eyE" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/monotile/dark, -/area/security/prison) "eyZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -9487,12 +9497,16 @@ dir = 9 }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "eAi" = ( -/obj/machinery/shower{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/turf/open/floor/monotile/light, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/monotile/steel, /area/security/prison) "eAk" = ( /obj/structure/cable{ @@ -10057,7 +10071,7 @@ dir = 4 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -10324,19 +10338,6 @@ }, /turf/open/floor/engine, /area/science/xenobiology) -"eRx" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "eRR" = ( /obj/structure/table/reinforced, /obj/structure/window/reinforced{ @@ -10503,12 +10504,6 @@ /obj/item/storage/lockbox/medal, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/captain) -"eVs" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "eVH" = ( /obj/effect/landmark/start/research_director, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -10684,8 +10679,18 @@ /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/starboard) "faO" = ( +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 2; + icon_state = "right"; + name = "Shooting Range" + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "faU" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -11420,11 +11425,8 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/camera/autoname{ - dir = 8 - }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "fsM" = ( /obj/structure/cable{ icon_state = "4-8" @@ -11927,12 +11929,12 @@ /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) "fEZ" = ( +/obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/machinery/cryopod{ - dir = 4 - }, +/obj/structure/weightmachine/weightlifter, +/obj/machinery/newscaster/directional/west, /turf/open/floor/monotile/steel, /area/security/prison) "fFa" = ( @@ -12355,13 +12357,6 @@ }, /turf/open/floor/monotile/steel, /area/hallway/secondary/command) -"fOM" = ( -/obj/structure/chair/stool, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/monotile/dark, -/area/security/prison) "fOU" = ( /obj/machinery/rnd/production/techfab/department/security, /obj/effect/turf_decal/stripes/box, @@ -12538,16 +12533,22 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, /obj/machinery/turnstile{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/loading_area{ dir = 4 }, /obj/effect/landmark/zebra_interlock_point, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/monotile/dark, /area/security/prison) "fUr" = ( @@ -13469,16 +13470,12 @@ /turf/open/floor/monotile/light, /area/medical/storage) "gqd" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/machinery/airalarm/directional/east, /turf/open/floor/monotile/steel, -/area/security/range) +/area/security/execution/transfer) "gqg" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13877,20 +13874,11 @@ /turf/open/floor/plating, /area/security/main) "gCe" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/hydroponics/constructable, -/obj/item/reagent_containers/glass/bucket, -/obj/item/seeds/glowshroom, -/obj/machinery/light{ - dir = 4 +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/monotile/steel, -/area/security/prison) +/turf/open/floor/engine, +/area/holodeck/prison) "gCE" = ( /obj/structure/closet/wardrobe/pjs, /obj/machinery/light_switch/south, @@ -14052,21 +14040,6 @@ /obj/structure/girder, /turf/open/floor/plating, /area/maintenance/nsv/deck1/aft) -"gGM" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/computer/cryopod{ - density = 1; - dir = 8; - icon = 'icons/obj/computer.dmi'; - icon_state = "computer" - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "gGX" = ( /obj/effect/turf_decal/tile/ship/blue{ dir = 4 @@ -14727,8 +14700,14 @@ /turf/open/floor/monotile/light, /area/medical/virology) "gWD" = ( -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/machinery/shower{ + dir = 1 + }, +/obj/item/soap/nanotrasen, +/obj/item/bikehorn/rubberducky, +/obj/structure/curtain, +/turf/open/floor/monotile/light, +/area/security/prison) "gWE" = ( /obj/machinery/mech_bay_recharge_port, /obj/effect/turf_decal/bot, @@ -15182,29 +15161,6 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/nsv/deck1/aft) -"hgM" = ( -/obj/machinery/door/airlock/ship/hatch{ - name = "Prisoner Transfer Centre"; - req_one_access_txt = "3" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/effect/landmark/zebra_interlock_point, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "hgO" = ( /obj/effect/turf_decal/delivery, /obj/structure/cable/yellow{ @@ -15346,15 +15302,6 @@ }, /turf/open/floor/plating, /area/security/brig) -"hjK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/monotile/dark, -/area/security/prison) "hkK" = ( /turf/open/floor/carpet/ship, /area/nsv/crew_quarters/heads/maa) @@ -15562,16 +15509,10 @@ /turf/open/floor/monotile/light, /area/medical/medbay/central) "hpc" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/washing_machine, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) "hpg" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/effect/turf_decal/bot, @@ -15611,6 +15552,9 @@ /obj/machinery/light{ dir = 4 }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, /turf/open/floor/monotile/steel, /area/security/warden) "hpK" = ( @@ -15850,15 +15794,19 @@ }, /area/maintenance/nsv/hangar) "huQ" = ( -/obj/structure/table, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/clothing/head/chefhat, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/hydroponics/constructable, +/obj/item/reagent_containers/glass/bucket, +/obj/item/seeds/glowshroom, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/status_display/ai/east, /turf/open/floor/monotile/steel, /area/security/prison) "hvj" = ( @@ -17117,6 +17065,14 @@ /obj/effect/landmark/zebra_interlock_point, /turf/open/floor/monotile/steel, /area/shuttle/turbolift) +"hYp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 8 + }, +/obj/structure/table, +/obj/item/storage/pill_bottle/dice, +/turf/open/floor/monotile/dark, +/area/security/prison) "hYU" = ( /obj/machinery/suit_storage_unit/pilot, /turf/open/floor/plasteel/ridged/steel, @@ -18190,9 +18146,6 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/light{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 9 }, @@ -18584,6 +18537,15 @@ /obj/effect/spawner/lootdrop/maintenance/two, /turf/open/floor/plating, /area/maintenance/nsv/deck1/aft) +"iGY" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "iHm" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/event_spawn, @@ -19246,6 +19208,16 @@ }, /turf/open/floor/monotile/dark, /area/crew_quarters/heads/hor) +"iVS" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "iWp" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 8 @@ -20274,15 +20246,11 @@ /turf/open/floor/plating/airless, /area/nsv/hanger) "jup" = ( -/obj/machinery/door/window/westleft{ - base_state = "right"; - dir = 2; - icon_state = "right"; - name = "Shooting Range" +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "jus" = ( /turf/template_noop, /area/maintenance/nsv/deck1/starboard) @@ -20715,6 +20683,16 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/aft) +"jGl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/washing_machine, +/turf/open/floor/monotile/steel, +/area/security/prison) "jGD" = ( /obj/structure/lattice/catwalk/over/ship/dark, /obj/machinery/door/firedoor/border_only{ @@ -20862,8 +20840,8 @@ /obj/structure/cable{ icon_state = "2-4" }, -/turf/open/floor/monotile/dark, -/area/security/prison) +/turf/open/floor/engine, +/area/holodeck/prison) "jJA" = ( /obj/machinery/sparker{ id = "Xenobio"; @@ -21077,13 +21055,6 @@ }, /turf/open/floor/monotile/steel, /area/security/brig) -"jNT" = ( -/obj/machinery/camera/motion{ - c_tag = "Armory - External 2" - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "jOC" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -21661,6 +21632,13 @@ }, /turf/open/floor/monotile/steel, /area/crew_quarters/nsv/officerquarters) +"khh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/biogenerator, +/turf/open/floor/monotile/steel, +/area/security/prison) "khm" = ( /obj/effect/landmark/start/paramedic, /turf/open/floor/monotile/light, @@ -22034,15 +22012,6 @@ /obj/item/ship_weapon/parts/missile/iff_card, /turf/open/floor/monotile/dark, /area/nsv/weapons/starboard) -"koD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "koL" = ( /obj/structure/cable{ icon_state = "4-8" @@ -22497,6 +22466,9 @@ dir = 8 }, /obj/machinery/firealarm/directional/east, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/monotile/steel, /area/security/prison) "kAk" = ( @@ -22824,10 +22796,6 @@ "kLp" = ( /turf/closed/wall/ship, /area/maintenance/nsv/deck1/starboard) -"kLK" = ( -/obj/effect/turf_decal/bot_white, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "kLO" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -23114,7 +23082,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/ship/preopen{ dir = 4; - id = "Prison Gate"; + id = "Prisongate"; name = "Prison Lockdown Blast Doors" }, /obj/structure/cable{ @@ -24603,8 +24571,21 @@ /area/maintenance/nsv/deck1/port/aft) "lzE" = ( /obj/machinery/firealarm/directional/east, +/obj/machinery/photocopier{ + pixel_y = 3 + }, /turf/open/floor/monotile/dark, /area/security/warden) +"lzL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "lzR" = ( /obj/structure/closet/wardrobe/chemistry_white, /obj/effect/turf_decal/tile/ship/full/yellow, @@ -25062,7 +25043,7 @@ dir = 8 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -25266,7 +25247,7 @@ dir = 8 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -25405,10 +25386,6 @@ }, /turf/open/floor/plasteel/ridged/steel, /area/hallway/nsv/deck1/frame1/central) -"lSo" = ( -/obj/effect/turf_decal/bot_red/right, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "lSr" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -26150,10 +26127,13 @@ /turf/open/floor/monotile/light, /area/medical/medbay/aft) "mlp" = ( -/obj/effect/spawner/structure/window/reinforced/ship, /obj/structure/cable{ icon_state = "0-2" }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, /turf/open/floor/plating, /area/security/prison) "mlr" = ( @@ -26838,10 +26818,15 @@ /turf/open/floor/monotile/dark, /area/security/warden) "mzY" = ( -/obj/structure/target_stake, -/obj/item/target/syndicate, +/obj/structure/chair{ + dir = 1; + name = "execution" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "mAH" = ( /obj/structure/table, /obj/item/cautery{ @@ -27414,19 +27399,11 @@ /turf/open/floor/plating, /area/bridge) "mMA" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/table, -/obj/structure/bedsheetbin, /obj/structure/cable{ icon_state = "4-8" }, -/turf/open/floor/monotile/steel, -/area/security/prison) +/turf/open/floor/engine, +/area/holodeck/prison) "mMP" = ( /obj/structure/rack, /obj/item/storage/firstaid/radbgone, @@ -27513,27 +27490,51 @@ /turf/open/floor/plasteel/tech/grid, /area/nsv/weapons/ordnance) "mPo" = ( -/obj/structure/rack, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/gun/energy/laser/practice{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/machinery/camera{ - c_tag = "Firing Range"; - dir = 8 - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, +/obj/structure/closet/secure_closet{ + desc = "It's a card-locked storage unit.
One magazine in each set is lethal. The other two are not."; + name = "Firing Squad Magazine" + }, +/obj/item/ammo_box/magazine/peacekeeper/lethal{ + name = "M2A45 pulse rifle magazine (Blind Set 2)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 2)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 2)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 3)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 3)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 1)" + }, +/obj/item/ammo_box/magazine/peacekeeper/lethal{ + name = "M2A45 pulse rifle magazine (Blind Set 3)" + }, +/obj/item/ammo_box/magazine/peacekeeper/lethal{ + name = "M2A45 pulse rifle magazine (Blind Set 1)" + }, +/obj/item/ammo_box/magazine/peacekeeper{ + icon_state = "peacekeeper"; + name = "M2A45 pulse rifle magazine (Blind Set 1)" + }, /turf/open/floor/monotile/steel, -/area/security/range) +/area/security/execution/transfer) "mPs" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -27933,14 +27934,13 @@ /turf/closed/wall/ship, /area/science/research) "nbh" = ( -/obj/effect/spawner/structure/window/reinforced/ship, -/obj/machinery/door/poddoor/shutters/ship{ - dir = 4; - id = "firingsquad"; - name = "security shutters" +/obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" }, /turf/open/floor/plating, -/area/security/execution/transfer) +/area/security/prison) "nby" = ( /obj/structure/lattice/catwalk/over/ship/dark, /obj/structure/disposalpipe/segment, @@ -27999,11 +27999,6 @@ /obj/structure/cable, /turf/open/floor/monotile/dark, /area/science/explab) -"ncu" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/turf/open/floor/monotile/dark, -/area/security/prison) "ncG" = ( /obj/structure/chair, /obj/structure/cable{ @@ -28431,6 +28426,14 @@ /obj/effect/landmark/start/roboticist, /turf/open/floor/plasteel/techmaint, /area/science/robotics/lab) +"nkN" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/monotile/steel, +/area/security/prison) "nkQ" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/stripes/corner{ @@ -29584,6 +29587,12 @@ /obj/machinery/light, /turf/open/floor/monotile/dark, /area/science/storage) +"nPM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "nPS" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/monotile/steel, @@ -29751,7 +29760,7 @@ /obj/effect/turf_decal/delivery, /obj/machinery/door/poddoor/ship/preopen{ dir = 4; - id = "Prison Gate"; + id = "Prisongate"; name = "Prison Lockdown Blast Doors" }, /turf/open/floor/monotile/steel, @@ -29982,6 +29991,9 @@ "oaX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 + }, /turf/open/floor/plating, /area/security/prison) "oba" = ( @@ -30152,6 +30164,7 @@ network = list("ss13","prison") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, +/obj/machinery/computer/lore_terminal, /turf/open/floor/monotile/steel, /area/security/prison) "oeS" = ( @@ -30420,16 +30433,6 @@ }, /turf/open/floor/monotile/steel, /area/crew_quarters/nsv/officerquarters) -"okD" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/camera/autoname{ - dir = 4 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "oly" = ( /obj/structure/cable{ icon_state = "1-2" @@ -31836,6 +31839,20 @@ /obj/effect/landmark/zebra_interlock_point, /turf/open/floor/monotile/steel, /area/science/research) +"oSq" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "oSE" = ( /obj/machinery/door/airlock/ship{ name = "E.X.P.E.R.I-MENTOR Lab"; @@ -31874,9 +31891,16 @@ dir = 4 }, /obj/machinery/firealarm/directional/east, -/obj/machinery/photocopier{ +/obj/structure/rack, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -3; pixel_y = 3 }, +/obj/item/screwdriver{ + pixel_y = 5 + }, +/obj/item/multitool, /turf/open/floor/monotile/steel, /area/security/warden) "oSX" = ( @@ -32406,22 +32430,25 @@ /turf/closed/wall/r_wall/ship, /area/science/xenobiology) "pdS" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/turf_decal/delivery/red, +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_y = -25 + }, +/obj/structure/bedsheetbin, +/obj/structure/table, /turf/open/floor/monotile/steel, -/area/security/execution/transfer) +/area/security/prison) "ped" = ( /obj/machinery/ai_slipper{ uses = 10 }, /turf/open/floor/circuit, /area/ai_monitored/turret_protected/ai) -"pee" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/monotile/dark, -/area/security/prison) "pel" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/ship/preopen{ @@ -32499,10 +32526,6 @@ /turf/open/floor/plating, /area/medical/medbay/lobby) "pgD" = ( -/obj/machinery/door/airlock/ship/security/glass{ - name = "Firing Range"; - req_one_access_txt = "1" - }, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -32513,6 +32536,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/effect/landmark/zebra_interlock_point, +/obj/machinery/door/airlock/ship/hatch{ + name = "Prisoner Transfer Centre"; + req_one_access_txt = "3" + }, /turf/open/floor/monotile/steel, /area/security/prison) "pgP" = ( @@ -32833,10 +32860,12 @@ /turf/open/floor/monotile/dark/airless, /area/nsv/hanger) "plr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, /turf/open/floor/monotile/steel, /area/security/prison) "plA" = ( @@ -32952,11 +32981,11 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "poL" = ( -/obj/effect/turf_decal/tile/red, +/obj/structure/holohoop, /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/holohoop, +/obj/effect/turf_decal/tile/red, /turf/open/floor/monotile/steel, /area/security/prison) "poM" = ( @@ -32972,6 +33001,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/seed_extractor, /turf/open/floor/monotile/steel, /area/security/prison) "poW" = ( @@ -33861,14 +33891,6 @@ }, /turf/open/floor/monotile/dark, /area/science/research) -"pKb" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/computer/arcade, -/turf/open/floor/monotile/steel, -/area/security/prison) "pKh" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -33964,6 +33986,19 @@ }, /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) +"pMK" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "pNv" = ( /obj/machinery/door/airlock/ship/security/glass{ name = "Brig Control"; @@ -34174,16 +34209,6 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/fore) -"pUN" = ( -/obj/machinery/button/door{ - dir = 8; - id = "firingsquad"; - name = "Firing Squad Shutters"; - pixel_y = -28; - req_one_access_txt = "3" - }, -/turf/open/floor/monotile/steel, -/area/security/execution/transfer) "pUQ" = ( /obj/structure/sign/ship/securearea{ pixel_y = 32 @@ -34395,7 +34420,7 @@ dir = 8 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -34791,20 +34816,8 @@ /turf/closed/wall/r_wall/ship, /area/ai_monitored/turret_protected/aisat_interior) "qmA" = ( -/obj/item/storage/crayons, -/obj/item/paper/guides/jobs/hydroponics, -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) +/turf/open/floor/engine, +/area/holodeck/prison) "qmD" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -35031,8 +35044,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 9 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 }, /turf/open/floor/monotile/steel, /area/security/prison) @@ -35394,7 +35407,7 @@ dir = 1 }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "qzV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/monotile/dark, @@ -35588,6 +35601,9 @@ /obj/structure/toilet{ dir = 8 }, +/obj/machinery/light/small{ + dir = 1 + }, /turf/open/floor/monotile/light, /area/security/prison) "qDi" = ( @@ -35720,7 +35736,7 @@ dir = 8 }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "qGc" = ( /obj/structure/cable{ icon_state = "1-2" @@ -35757,11 +35773,14 @@ /turf/open/floor/monotile/dark, /area/security/warden) "qGK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 +/obj/effect/turf_decal/tile/red{ + dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "qHp" = ( /obj/effect/turf_decal/trimline/red/filled/end{ dir = 8 @@ -36042,6 +36061,13 @@ }, /turf/open/floor/monotile/steel, /area/security/brig) +"qMV" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/monotile/steel, +/area/security/prison) "qNi" = ( /obj/structure/table, /obj/item/clothing/under/rank/medical/doctor/purple{ @@ -36088,7 +36114,7 @@ dir = 5 }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "qNQ" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -36152,45 +36178,9 @@ /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/frame1/central) "qQj" = ( -/obj/structure/closet/secure_closet{ - desc = "It's a card-locked storage unit.
One magazine in each set is lethal. The other two are not."; - name = "Firing Squad Magazine" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 1)" - }, -/obj/item/ammo_box/magazine/peacekeeper/lethal{ - name = "M2A45 pulse rifle magazine (Blind Set 1)" - }, -/obj/item/ammo_box/magazine/peacekeeper/lethal{ - name = "M2A45 pulse rifle magazine (Blind Set 3)" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 1)" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 3)" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 3)" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 2)" - }, -/obj/item/ammo_box/magazine/peacekeeper{ - icon_state = "peacekeeper"; - name = "M2A45 pulse rifle magazine (Blind Set 2)" - }, -/obj/item/ammo_box/magazine/peacekeeper/lethal{ - name = "M2A45 pulse rifle magazine (Blind Set 2)" - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/machinery/light, +/turf/open/floor/monotile/light, +/area/security/prison) "qQx" = ( /obj/effect/turf_decal/tile/ship/half/blue, /obj/structure/cable{ @@ -36745,7 +36735,13 @@ /turf/open/floor/monotile/steel, /area/security/brig) "rfG" = ( -/obj/effect/spawner/structure/window/reinforced, +/obj/effect/spawner/structure/window/reinforced/prison, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, /turf/open/floor/plating, /area/security/prison) "rfO" = ( @@ -36974,15 +36970,6 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/fore) -"rmS" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/monotile/steel, -/area/security/prison) "rne" = ( /obj/machinery/door/firedoor/border_only{ dir = 4 @@ -37029,20 +37016,6 @@ "roe" = ( /turf/closed/wall/ship, /area/hallway/nsv/deck1/frame1/starboard) -"ror" = ( -/obj/machinery/door/airlock/ship/maintenance{ - name = "Maintenance Access Firing Range"; - req_one_access_txt = "1" - }, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/landmark/zebra_interlock_point, -/turf/open/floor/plating, -/area/maintenance/department/bridge) "rot" = ( /obj/machinery/door/airlock/ship/maintenance{ name = "Maintenance Access Infirmary"; @@ -37564,9 +37537,13 @@ /turf/open/floor/monotile/steel, /area/science/mixing) "rCJ" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/obj/effect/spawner/structure/window/reinforced/prison, +/obj/structure/cable, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "rCV" = ( /obj/effect/landmark/start/pilot, /turf/open/floor/carpet/blue, @@ -37641,13 +37618,6 @@ network = list("ss13","prison") }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/monotile/steel, -/area/security/prison) -"rEu" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, /obj/machinery/computer/lore_terminal, /turf/open/floor/monotile/steel, /area/security/prison) @@ -38315,18 +38285,6 @@ }, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/aft) -"rZR" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "rZS" = ( /obj/machinery/holopad, /obj/effect/landmark/event_spawn, @@ -38700,6 +38658,24 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/maintenance/nsv/deck1/port/aft) +"skz" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/radio/intercom{ + desc = "Talk through this. It looks like it has been modified to not broadcast."; + name = "Prison Intercom"; + pixel_x = -28; + prison_radio = 1 + }, +/obj/machinery/vending/sustenance{ + desc = "A vending machine normally reserved for work camps."; + name = "\improper sustenance vendor"; + product_slogans = "Enjoy your meal.;Enough calories to support any worker." + }, +/turf/open/floor/monotile/steel, +/area/security/prison) "skH" = ( /obj/structure/bed/roller, /obj/effect/turf_decal/tile/ship/half/green{ @@ -38964,12 +38940,13 @@ /turf/open/floor/plating, /area/maintenance/nsv/deck1/aft) "sql" = ( -/obj/structure/window/reinforced, /obj/effect/turf_decal/stripes/line{ - dir = 6 + dir = 8 }, -/turf/open/floor/plating, -/area/security/range) +/obj/structure/table, +/obj/item/storage/box/bodybags, +/turf/open/floor/monotile/steel, +/area/security/execution/transfer) "sqD" = ( /obj/item/stack/sheet/durasteel/twenty, /turf/open/floor/plating, @@ -39026,6 +39003,13 @@ /obj/effect/landmark/zebra_interlock_point, /turf/open/floor/monotile/dark, /area/nsv/briefingroom) +"srW" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/security/execution/transfer) "ssN" = ( /turf/open/floor/plating, /area/maintenance/department/security/brig) @@ -39743,6 +39727,9 @@ name = "Cell 3 Lockdown" }, /obj/effect/landmark/zebra_interlock_point, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, /turf/open/floor/monotile/steel, /area/security/prison) "sHn" = ( @@ -39852,15 +39839,6 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/monotile/steel, /area/nsv/briefingroom) -"sJp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/monotile/dark, -/area/security/prison) "sJq" = ( /obj/machinery/ai_slipper{ uses = 10 @@ -40435,14 +40413,11 @@ /area/nsv/hanger/notkmcstupidhanger/atc) "sVy" = ( /obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/item/radio/intercom{ - desc = "Talk through this. It looks like it has been modified to not broadcast."; - name = "Prison Intercom"; - pixel_x = -28; - prison_radio = 1 +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/machinery/camera/autoname{ + dir = 4; + network = list("ss13","prison") }, /turf/open/floor/monotile/steel, /area/security/prison) @@ -40565,9 +40540,6 @@ name = "nanoweave carpet (bluer)" }, /area/bridge/meeting_room) -"sXx" = ( -/turf/closed/wall/r_wall/ship, -/area/security/range) "sXy" = ( /obj/machinery/camera/autoname{ dir = 4 @@ -41855,9 +41827,13 @@ /turf/open/space/basic, /area/space/nearstation) "tFK" = ( -/obj/effect/spawner/structure/window/reinforced/ship, -/obj/structure/cable, -/turf/open/floor/plating, +/obj/structure/curtain/obscuring/grey, +/obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only{ + dir = 1 + }, +/obj/effect/landmark/zebra_interlock_point, +/turf/open/floor/monotile/light, /area/security/prison) "tFO" = ( /obj/machinery/disposal/bin, @@ -42526,11 +42502,12 @@ /turf/open/floor/monotile/dark, /area/teleporter) "uaL" = ( +/obj/structure/window/reinforced, /obj/effect/turf_decal/stripes/line{ - dir = 4 + dir = 6 }, /turf/open/floor/plating, -/area/security/range) +/area/security/execution/transfer) "ubk" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -43464,6 +43441,15 @@ }, /turf/open/floor/monotile/steel, /area/crew_quarters/nsv/officerquarters) +"uyk" = ( +/obj/structure/table, +/obj/item/pen, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "uyp" = ( /obj/effect/landmark/start/detective, /obj/effect/landmark/xeno_spawn, @@ -43619,15 +43605,6 @@ }, /turf/open/floor/monotile/dark/airless, /area/nsv/hanger) -"uAX" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/monotile/dark, -/area/security/prison) "uBf" = ( /obj/structure/closet/crate, /obj/effect/spawner/lootdrop/maintenance, @@ -43685,8 +43662,17 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/machinery/seed_extractor, -/obj/machinery/status_display/ai/east, +/obj/machinery/status_display/evac/east, +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/sugar{ + pixel_x = 4 + }, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, /turf/open/floor/monotile/steel, /area/security/prison) "uCv" = ( @@ -44313,11 +44299,6 @@ }, /turf/open/floor/monotile/dark, /area/crew_quarters/dorms/nsv/state_room) -"uQD" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice, -/turf/open/floor/monotile/dark, -/area/security/prison) "uQP" = ( /obj/item/poster/random_contraband, /obj/structure/closet/crate, @@ -44739,14 +44720,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/carpet/blue, /area/crew_quarters/dorms/nsv/state_room) -"vat" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/washing_machine, -/turf/open/floor/monotile/steel, -/area/security/prison) "vav" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -45177,11 +45150,11 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 10 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 10 }, /turf/open/floor/plating, /area/security/prison) @@ -46354,10 +46327,6 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/monotile/steel, /area/science/nsv/astronomy) -"vLV" = ( -/obj/item/ship_weapon/ammunition/torpedo/freight, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) "vLZ" = ( /obj/structure/closet/radiation, /turf/open/floor/plating{ @@ -46520,15 +46489,30 @@ /turf/open/floor/plating, /area/maintenance/nsv/deck1/starboard/aft) "vSW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/computer/security/telescreen/entertainment{ + pixel_x = 30 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 +/obj/machinery/light{ + brightness = 3; + bulb_vacuum_brightness = 2; + dir = 4; + nightshift_brightness = 1 }, -/obj/machinery/biogenerator, -/obj/machinery/status_display/evac/east, -/turf/open/floor/monotile/steel, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/turf/open/floor/monotile/dark, /area/security/prison) "vTb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -47870,14 +47854,15 @@ /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) "wxw" = ( -/obj/machinery/power/apc/auto_name/north{ - pixel_y = 24 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "0-2" +/obj/machinery/computer/cryopod{ + pixel_x = -32 }, -/turf/open/floor/plasteel/dark, -/area/security/execution/transfer) +/turf/open/floor/monotile/steel, +/area/security/prison) "wxI" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood{ @@ -48110,13 +48095,6 @@ }, /turf/open/floor/noslip/dark, /area/nsv/weapons/starboard) -"wES" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/monotile/dark, -/area/security/prison) "wFb" = ( /obj/structure/cable{ icon_state = "1-2" @@ -48180,7 +48158,7 @@ dir = 8 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -48385,23 +48363,6 @@ }, /turf/closed/wall/ship, /area/nsv/weapons/starboard) -"wLQ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = -25 - }, -/turf/open/floor/monotile/steel, -/area/security/prison) "wMq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/ship/preopen{ @@ -49667,12 +49628,12 @@ /turf/open/floor/plating, /area/medical/genetics) "xsA" = ( -/obj/item/soap/nanotrasen, -/obj/machinery/shower{ - dir = 4 +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/monotile/light, +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/monotile/steel, /area/security/prison) "xsK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -49744,17 +49705,6 @@ }, /turf/open/floor/monotile/steel, /area/medical/storage) -"xuk" = ( -/obj/structure/curtain/obscuring/grey, -/obj/machinery/door/firedoor/border_only{ - dir = 8 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/effect/landmark/zebra_interlock_point, -/turf/open/floor/monotile/light, -/area/security/prison) "xuF" = ( /obj/structure/cable{ icon_state = "2-4" @@ -49979,10 +49929,7 @@ /turf/open/floor/plating, /area/nsv/hanger/notkmcstupidhanger/pilot) "xzg" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/monotile/light, +/turf/open/floor/monotile/steel, /area/security/prison) "xzM" = ( /obj/structure/lattice/catwalk/over/ship/dark, @@ -50992,6 +50939,12 @@ /obj/machinery/microwave, /turf/open/floor/monotile/steel, /area/security/brig) +"xWa" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/monotile/dark, +/area/security/prison) "xWS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -51183,7 +51136,7 @@ dir = 4 }, /obj/machinery/turnstile{ - dir = 4 + dir = 8 }, /obj/machinery/door/firedoor/border_only{ dir = 8 @@ -51445,14 +51398,6 @@ }, /turf/open/floor/carpet/blue, /area/crew_quarters/nsv/officerquarters) -"yiz" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/computer/ship/viewscreen, -/turf/open/floor/monotile/steel, -/area/security/prison) "yiA" = ( /turf/template_noop, /area/maintenance/nsv/deck1/port/fore) @@ -93183,7 +93128,7 @@ omK qAa bEM jVZ -nrx +cla aaa tFC aaa @@ -93697,7 +93642,7 @@ qAa qAa bEM jVZ -nrx +cla aaa tFC aaa @@ -93954,7 +93899,7 @@ ubT qAa vcd jVZ -nrx +cla aaa tFC aaa @@ -94211,7 +94156,7 @@ qAa qAa ePO jVZ -jNT +cla aaa tFC aaa @@ -94468,7 +94413,7 @@ wCN qAa aMQ jVZ -nrx +cla aaa tFC aaa @@ -94982,7 +94927,7 @@ jVZ jVZ jVZ jVZ -nrx +cla aaa tFC aaa @@ -95239,9 +95184,9 @@ sRm oAa gdd xPs -nrx -aaa +cla aaa +tFC aaa aaa aaa @@ -95496,9 +95441,9 @@ fci jDN uYM sGf -nrx -aaa +cla aaa +tFC aaa aaa aaa @@ -95753,9 +95698,9 @@ diu qch aCZ xPs -nrx +cla aaU -aaa +tFC aaa aaa aaa @@ -96011,8 +95956,8 @@ cSf cSf cSf nrx -aaa -aaa +nrx +tFC aaa aaa aaa @@ -96267,9 +96212,9 @@ nfL wkn cSf qVi -nrx -aaa +cla aaa +tFC aaa aaa aaa @@ -98289,16 +98234,16 @@ pqY fJc jGO ctU -sXx +xIu ezw qFN qFN qFN -qFN +srW cfB ddA ejh -rfG +oCO pqU dOa tbV @@ -98546,11 +98491,11 @@ pqY vav jGO iDH -sXx +xIu qzM mzY -faO -faO +jup +jup faO jup dak @@ -98803,19 +98748,19 @@ pqY xKq ybx eEY -sXx +xIu qND fsA -uaL -uaL +fsA +fsA uaL sql gqd mPo oCO -lIf -lIf -lIf +pqU +xzg +pqU lIf lIf eDY @@ -98823,7 +98768,7 @@ lIf lIf rfG bwc -rfG +rCJ lIf lIf eHE @@ -99060,15 +99005,15 @@ pqY rne pkz rne -sXx -sXx -sXx -sXx -ror -sXx -sXx -sXx -sXx +xIu +xIu +xIu +xIu +xIu +xIu +xIu +xIu +xIu oCO xsA xzg @@ -99327,9 +99272,9 @@ keD nKG lGu oCO -kjQ -frb -qDh +nkN +ecR +alx lIf oeQ plr @@ -99585,7 +99530,7 @@ iBF lBU oCO lIf -xuk +lIf lIf lIf lIf @@ -99594,15 +99539,15 @@ lIf lIf rfG fUe -rfG +rCJ lIf lIf sGW lIf -xIu -xIu -hgM -xIu +oCO +oCO +oCO +oCO oCO oCO oCO @@ -99841,28 +99786,28 @@ sXB rXD nhp oCO -alx -rLy -rmS -pKb -okD -xaM +qmA +qmA +qmA +qmA +qmA +xWa sVy dih rLy -eRx -rLy +xaM +bjn aLH -nkU -rLy +skz +iVS fEZ -xIu +nkU wxw -rZR -clE -rCJ +nkU +oCO +kjQ gWD -xIu +oCO aaa aaa aaa @@ -100098,28 +100043,28 @@ eEY iBF qPj oCO -rEu -hIv -hIv +qmA +qmA +qmA +qmA +qmA +xWa +qMV hIv hIv rpi hIv hIv hIv -hjK -hIv +nPM hIv hIv hIv -kou -xIu -vLV qGK -gWD -gWD +tFK +frb qQj -xIu +oCO aaa aaa aaa @@ -100355,28 +100300,28 @@ mQZ oaH rkX oCO -yiz -hIv +qmA +qmA +qmA +qmA +qmA +bXA +qMV aLt vbf -ncu -fOM -hIv +cMC +aLt hIv hIv -cMC +cjH hZX hIv hIv -hIv -gGM -xIu -cIJ -koD -bCz -cIJ +kou +oCO +frb dWw -xIu +oCO aaa aaa aaa @@ -100612,28 +100557,28 @@ mQZ oaH czm oCO +qmA +qmA +qmA +qmA +qmA +bXA poL -sJp aLt -eyE -uQD -fOM +uyk +hYp +aLt hIv wFM hIv -ieS hIv hIv hIv -wES aGD -xIu -eoL -kLK -lSo -dlI -pUN -xIu +oCO +kjQ +frb +oCO aaa aaU aaa @@ -100815,121 +100760,121 @@ aaa aaa aaa aaa -djP -dwy -dwy -dwy -dwy -dwy -dwy -dwy -dwy -dwy -rqo -uwq -rqo -rqo -bKl -wwa -muN -nCN -rqo -uzU -ojG -tqU -rNm -wrP -mxX -wAi -tWR -bco -hqs -xlT -ncY -wIk -sUd -wIk -wIk -wIk -kvP -icv -uph -mEQ -dvg -lgf -nUj -seo -sNf -kjd -rGR -rGR -mvE -iDH -iDH -vWH -iDH -kjd -hpc -hIv -jJo -itX -itX -mFg -itX -jZR -itX -uAX -itX -itX -mqi -aLt -bfX -xIu -cpS -dlI -dlI -dlI -dlI -xIu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +djP +dwy +dwy +dwy +dwy +dwy +dwy +dwy +dwy +dwy +rqo +uwq +rqo +rqo +bKl +wwa +muN +nCN +rqo +uzU +ojG +tqU +rNm +wrP +mxX +wAi +tWR +bco +hqs +xlT +ncY +wIk +sUd +wIk +wIk +wIk +kvP +icv +uph +mEQ +dvg +lgf +nUj +seo +sNf +kjd +rGR +rGR +mvE +iDH +iDH +vWH +iDH +kjd +qmA +qmA +jJo +gCe +gCe +iGY +lzL +jZR +itX +mFg +itX +itX +jZR +itX +itX +itX +mqi +jGl +oCO +dlI +oCO +oCO +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -101126,28 +101071,28 @@ eEY qFe wtz kjd -vat -hIv +qmA +qmA +mMA +qmA +qmA +bqB +qMV ieS hIv hIv hIv hIv -ieS -pee +eom hIv hIv hIv ieS -aLt -wLQ -xIu -eVs pdS -dlI -dlI -nbh -nbh +oCO +qDh +oCO +oCO aaa aaa aaa @@ -101383,27 +101328,27 @@ cyV rfO uen kjd -aZQ -poO +qmA +qmA mMA -poO +qmA qmA vSW -kPp +ebd aCt bYs uCl -gCe -uyB -wHl +kPp +kPp +oSq poO huQ -xIu -dlI -dlI -dlI -nbh -nbh +uyB +wHl +khh +oCO +oCO +oCO aaa aaa aaa @@ -101643,23 +101588,23 @@ kjd oCO mlp bkO -tFK +nbh oCO oCO mlp bkO -tFK +nbh oCO oCO mlp bkO -tFK -oCO -xIu -nbh -nbh nbh +oCO +oCO +pMK nbh +oCO +oCO aaa aaa aaa @@ -101896,27 +101841,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx +nrx aaa aaa aaa @@ -102154,25 +102099,25 @@ aaa aaa aaa aaa +nrx aaa aaa aaa +nrx aaa aaa aaa aaa +nrx aaa aaa aaa aaa +nrx aaa aaa aaa -aaa -aaa -aaa -aaa -aaa +nrx aaa aaa aaa @@ -102410,27 +102355,27 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc +hpc aaa aaa aaa @@ -102682,7 +102627,7 @@ aaa aaa aaa aaa -aaa +aaU aaa aaa aaa diff --git a/_maps/map_files/Hammerhead/Hammerhead.dmm b/_maps/map_files/Hammerhead/Hammerhead.dmm index a3dbae2f4e2..28830c9cdc4 100644 --- a/_maps/map_files/Hammerhead/Hammerhead.dmm +++ b/_maps/map_files/Hammerhead/Hammerhead.dmm @@ -2720,6 +2720,7 @@ pixel_x = -26 }, /obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only/directional/north, /turf/open/floor/durasteel/eris_techfloor_alt, /area/security/prison) "aiV" = ( @@ -4573,6 +4574,7 @@ icon_state = "1-4" }, /obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only/directional/north, /turf/open/floor/durasteel, /area/security/prison) "aoL" = ( @@ -5194,6 +5196,7 @@ icon_state = "0-8" }, /obj/machinery/door/firedoor/border_only, +/obj/machinery/door/firedoor/border_only/directional/north, /turf/open/floor/durasteel/eris_techfloor_alt, /area/security/prison) "aqH" = ( @@ -6660,7 +6663,15 @@ /area/crew_quarters/dorms) "avJ" = ( /obj/structure/table/reinforced, -/obj/machinery/recharger, +/obj/machinery/recharger{ + pixel_x = -6 + }, +/obj/machinery/button/door{ + id = "Prisongate"; + name = "Prison Lockdown"; + req_access_txt = "63"; + pixel_x = 6 + }, /turf/open/floor/plasteel/dark, /area/security/warden) "avK" = ( @@ -7751,15 +7762,18 @@ /turf/open/floor/plasteel/white, /area/medical/genetics/cloning) "ayO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, /obj/effect/turf_decal/tile/red{ dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, /turf/open/floor/durasteel, /area/security/prison) "ayP" = ( @@ -11021,14 +11035,18 @@ /area/library/lounge) "aJw" = ( /obj/effect/turf_decal/tile/red{ - dir = 1 + dir = 4 }, /obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/structure/table/reinforced, -/obj/machinery/microwave, -/turf/open/floor/durasteel/eris_techfloor_alt, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/durasteel, /area/security/prison) "aJx" = ( /obj/effect/spawner/structure/window/reinforced, @@ -11144,8 +11162,6 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/table/reinforced, -/obj/item/storage/box/donkpockets, /obj/machinery/camera/autoname, /turf/open/floor/durasteel/eris_techfloor_alt, /area/security/prison) @@ -13106,15 +13122,14 @@ /turf/open/floor/durasteel, /area/security/prison) "aQb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 9 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/durasteel, /area/security/prison) "aQc" = ( @@ -13166,12 +13181,11 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) "aQj" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/red, -/obj/structure/sign/poster/official/random{ - pixel_x = 32 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 }, /turf/open/floor/durasteel, /area/security/prison) @@ -14789,9 +14803,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 10 - }, /obj/machinery/door_timer{ id = "pw_5"; name = "Cell 5"; @@ -14803,6 +14814,9 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, /turf/open/floor/durasteel, /area/security/prison) "aVE" = ( @@ -20840,6 +20854,27 @@ "bUN" = ( /turf/closed/wall/r_wall/ship, /area/maintenance/department/medical) +"bVe" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/obj/item/prison_scanner, +/turf/open/floor/durasteel/eris_techfloor_alt, +/area/security/prison) "bVh" = ( /obj/machinery/armour_plating_nanorepair_pump/forward_port{ apnw_id = "poolnoodles" @@ -21006,6 +21041,15 @@ "cag" = ( /turf/closed/wall/r_wall/ship, /area/science/server) +"cai" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/durasteel, +/area/security/prison) "cam" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -22219,6 +22263,23 @@ /obj/machinery/light_switch/west, /turf/open/floor/carpet/ship, /area/bridge/meeting_room) +"cTF" = ( +/obj/structure/table/reinforced, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/reagent_containers/food/condiment/sugar{ + pixel_x = 4 + }, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_x = -5 + }, +/turf/open/floor/durasteel, +/area/security/prison) "cTG" = ( /obj/structure/closet/emcloset, /turf/open/floor/plating, @@ -24884,6 +24945,24 @@ }, /turf/open/floor/plasteel/techmaint, /area/engine/atmos) +"eGK" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/turf/open/floor/durasteel, +/area/security/prison) "eGO" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -26139,6 +26218,16 @@ }, /turf/open/floor/plasteel/techmaint, /area/engine/atmospherics_engine) +"fxf" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/item/storage/bag/tray, +/obj/item/storage/box/donkpockets, +/turf/open/floor/durasteel, +/area/security/prison) "fxl" = ( /obj/effect/spawner/structure/window/reinforced/ship, /turf/open/floor/plating, @@ -27193,7 +27282,7 @@ /turf/open/floor/plating, /area/maintenance/department/cargo) "gid" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/holodeck/prison{ dir = 1 }, /turf/open/floor/durasteel, @@ -28497,6 +28586,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) +"heu" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 6 + }, +/turf/open/floor/durasteel, +/area/security/prison) "hew" = ( /obj/effect/turf_decal/tile/purple{ dir = 1 @@ -29278,23 +29377,34 @@ /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/primary/fore) "hBn" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/structure/cable{ icon_state = "1-8" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/durasteel, /area/security/brig) +"hBG" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/camera/autoname{ + dir = 8 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/book/granter/crafting_recipe/cooking_sweets_101, +/turf/open/floor/durasteel/eris_techfloor_alt, +/area/security/prison) "hBM" = ( /obj/effect/turf_decal/tile/brown{ dir = 4 @@ -29959,6 +30069,13 @@ /obj/machinery/camera/autoname, /turf/open/floor/carpet/blue, /area/crew_quarters/heads/cmo) +"hYx" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/durasteel, +/area/security/prison) "hZb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -30079,6 +30196,22 @@ /obj/machinery/vending/cola/random, /turf/open/floor/carpet/orange, /area/engine/break_room) +"ica" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/durasteel, +/area/security/prison) "icA" = ( /obj/machinery/light{ dir = 8 @@ -31235,6 +31368,20 @@ /obj/effect/spawner/structure/window/reinforced/ship, /turf/open/floor/plating, /area/engine/atmos) +"iPN" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/book/manual/chef_recipes, +/turf/open/floor/durasteel/eris_techfloor_alt, +/area/security/prison) "iPW" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/door/firedoor/border_only/directional/south, @@ -32405,8 +32552,11 @@ /turf/open/floor/plasteel, /area/engine/engineering) "jHf" = ( -/obj/effect/spawner/structure/window/reinforced/ship, /obj/structure/cable, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, /turf/open/floor/plating, /area/security/prison) "jHn" = ( @@ -32549,22 +32699,6 @@ /obj/machinery/light, /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/primary/port) -"jLi" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/durasteel/eris_techfloor_alt, -/area/security/brig) "jLj" = ( /obj/machinery/light/broken{ dir = 1 @@ -33314,6 +33448,16 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"kmj" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/durasteel, +/area/security/prison) "kmq" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -37761,6 +37905,25 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"mYl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/durasteel, +/area/security/prison) "mYm" = ( /obj/structure/extinguisher_cabinet/east, /turf/open/floor/carpet/black, @@ -37849,13 +38012,6 @@ "mZW" = ( /turf/open/floor/plating, /area/nsv/hanger) -"naL" = ( -/obj/machinery/camera/motion{ - c_tag = "Armoury"; - dir = 4 - }, -/turf/open/space/basic, -/area/space) "naW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -37947,6 +38103,12 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/maintenance/starboard/central) +"ndN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/durasteel/eris_techfloor_alt, +/area/security/prison) "ndS" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/floor/plasteel/tech/grid, @@ -39180,6 +39342,12 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, /turf/open/floor/durasteel, /area/security/prison) "nRG" = ( @@ -40923,6 +41091,12 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, /turf/open/floor/durasteel, /area/security/prison) "pbr" = ( @@ -41415,6 +41589,16 @@ /obj/effect/landmark/nuclear_waste_spawner, /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/primary/aft) +"prP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 + }, +/turf/open/floor/durasteel, +/area/security/prison) "prS" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -42167,6 +42351,9 @@ dir = 4 }, /obj/effect/turf_decal/tile/red, +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, /turf/open/floor/durasteel, /area/security/prison) "pPh" = ( @@ -42333,10 +42520,13 @@ /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/primary/fore) "pTV" = ( -/obj/effect/spawner/structure/window/reinforced/ship, /obj/structure/cable{ icon_state = "0-4" }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, /turf/open/floor/plating, /area/security/prison) "pUg" = ( @@ -42486,6 +42676,19 @@ /obj/machinery/atmospherics/pipe/layer_manifold/visible, /turf/open/floor/plating, /area/engine/engineering/hangar) +"pYm" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "pYy" = ( /obj/machinery/door/airlock/ship/maintenance{ req_one_access_txt = "12" @@ -42703,6 +42906,31 @@ /area/nsv/hanger/deck2/starboard{ name = "Launch tubes 1 and 2" }) +"qfz" = ( +/obj/machinery/door/airlock/ship/public/glass{ + name = "Workshop" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/durasteel, +/area/security/prison) "qfG" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -42831,6 +43059,19 @@ /obj/machinery/door/firedoor/border_only/directional/south, /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/secondary/entry) +"qkp" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "qkG" = ( /obj/machinery/light{ dir = 4 @@ -43319,6 +43560,9 @@ "qAS" = ( /turf/closed/wall/ship, /area/ai_monitored/turret_protected/aisat/hallway/support_ship) +"qAX" = ( +/turf/open/floor/engine, +/area/holodeck/prison) "qBf" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, /obj/effect/turf_decal/stripes/white/line{ @@ -43431,6 +43675,13 @@ }, /turf/open/floor/plating, /area/quartermaster/warehouse) +"qEh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/durasteel, +/area/security/prison) "qEr" = ( /obj/structure/cable{ icon_state = "2-9" @@ -47090,18 +47341,8 @@ /turf/open/floor/durasteel/eris_techfloor_alt, /area/nsv/hanger) "sUw" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/newscaster/security_unit{ - pixel_x = 32 - }, -/turf/open/floor/durasteel, -/area/security/prison) +/turf/closed/wall/ship, +/area/security/brig) "sUz" = ( /obj/structure/chair/stool, /turf/open/floor/plating, @@ -47900,6 +48141,10 @@ /area/hallway/secondary/exit/departure_lounge) "tsF" = ( /obj/machinery/light/small, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, /turf/open/floor/plasteel/freezer, /area/security/prison) "tsN" = ( @@ -48567,6 +48812,28 @@ "tOb" = ( /turf/open/floor/plating/airless, /area/maintenance/department/crew_quarters/bar) +"tOT" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/durasteel, +/area/security/prison) +"tPv" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/glass/bowl, +/obj/item/clothing/head/chefhat, +/turf/open/floor/durasteel, +/area/security/prison) "tPI" = ( /obj/structure/disposalpipe/sorting/mail{ dir = 1; @@ -49445,6 +49712,10 @@ }, /turf/open/floor/durasteel/eris_techfloor_alt, /area/hallway/primary/fore) +"upz" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/security/brig) "upJ" = ( /turf/closed/wall/r_wall/ship, /area/security/warden) @@ -49983,6 +50254,16 @@ }, /turf/open/floor/plating, /area/engine/engineering/hangar) +"uHC" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "uHX" = ( /obj/structure/table, /obj/machinery/light{ @@ -53494,6 +53775,29 @@ }, /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) +"wWR" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/turf/open/floor/durasteel/eris_techfloor_alt, +/area/security/prison) "wWW" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -53545,17 +53849,6 @@ /obj/item/reagent_containers/food/drinks/solgovcup, /turf/open/floor/durasteel/riveted, /area/maintenance/department/medical/morgue) -"wZh" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light, -/turf/open/floor/durasteel, -/area/security/prison) "wZZ" = ( /obj/effect/turf_decal/tile/brown, /turf/open/floor/plasteel/white, @@ -54305,6 +54598,17 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"xwu" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/turf/open/floor/durasteel, +/area/security/prison) "xww" = ( /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt/dust, @@ -54351,6 +54655,19 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"xyd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced/ship/prison, +/obj/machinery/door/poddoor/ship/preopen{ + id = "Prisongate" + }, +/turf/open/floor/plating, +/area/security/prison) "xyr" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ @@ -54855,6 +55172,20 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"xOF" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 9 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/durasteel, +/area/security/prison) "xPt" = ( /obj/structure/cable{ icon_state = "1-4" @@ -108236,7 +108567,7 @@ aVX aGD aGV pPU -aJw +aKI aMn aOW qhw @@ -111314,7 +111645,7 @@ aPB cFg aqG aBV -jLi +aBV aFb pPU gLY @@ -111322,7 +111653,7 @@ qHQ pOP aMa aZg -aQj +ica aRm aSo aTp @@ -111570,16 +111901,16 @@ gOU dnO aFQ aFQ -alR -ykn -alR -pPU +sUw +sUw +sUw pPU pPU pPU pPU pPU pPU +qfz pPU pPU ccX @@ -111827,16 +112158,16 @@ aqn aII aQy aFQ -kNZ -rSV -axg -eox -xHS -xHS -xHS -xHS -xHS -xHS +upz +asx +qAX +qAX +qAX +qAX +qAX +bVe +cai +mYl pPU ujZ tsF @@ -112084,16 +112415,16 @@ bcU bda gid aFQ -eSk -wHO -vNS -uJs -amd -amd -amd -amd -amd -amd +upz +asx +qAX +qAX +qAX +qAX +qAX +wWR +hYx +eGK pPU pPU pPU @@ -112341,20 +112672,20 @@ bcW bdb vmy aFQ -bLK -mlL -axg -tvM -amd -jtr -aaa -aaa -aaa -aaa -aIJ -yfL +upz +asx +qAX +qAX +qAX +qAX +qAX +ndN +heu +xOF +pPU aaa aaa +kwa aaa aaa aaa @@ -112598,20 +112929,20 @@ bcU bda xkE aFQ -mdJ -uSS -axg -xrH -hWc -cQw -aaa -aaa -aaa -aaa -aIJ +upz +asx +qAX +qAX +qAX +qAX +qAX +ndN +aQj +fxf +pPU yfL -aaa -aaa +yfL +kwa aaa aaa aaa @@ -112855,20 +113186,20 @@ sXj aJf hEA upJ -amd -amd -amd -amd -amd -jtr -aaa -aaa -aaa -aaa -aIJ -yfL +upz +asx +qAX +qAX +qAX +qAX +qAX +ndN +prP +tOT +pPU aaa aaa +kSB aaa aaa aaa @@ -113112,20 +113443,20 @@ aXU bsB gAl aXU +upz +asx +qAX +qAX +qAX +qAX +qAX +iPN +qEh +cTF +pPU aaa aaa -yfL -yfL -aIJ -aIJ -aIJ -aIJ -aIJ -aIJ -aIJ -eQK -aaa -aaa +kwa aaa aaa aaa @@ -113361,7 +113692,7 @@ aUZ aWS aqU ayO -cwC +xwu aXU aFz aDe @@ -113369,20 +113700,20 @@ xeT iIg aQk aXU -aaa -nsK -eQK -eQK -sKV -eQK +upz +asx +qAX +qAX +qAX +qAX +qAX +hBG +kmj +tPv +pPU yfL -eQK -nsK -eQK -eQK -eQK -aaa -aaa +yfL +kwa aaa aaa aaa @@ -113617,7 +113948,7 @@ pPU aGq aGq fiq -xqm +aJw ouu aXU vJD @@ -113626,20 +113957,20 @@ lPB aKx dxv aXU -yfL -eQK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +asx +asx +pPU +uHC +pYm +xyd +xyd +pYm +qkp +pPU +pPU aaa aaa +kwa aaa aaa aaa @@ -113884,19 +114215,19 @@ aKx jXs aXU aaa -eQK -aaa -aaa aaa aaa +yfL aaa aaa aaa aaa aaa +yfL aaa aaa aaa +kwa aaa aaa aaa @@ -114131,7 +114462,7 @@ pPU aUZ aXz aqU -xqm +aJw gzh aXU bax @@ -114141,19 +114472,19 @@ ayD gYd aXU aaa -eQK -aaa -aaa aaa aaa +yfL aaa aaa aaa aaa aaa +yfL aaa aaa aaa +kwa aaa aaa aaa @@ -114307,127 +114638,127 @@ aaa aaa aaa aaa -aVE -aWZ -msY -msY -yjW -msY -uMt -aae -ijk -qEV -eAZ -aSS -dwX -kai -abQ -abQ -qVq -aAJ -ljz -ahn -ahn -ahn -eXL -aZc -jzA -aoI -auh -arv -iPD -arv -lNu -kyI -aar -aee -ajz -lNu -aUq -aar -lNu -lNu -lNu -imu -xfz -aOA -aOA -aOA -aOA -aOA -atr -atr -atr -jvX -aJh -aJh -kZV -aCO -kZV -aJh -aJh -bcN -lzu -nFo -bcN -fwl -lzu -bcN -diK -wMS -aeX -bgh -bfT -aaa -aaa -aaa -aaa -aZT -bgZ -pPU -aGq -aGq -eBF -xqm -gzh -aXU -aLl -aQk -lZY -aVr -gUG -aXU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +aVE +aWZ +msY +msY +yjW +msY +uMt +aae +ijk +qEV +eAZ +aSS +dwX +kai +abQ +abQ +qVq +aAJ +ljz +ahn +ahn +ahn +eXL +aZc +jzA +aoI +auh +arv +iPD +arv +lNu +kyI +aar +aee +ajz +lNu +aUq +aar +lNu +lNu +lNu +imu +xfz +aOA +aOA +aOA +aOA +aOA +atr +atr +atr +jvX +aJh +aJh +kZV +aCO +kZV +aJh +aJh +bcN +lzu +nFo +bcN +fwl +lzu +bcN +diK +wMS +aeX +bgh +bfT +aaa +aaa +aaa +aaa +aZT +bgZ +pPU +aGq +aGq +eBF +aJw +gzh +aXU +aLl +aQk +lZY +aVr +gUG +aXU +yfL +yfL +kwa +eQK +kwa +kSB +kwa +kSB +kwa +kwa +kwa +kSB +kwa +kwa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -114656,7 +114987,7 @@ djz aXU wBr aaa -aaa +kwa aaa aaa aaa @@ -114902,7 +115233,7 @@ pPU qWW nZT afW -xqm +aJw cwC aXU auI @@ -114913,7 +115244,7 @@ djz aXU aaa aaa -aaa +kwa aaa aaa aaa @@ -115159,7 +115490,7 @@ pPU bIP aoC fOR -xqm +aJw nuA aXU auf @@ -115168,6 +115499,9 @@ aNn aOY bby aXU +yfL +yfL +kwa aaa aaa aaa @@ -115177,10 +115511,7 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa +pFp aaa aaa aaa @@ -115416,7 +115747,7 @@ pPU fqL etB bau -xqm +aJw jaD aXU aXU @@ -115427,7 +115758,7 @@ xDD aXU aaa aaa -aaa +kwa aaa aaa aaa @@ -115673,7 +116004,7 @@ pPU uFV etB bav -xqm +aJw gzh baz aQk @@ -115684,7 +116015,7 @@ orR aXU aaa aaa -aaa +kwa aaa aaa aaa @@ -115930,7 +116261,7 @@ pPU ngH nfh bay -xqm +aJw gzh baz aQk @@ -115939,9 +116270,9 @@ aQk aQk tZQ aXU -aaa -aaa -aaa +yfL +yfL +kwa aaa aaa aaa @@ -116186,9 +116517,9 @@ gMU pPU pPU pPU -pPU -sUw -wZh +alR +ykn +alR aXU aXU aXU @@ -116198,7 +116529,7 @@ aXU aXU aaa aaa -aaa +kwa aaa aaa aaa @@ -116442,20 +116773,20 @@ aaa aaa gMU aaa -aaa -pPU -pPU -pPU -pPU -aaa -aaa -naL -aaa -aaa -aaa -aaa +amd +kNZ +rSV +axg +eox +xHS +xHS +xHS +xHS +xHS +amd aaa aaa +kwa aaa aaa aaa @@ -116699,20 +117030,20 @@ aaa aaa gMU aaa -aaa -aaa -aaa -aaa -gMU -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +amd +eSk +wHO +vNS +uJs +amd +amd +amd +amd +amd +amd +yfL +kwa +kwa aaa aaa aaa @@ -116956,13 +117287,13 @@ bfF bkv bfF bfF -bkv -bfF -bfF -bfF -bfF -bfF -aaa +amd +bLK +mlL +axg +tvM +amd +jtr aaa aaa aaa @@ -117213,13 +117544,13 @@ aaa aaa aaa aaa -aaa -pFp -aaa -aaa -aaa -aaa -aaa +amd +mdJ +uSS +axg +xrH +hWc +cQw aaa aaa aaa @@ -117470,13 +117801,13 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +amd +amd +amd +amd +amd +amd +jtr aaa aaa aaa @@ -117736,7 +118067,7 @@ aaa aaa aaa aaa -pFp +aaa aaa aaa aaa @@ -118251,7 +118582,7 @@ aaa aaa aaa aaa -aaa +pFp aaa aaa aaa diff --git a/_maps/map_files/Serendipity/Serendipity1.dmm b/_maps/map_files/Serendipity/Serendipity1.dmm index 12fbc140913..139581a81b4 100644 --- a/_maps/map_files/Serendipity/Serendipity1.dmm +++ b/_maps/map_files/Serendipity/Serendipity1.dmm @@ -10623,7 +10623,9 @@ /obj/machinery/door/firedoor/border_only/directional/north, /obj/machinery/door/firedoor/border_only/directional/south, /obj/effect/landmark/zebra_interlock_point, -/obj/machinery/turnstile, +/obj/machinery/turnstile{ + dir = 1 + }, /turf/open/floor/carpet/ship/red_carpet, /area/security/prison) "Jn" = ( diff --git a/_maps/map_files/Tycoon/Tycoon1.dmm b/_maps/map_files/Tycoon/Tycoon1.dmm index 86ca4501530..5e86b50df0e 100644 --- a/_maps/map_files/Tycoon/Tycoon1.dmm +++ b/_maps/map_files/Tycoon/Tycoon1.dmm @@ -6499,10 +6499,12 @@ dir = 1 }, /obj/effect/landmark/zebra_interlock_point, -/obj/machinery/turnstile/xo, /obj/effect/turf_decal/loading_area{ dir = 1 }, +/obj/machinery/turnstile/xo{ + dir = 1 + }, /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/hallway) "vF" = ( @@ -7791,10 +7793,8 @@ dir = 1 }, /obj/effect/landmark/zebra_interlock_point, -/obj/machinery/turnstile/xo{ - dir = 1 - }, /obj/effect/turf_decal/loading_area, +/obj/machinery/turnstile/xo, /turf/open/floor/monotile/steel, /area/hallway/nsv/deck1/hallway) "Qg" = ( diff --git a/_maps/map_files/Tycoon/Tycoon2.dmm b/_maps/map_files/Tycoon/Tycoon2.dmm index dc8b53d913a..5ce62ce8fba 100644 --- a/_maps/map_files/Tycoon/Tycoon2.dmm +++ b/_maps/map_files/Tycoon/Tycoon2.dmm @@ -11669,14 +11669,12 @@ /turf/open/floor/durasteel, /area/security/prison) "aGB" = ( -/obj/machinery/turnstile{ - dir = 1 - }, /obj/effect/turf_decal/loading_area, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/firedoor/border_only{ dir = 1 }, +/obj/machinery/turnstile, /turf/open/floor/monotile/dark, /area/security/prison) "aGC" = ( @@ -33455,9 +33453,6 @@ /obj/structure/cable{ icon_state = "0-8" }, -/obj/machinery/turnstile{ - dir = 8 - }, /obj/effect/turf_decal/loading_area{ dir = 4 }, @@ -33467,6 +33462,9 @@ /obj/machinery/door/firedoor/border_only{ dir = 8 }, +/obj/machinery/turnstile{ + dir = 4 + }, /turf/open/floor/plating, /area/security/brig) "bAG" = ( @@ -33603,7 +33601,7 @@ icon_state = "0-4" }, /obj/machinery/turnstile{ - dir = 8 + dir = 4 }, /obj/effect/turf_decal/loading_area{ dir = 4 @@ -35659,9 +35657,6 @@ /turf/open/floor/plating, /area/security/brig) "bEI" = ( -/obj/machinery/turnstile{ - dir = 1 - }, /obj/effect/turf_decal/loading_area, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -35672,6 +35667,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/turnstile, /turf/open/floor/monotile/dark, /area/security/prison) "bEJ" = ( @@ -52691,7 +52687,7 @@ name = "Cargo Fax Machine" }, /turf/open/floor/plasteel/grid/steel, -/area/space) +/area/quartermaster/storage) "vbz" = ( /obj/machinery/door/poddoor/ship{ dir = 4; diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 12f938d40ba..84e2f1ee201 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -11,6 +11,7 @@ #define ACCESS_ENGINE_EQUIP 11 //! APCs, EngiVend/YouTool, engineering equipment lockers #define ACCESS_MAINT_TUNNELS 12 #define ACCESS_EXTERNAL_AIRLOCKS 13 +#define ACCESS_PRISONER 14//! Brig turnstile and prisonner locker #define ACCESS_CHANGE_IDS 15 #define ACCESS_AI_UPLOAD 16 #define ACCESS_TELEPORTER 17 @@ -71,7 +72,6 @@ #define ACCESS_MINING_ENGINEERING 74 #define ACCESS_MINING_BRIDGE 75 #define ACCESS_SEC_RECORDS 77 //! Update security records //NSV13 - changed from 69 -#define ACCESS_PRISONER 78 //! Nsv13 - Genpop. This access is added to prisoner IDs that have served their time. #define ACCESS_HANGAR 79 //NSV13 - Access to the hangar /// Room and launching. diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index e697cbc3b11..0025c832e19 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -55,6 +55,11 @@ #define FLOODLIGHT_NEEDS_SECURING 2 #define FLOODLIGHT_NEEDS_WRENCHING 3 +// turnstile state +#define TURNSTILE_SECURED 0 +#define TURNSTILE_CIRCUIT_EXPOSED 1 +#define TURNSTILE_SHELL 2 + //! ## other construction-related things /// windows affected by Nar'Sie turn this color. diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 03f8d4dd633..e43af7bc16c 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -15,6 +15,7 @@ #define BLOCK_Z_IN_DOWN (1<<11) // Should this object block z falling from above? #define BLOCK_Z_IN_UP (1<<12) // Should this object block z uprise from below? #define OBJ_EMPED (1<<13) // Object is affected by EMP +#define SCANNED (1<<14) //! Object has been scanned by the prison_scanner // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index ccab73e84aa..e896d0854a3 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -64,6 +64,8 @@ DEFINE_BITFIELD(obj_flags, list( "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, "FROZEN" = FROZEN, + "OBJ_EMPED" = OBJ_EMPED, + "OBJ_SCANNED" = SCANNED, )) DEFINE_BITFIELD(datum_flags, list( diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 7514d1c2be4..b8f5e5c76b9 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -107,7 +107,11 @@ return for(var/atom/movable/AM in range(radius_range, a)) - if((AM.flags_1 & HOLOGRAM_1) || (blacklist && (AM.type in blacklist))) + if(blacklist && (AM.type in blacklist)) + continue + else if(istype(get_area(AM), /area/holodeck/prison)) //don't prevent crafting in the prison workshop + . += AM + else if(AM.flags_1 & HOLOGRAM_1) continue . += AM diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 25aa3227eb0..be888cabc50 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -19,7 +19,7 @@ area_type = /area protected_areas = list(/area/maintenance, /area/ai_monitored/turret_protected/ai_upload, /area/ai_monitored/turret_protected/ai_upload_foyer, /area/ai_monitored/turret_protected/ai, /area/storage/emergency/starboard, /area/storage/emergency/port, /area/shuttle, /area/security/prison/asteroid/shielded, - /area/security/prison/asteroid/service, /area/space/nearstation) + /area/security/prison/asteroid/service, /area/space/nearstation, /area/solar, /area/security/prison, /area/holodeck/prison) target_trait = ZTRAIT_STATION immunity_type = "rad" diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index b8873b4e9d0..89a36ec5f2a 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -52,3 +52,9 @@ /area/holodeck/rec_center/offstation_one name = "\improper Recreational Holodeck" + +//Prison holodeck will be 4x7 +/area/holodeck/prison + name = "\improper Workshop" + dynamic_lighting = DYNAMIC_LIGHTING_ENABLED + diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm index 0f086ab5479..f64d9e76333 100644 --- a/code/game/machinery/computer/prisoner/_prisoner.dm +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -1,5 +1,5 @@ /obj/machinery/computer/prisoner - var/obj/item/card/id/prisoner/contained_id + var/obj/item/card/id/gulag/contained_id /obj/machinery/computer/prisoner/Destroy() if(contained_id) @@ -17,10 +17,10 @@ /obj/machinery/computer/prisoner/AltClick(mob/user) id_eject(user) -/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/prisoner/P) +/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/gulag/P) if(!P) var/obj/item/held_item = user.get_active_held_item() - if(istype(held_item, /obj/item/card/id/prisoner)) + if(istype(held_item, /obj/item/card/id/gulag)) P = held_item if(istype(P)) @@ -50,7 +50,7 @@ updateUsrDialog() /obj/machinery/computer/prisoner/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/card/id/prisoner)) + if(istype(I, /obj/item/card/id/gulag)) id_insert(user, I) else return ..() diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index da61243b8b8..201ea699ae5 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -44,8 +44,8 @@ can_reclaim = TRUE var/obj/item/card/id/I = user.get_idcard(TRUE) - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/prisonerID = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/prisonerID = I if(prisonerID.points >= prisonerID.goal && !prisonerID.permanent) can_reclaim = TRUE diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 134b1ce94bc..3f43886615e 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -91,7 +91,7 @@ again. //reinforced -/obj/effect/spawner/structure/window/reinforced +/obj/effect/spawner/structure/window/reinforced //brig windows here name = "reinforced window spawner" icon_state = "rwindow_spawner" spawn_list = list(/obj/machinery/door/firedoor/window, /obj/structure/grille, /obj/structure/window/reinforced/fulltile) //NSV13, adds window firedoors to window spawners @@ -99,6 +99,11 @@ again. pipe_astar_cost = 2\ ) +//Alarm grilles for prison wing +/obj/effect/spawner/structure/window/reinforced/prison + name = "prison window spawner" + spawn_list = list(/obj/machinery/door/firedoor/window, /obj/structure/grille/prison, /obj/structure/window/reinforced/fulltile) //NSV13, adds window firedoors to window spawners + //reinforced shutter /obj/effect/spawner/structure/window/reinforced/shutter name = "reinforced shutter window spawner" diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 7d38969757d..2fcc509c0a3 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -398,13 +398,13 @@ update_label("John Doe", "Clowny") /obj/item/card/id/pass/mining_access_card, /obj/item/card/mining_point_card, /obj/item/card/id, - /obj/item/card/id/prisoner/one, - /obj/item/card/id/prisoner/two, - /obj/item/card/id/prisoner/three, - /obj/item/card/id/prisoner/four, - /obj/item/card/id/prisoner/five, - /obj/item/card/id/prisoner/six, - /obj/item/card/id/prisoner/seven, + /obj/item/card/id/gulag/one, + /obj/item/card/id/gulag/two, + /obj/item/card/id/gulag/three, + /obj/item/card/id/gulag/four, + /obj/item/card/id/gulag/five, + /obj/item/card/id/gulag/six, + /obj/item/card/id/gulag/seven, /obj/item/card/id/departmental_budget, /obj/item/card/id/syndicate/anyone, /obj/item/card/id/syndicate/nuke_leader, @@ -666,7 +666,7 @@ update_label("John Doe", "Clowny") access = get_all_accesses() . = ..() -/obj/item/card/id/prisoner +/obj/item/card/id/gulag name = "prisoner ID card" desc = "You are a number, you are not a free man." icon_state = "orange" @@ -678,7 +678,7 @@ update_label("John Doe", "Clowny") var/permanent = FALSE hud_state = JOB_HUD_PRISONER -/obj/item/card/id/prisoner/examine(mob/user) +/obj/item/card/id/gulag/examine(mob/user) . = ..() if(!permanent) @@ -687,31 +687,31 @@ update_label("John Doe", "Clowny") else . += "The mark on the ID indicates the sentence is permanent." -/obj/item/card/id/prisoner/one +/obj/item/card/id/gulag/one name = "Prisoner #13-001" registered_name = "Prisoner #13-001" -/obj/item/card/id/prisoner/two +/obj/item/card/id/gulag/two name = "Prisoner #13-002" registered_name = "Prisoner #13-002" -/obj/item/card/id/prisoner/three +/obj/item/card/id/gulag/three name = "Prisoner #13-003" registered_name = "Prisoner #13-003" -/obj/item/card/id/prisoner/four +/obj/item/card/id/gulag/four name = "Prisoner #13-004" registered_name = "Prisoner #13-004" -/obj/item/card/id/prisoner/five +/obj/item/card/id/gulag/five name = "Prisoner #13-005" registered_name = "Prisoner #13-005" -/obj/item/card/id/prisoner/six +/obj/item/card/id/gulag/six name = "Prisoner #13-006" registered_name = "Prisoner #13-006" -/obj/item/card/id/prisoner/seven +/obj/item/card/id/gulag/seven name = "Prisoner #13-007" registered_name = "Prisoner #13-007" diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 2f695b53ed7..e90f828f5e5 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -118,6 +118,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2), \ new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2), \ new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1), \ + new/datum/stack_recipe("prisoner interface frame", /obj/item/wallframe/genpop_interface, 5), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, one_per_turf = TRUE, on_floor = TRUE), \ @@ -364,6 +365,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("19x19 canvas", /obj/item/canvas/nineteen_nineteen, 3), \ new/datum/stack_recipe("23x19 canvas", /obj/item/canvas/twentythree_nineteen, 4), \ new/datum/stack_recipe("23x23 canvas", /obj/item/canvas/twentythree_twentythree, 5), \ + null, \ + new/datum/stack_recipe("plush fabric", /obj/item/toy/empty_plush, 5, time = 4 SECONDS), \ + null, \ )) /obj/item/stack/sheet/cotton/cloth diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index a5955db1157..47399e30eef 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -631,13 +631,13 @@ /obj/item/storage/box/prisoner/PopulateContents() ..() - new /obj/item/card/id/prisoner/one(src) - new /obj/item/card/id/prisoner/two(src) - new /obj/item/card/id/prisoner/three(src) - new /obj/item/card/id/prisoner/four(src) - new /obj/item/card/id/prisoner/five(src) - new /obj/item/card/id/prisoner/six(src) - new /obj/item/card/id/prisoner/seven(src) + new /obj/item/card/id/gulag/one(src) + new /obj/item/card/id/gulag/two(src) + new /obj/item/card/id/gulag/three(src) + new /obj/item/card/id/gulag/four(src) + new /obj/item/card/id/gulag/five(src) + new /obj/item/card/id/gulag/six(src) + new /obj/item/card/id/gulag/seven(src) /obj/item/storage/box/seccarts name = "box of PDA security job disks" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 01aa7c6366a..54fef93d23a 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -34,6 +34,32 @@ throw_range = 7 force = 0 +/* + * Empty plushies before stuffing + */ +/obj/item/toy/empty_plush //not a plushie subtype because of all the code regarding breeding and weird jokes, this is just a transitory state + name = "plush fabric" + desc = "An empty plush fabric. Ready to be stuffed with cotton." + icon = 'icons/obj/plushes.dmi' + lefthand_file = 'icons/mob/inhands/plushes_lefthand.dmi' + righthand_file = 'icons/mob/inhands/plushes_righthand.dmi' + icon_state = "debug" + +/obj/item/toy/empty_plush/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/stack/sheet/cotton)) + var/obj/item/stack/S = I + if(S.amount< 3) + to_chat(user, "You need three stacks of cotton to stuff a plush!") + return + if(do_after(user, 3 SECONDS)) + var/obj/item/toy/plush/P = pick(subtypesof(/obj/item/toy/plush) - /obj/item/toy/plush/carpplushie/dehy_carp) + new P(get_turf(src)) + to_chat(user, "You make a new plush.") + S.use(3) + qdel(src) + return + . = ..() + /* * Balloons diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index ab3d6bec538..154bf5447ad 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -288,3 +288,43 @@ rods_broken = FALSE grille_type = /obj/structure/grille broken_type = null + +/obj/structure/grille/prison //grilles that trigger prison lockdown under some circumstances + name = "prison grille" + desc = "a set of rods under current used to protect the prison wing. An alarm will go off if they are breached." + var/obj/item/assembly/control/device + var/id = "Prisongate" + var/initialized_device = FALSE + +/obj/structure/grille/prison/proc/setup_device() + device = new /obj/item/assembly/control + device.id = id + initialized_device = 1 + +/obj/structure/grille/prison/Initialize() + ..() + if(!initialized_device) + setup_device() + +/obj/structure/grille/prison/deconstruct() + var/turf/T = get_turf(src) + var/obj/structure/cable/C = T.get_cable_node() + if(C?.powernet) + var/datum/powernet/P = C.powernet + if(initialized_device && P.avail != 0) + src.device.activate() + ..() + +/obj/structure/grille/prison/obj_break() + var/turf/T = get_turf(src) + var/obj/structure/cable/C = T.get_cable_node() + if(C?.powernet) + var/datum/powernet/P = C.powernet + if(P) + if(initialized_device && P.avail != 0) + src.device.activate() + ..() + +/obj/structure/grille/prison/Destroy() + QDEL_NULL(device) + return ..() diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 67bf83a2909..e2b30e9defc 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -82,6 +82,23 @@ R.use(1) to_chat(user, "You reinforce the floor.") return + if(istype(C, /obj/item/stack/sheet/plasteel) && attachment_holes) + if(broken || burnt) + to_chat(user, "Repair the plating first!") + return + var/obj/item/stack/sheet/iron/R = C + if (R.get_amount() < 1) + to_chat(user, "You need one sheet to make a prison secure floor!") + return + else + to_chat(user, "You begin reinforcing the floor to secure the plating..") + if(do_after(user, 30, target = src)) + if (R.get_amount() >= 1 && !istype(src, /turf/open/floor/prison)) + PlaceOnTop(/turf/open/floor/prison, flags = CHANGETURF_INHERIT_AIR) + playsound(src, 'sound/items/deconstruct.ogg', 80, 1) + R.use(1) + to_chat(user, "You secure the plating.") + return else if(istype(C, /obj/item/stack/tile))//NSV allow placing tiles under open plated catwalks if(!broken && !burnt) for(var/obj/O in src) diff --git a/code/game/turfs/open/floor/prison_floor.dm b/code/game/turfs/open/floor/prison_floor.dm new file mode 100644 index 00000000000..a1452704915 --- /dev/null +++ b/code/game/turfs/open/floor/prison_floor.dm @@ -0,0 +1,73 @@ +#define MAX_PRISON_PLATES 4 + +/turf/open/floor/prison + name = "secure floor" + desc = "Prison break-proof!" + icon = 'icons/turf/prisonfloor.dmi' + icon_state = "prisonfloor4" + //max_integrity = 500 //NSV13 Our floors don't have max integrity yet + holodeck_compatible = TRUE + thermal_conductivity = 0.025 + heat_capacity = INFINITY + floor_tile = /obj/item/stack/sheet/plasteel + footstep = FOOTSTEP_PLATING + barefootstep = FOOTSTEP_HARD_BAREFOOT + clawfootstep = FOOTSTEP_HARD_CLAW + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + tiled_dirt = FALSE + baseturfs = /turf/open/floor/plating + var/plates_type = /obj/item/stack/tile/plasteel + var/plates = MAX_PRISON_PLATES + var/wrenching = FALSE + +/turf/open/floor/prison/examine(mob/user) + . = ..() + . += "The reinforcement plates are wrenched firmly in place." + +/turf/open/floor/prison/break_tile() + return //unbreakable + +/turf/open/floor/prison/burn_tile() // consider changing this + return //unburnable + +/turf/open/floor/prison/try_replace_tile(obj/item/stack/tile/T, mob/user, params) + return + +/turf/open/floor/prison/crowbar_act(mob/living/user, obj/item/I) + if(plates != 0) + to_chat(user, " The reinforcement plates are still firmly in place!") + return TRUE + else + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + to_chat(user, "You begin prying open the tile...") + if(do_after(user, 4 SECONDS)) + return ..() + +/turf/open/floor/prison/wrench_act(mob/living/user, obj/item/I) + if(!wrenching && plates >0) + wrenching = TRUE + if(I.use_tool(src, user, 50, volume=80)) + to_chat(user, "You begin removing some of the plates...") + plates -= 1 + update_icon_state() + wrenching = FALSE + new plates_type(src, 1) + return TRUE + else + wrenching = FALSE + +/turf/open/floor/prison/update_icon_state() + icon_state = "prisonfloor[plates]" + return ..() + +/turf/open/floor/prison/attackby(obj/item/object, mob/living/user, params) + if(plates< MAX_PRISON_PLATES && istype(object, plates_type)) + var/obj/item/stack/sheet/I = object + I.use(1) + plates += 1 + update_icon_state() + return + return ..() + + +#undef MAX_PRISON_PLATES diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index b91a6457eb8..ac44474efd6 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -53,11 +53,11 @@ and clear when youre done! if you dont i will use :newspaper2: on you var/area/holodeck/linked ///what program is loaded right now or is about to be loaded - var/program = "offline" + var/program = "recreational-offline" var/last_program ///the default program loaded by this holodeck when spawned and when deactivated - var/offline_program = "offline" + var/offline_program = "recreational-offline" ///stores all of the unrestricted holodeck map templates that this computer has access to var/list/program_cache @@ -65,7 +65,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you var/list/emag_programs ///subtypes of this (but not this itself) are loadable programs - var/program_type = /datum/map_template/holodeck + var/program_type = /datum/map_template/holodeck/recreation ///every holo object created by the holodeck goes in here to track it var/list/spawned = list() @@ -231,7 +231,7 @@ and clear when youre done! if you dont i will use :newspaper2: on you spawned = template.created_atoms //populate the spawned list with the atoms belonging to the holodeck - if(istype(template, /datum/map_template/holodeck/thunderdome1218) && !SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM]) + if(istype(template, /datum/map_template/holodeck/recreation/thunderdome1218) && !SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM]) say("Special note from \"1218 AD\" developer: I see you too are interested in the REAL dark ages of humanity! I've made this program also unlock some interesting shuttle designs on any communication console around. Have fun!") SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_MEDISIM] = TRUE diff --git a/code/modules/holodeck/holodeck_map_templates.dm b/code/modules/holodeck/holodeck_map_templates.dm index f687d3e2fd6..f624ceda52e 100644 --- a/code/modules/holodeck/holodeck_map_templates.dm +++ b/code/modules/holodeck/holodeck_map_templates.dm @@ -13,153 +13,173 @@ var/obj/machinery/computer/holodeck/linked -/datum/map_template/holodeck/offline +/datum/map_template/holodeck/recreation/offline name = "Holodeck - Offline" - template_id = "offline" + template_id = "recreational-offline" mappath = "_maps/holodeck/offline.dmm" -/datum/map_template/holodeck/emptycourt +/datum/map_template/holodeck/recreation/emptycourt name = "Holodeck - Empty Court" template_id = "emptycourt" mappath = "_maps/holodeck/emptycourt.dmm" -/datum/map_template/holodeck/dodgeball +/datum/map_template/holodeck/recreation/dodgeball name = "Holodeck - Dodgeball Court" template_id = "dodgeball" mappath = "_maps/holodeck/dodgeball.dmm" -/datum/map_template/holodeck/basketball +/datum/map_template/holodeck/recreation/basketball name = "Holodeck - Basketball Court" template_id = "basketball" mappath = "_maps/holodeck/basketball.dmm" -/datum/map_template/holodeck/thunderdome +/datum/map_template/holodeck/recreation/thunderdome name = "Holodeck - Thunderdome Arena" template_id = "thunderdome" mappath = "_maps/holodeck/thunderdome.dmm" -/datum/map_template/holodeck/beach +/datum/map_template/holodeck/recreation/beach name = "Holodeck - Beach" template_id = "beach" mappath = "_maps/holodeck/beach.dmm" -/datum/map_template/holodeck/lounge +/datum/map_template/holodeck/recreation/lounge name = "Holodeck - Lounge" template_id = "lounge" mappath = "_maps/holodeck/lounge.dmm" -/datum/map_template/holodeck/petpark +/datum/map_template/holodeck/recreation/petpark name = "Holodeck - Pet Park" template_id = "petpark" mappath = "_maps/holodeck/petpark.dmm" -/datum/map_template/holodeck/firingrange +/datum/map_template/holodeck/recreation/firingrange name = "Holodeck - Firing Range" template_id = "firingrange" mappath = "_maps/holodeck/firingrange.dmm" -/datum/map_template/holodeck/anime_school +/datum/map_template/holodeck/recreation/anime_school name = "Holodeck - Anime School" template_id = "animeschool" mappath = "_maps/holodeck/animeschool.dmm" -/datum/map_template/holodeck/chapelcourt +/datum/map_template/holodeck/recreation/chapelcourt name = "Holodeck - Chapel Courtroom" template_id = "chapelcourt" mappath = "_maps/holodeck/chapelcourt.dmm" -/datum/map_template/holodeck/spacechess +/datum/map_template/holodeck/recreation/spacechess name = "Holodeck - Space Chess" template_id = "spacechess" mappath = "_maps/holodeck/spacechess.dmm" -/datum/map_template/holodeck/spacecheckers +/datum/map_template/holodeck/recreation/spacecheckers name = "Holodeck - Space Checkers" template_id = "spacecheckers" mappath = "_maps/holodeck/spacecheckers.dmm" -/datum/map_template/holodeck/kobayashi +/datum/map_template/holodeck/recreation/kobayashi name = "Holodeck - Kobayashi Maru" template_id = "kobayashi" mappath = "_maps/holodeck/kobayashi.dmm" -/datum/map_template/holodeck/winterwonderland +/datum/map_template/holodeck/recreation/winterwonderland name = "Holodeck - Winter Wonderland" template_id = "winterwonderland" mappath = "_maps/holodeck/winterwonderland.dmm" -/datum/map_template/holodeck/photobooth +/datum/map_template/holodeck/recreation/photobooth name = "Holodeck - Photobooth" template_id = "photobooth" mappath = "_maps/holodeck/photobooth.dmm" -/datum/map_template/holodeck/skatepark +/datum/map_template/holodeck/recreation/skatepark name = "Holodeck - Skatepark" template_id = "skatepark" mappath = "_maps/holodeck/skatepark.dmm" -/datum/map_template/holodeck/teahouse +/datum/map_template/holodeck/recreation/teahouse name = "Holodeck - Japanese Tea House" template_id = "holodeck_teahouse" mappath = "_maps/templates/holodeck_teahouse.dmm" -/datum/map_template/holodeck/kitchen +/datum/map_template/holodeck/recreation/kitchen name = "Holodeck - Holo-Kitchen" template_id = "holodeck_kitchen" mappath = "_maps/templates/holodeck_kitchen.dmm" //bad evil no good programs -/datum/map_template/holodeck/medicalsim +/datum/map_template/holodeck/recreation/medicalsim name = "Holodeck - Emergency Medical" template_id = "medicalsim" mappath = "_maps/holodeck/medicalsim.dmm" restricted = TRUE -/datum/map_template/holodeck/thunderdome1218 +/datum/map_template/holodeck/recreation/thunderdome1218 name = "Holodeck - 1218 AD" template_id = "thunderdome1218" mappath = "_maps/holodeck/thunderdome1218.dmm" restricted = TRUE -/datum/map_template/holodeck/burntest +/datum/map_template/holodeck/recreation/burntest name = "Holodeck - Atmospheric Burn Test" template_id = "burntest" mappath = "_maps/holodeck/burntest.dmm" restricted = TRUE -/datum/map_template/holodeck/wildlifesim +/datum/map_template/holodeck/recreation/wildlifesim name = "Holodeck - Wildlife Simulation" template_id = "wildlifesim" mappath = "_maps/holodeck/wildlifesim.dmm" restricted = TRUE -/datum/map_template/holodeck/holdoutbunker +/datum/map_template/holodeck/recreation/holdoutbunker name = "Holodeck - Holdout Bunker" template_id = "holdoutbunker" mappath = "_maps/holodeck/holdoutbunker.dmm" restricted = TRUE -/datum/map_template/holodeck/anthophillia +/datum/map_template/holodeck/recreation/anthophillia name = "Holodeck - Anthophillia" template_id = "anthophillia" mappath = "_maps/holodeck/anthophillia.dmm" restricted = TRUE -/datum/map_template/holodeck/refuelingstation +/datum/map_template/holodeck/recreation/refuelingstation name = "Holodeck - Refueling Station" template_id = "refuelingstation" mappath = "_maps/holodeck/refuelingstation.dmm" restricted = TRUE -/datum/map_template/holodeck/asylum +/datum/map_template/holodeck/recreation/asylum name = "Holodeck - Asylum" template_id = "holodeck_asylum" mappath = "_maps/templates/holodeck_asylum.dmm" restricted = TRUE -/datum/map_template/holodeck/clownworld +/datum/map_template/holodeck/recreation/clownworld name = "Holodeck - Clown World" template_id = "holodeck_clownworld" mappath = "_maps/templates/holodeck_clownworld.dmm" restricted = TRUE + +// -------------------- +// -- PRISON TEMPLATES -- +// -------------------- +/datum/map_template/holodeck/prison + +/datum/map_template/holodeck/prison/offline + name = "Workshop - Offline" + template_id = "workshop-offline" + mappath = "_maps/holodeck/workshop/offline.dmm" + +/datum/map_template/holodeck/prison/donut + name = "Workshop - Donut Workshop" + template_id = "donut" + mappath = "_maps/holodeck/workshop/donut.dmm" + +/datum/map_template/holodeck/prison/plushes + name = "Workshop - Plushes Sweatshop" + template_id = "plush" + mappath = "_maps/holodeck/workshop/plush.dmm" diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 14cf9b1e4c8..be0a440cc24 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -179,3 +179,18 @@ name = "white floor" desc = "A tile in a pure white color." icon_state = "pure_white" + +/turf/open/floor/holofloor/monotile/dark + name = "dark holotile" + desc = "A really big dark steel holotile." + icon_state = "monotile_dark" + +/turf/open/floor/holofloor/monotile/steel + name = "steel holotile" + desc = "A really big steel holotile." + icon_state = "steel_monotile" + +/turf/open/floor/holofloor/monotile/light + name = "light holotile" + desc = "A really big light steel holotile." + icon_state = "monotile_light" diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 44b7a086027..3d9a52ee5d3 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -68,8 +68,8 @@ GLOBAL_LIST(labor_sheet_values) can_go_home = TRUE var/obj/item/card/id/I = user.get_idcard(TRUE) - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/prisonerID = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/prisonerID = I data["id_points"] = prisonerID.points if(prisonerID.points >= prisonerID.goal && !prisonerID.permanent) can_go_home = TRUE @@ -96,8 +96,8 @@ GLOBAL_LIST(labor_sheet_values) switch(action) if("claim_points") var/obj/item/card/id/I = M.get_idcard(TRUE) - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/P = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/P = I P.points += stacking_machine.points stacking_machine.points = 0 to_chat(M, "Points transferred.") @@ -164,8 +164,8 @@ GLOBAL_LIST(labor_sheet_values) /obj/machinery/mineral/labor_points_checker/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/card/id)) - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/prisoner_id = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/prisoner_id = I to_chat(user, "ID: [prisoner_id.registered_name]") to_chat(user, "Points Collected:[prisoner_id.points]") to_chat(user, "Point Quota: [prisoner_id.goal]") diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 70640b542e3..e0e225481d6 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -683,3 +683,19 @@ build_path = /obj/item/circuitboard/machine/fax departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE category = list("Misc. Machinery") + +/datum/design/board/turnstile + name = "Machine Design (Turnstile)" + desc = "The circuit board for a turnstile machine." + id = "turnstile" + build_path = /obj/item/circuitboard/machine/turnstile + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + category = list("Misc. Machinery") + +/datum/design/board/genpop_interface + name = "Machine Design (Prisoner Management Interface)" + desc = "The circuit board for a prisonner management interface." + id = "genpop_interface" + build_path = /obj/item/electronics/genpop_interface + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + category = list("Misc. Machinery") diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index c7d830cef11..06a03fb4447 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -794,7 +794,7 @@ tech_tier = 1 display_name = "Basic Security Equipment" description = "Standard equipment used by security." - design_ids = list("seclite", "pepperspray", "bola_energy", "gulagpack", "zipties", "evidencebag", "flashbulb") //NSV13 added gulagpack + design_ids = list("seclite", "pepperspray", "bola_energy", "gulagpack", "zipties", "evidencebag", "flashbulb", "turnstile", "genpop_interface") //NSV13 added gulagpack prereq_ids = list("base") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000) export_price = 5000 diff --git a/code/modules/security/crimes.dm b/code/modules/security/crimes.dm new file mode 100644 index 00000000000..a28d0c986a0 --- /dev/null +++ b/code/modules/security/crimes.dm @@ -0,0 +1,274 @@ +#define MAX_TIMER 10 HOURS //Permabrig. +#define PRESET_SHORT 5 MINUTES +#define PRESET_MEDIUM 10 MINUTES +#define PRESET_LONG 15 MINUTES + +#define CRIME_MINOR "Minor" +#define CRIME_MISDEMEANOUR "Misdemeanour" +#define CRIME_MAJOR "Major" +#define CRIME_CAPITAL "Capital" + +/* This is overwritten by the config (space_law.json as of writting this), this only exists as a backup in case the game fails to load said file. +Do not modify this unless you know what you're doing. */ + +/datum/crime + var/name + var/tooltip + var/colour + var/icon + var/sentence + var/category + +/datum/crime/minor + category = CRIME_MINOR + sentence = PRESET_SHORT + colour="yellow" + +/datum/crime/minor/assault + name = "Assault" + icon = "hand-rock" + tooltip = "To use physical force against someone without the apparent intent to kill them." + +/datum/crime/minor/pickpocketting + name = "Pickpocketting" + icon = "mask" + tooltip = "To steal items from another's person." + +/datum/crime/minor/minor_vandalism + name = "Minor Vandalism" + icon = "house-damage" + tooltip = "To damage, destroy, or permanently deface non-critical furniture, vendors, or personal property." + +/datum/crime/minor/vigilantism + name = "Vigilantism" + icon = "user-secret" + tooltip = "To perform the responsibilities and duties of the security department without approval or due cause to act." + +/datum/crime/minor/illegal_distribution + name = "Illegal Distribution" + icon = "joint" + tooltip = "The possession of dangerous or illegal drugs/equipment in a quantity greater than that which is reasonable for personal consumption." + +/datum/crime/minor/disturbing + name = "Disturbing the Peace" + icon = "fist-raised" + tooltip = "To knowingly organize a movement which disrupts the normal operations of a department." + +/datum/crime/minor/negligence + name = "Negligence" + icon = "low-vision" + tooltip = "To be negligent in one's duty to an extent that it may cause harm, illness, or other negative effect, to another." + +/datum/crime/minor/trespass + name = "Trespass" + icon = "walking" + tooltip = "To be in an area which a person has either not purposefully been admitted to, does not have access, or has been asked to leave by someone who has access to that area." + +/datum/crime/minor/breaking_and_entering + name = "Breaking and Entering" + icon = "door-open" + tooltip = "To trespass into an area using a method of forcible entry." + +/datum/crime/minor/discriminatory_language + name = "Discriminatory Language" + icon = "comment-slash" + tooltip = "To use language which demeans, generalizes, or otherwise de-personafies the individual at which it is targeted." + +/datum/crime/minor/fine_evasion + name = "Fine Evasion" + icon = "dollar-sign" + tooltip = "To purposefully avoid or refuse to pay a legal fine." + +/datum/crime/minor/religious_activity + name = "Religious Activity outside of the chapel" + icon = "cross" + tooltip = "To convert, proselytize, hold rituals or otherwise attempt to act in the name of a religion or deity outside of the chapel." + +/datum/crime/misdemeanour + category = CRIME_MISDEMEANOUR + sentence = PRESET_MEDIUM + colour="orange" + +/datum/crime/misdemeanour/aggravated_assault + name = "Aggravated Assault" + icon = "user-injured" + tooltip = "To take physical action against a person with intent to grievously harm, but not to kill." + +/datum/crime/misdemeanour/theft + name = "Theft" + icon = "mask" + tooltip = "To steal equipment or items from a workplace, or items of extraordinary value from one's person." + +/datum/crime/misdemeanour/vandilism + name = "Major Vandalism" + icon = "house-damage" + tooltip = "To destroy or damage non-critical furniture, vendors, or personal property in a manor that can not be repaired." + +/datum/crime/misdemeanour/conspiracy + name = "Conspiracy" + icon = "user-friends" + tooltip = "To knowingly work with another person in the interest of committing an illegal action." + +/datum/crime/misdemeanour/hostile_agent + name = "Hostile Agent" + icon = "user-ninja" + tooltip = "To knowingly act as a recruiter, representative, messenger, ally, benefactor, or other associate of a hostile organization as defined within Code 405(EOTC)." + +/datum/crime/misdemeanour/contraband + name = "Contraband Equipment Possession" + icon = "briefcase" + tooltip = "To possess equipment not approved for use or production aboard Nanotrasen stations. This includes equipment produced by The Syndicate, Wizard Federation, or any other hostile organization as defined within Code 405(EOTC)." + +/datum/crime/misdemeanour/rioting + name = "Rioting" + icon = "fist-raised" + tooltip = "To act as a member in a group which collectively commits acts of major vandalism, sabotage, grand sabotage, or other felony crimes." + +/datum/crime/misdemeanour/negligence + name = "High Negligence" + icon = "blind" + tooltip = "To be negligent in one's duty to an extent that it may cause harm to multiple individuals, a department, or in a manor which directly leads to a serious injury of another person which requires emergency medical treatment." + +/datum/crime/misdemeanour/tresspass + name = "Trespass, Inherently Dangerous Areas" + icon = "door-closed" + tooltip = "Trespassing in an area which may lead to the injury of self, or others." + +/datum/crime/misdemeanour/entering + name = "Breaking and Entering, Inherently Dangerous Areas" + icon = "door-open" + tooltip = "To trespass into an area which may lead to the injury of self or others using forcible entry." + +/datum/crime/misdemeanour/insubordination + name = "Insubordination" + icon = "hand-middle-finger" + tooltip = "To knowingly disobey a lawful order from a superior." + +/datum/crime/misdemeanour/fraud + name = "Fraud" + icon = "comment-dollar" + tooltip = "To misrepresent ones intention in the interest of gaining property or money from another individual." + +/datum/crime/misdemeanour/genetic_mutilation + name = "Genetic Mutilation" + icon = "dna" + tooltip = "To purposefully modify an individual's genetic code without consent, or with intent to harm." + +/datum/crime/major + category = CRIME_MAJOR + sentence = PRESET_LONG + colour="bad" + +/datum/crime/major/murder + name = "Murder" + icon = "skull" + tooltip = "To purposefully kill someone." + +/datum/crime/major/larceny + name = "Larceny" + icon = "mask" + tooltip = "To steal rare, expensive (Items of greater than 1000 credit value), or restricted equipment from secure areas or one's person." + +/datum/crime/major/sabotage + name = "Sabotage" + icon = "bomb" + tooltip = "To destroy station assets or resources critical to normal or emergency station procedures, or cause sections of the station to become uninhabitable." + +/datum/crime/major/conspiracy + name = "High Conspiracy" + icon = "users" + tooltip = "To knowingly work with another person in the interest of committing a major or greater crime." + +/datum/crime/major/hostile + name = "Hostile Activity" + icon = "thumbs-down" + tooltip = "To knowingly commit an act which is in direct opposition to the interests of Nanotrasen, Or to directly assist a known enemy of the corporation." + +/datum/crime/major/contraband + name = "Possession, Illegal Inherently Dangerous Equipment" + icon = "exclamation-triangle" + tooltip = "To possess restricted or illegal equipment which has a primary purpose of causing harm to others, or large amounts of destruction." + +/datum/crime/major/riot + name = "Inciting a Riot" + icon = "fist-raised" + tooltip = "To perform actions in the interest of causing large amounts of unrest up to and including rioting." + +/datum/crime/major/manslaughter + name = "Manslaughter" + icon = "book-dead" + tooltip = "To unintentionally kill someone through negligent, but not malicious, actions." + +/datum/crime/major/tresspass + name = "Trespass, High Security Areas" + icon = "running" + tooltip = "Trespassing in any of the following without appropriate permission or access: Command areas, Personal offices, Weapons storage, weapon production, explosive storage, explosive production, or other high security areas." + +/datum/crime/major/break_enter + name = "Breaking and Entering, High Security Areas" + icon = "door-open" + tooltip = "To commit trespassing into a secure area as defined in Code 309(Trespass, High Security Areas) using forcible entry." + +/datum/crime/major/dereliction + name = "Dereliction" + icon = "walking" + tooltip = "To willfully abandon an obligation that is critical to the station's continued operation." + +/datum/crime/major/fraud + name = "Corporate Fraud" + icon = "hand-holding-usd" + tooltip = "To misrepresent one's intention in the interest of gaining property or money from Nanotrasen, or to gain or give property or money from Nanotrasen without proper authorization." + +/datum/crime/major/impersonation + name = "Identity Theft" + icon = "theater-masks" + tooltip = "To assume the identity of another individual." + +/datum/crime/capital + category = CRIME_CAPITAL + sentence = MAX_TIMER + colour = "grey" + +/datum/crime/capital/murder + name = "Prime Murder" + icon = "skull-crossbones" + tooltip = "To commit the act of murder, with clear intent to kill, and clear intent or to have materially take steps to prevent the revival of the victim" + +/datum/crime/capital/larcany + name = "Grand Larceny" + icon = "mask" + tooltip = "To steal inherently dangerous items from their storage, one's person, or other such methods acquire through illicit means." + +/datum/crime/capital/sabotage + name = "Grand Sabotage" + icon = "bomb" + tooltip = "To destroy or modify station assets or equipment without which the station may collapse or otherwise become uninhabitable." + +/datum/crime/capital/espionage + name = "Espionage" + icon = "user-secret" + tooltip = "To knowingly betray critical information to enemies of the station." + +/datum/crime/capital/enemy + name = "Enemy of the Corporation" + icon = "user-alt-slash" + tooltip = "To be a member of any of the following organizations: Hostile boarding parties, Wizards, Changeling Hiveminds, cults." + +/datum/crime/capital/contraband + name = "Possession, Corporate Secrets" + icon = "file-invoice" + tooltip = "To possess secret documentation or high density tamper-resistant data storage devices (Blackboxes) from any organization without authorization by Nanotrasen." + +/datum/crime/capital/subversion + name = "Subversion of the Chain of Command" + icon = "link" + tooltip = "Disrupting the chain of command via either murder of a commanding officer or illegaly declaring oneself to be a commanding officer." + +/datum/crime/capital/biological + name = "Biological Terror" + icon = "biohazard" + tooltip = "To knowingly release, cause, or otherwise cause the station to become affected by a disease, plant, or other biological form which may spread uncontained and or cause serious physical harm." + +#undef PRESET_SHORT +#undef PRESET_MEDIUM +#undef PRESET_LONG diff --git a/code/modules/security/genpop.dm b/code/modules/security/genpop.dm new file mode 100644 index 00000000000..b43aecf17ee --- /dev/null +++ b/code/modules/security/genpop.dm @@ -0,0 +1,741 @@ +//From NSV13, ported to BeeStation, and back to NSV13 +//Credit to oraclestation for the idea! This just a recode... +// Recode CanAllowThrough() at some point, it won't allow ridden vehicles + +/obj/machinery/turnstile + name = "turnstile" + desc = "A mechanical door that permits one-way access to the brig." + icon = 'icons/obj/machines/turnstile.dmi' //ADD ICON + icon_state = "turnstile_map" //ADD ICON + power_channel = AREA_USAGE_ENVIRON + density = TRUE + pass_flags_self = PASSGLASS | PASSGRILLE | PASSSTRUCTURE + obj_integrity = 600 + max_integrity = 600 + integrity_failure = 0.35 + //Robust! It'll be tough to break... + armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 80, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50, "stamina" = 0) + anchored = TRUE + idle_power_usage = 2 + resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + layer = OPEN_DOOR_LAYER + //Seccies and brig phys may always pass, either way. + req_one_access = list(ACCESS_BRIG, ACCESS_BRIGPHYS) + //Cooldown so we don't shock a million times a second + COOLDOWN_DECLARE(shock_cooldown) + circuit = /obj/item/circuitboard/machine/turnstile + var/state = TURNSTILE_SECURED + +/obj/item/circuitboard/machine/turnstile + name = "Turnstile circuitboard" + desc = "The circuit board for a turnstile machine." + build_path = /obj/machinery/turnstile + req_components = list( + /obj/item/stack/cable_coil = 5, + /obj/item/stock_parts/micro_laser = 2, + /obj/item/stack/ore/bluespace_crystal = 1, + /obj/item/stack/rods = 12 + ) + +/obj/machinery/turnstile/examine(mob/user) + . = ..() + if(state == TURNSTILE_SECURED) + . += "The turnstile panel is tightly screwed to the frame." + if(state == TURNSTILE_CIRCUIT_EXPOSED) + . += "The turnstile circuitboard is exposed, you could pry it from the frame." + if(state == TURNSTILE_SHELL && anchored) + . += "The turnstile frame is empty but firmly wrenched to the floor." + if(state == TURNSTILE_SHELL && !anchored) + . += "The turnstile frame is empty and unsecured, ready to be sliced through welding." + +//Executive officer's line variant. For rule of cool. NSV13 We use this +/obj/machinery/turnstile/xo + name = "\improper XO line turnstile" + req_one_access = list(ACCESS_BRIG, ACCESS_HEADS) + +/obj/structure/closet/secure_closet/genpop + name = "Prisoner locker" + desc = "A locker used to store a prisoner's valuables, that they can collect at a later date." + req_access = list(ACCESS_BRIG) + anchored = TRUE + locked = FALSE + var/registered_name = null + var/assigned_id = null + +/obj/structure/closet/secure_closet/genpop/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/card/id)) + var/obj/item/card/id/I = W + if(broken) + to_chat(user, "It appears to be broken.") + return + if(!I || !I.registered_name) + return + //Sec officers can always open the lockers. Bypass the ID setting behaviour. + //Buuut, if they're holding a prisoner ID, that takes priority. + if(allowed(user) && !istype(I, /obj/item/card/id/prisoner)) + if(!registered_name) + say("Invalid, please assign this locker to prisoners first before handling it!") // Prevents officers from "forgetting" to assign lockers to the prisoners they are handling. + return + else + var/unassign = alert(user, "Do you want to unassign this locker?", "Prisoner locker", "Yes", "No") + switch(unassign) + if("Yes") + var/obj/item/card/id/prisoner/P = assigned_id + P.assigned_locker = null + registered_name = null + desc = initial(desc) + locked = FALSE + update_icon() + playsound(src, 'sound/machines/ping.ogg', 50, 0) + if("No") + locked = FALSE + update_icon() + return + //Handle setting a new ID. + if(!registered_name) + if(istype(I, /obj/item/card/id/prisoner)) //Don't claim the locker for a sec officer mind you... + var/obj/item/card/id/prisoner/P = I + if(P.assigned_locker) + to_chat(user, "This ID card is already registered to a locker.") + return + P.assigned_locker = src + assigned_id = I + registered_name = I.registered_name + desc = "A locker used to store a prisoner's valuables, that they can collect at a later date.\nCurrently assigned to: [I.registered_name]. Swipe a security officer ID to unassign it." + say("Locker sealed. Assignee: [I.registered_name]") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + locked = TRUE + update_icon() + else + to_chat(user, "Invalid ID. Only prisoners and officers may use these lockers.") + return + //It's an ID, and is the correct registered name. + if(istype(I) && (registered_name == I.registered_name)) + var/obj/item/card/id/prisoner/ID = I + //Not a prisoner ID. + if(!istype(ID)) + return + if(ID.served_time < ID.sentence) + playsound(loc, 'sound/machines/buzz-sigh.ogg', 80) //find another sound + say("DANGER: PRISONER HAS NOT COMPLETED SENTENCE. AWAIT SENTENCE COMPLETION. COMPLIANCE IS IN YOUR BEST INTEREST.") + return + visible_message("[user] slots [I] into [src]'s ID slot, freeing its contents!") + registered_name = null + desc = initial(desc) + locked = FALSE + update_icon() + qdel(I) + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + else + say("Access Denied. If you are a released prisoner, please insert your prisoner ID.") + return + else + return ..() + +/obj/structure/closet/secure_closet/genpop/AltClick(user) + var/mob/living/carbon/human/H = user + var/obj/item/card/id/I = H.get_idcard() + if(!registered_name) + if(allowed(user) && !istype(I, /obj/item/card/id/prisoner)) + say("Invalid, please assign this locker to prisoners first before handling it!") // Prevents officers from "forgetting" to assign lockers to the prisoners they are handling. + return + ..() + + +/obj/machinery/turnstile/Initialize(mapload) + . = ..() + icon_state = "turnstile" + //Attach a signal handler to the turf below for when someone passes through. + //Signal automatically gets unattached and reattached when we're moved. + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + AddComponent(/datum/component/simple_rotation, ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS, null, CALLBACK(src, PROC_REF(can_be_rotated))) + +/obj/machinery/turnstile/proc/can_be_rotated(mob/user, rotation_type) + if(!anchored && state == TURNSTILE_SHELL) + return TRUE + to_chat(user, "It is fastened to the floor!") + return FALSE + +/obj/machinery/turnstile/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + if(!istype(arrived, /mob)) + return + flick("operate", src) + playsound(src,'sound/items/ratchet.ogg',50,0,3) + if(arrived.pulledby) // don't do anything else for prisoners that are being escorted. + return + if(!istype(arrived, /mob/living/carbon/human)) //we only want to prevent prisoners from being able to reuse their ID card. + return + var/mob/living/carbon/human/H = arrived + var/obj/item/card/id/id_card = H.get_idcard(hand_first = TRUE) + if(ACCESS_PRISONER in id_card?.GetAccess()) + id_card.access -= list(ACCESS_PRISONER) //Prisoner IDs can only be used once to exit the turnstile + to_chat(H, "Your prisoner ID access has been purged, you won't be able to exit the prison through the turnstile again!") + addtimer(CALLBACK(src, PROC_REF(exit_push), H), 2) + +/obj/machinery/turnstile/proc/exit_push(atom/movable/pushed) //Just "pushes" prisoners that are being released out of the turnstile so that they don't trap themselves. + var/our_turf = get_turf(src) + var/pushed_turf = get_turf(pushed) + if(our_turf == pushed_turf) + var/movedir = turn(dir, 180) //Set to be the opposite of the turnstile dir, as that would always be the exit, unless the turnstile has been built incorrectly. + pushed.Move(get_step(pushed, movedir), movedir) + +///Handle movables (especially mobs) bumping into us. +/obj/machinery/turnstile/Bumped(atom/movable/movable) + . = ..() + if(!ismob(movable)) //Try to mimmick how airlocks act when bumped by items and the likes. Except when pulled (for crates and beds etc.) + if(movable.pulledby) + return + flick("deny", src) + playsound(src,'sound/machines/deniedbeep.ogg',50,0,3) + return + if(machine_stat & BROKEN) //try to shock mobs if we're broken + try_shock(movable) + return + //pretend to be an airlock if a mob bumps us + //(which means they tried to move through but didn't have access) + flick("deny", src) + playsound(src,'sound/machines/deniedbeep.ogg',50,0,3) + +///Shock attacker if we're broken +/obj/machinery/turnstile/attackby(obj/item/I, mob/user, params) + if(default_deconstruction_screwdriver(user, "turnstile", "turnstile", I)) + update_appearance()//add proper panel icons + state = TURNSTILE_CIRCUIT_EXPOSED + return + if(I.tool_behaviour == TOOL_CROWBAR && panel_open && circuit != null) + to_chat(user, "You start tearing out the circuitry...") + if(do_after(user, 3 SECONDS)) + I.play_tool_sound(src, 50) + circuit.forceMove(loc) + circuit = null + state = TURNSTILE_SHELL + return + if(istype(I, /obj/item/circuitboard/machine/turnstile) && state == TURNSTILE_SHELL && anchored) + to_chat(user, "You add the circuitboard to the frame.") + circuit = new/obj/item/circuitboard/machine/turnstile(src) + qdel(I) + state = TURNSTILE_CIRCUIT_EXPOSED + return + if(I.tool_behaviour == TOOL_WRENCH && state == TURNSTILE_SHELL) + if(anchored) + to_chat(user, "You unanchor the turnstile frame...") + if(do_after(user, 3 SECONDS)) + I.play_tool_sound(src, 50) + anchored = FALSE + return + if(!anchored) + to_chat(user, "You start anchoring the turnstile frame...") + if(do_after(user, 3 SECONDS)) + I.play_tool_sound(src, 50) + anchored = TRUE + return + . = ..() + if(machine_stat & BROKEN) + try_shock(user) + +//Shock attack if something is thrown at it if we're broken +/obj/machinery/turnstile/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + if(isobj(AM)) + if(prob(50) && (machine_stat & BROKEN)) + var/obj/O = AM + if(O.throwforce != 0)//don't want to let people spam tesla bolts, this way it will break after time + playsound(src, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = 5) + tesla_zap(src, 3, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN | TESLA_ALLOW_DUPLICATES) // Around 20 damage for humans + return ..() + +/obj/machinery/turnstile/welder_act(mob/living/user, obj/item/I) + //Shamelessly copied airlock code + . = TRUE + if(!I.tool_start_check(user, amount=0)) + return + if(circuit == null && user.a_intent == INTENT_HARM) + var/obj/item/weldingtool/W = I + if(W.use_tool(src, user, 40, volume=50)) + to_chat(user, "You start slicing off the bars of the [src]") + new /obj/item/stack/rods/ten(get_turf(src)) + qdel(src) + return + + if(obj_integrity >= max_integrity) + to_chat(user, "The turnstile doesn't need repairing.") + return + user.visible_message("[user] is welding the turnstile.", \ + "You begin repairing the turnstile...", \ + "You hear welding.") + if(I.use_tool(src, user, 40, volume=50)) + obj_integrity = max_integrity + set_machine_stat(machine_stat & ~BROKEN) + user.visible_message("[user.name] has repaired [src].", \ + "You finish repairing the turnstile.") + update_icon() + return + +/obj/machinery/turnstile/CanAllowThrough(atom/movable/mover, turf/target) + var/obj/item/card/id/id_card // used to check for prisoners trying to drag or piggyback others through the turnstile + . = ..() + if(. == TRUE) + return TRUE //Allow certain things declared with pass_flags_self through wihout side effects + if(machine_stat & BROKEN) + return FALSE + // Let everything through in 1 direction + if(mover.dir == dir) + return TRUE + // Call the default allowed functionality, handles: + // - Mobs with security access + // - Mobs with security access that are buckled to a vehicle + // - Monkeys carrying ID cards + // - Objects trying to pass through that have security access + // This doesn't handle prisoner access + if (ismob(mover) && allowed(mover)) + return TRUE + // Allow us through if the thing pulling us is allowed through + if(ismob(mover.pulledby) && allowed(mover.pulledby)) + return TRUE + // From this point on, we are assuming that the mover is a living entity + if (isliving(mover)) + // Block anyone if they are carrying someone + if (length(mover.buckled_mobs)) + return FALSE + // At this point, allow anyone with prisoner access on their direct ID card through + // although reject anyone attempting to pass without prisoner access + var/mob/living/living_prisoner = mover + id_card = living_prisoner.get_idcard(hand_first = TRUE) + if(ACCESS_PRISONER in id_card?.GetAccess()) + return TRUE + // Handle the prisoner being in a wheelchair + // check if someone riding on / buckled to them has access + if (!length(mover.buckled_mobs)) + return FALSE + // Reject the moving thing if anyone inside of the moving thing doesn't have access + for(var/mob/living/buckled in mover.buckled_mobs) + if(mover == buckled || buckled == mover) // just in case to prevent a possible infinite loop scenario (but it won't happen) + continue + id_card = buckled.get_idcard(hand_first = TRUE) + // If we aren't allowed through normally and we don't have prisoner access, reject + if (!allowed(buckled) && !(ACCESS_PRISONER in id_card?.GetAccess())) + return FALSE + return TRUE + +///Shock user if we can +/obj/machinery/turnstile/proc/try_shock(mob/user) + if(machine_stat & NOPOWER) // unpowered, no shock + return FALSE + if(!COOLDOWN_FINISHED(src, shock_cooldown)) //Don't shock in very short succession to avoid stuff getting out of hand. + return FALSE + COOLDOWN_START(src, shock_cooldown, 0.5 SECONDS) + do_sparks(5, TRUE, src) + if(electrocute_mob(user, power_source = get_area(src), source = src, dist_check = TRUE)) + return TRUE + else + return FALSE + +//Officer interface. +/obj/machinery/genpop_interface + name = "Prisoner Management Interface" + icon = 'icons/obj/machines/genpop_display.dmi' + icon_state = "frame" + desc = "An all-in-one interface for officers to manage prisoners!" + req_access = list(ACCESS_BRIG) + density = FALSE + maptext_height = 26 + maptext_width = 32 + maptext_y = -1 + var/time_to_screwdrive = 20 + var/buildstage = 2 // 2 = complete, 1 = no wires, 0 = circuit gone + var/next_print = 0 + var/desired_name //What is their name? + var/desired_details //Details of the crime + var/obj/item/radio/Radio //needed to send messages to sec radio + var/config_file = file("config/space_law.json") + /// A list of all of the available crimes in a formated served to the user interface. + var/static/list/crime_list + var/crime_names = list() + var/static/regex/valid_crime_name_regex = null + +//Prisoner interface wallframe +/obj/item/wallframe/genpop_interface + name = "\improper prisoner interface frame" + desc = "Frame used to build the prisoner interface." + icon = 'icons/obj/machines/genpop_display.dmi' + icon_state = "frame" + pixel_shift = 32 + inverse = 1 + result_path = /obj/machinery/genpop_interface + +/obj/item/electronics/genpop_interface + name = "prisoner interface circuitboard" + icon_state = "power_mod" + desc = "Central processing unit for the prisoner interface." + +/obj/machinery/genpop_interface/Initialize(mapload, nbuild) + . = ..() + update_icon() + + if(nbuild) + buildstage = 0 + panel_open = TRUE + + if (!crime_list || !valid_crime_name_regex) + build_static_information() + + Radio = new/obj/item/radio(src) + Radio.listening = 0 + Radio.set_frequency(FREQ_SECURITY) + +/obj/machinery/genpop_interface/proc/build_static_information() + // Generate the crime list + try crime_list = json_decode(file2text(config_file)) + catch(var/exception/e) + message_admins("[e] caught on [e.file]:[e.line].") + load_default_crimelist() + return + //we need to get the names of each crime for the regex + for(var/key in crime_list) + var/value = crime_list[key] + for(var/second_key in value) + var/second_value = second_key["name"] + LAZYADD(crime_names, second_value) + + if (valid_crime_name_regex) + return + + // Form the valid crime regex + var/regex_string = "^(Attempted )?([jointext(crime_names, "|")])( \\(Repeat offender\\))?$" + valid_crime_name_regex = regex(regex_string, "gm") + +/obj/machinery/genpop_interface/proc/load_default_crimelist() + crime_list = list() + //Hardcoded crimes list from crimes.dm, not used unless the config file is missing somehow. + message_admins("Failed to read the space_law config file! Defaulting to hardcoded datums.") //Hardcoded crimes list from crimes.dm, not used unless the config file is missing somehow. + for (var/datum/crime/crime_path as() in subtypesof(/datum/crime)) + // Ignore this crime, it is abstract + if (isnull(initial(crime_path.name))) + continue + // We need to know about this crime for the regex + crime_names += initial(crime_path.name) + // Create the category if it is needed + if (!islist(crime_list[initial(crime_path.category)])) + crime_list[initial(crime_path.category)] = list() + // Add crimes to that category + crime_list[initial(crime_path.category)] += list(list( + "name" = initial(crime_path.name), + "tooltip" = initial(crime_path.tooltip), + "colour" = initial(crime_path.colour), + "icon" = initial(crime_path.icon), + "sentence" = initial(crime_path.sentence), + )) + var/regex_string = "^(Attempted )?([jointext(crime_names, "|")])( \\(Repeat offender\\))?$" + valid_crime_name_regex = regex(regex_string, "gm") + +/obj/machinery/genpop_interface/update_icon() + if(buildstage< 2) + icon_state = "frame" + set_picture("ai_off") + return + + if(panel_open) + set_picture("ai_off") + return + + if(machine_stat & (NOPOWER)) + icon_state = "frame" + set_picture("ai_off") + return + + if(machine_stat & (BROKEN)) + set_picture("ai_bsod") + return + set_picture("genpop") + +/obj/machinery/genpop_interface/examine() + . = ..() + if(!panel_open) + . += "The prisoner interface panel is screwed in safely." + if(panel_open && buildstage == 2) + . += "The prisoner interface panel is open, the wires are exposed.\nThe interface cannot function with its panel screwed open." + if(buildstage == 1) + . += "The circuits are visible and ready to be pried off.\nIt is lacking proper wiring" + if(buildstage == 0) + .+= "The empty frame is ready to be wrenched off the wall.\nIt is lacking a circuitboard." + +/obj/machinery/genpop_interface/attackby(obj/item/C, mob/user) + switch(buildstage) + if(0) + if(istype(C, /obj/item/electronics/genpop_interface)) + if(user.temporarilyRemoveItemFromInventory(C)) + to_chat(user, "You insert the processing unit in the frame.") + qdel(C) + buildstage = 1 + return + + if(C.tool_behaviour == TOOL_WRENCH) + to_chat(user, "You wrench the frame off the wall.") + C.play_tool_sound(src) + new /obj/item/wallframe/genpop_interface( user.loc ) + qdel(src) + return + if(1) + if(istype(C, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/cable = C + if(cable.get_amount() < 5) + to_chat(user, "You need five lengths of cable to wire the prisoner interface!") + return + user.visible_message("[user.name] wires theprisoner interface.", \ + "You start wiring the prisoner interface.") + if (do_after(user, 20, target = src)) + if (cable.get_amount() >= 5 && buildstage == 1) + cable.use(5) + to_chat(user, "You wire the prisoner interface.") + buildstage = 2 + update_icon() + return + + if(C.tool_behaviour == TOOL_CROWBAR) + to_chat(user, "You start prying out the electronics off the frame.") + if (C.use_tool(src, user, 20)) + if (buildstage == 1) + to_chat(user, "You remove the prisoner interface electronics.") + new /obj/item/electronics/genpop_interface( src.loc ) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + buildstage = 0 + update_icon() + return + if(2) + if(C.tool_behaviour == TOOL_SCREWDRIVER) + if(panel_open) + to_chat(user, "You close the panel of the [src].") + C.play_tool_sound(src) + panel_open = FALSE + update_icon() + return + else + to_chat(user, "You open the panel of the [src].") + C.play_tool_sound(src) + panel_open = TRUE + update_icon() + return + + if(C.tool_behaviour == TOOL_WIRECUTTER && panel_open) + C.play_tool_sound(src) + to_chat(user, "You cut the wires.") + new /obj/item/stack/cable_coil(loc, 5) + buildstage = 1 + update_icon() + return + + if(!istype(C, /obj/item/card/id)) + . = ..() + else + var/obj/item/card/id/I = C + playsound(src, 'sound/machines/ping.ogg', 20) + desired_name = I.registered_name + +/obj/machinery/genpop_interface/proc/set_picture(state) + if(maptext) + maptext = "" + cut_overlays() + add_overlay(mutable_appearance(icon, state)) + +/obj/machinery/genpop_interface/ui_state(mob/user) + return GLOB.default_state + +/obj/machinery/genpop_interface/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "GenPop") + ui.open() + ui.set_autoupdate(TRUE) + +/obj/machinery/genpop_interface/ui_data(mob/user) + var/list/data = list() + data["allPrisoners"] = list() + data["desired_name"] = desired_name + data["desired_details"] = desired_details + data["canPrint"] = world.time >= next_print + var/list/L = data["allPrisoners"] + for(var/obj/item/card/id/prisoner/ID in GLOB.prisoner_ids) + var/list/id_info = list() + id_info["name"] = ID.registered_name + id_info["id"] = REF(ID) + id_info["served_time"] = ID.served_time + id_info["sentence"] = ID.sentence + id_info["crime"] = ID.crime + data["allPrisoners"][++L.len] = id_info + return data + +/// Send these in static data because they will never change. +/obj/machinery/genpop_interface/ui_static_data(mob/user) + var/list/data = list() + // The global crime list + data["crime_list"] = crime_list + return data + +/obj/machinery/genpop_interface/proc/print_id(mob/user, desired_crime, desired_sentence) + + if(world.time < next_print) + to_chat(user, "[src]'s ID printer is on cooldown.") + return FALSE + investigate_log("[key_name(user)] created a prisoner ID with sentence: [desired_sentence / 600] for [desired_sentence / 600] min", INVESTIGATE_RECORDS) + user.log_message("[key_name(user)] created a prisoner ID with sentence: [desired_sentence / 600] for [desired_sentence / 600] min", LOG_ATTACK) + + if(desired_crime) + var/datum/data/record/R = find_record("name", desired_name, GLOB.data_core.general) + if(R) + R.fields["criminal"] = "Incarcerated" + var/crime = GLOB.data_core.createCrimeEntry(desired_crime, null, user.real_name, station_time_timestamp()) + GLOB.data_core.addCrime(R.fields["id"], crime) + investigate_log("New Crime: [desired_crime] | Added to [R.fields["name"]] by [key_name(user)]", INVESTIGATE_RECORDS) + say("Criminal record for [R.fields["name"]] successfully updated.") + playsound(loc, 'sound/machines/ping.ogg', 50, 1) + + var/obj/item/card/id/id = new /obj/item/card/id/prisoner(get_turf(src), desired_sentence * 0.1, desired_crime, desired_name) + Radio.talk_into(src, "Prisoner [id.registered_name] has been incarcerated for [desired_sentence / 600 ] minutes.") + var/obj/item/paper/paperwork = new /obj/item/paper(get_turf(src)) + paperwork.add_raw_text("

Record Of Incarceration:


Name:

[desired_name]

Crime:

[desired_crime]

Sentence (Min)

[desired_sentence/600]

Description

[desired_details]

WhiteRapids Military Council, disciplinary authority.

") //NSV13 Nanotrasen replaced with WhiteRapids + paperwork.update_appearance() + desired_name = null + desired_details = null + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) + next_print = world.time + 5 SECONDS + + + + +/obj/machinery/genpop_interface/ui_act(action, params) + if(buildstage != 2 & panel_open) + return + if(isliving(usr)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + if(..()) + return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + switch(action) + if("prisoner_name") + // Encode the name and ensure it is saniticed for IC input + var/prisoner_name = stripped_input(usr, "Input prisoner's name...", "Crimes", desired_name) + prisoner_name = sanitize_name(prisoner_name) + if(!prisoner_name || (!Adjacent(usr) && !IsAdminGhost(usr))) + return FALSE + desired_name = prisoner_name + var/prisoner_details = stripped_input(usr, "Input details of the offense...", "Crimes", desired_details) + if (!prisoner_details || CHAT_FILTER_CHECK(prisoner_details) || (!Adjacent(usr) && !IsAdminGhost(usr))) + return TRUE + desired_details = prisoner_details + // Ask them for the details of the crime + if("edit_details") + var/prisoner_details = stripped_input(usr, "Input details of the offense...", "Crimes", desired_details) + if (!prisoner_details || CHAT_FILTER_CHECK(prisoner_details) || (!Adjacent(usr) && !IsAdminGhost(usr))) + return FALSE + desired_details = prisoner_details + // Ask them for the details of the crime + if("print") + if (!desired_name) + return + if (!desired_details) + var/prisoner_details = stripped_input(usr, "Input details of the offense...", "Crimes", desired_details) + if (!prisoner_details || CHAT_FILTER_CHECK(prisoner_details) || (!Adjacent(usr) && !IsAdminGhost(usr))) + say("Please provide a correct description of the incident that led to their charge.") + return + desired_details = prisoner_details + var/desired_sentence = text2num(params["desired_sentence"]) + if (!desired_sentence) + return + var/desired_crime = params["desired_crime"] + if (!valid_crime_name_regex.Find(desired_crime)) + log_href_exploit(usr, "Entered a desired crime which was not permitted by the desired crime regex.") + return + print_id(usr, desired_crime, desired_sentence) + + // For adjusting the time of pre-existing prisoners + if("adjust_time") + var/obj/item/card/id/prisoner/id = locate(params["id"]) in GLOB.prisoner_ids + var/value = text2num(params["adjust"]) + if(!istype(id)) + return + if(id.served_time >= id.sentence) + say("Prisoner has already served their time! Please apply another charge to sentence them with!") + return + if(value && isnum(value)) + id.sentence = clamp(id.sentence + value , 0 , MAX_TIMER) + + if("release") + var/obj/item/card/id/prisoner/id = locate(params["id"]) in GLOB.prisoner_ids + if(!istype(id)) + return + if(alert("Are you sure you want to release [id.registered_name]", "Prisoner Release", "Yes", "No") != "Yes") + return + Radio.talk_into(src, "Prisoner [id.registered_name] has been discharged.") + investigate_log("[key_name(usr)] has early-released [id] ([id.loc])", INVESTIGATE_RECORDS) + usr.log_message("[key_name(usr)] has early-released [id] ([id.loc])", LOG_ATTACK) + id.served_time = id.sentence + if("escaped") + var/obj/item/card/id/prisoner/id = locate(params["id"]) in GLOB.prisoner_ids + if(!istype(id)) + return + if(alert("Do you want to reset the sentence of [id.registered_name]?", "Confirmation", "Yes", "No") != "Yes") + return + Radio.talk_into(src, "Prisoner [id.registered_name] has had their serving time reset.") + investigate_log("[key_name(usr)] has reset the timer of [id] ([id.loc])", INVESTIGATE_RECORDS) + usr.log_message("[key_name(usr)] has reset the timer of [id] ([id.loc])", LOG_ATTACK) + id.served_time = 0 + +GLOBAL_LIST_EMPTY(prisoner_ids) + +/obj/item/card/id/prisoner //renamed existing prisonner id to id/gulag + icon_state = "orange" + item_state = "orange-id" + assignment = "convict" + hud_state = JOB_HUD_PRISONER + var/served_time = 0 //Seconds. + var/sentence = 0 //'ard time innit. + var/crime = null //What you in for mate? + var/atom/assigned_locker = null //Where's our stuff then guv? + +/obj/item/card/id/prisoner/Initialize(mapload, _sentence, _crime, _name) + . = ..() + GLOB.prisoner_ids += src + if(_crime) + crime = _crime + if(_sentence) + sentence = _sentence + if(!_name) + registered_name = "Prisoner WR-ROSETTA#[rand(0, 10000)]" + else + registered_name = _name + update_label(registered_name, "Convict") + START_PROCESSING(SSobj, src) + +/obj/item/card/id/prisoner/Destroy() + GLOB.prisoner_ids -= src + . = ..() + +/obj/item/card/id/prisoner/examine(mob/user) + . = ..() + if(sentence) + . += "You have served [DisplayTimeText(served_time*10, 1)] out of [DisplayTimeText(sentence*10, 1)]." + if(crime) + . += "It appears its holder was convicted of: [crime]" + +/obj/item/card/id/prisoner/process(delta_time) + served_time += delta_time + if(served_time >= sentence) //FREEDOM! + assignment = "Ex-Convict" + access = list(ACCESS_PRISONER) + update_label(registered_name, assignment) + playsound(loc, 'sound/machines/ping.ogg', 50, 1) + + var/datum/data/record/R = find_record("name", registered_name, GLOB.data_core.general) + if(R) + R.fields["criminal"] = "Discharged" + + if(isliving(loc)) + to_chat(loc, "You have served your sentence! You may now exit prison through the turnstiles and collect your belongings.") + return PROCESS_KILL + +#undef MAX_TIMER diff --git a/code/modules/security/prison_scanner.dm b/code/modules/security/prison_scanner.dm new file mode 100644 index 00000000000..011f036564b --- /dev/null +++ b/code/modules/security/prison_scanner.dm @@ -0,0 +1,57 @@ +//Scanner item for the prisoners to redeem sentence time for their work in the workshop + +/obj/item/prison_scanner + name = "prison export scanner" + desc = "A device used to check objects made in the workshop, to have them cashed out for sentence reductions." + icon = 'icons/obj/device.dmi' + icon_state = "export_scanner" + item_state = "radio" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + item_flags = NOBLUDGEON + w_class = WEIGHT_CLASS_SMALL + siemens_coefficient = 1 + var/obj/item/prison_scanner/linked_id = null //Which prisoner ID is linked to this scanner + var/list/redeemable = list() //Items ready to be redeemed + +/obj/item/prison_scanner/examine(mob/user) + . = ..() + if(linked_id) + . += "[src] is currently linked with [linked_id]'s ID card." + if(!linked_id) + . += "[src] is currently unlinked." + +/obj/item/prison_scanner/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/C = I + if(!linked_id) + linked_id = C.registered_name + to_chat(user, "Scanner linked to [C.registered_name] succesfully!") + if(linked_id != C.registered_name) + to_chat(user, "The scanner is already linked to [linked_id]'s ID!") + else if(length(redeemable)) + C.served_time += (15 * redeemable.len) + redeemable.Cut() + if(C.served_time >= C.sentence) + to_chat(user, "Items redeemed! You now have [DisplayTimeText((C.sentence - C.served_time)*10, 1)] left to serve!") + linked_id = null + else + to_chat(user, " No items to redeem!") + else + . = ..() + +/obj/item/prison_scanner/afterattack(obj/O, mob/user, proximity) + . = ..() + if(!linked_id) + to_chat(user, "No linked account!") + else if(!istype(O, /obj/item/reagent_containers/food/snacks/donut) && !istype(O, /obj/item/toy/plush)) + to_chat(user, "Invalid item! Only scan donuts or plushes made in the workshop!") + else + if(O.obj_flags & SCANNED) + to_chat(user, "The [O.name] has been scanned already!") + else + redeemable += O + O.obj_flags |= SCANNED + to_chat(user, "The [O.name] has been scanned succesfully! Swipe your id card on the scanner once you want to redeem your earned time.") diff --git a/code/modules/security/workshop.dm b/code/modules/security/workshop.dm new file mode 100644 index 00000000000..25ce0e4c36f --- /dev/null +++ b/code/modules/security/workshop.dm @@ -0,0 +1,107 @@ +// Workshop area for the prison wing in Brig + + +/obj/machinery/computer/holodeck/prison + name = "workshop control console" + desc = "a computer used to control the workshop in the prison" + + mapped_start_area = /area/holodeck/prison + linked = /area/holodeck/prison //linked area + program_type = /datum/map_template/holodeck/prison //load workshop programs + req_access = list(ACCESS_SECURITY) + var/startup + var/offline = FALSE + +/obj/machinery/computer/holodeck/prison/LateInitialize() + var/area/computer_area = get_area(src) + if(istype(computer_area, /area/holodeck/prison)) + log_mapping("Holodeck computer cannot be in a holodeck, This would cause circular power dependency.") + qdel(src) + return + else + offline_program = pick("donut", "plush") + . = ..() + +/obj/machinery/computer/holodeck/prison/generate_program_list() + for(var/typekey in subtypesof(program_type)) + var/datum/map_template/holodeck/program = typekey + var/list/info_this = list("id" = initial(program.template_id), "name" = initial(program.name)) + if(!(initial(program.template_id) == "offline")) + LAZYADD(program_cache, list(info_this)) + +/obj/machinery/computer/holodeck/prison/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Workshop") + ui.open() + + +/obj/machinery/computer/holodeck/prison/ui_data(mob/user) + var/list/data = list() + + data["default_programs"] = program_cache + data["program"] = program + return data + +/obj/machinery/computer/holodeck/prison/ui_act(action, params) + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + if(..()) + return + switch(action) + if("load_program") + var/program_to_load = params["id"] + + var/valid = FALSE //dont tell security about this + + //checks if program_to_load is any one of the loadable programs, if it isnt then it rejects it + for(var/list/check_list as anything in program_cache) + if(check_list["id"] == program_to_load) + valid = TRUE + break + if(!valid) + return + if(offline) + say("Workshop shutdown underway! Standby for reboot...") + return + else //load the map_template that program_to_load represents + load_program(program_to_load) + . = TRUE + if("shutdown") + log_game("[key_name(usr)] has shutdown the prison workshop at [loc_name(src)]!") + temporary_down() + . = TRUE + +/obj/machinery/computer/holodeck/prison/proc/temporary_down() + if(!offline) + say("Emergency shutdown engaged. Restarting in 2 minutes...") + offline_program = "workshop-offline" + emergency_shutdown() + offline = TRUE + offline_program = pick("donut", "plush") + addtimer(CALLBACK(src, PROC_REF(load_program), offline_program), 1200) + else + say("Workshop shutdown underway! Standby for reboot...") + +/obj/machinery/computer/holodeck/prison/nerf(nerf_this, is_loading) //We want items to behave as normal and to do damage + return + +/obj/machinery/computer/holodeck/prison/derez(atom/movable/holo_atom, silent = TRUE, forced = FALSE) + spawned -= holo_atom + if(!holo_atom) + return + if(!(get_turf(holo_atom) in linked)) //Don't derez items that have been hidden or taken away by prisoners + return + UnregisterSignal(holo_atom, COMSIG_PARENT_PREQDELETED) + var/turf/target_turf = get_turf(holo_atom) + for(var/atom/movable/atom_contents as anything in holo_atom) //make sure that things inside of a holoitem are moved outside before destroying it + atom_contents.forceMove(target_turf) + if(!silent) + visible_message("[holo_atom] fades away!") + + qdel(holo_atom) + +/obj/machinery/computer/holodeck/prison/load_program() + . = ..() + offline = FALSE diff --git a/config/space_law.json b/config/space_law.json new file mode 100644 index 00000000000..f7fc3b9d9f2 --- /dev/null +++ b/config/space_law.json @@ -0,0 +1,290 @@ +{ + "Minor": [ + { + "name": "Minor Vandalism", + "tooltip": "To damage, destroy, or permanently deface non-critical furniture, vendors, or personal property.", + "colour": "yellow", + "icon": "house-damage", + "sentence": 3000 + }, + { + "name": "Assault", + "tooltip": "To use physical force against someone without the apparent intent to kill them.", + "colour": "yellow", + "icon": "hand-rock", + "sentence": 3000 + }, + { + "name": "Disturbing the Peace", + "tooltip": "To knowingly organize a movement which disrupts the normal operations of a department.", + "colour": "yellow", + "icon": "fist-raised", + "sentence": 3000 + }, + { + "name": "Dereliction of Duty", + "tooltip": "To willfully abandon an obligation that is critical to the vessel's continued operation.", + "colour": "yellow", + "icon": "walking", + "sentence": 3000 + }, + { + "name": "Breaking and Entering", + "tooltip": "Forced entry to areas where the subject does not have access to. This counts for general areas only.", + "colour": "yellow", + "icon": "door-open", + "sentence": 3000 + }, + { + "name": "Encouragement of sympathizing Attitudes", + "tooltip": "To openly express viewpoints or opinions sympathetic to the cause of an enemy organisation, in the attempt to encourage such thoughts among the wider crew.", + "colour": "yellow", + "icon": "comment-slash", + "sentence": 3000 + }, + { + "name": "Trespass", + "tooltip": "To be in an area which a person has either not purposefully been admitted to, does not have access, or has been asked to leave by someone who has access to that area.", + "colour": "yellow", + "icon": "walking", + "sentence": 3000 + }, + { + "name": "Workplace Negligence", + "tooltip": "To be negligent in one's duty to an extent that it may cause harm, illness, or other negative effect, to another.", + "colour": "yellow", + "icon": "low-vision", + "sentence": 3000 + }, + { + "name": "Petty Theft", + "tooltip": "To steal items from another's person.", + "colour": "yellow", + "icon": "mask", + "sentence": 3000 + }, + { + "name": "Possession, Illicit Substances", + "tooltip": "The possession of illegal drugs in quantities appropriate for personal use.", + "colour": "yellow", + "icon": "joint", + "sentence": 3000 + }, + { + "name": "Misrepresentation of Authorization", + "tooltip": "To intentionally lie or mislead others that one has orders to access restricted company resources. To deceive others to gain property or credits from other personnel.", + "colour": "yellow", + "icon": "hand-holding-usd", + "sentence": 3000 + }, + { + "name": "Indecent Exposure", + "tooltip": "To be intentionally and publicly unclothed.", + "colour": "yellow", + "icon": "tshirt", + "sentence": 3000 + } + ], + "Misdemeanour": [ + { + "name": "Vandalism, Major", + "tooltip": "To destroy or damage non-critical furniture, vendors, or personal property in a manor that can not be repaired.", + "colour": "orange", + "icon": "house-damage", + "sentence": 6000 + }, + { + "name": "Assault of an Officer", + "tooltip": "To use physical force against a Department Head or member of Security without the apparent intent to kill them.", + "colour": "orange", + "icon": "user-injured", + "sentence": 6000 + }, + { + "name": "Vigilantism", + "tooltip": "To perform the responsibilities and duties of military police without approval or due cause to act.", + "colour": "orange", + "icon": "user-secret", + "sentence": 6000 + }, + { + "name": "Insubordination", + "tooltip": "To knowingly disobey a lawful order from a superior.", + "colour": "orange", + "icon": "hand-middle-finger", + "sentence": 6000 + }, + { + "name": "Breaking and Entering, Inherently Dangerous Areas", + "tooltip": "To trespass into an area which may lead to the injury of self or others using forcible entry.", + "colour": "orange", + "icon": "door-open", + "sentence": 6000 + }, + { + "name": "Propaganda", + "tooltip": "Advocating for defection of the ship to a hostile faction.", + "colour": "orange", + "icon": "briefcase", + "sentence": 6000 + }, + { + "name": "Trespass, Inherently Dangerous Areas", + "tooltip": "Trespassing in an area which may lead to the injury of self, or others.", + "colour": "orange", + "icon": "door-closed", + "sentence": 6000 + }, + { + "name": "Gross Incompetence", + "tooltip": "To be negligent in one's duty to an extent that it may cause harm to multiple individuals, a department, or in a manor which directly leads to a serious injury of another person which requires emergency medical treatment.", + "colour": "orange", + "icon": "blind", + "sentence": 6000 + }, + { + "name": "Theft", + "tooltip": "To steal equipment or items from a workplace, or items of extraordinary value from one's person.", + "colour": "orange", + "icon": "mask", + "sentence": 6000 + }, + { + "name": "Distrubution, Illicit Substances", + "tooltip": "The possession of dangerous or illegal drugs/equipment in a quantity greater than that which is reasonable for personal consumption.", + "colour": "orange", + "icon": "joint", + "sentence": 6000 + }, + { + "name": "Identity Fraud", + "tooltip": "The manufacture of falsified documents or tampering with other signifiers for the purposes of; falsifying an Identity, Wearing the uniform of another department without authorization, or claiming to be reassigned to a department or command.", + "colour": "orange", + "icon": "theater-masks", + "sentence": 6000 + } + ], + "Major": [ + { + "name": "Sabotage", + "tooltip": "To destroy vessel assets or resources critical to normal or emergency vessel procedures, or cause sections of the vessel to become uninhabitable.", + "colour": "bad", + "icon": "bomb", + "sentence": 9000 + }, + { + "name": "Aggravated Assault/Attempted Murder", + "tooltip": "To take physical action against a person with intent to grievously harm or kill.", + "colour": "bad", + "icon": "user-injured", + "sentence": 9000 + }, + { + "name": "Rioting", + "tooltip": "To partake in an unauthorised and disruptive assembly of crewmen that refuse to disperse.", + "colour": "bad", + "icon": "fist-raised", + "sentence": 9000 + }, + { + "name": "Interference With Department Leadership", + "tooltip": "To significantly disrupt the Head of a department's ability to lead or coordinate.", + "colour": "bad", + "icon": "hand-middle-finger", + "sentence": 9000 + }, + { + "name": "Breaking and Entering, High Security Areas", + "tooltip": "To commit trespassing into a secure area such as: Command areas, Personal offices, Weapons storage, weapon production, explosive storage, explosive production, or other high security areas, using forcible entry.", + "colour": "bad", + "icon": "door-open", + "sentence": 9000 + }, + { + "name": "Enemy Sympathizer", + "tooltip": "To openly call for action to the benefit of an enemy organisation, in the attempt to weaken the position of the ship, or strengthen the position of the enemy.", + "colour": "bad", + "icon": "comment-slash", + "sentence": 9000 + }, + { + "name": "Trespass, High Security Areas", + "tooltip": "Trespassing in any of the following without appropriate permission or access: Command areas, Personal offices, Weapons storage, weapon production, explosive storage, explosive production, or other high security areas.", + "colour": "bad", + "icon": "running", + "sentence": 9000 + }, + { + "name": "Manslaughter", + "tooltip": "To unintentionally kill someone through negligent, but not malicious, actions.", + "colour": "bad", + "icon": "book-dead", + "sentence": 9000 + }, + { + "name": "Larceny", + "tooltip": "To steal rare, expensive (Items of greater than 1000 credit value), or restricted equipment from secure areas or one's person.", + "colour": "bad", + "icon": "mask", + "sentence": 9000 + }, + { + "name": "Production, Illicit Substances", + "tooltip": "To produce substances such as drugs, poisons, performance enhancers, etc without explicit written permission by the Chief Medical Officer and Captain.", + "colour": "bad", + "icon": "flask", + "sentence": 9000 + }, + { + "name": "Impersonation of Central Command ", + "tooltip": "Falsify orders from or to impersonate a member of Central Command.", + "colour": "bad", + "icon": "user-secret", + "sentence": 9000 + } + ], + "Capital": [ + { + "name": "Grand Sabotage", + "tooltip": "To destroy or modify vessel assets or equipment without which the vessel may collapse or otherwise become uninhabitable.", + "colour": "grey", + "icon": "bomb", + "sentence": 360000 + }, + { + "name": "Murder", + "tooltip": "To maliciously kill someone.", + "colour": "grey", + "icon": "skull-crossbones", + "sentence": 360000 + }, + { + "name": "Inciting a Riot", + "tooltip": "To attempt to stir the crew into a riot with the intention of disrupting the functioning of the vessel.", + "colour": "grey", + "icon": "fist-raised", + "sentence": 360000 + }, + { + "name": "Mutiny", + "tooltip": "To act individually, or as a group, to overthrow or subvert the established Chain of Command without lawful and legitimate cause.", + "colour": "grey", + "icon": "link", + "sentence": 360000 + }, + { + "name": "Enemy of the Corporation", + "tooltip": "To be a member of any of the following organizations: The syndicate, Hostile boarding parties, Wizards, Changeling Hiveminds, cults, or other non-authorized religious practitioners (heretics).", + "colour": "grey", + "icon": "user-alt-slash", + "sentence": 360000 + }, + { + "name": "Grand Larceny", + "tooltip": "To steal inherently dangerous items from their storage, one's person, or other such methods acquire through illicit means.", + "colour": "grey", + "icon": "mask", + "sentence": 360000 + } + ] + } diff --git a/nsv13/icons/obj/status_display.dmi b/icons/obj/machines/genpop_display.dmi similarity index 100% rename from nsv13/icons/obj/status_display.dmi rename to icons/obj/machines/genpop_display.dmi diff --git a/icons/obj/machines/turnstile.dmi b/icons/obj/machines/turnstile.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5647ea68c1fbf928856e07250be5646b575ff787 GIT binary patch literal 8179 zcma)hc|26@-~WgrB~mF{lS&&IWjD-}rA^T$TN$+2Vk$zI8M~x(w=lwxRLV9aWSgNZ zW#4y(WZxOHnwj4mU%w*5IrF@Gsl6`0*Q$HmQ+MXrXl?WT{?4qwpJD1{vPaQW?JU9Cb0 zWGDBu(ecYZ2{ZlZ+gry7!t+GKvL8A#IkLnCudK<<5y%|*b`3XA?X`k1ZNYPIFG>Cg z7cDTN8n)sb#?vLid@+|u)`;}YNBMqf`rbL@9*#NXhc3uPFA3j=654jh998xS)WKKHicjc z&vx~evng;FgvgbqZt5k+HazI>i#au2Eh~uDCERakGOw0iW_snLNO?zxrLQ~InVPa( zn(_2{Hl@pFPn=A(hpkpYVK+|>8gS@c)W9Xjm2@(5y5}fqOTr;F$Ya7GMU5A_1f0w#b`~01_I-hl~BGyC71YNI;m1ug- z>V-8BP8wqLWn^R*8&Z&js;vG6VPcoC-)yaNhN7YGoSUzvV}N4-bcV{?wqUFr~wT7F(v z&mEhTRF+B?hExa`#k7x>(DWfWUH$I2#)=MA3J1g&jBeDDB+S(kOlHqd#=C7J}O}*-QnLY@;+@meOXpUMlR`=<5B5GwgIZ6AjX1?vJ!rMO5G*I zP7-~LHMtTNwr-}BKA@!A-;?Kx@e{P>yl3yM>}v0<@GllkLmwv6$j_0Q5k@IKv)ztO z%{iN%Ielh``&^~o#7wvp%{3?BtXyi-IZqYTF(WpQ|Ep?ZiJy0O{b09 zySi@l2{(a?RuDog7Y=`xlkMp`D47lw7mqD5>&gqT8tUp!KWXt7NPT}YhV=Xp9-EQt99jc{7)$hy@QQu z_0ye9Me25G(*p*_;>qV}DPKE5NyH3^o~x1y%9#5k9U=K*mUYANYS#Pn@@s5N@`%37 zNcoVgHq3XQ18Nh6``+Yfe zub2{((^kWI{H??r>MH_Ky)^jH(p2O`5`tsLJhA`zkGEHDA3Ne9vOLdGnh&OVtvK9~ zK;!(oW8YhftcBPV6-hk_HUc-#GqZwI%A=Jm1T62~b2(IM&%BqA5chSV+iI^vj(*H( zvpiIh`cE$|b;9Bcd2LyNsp&aR-A`V}(TQg?6Ff_B+^>i$FLw4zK$cbkMprHP#idIO z&s*z0d=v;!f~c^+v^J;0M$iJ;DG!lr2CqTIb)S>aQtjo6UCP< zb*N|5KlmA!m)SH78OP7bHVoDnyB+d}clNz^VJ^`^r^qfV&k_aseCQordO9_KJua+7{b ztH5oNieuJiP>lQXeuXn`33{W4{A=K(#*GgFP#q9xqqk;Bq}ayfR{*lGQMHiwW=ROppVW!) z#?`?wNB#xlYoSfGQlolL*^$d zBbT`8#8C$Ci!T@UGSwpEHS`#YxGS{j54JV_4{S?3t@gMA!FY4?iJZeE??!!XYUOrq zTB;J&a1@z+OM^Dk8=jcB^Xd+gWgcm2(CN-djXC5B

g6302Nc!bO!PVZw}*X|R~n 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 Y0xSDJW2BFQxA>6L#->JD26jRJ5BW$f}FD)lO zzsN+1i!&v&s2C`0$i$k-0@q1IK~z|Utyk-sqaX}*EzGze+nK)q!!9A9A+?5Mo3H(WF&xR2Gd=!DdCYqK zu1q)Qg?!Cla_MjL{N0IKE~b9Ec?;mLl(}0KfOGwH3n6A%Nqoov&L>{RSOH#sVFftV z(+T1lStKAT{9pJS-$G}lgIR-nx znj`>y4*!Y^>QB1prM?8Y$o<{`ViV^!7d4w%?j~IHQojT2CrCNsB+emy#DRN}s}VSkf!1600>B67TaY=C{6Q9Jy=9*PLZV*Ey@%%kOP&u0b)fZ@ zJ)IzN>25ES=G_5^O4WMHzEpDJC&{@|Xk6B`4$r+v>n(d~*9=d+$F~<~Vy3k9BGE0i z-m)(-Ucmy=BkcbPY*Nv@I(Rvq?-cs5NoD%t+HVZ5=)q2Zb&4b(>^*mTQdD2^JJr6!EPXH)Cm@GN+u|J7Hzg$KD4zdK`2O|Le2|#`@ z1kjH}j30~v^b-r>2V(%TTY~&x5J2>MkROb?NK7n@AB?(4%v_8gTyYV^4@Oh z1GpEV`~dEzC_lL7B7h%U$Rdm%T*xAfA6zLkh#y>O6%apwZ+0j@fbXU#KUmb-1TgRC cZ(iU319Hlb{(*FYvH$=807*qoM6N<$g1C^f)&Kwi literal 0 HcmV?d00001 diff --git a/nsv13.dme b/nsv13.dme index fe9140ba874..32ae7a97bea 100644 --- a/nsv13.dme +++ b/nsv13.dme @@ -1453,6 +1453,7 @@ #include "code\game\turfs\open\floor\misc_floor.dm" #include "code\game\turfs\open\floor\plasteel_floor.dm" #include "code\game\turfs\open\floor\plating.dm" +#include "code\game\turfs\open\floor\prison_floor.dm" #include "code\game\turfs\open\floor\reinf_floor.dm" #include "code\game\turfs\open\floor\plating\asteroid.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" @@ -3296,6 +3297,10 @@ #include "code\modules\ruins\spaceruin_code\spacehotel.dm" #include "code\modules\ruins\spaceruin_code\TheDerelict.dm" #include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" +#include "code\modules\security\crimes.dm" +#include "code\modules\security\genpop.dm" +#include "code\modules\security\prison_scanner.dm" +#include "code\modules\security\workshop.dm" #include "code\modules\security_levels\keycard_authentication.dm" #include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\arrivals.dm" @@ -4083,7 +4088,6 @@ #include "nsv13\code\modules\research\machinery\departmental_protolathe.dm" #include "nsv13\code\modules\research\techweb\_techweb.dm" #include "nsv13\code\modules\research\techweb\all_nsv_nodes.dm" -#include "nsv13\code\modules\Security\genpop.dm" #include "nsv13\code\modules\security_levels\security_levels.dm" #include "nsv13\code\modules\ship_missions\hail_computer.dm" #include "nsv13\code\modules\shuttle\computer.dm" diff --git a/nsv13/code/game/objects/effects/spawners/custom_window_spawners.dm b/nsv13/code/game/objects/effects/spawners/custom_window_spawners.dm index e95046f5c63..d6bb2cde548 100644 --- a/nsv13/code/game/objects/effects/spawners/custom_window_spawners.dm +++ b/nsv13/code/game/objects/effects/spawners/custom_window_spawners.dm @@ -3,3 +3,7 @@ icon = 'nsv13/icons/overmap/effects.dmi' icon_state = "spawner_reinforced" spawn_list = list(/obj/structure/grille, /obj/structure/window/reinforced/fulltile/ship, /obj/machinery/door/firedoor/window) + +/obj/effect/spawner/structure/window/reinforced/ship/prison + name = "nanocarbon prison window spawner" + spawn_list = list(/obj/structure/grille/prison, /obj/structure/window/reinforced/fulltile/ship, /obj/machinery/door/firedoor/window) diff --git a/nsv13/code/modules/Security/genpop.dm b/nsv13/code/modules/Security/genpop.dm deleted file mode 100644 index 16f83b2e775..00000000000 --- a/nsv13/code/modules/Security/genpop.dm +++ /dev/null @@ -1,432 +0,0 @@ -//Credit to oraclestation for the idea! This just a recode... - -#define MAX_TIMER 10 HOURS //Permabrig. -#define PRESET_SHORT 2 MINUTES -#define PRESET_MEDIUM 3 MINUTES -#define PRESET_LONG 5 MINUTES - -/obj/machinery/turnstile - name = "turnstile" - desc = "A mechanical door that permits one-way access to the brig." - icon = 'nsv13/icons/obj/objects.dmi' - icon_state = "turnstile_map" - power_channel = AREA_USAGE_ENVIRON - density = TRUE - pass_flags_self = PASSGLASS | LETPASSTHROW | PASSGRILLE | PASSSTRUCTURE - obj_integrity = 250 - max_integrity = 250 - integrity_failure = 74 - //Robust! It'll be tough to break... - armor = list("melee" = 50, "bullet" = 20, "laser" = 0, "energy" = 80, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50, "stamina" = 0) - anchored = TRUE - idle_power_usage = 2 - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - layer = OPEN_DOOR_LAYER - //Seccies and brig phys may always pass, either way. - req_one_access = list(ACCESS_BRIG, ACCESS_BRIGPHYS, ACCESS_PRISONER) - //Cooldown so we don't shock a million times a second - COOLDOWN_DECLARE(shock_cooldown) - -//Executive officer's line variant. For rule of cool. -/obj/machinery/turnstile/xo - name = "\improper XO line turnstile" - req_one_access = list(ACCESS_BRIG, ACCESS_HEADS) - -/obj/structure/closet/secure_closet/genpop - name = "genpop locker" - desc = "A locker to store a prisoner's valuables, that they can collect at a later date." - req_access = list(ACCESS_BRIG) - anchored = TRUE - var/registered_name = null - -/obj/structure/closet/secure_closet/genpop/Initialize(mapload) - . = ..() - //Show that it's available. - set_light(1,1,COLOR_GREEN) - -/obj/structure/closet/secure_closet/genpop/attackby(obj/item/W, mob/user, params) - var/obj/item/card/id/I = null - if(istype(W, /obj/item/card/id)) - I = W - else - I = W.GetID() - if(istype(I)) - if(broken) - to_chat(user, "It appears to be broken.") - return - if(!I || !I.registered_name) - return - //Sec officers can always open the lockers. Bypass the ID setting behaviour. - //Buuut, if they're holding a prisoner ID, that takes priority. - if(allowed(user) && !istype(I, /obj/item/card/id/prisoner)) - locked = !locked - update_icon() - return TRUE - //Handle setting a new ID. - if(!registered_name) - if(istype(I, /obj/item/card/id/prisoner)) //Don't claim the locker for a sec officer mind you... - var/obj/item/card/id/prisoner/P = I - if(P.assigned_locker) - to_chat(user, "This ID card is already registered to a locker.") - return FALSE - P.assigned_locker = src - registered_name = I.registered_name - desc = "Assigned to: [I.registered_name]." - say("Locker sealed. Assignee: [I.registered_name]") - - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - set_light(1,1,COLOR_RED) - locked = TRUE - update_icon() - else - to_chat(user, "Invalid ID. Only prisoners / officers may use these lockers.") - return FALSE - //It's an ID, and is the correct registered name. - if(istype(I) && (registered_name == I.registered_name)) - var/obj/item/card/id/prisoner/ID = I - //Not a prisoner ID. - if(!istype(ID)) - return FALSE - if(ID.served_time < ID.sentence) - playsound(loc, 'nsv13/sound/effects/computer/alarm_3.ogg', 80) - say("DANGER: PRISONER HAS NOT COMPLETED SENTENCE. AWAIT SENTENCE COMPLETION. COMPLIANCE IS IN YOUR BEST INTEREST.") - return FALSE - visible_message("[user] slots [I] into [src]'s ID slot, freeing its contents!") - registered_name = null - desc = initial(desc) - locked = FALSE - update_icon() - set_light(1,1,COLOR_GREEN) - qdel(I) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - return - else - to_chat(user, "Access Denied.") - else - return ..() - - -/obj/machinery/turnstile/Initialize(mapload) - . = ..() - icon_state = "turnstile" - //Attach a signal handler to the turf below for when someone passes through. - //Signal automatically gets unattached and reattached when we're moved. - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/machinery/turnstile/proc/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) - SIGNAL_HANDLER - if(istype(arrived, /mob)) - flick("operate", src) - playsound(src,'sound/items/ratchet.ogg',50,0,3) - -///Handle movables (especially mobs) bumping into us. -/obj/machinery/turnstile/Bumped(atom/movable/movable) - . = ..() - if(!istype(movable, /mob)) //just let non-mobs bump - return - if(machine_stat & BROKEN) //try to shock mobs if we're broken - try_shock(movable) - return - //pretend to be an airlock if a mob bumps us - //(which means they tried to move through but didn't have access) - flick("deny", src) - playsound(src,'sound/machines/deniedbeep.ogg',50,0,3) - -///Shock attacker if we're broken -/obj/machinery/turnstile/attackby(obj/item/item, mob/user, params) - . = ..() - if(machine_stat & BROKEN) - try_shock(user) - -/obj/machinery/turnstile/welder_act(mob/living/user, obj/item/I) - //Shamelessly copied airlock code - . = TRUE //Never attack it with a welding tool - if(!I.tool_start_check(user, amount=0)) - return - if(obj_integrity >= max_integrity) - to_chat(user, "The turnstile doesn't need repairing.") - return - user.visible_message("[user] is welding the turnstile.", \ - "You begin repairing the turnstile...", \ - "You hear welding.") - if(I.use_tool(src, user, 40, volume=50)) - obj_integrity = max_integrity - set_machine_stat(machine_stat & ~BROKEN) - user.visible_message("[user.name] has repaired [src].", \ - "You finish repairing the turnstile.") - update_icon() - return - -/obj/machinery/turnstile/CanAllowThrough(atom/movable/mover, turf/target) - . = ..() - if(. == TRUE) - return TRUE //Allow certain things declared with pass_flags_self through wihout side effects - if(machine_stat & BROKEN) - return FALSE - if(get_dir(loc, target) == dir) //Always let people through in one direction - return TRUE - var/allowed = allowed(mover) - //Everyone with access (including released prisoners) can drag you out. - if(!allowed && mover.pulledby) - allowed = allowed(mover.pulledby) - if(allowed) - return TRUE - return FALSE - -///Shock user if we can -/obj/machinery/turnstile/proc/try_shock(mob/user) - if(machine_stat & NOPOWER) // unpowered, no shock - return FALSE - if(!COOLDOWN_FINISHED(src, shock_cooldown)) //Don't shock in very short succession to avoid stuff getting out of hand. - return FALSE - COOLDOWN_START(src, shock_cooldown, 0.5 SECONDS) - do_sparks(5, TRUE, src) - if(electrocute_mob(user, power_source = get_area(src), source = src, dist_check = TRUE)) - return TRUE - else - return FALSE - -//Officer interface. -/obj/machinery/genpop_interface - name = "Prisoner Management Interface" - icon = 'nsv13/icons/obj/status_display.dmi' - icon_state = "frame" - desc = "An all-in-one interface for officers to manage prisoners!" - req_access = list(ACCESS_SECURITY) - density = FALSE - maptext_height = 26 - maptext_width = 32 - maptext_y = -1 - circuit = /obj/item/circuitboard/machine/genpop_interface - var/next_print = 0 - var/desired_sentence = 60 //What sentence do you want to give them? - var/desired_crime = null //What is their crime? - var/desired_name = null - var/obj/item/radio/Radio //needed to send messages to sec radio - //Preset crimes that you can set, without having to remember times - var/static/list/crimes = list( - list(name="Resisting Arrest", tooltip="Resisting Arrest.", colour="good",icon="car-crash",sentence="2"), - list(name="Assault", tooltip="Grievous Bodily Harm.", colour="average",icon="first-aid",sentence="3"), - list(name="Sabotage", tooltip="Sabotage (minor)",colour="average",icon="bomb",sentence="5"), - list(name="Sedition", tooltip="Sedition (rebellion).", colour="average",icon="fist-raised",sentence="5"), - list(name="EOC", tooltip="Enemy Of The Corp.", colour="bad",icon="gavel",sentence="[MAX_TIMER / 600]"), - list(name="Murder", tooltip="Murder.", colour="bad",icon="hammer",sentence="[MAX_TIMER / 600]"), - list(name="Grand Sabotage", tooltip="Grand Sabotage.", colour="bad",icon="bomb",sentence="[MAX_TIMER / 600]"), - list(name="Mutiny", tooltip="Mutiny.", colour="bad",icon="skull-crossbones",sentence="[MAX_TIMER / 600]") - ) - -/obj/item/circuitboard/machine/genpop_interface - name = "Prisoner Management Interface (circuit)" - build_path = /obj/machinery/genpop_interface - -/obj/machinery/genpop_interface/Initialize(mapload) - . = ..() - update_icon() - - Radio = new/obj/item/radio(src) - Radio.listening = 0 - Radio.set_frequency(FREQ_SECURITY) - -/obj/machinery/genpop_interface/update_icon() - if(machine_stat & (NOPOWER)) - icon_state = "frame" - return - - if(machine_stat & (BROKEN)) - set_picture("ai_bsod") - return - set_picture("genpop") - - -/obj/machinery/genpop_interface/proc/set_picture(state) - if(maptext) - maptext = "" - cut_overlays() - add_overlay(mutable_appearance(icon, state)) - -/obj/machinery/genpop_interface/ui_state(mob/user) - return GLOB.default_state - -/obj/machinery/genpop_interface/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "GenPop") - ui.open() - ui.set_autoupdate(TRUE) - -/obj/machinery/genpop_interface/ui_data(mob/user) - var/list/data = list() - data["allPrisoners"] = list() - data["desired_name"] = desired_name - data["desired_crime"] = desired_crime - data["sentence"] = desired_sentence - data["canPrint"] = world.time >= next_print - data["allCrimes"] = crimes - var/list/L = data["allPrisoners"] - for(var/obj/item/card/id/prisoner/ID in GLOB.prisoner_ids) - var/list/id_info = list() - id_info["name"] = ID.registered_name - id_info["id"] = "\ref[ID]" - id_info["served_time"] = ID.served_time - id_info["sentence"] = ID.sentence - id_info["crime"] = ID.crime - data["allPrisoners"][++L.len] = id_info - return data - -/obj/machinery/genpop_interface/proc/print_id(mob/user) - - if(world.time < next_print) - to_chat(user, "[src]'s ID printer is on cooldown.") - return FALSE - investigate_log("[key_name(user)] created a prisoner ID with sentence: [desired_sentence / 60] for [desired_sentence / 60] min", INVESTIGATE_RECORDS) - user.log_message("[key_name(user)] created a prisoner ID with sentence: [desired_sentence / 60] for [desired_sentence / 60] min", LOG_ATTACK) - - if(desired_crime) - var/datum/data/record/R = find_record("name", desired_name, GLOB.data_core.general) - if(R) - R.fields["criminal"] = "Incarcerated" - var/crime = GLOB.data_core.createCrimeEntry(desired_crime, null, user.real_name, station_time_timestamp()) - GLOB.data_core.addCrime(R.fields["id"], crime) - investigate_log("New Crime: [desired_crime] | Added to [R.fields["name"]] by [key_name(user)]", INVESTIGATE_RECORDS) - say("Criminal record for [R.fields["name"]] successfully updated with inputted crime.") - playsound(loc, 'sound/machines/ping.ogg', 50, 1) - - var/obj/item/card/id/id = new /obj/item/card/id/prisoner(get_turf(src), desired_sentence, desired_crime, desired_name) - Radio.talk_into(src, "Prisoner [id.registered_name] has been incarcerated for [desired_sentence / 60 ] minutes.", FREQ_SECURITY) - var/obj/item/paper/paperwork = new /obj/item/paper(get_turf(src)) - paperwork.add_raw_text("

Record Of Incarceration:


Name:

[desired_name]

Crime:

[desired_crime]

Sentence (Min)

[desired_sentence/60]

WhiteRapids Military Council, disciplinary authority

") - paperwork.update_appearance() - desired_sentence = 60 - desired_crime = null - desired_name = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - next_print = world.time + 20 SECONDS - -/obj/machinery/genpop_interface/ui_act(action, params) - if(isliving(usr)) - playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) - if(..()) - return - if(!allowed(usr)) - to_chat(usr, "Access denied.") - return - switch(action) - if("time") - var/value = text2num(params["adjust"]) - if(value && isnum(value)) - desired_sentence += value - desired_sentence = clamp(desired_sentence,0,MAX_TIMER) - if("crime") - var/crimes = stripped_input(usr, "Input prisoner's crimes...", "Crimes", desired_crime) - if(crimes == null | !Adjacent(usr)) - return FALSE - desired_crime = crimes - if("prisoner_name") - var/prisoner_name = stripped_input(usr, "Input prisoner's name...", "Crimes", desired_name) - if(prisoner_name == null | !Adjacent(usr)) - return FALSE - desired_name = prisoner_name - if("print") - print_id(usr) - - if("preset") - var/preset = params["preset"] - var/preset_time = 0 - switch(preset) - if("short") - preset_time = PRESET_SHORT - if("medium") - preset_time = PRESET_MEDIUM - if("long") - preset_time = PRESET_LONG - if("perma") - preset_time = MAX_TIMER - - desired_sentence = preset_time - desired_sentence /= 10 - if("presetCrime") - var/preset_time = text2num(params["preset"]) - var/preset_crime = params["crime"] - desired_sentence = preset_time MINUTES - desired_sentence /= 10 - desired_crime = preset_crime - if("adjust_time") - var/obj/item/card/id/prisoner/id = locate(params["id"]) - if(!istype(id)) - return - if(id.access == ACCESS_PRISONER) - return - var/value = text2num(params["adjust"]) - if(value && isnum(value)) - id.sentence += value - id.sentence = clamp(id.sentence,0,MAX_TIMER) - if("release") - var/obj/item/card/id/prisoner/id = locate(params["id"]) - if(!istype(id)) - return - if(alert("Are you sure you want to release [id.registered_name]", "Prisoner Release", "Yes", "No") != "Yes") - return - Radio.talk_into(src, "Prisoner [id.registered_name] has been discharged.", FREQ_SECURITY) - investigate_log("[key_name(usr)] has early-released [id] ([id.loc])", INVESTIGATE_RECORDS) - usr.log_message("[key_name(usr)] has early-released [id] ([id.loc])", LOG_ATTACK) - id.served_time = id.sentence - -GLOBAL_LIST_EMPTY(prisoner_ids) - -/obj/item/card/id/prisoner - var/served_time = 0 //Seconds. - var/sentence = 0 //'ard time innit. - var/crime = null //What you in for mate? - var/atom/assigned_locker = null //Where's our stuff then guv? - -/obj/item/card/id/prisoner/Initialize(mapload, _sentence, _crime, _name) - . = ..() - LAZYADD(GLOB.prisoner_ids, src) - if(_crime) - crime = _crime - if(_sentence) - sentence = _sentence - if(!_name) - registered_name = "Prisoner WR-ROSETTA#[rand(0, 10000)]" - else - registered_name = _name - update_label(registered_name, "Convict") - START_PROCESSING(SSobj, src) - -/obj/item/card/id/prisoner/Destroy() - GLOB.prisoner_ids -= src - . = ..() - -/obj/item/card/id/prisoner/examine(mob/user) - . = ..() - if(sentence) - . += "You have served [served_time / 60] / [sentence / 60] minutes." - if(crime) - . += "It appears its holder was convicted of: [crime]" - -/obj/item/card/id/prisoner/process() - served_time ++ //Maybe 2? - if(served_time >= sentence) //FREEDOM! - assignment = "Ex-Convict" - access = list(ACCESS_PRISONER) - update_label(registered_name, assignment) - playsound(loc, 'sound/machines/ping.ogg', 50, 1) - - var/datum/data/record/R = find_record("name", registered_name, GLOB.data_core.general) - if(R) - R.fields["criminal"] = "Discharged" - - if(isliving(loc)) - to_chat(loc, "You have served your sentence! You may now exit prison through the turnstiles and collect your belongings.") - return PROCESS_KILL - - - -#undef PRESET_SHORT -#undef PRESET_MEDIUM -#undef PRESET_LONG - -#undef MAX_TIMER diff --git a/nsv13/code/modules/munitions/ammunition/missiles/missile_types.dm b/nsv13/code/modules/munitions/ammunition/missiles/missile_types.dm index f688f86de94..0ea86edd54f 100644 --- a/nsv13/code/modules/munitions/ammunition/missiles/missile_types.dm +++ b/nsv13/code/modules/munitions/ammunition/missiles/missile_types.dm @@ -22,8 +22,8 @@ /obj/item/ship_weapon/ammunition/missile/attackby(obj/item/I, mob/living/user, params) . = ..() - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/P = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/P = I P.points += claimable_gulag_points to_chat(user, "You claim [claimable_gulag_points] from [src]... Your balance is now: [P.points]") //This one's been claimed! diff --git a/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_construction.dm b/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_construction.dm index e3d2eaf29e1..3a3a2cc6b9d 100644 --- a/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_construction.dm +++ b/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_construction.dm @@ -5,7 +5,7 @@ icon_state = "case" desc = "The outer casing of a 30mm torpedo." claimable_gulag_points = 0 - volatility = 0 + volatility = 0 var/state = 0 var/obj/item/ship_weapon/parts/missile/warhead/wh = null var/obj/item/ship_weapon/parts/missile/guidance_system/gs = null diff --git a/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_types.dm b/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_types.dm index ed7109bebad..b0f1bff0930 100644 --- a/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_types.dm +++ b/nsv13/code/modules/munitions/ammunition/torpedos/torpedo_types.dm @@ -23,15 +23,13 @@ /obj/item/ship_weapon/ammunition/torpedo/attackby(obj/item/I, mob/living/user, params) . = ..() - if(istype(I, /obj/item/card/id/prisoner)) - var/obj/item/card/id/prisoner/P = I + if(istype(I, /obj/item/card/id/gulag)) + var/obj/item/card/id/gulag/P = I P.points += claimable_gulag_points to_chat(user, "You claim [claimable_gulag_points] from [src]... Your balance is now: [P.points]") //This one's been claimed! claimable_gulag_points = 0 -/obj/item/card/id/prisoner - /obj/item/ship_weapon/ammunition/torpedo/examine(mob/user) . = ..() . += "It's far too cumbersome to carry, and dragging it around might set it off!" diff --git a/nsv13/icons/obj/objects.dmi b/nsv13/icons/obj/objects.dmi index e7b21f5fb3098dd64f31835b49db7a6e15d4245d..b607c9f654c79c347306fa7117981427ce3c62b2 100644 GIT binary patch literal 1197 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 Y#S}f}Px# diff --git a/tgui/packages/tgui/interfaces/GenPop.js b/tgui/packages/tgui/interfaces/GenPop.js index 4650ba3cbe3..92121c571f2 100644 --- a/tgui/packages/tgui/interfaces/GenPop.js +++ b/tgui/packages/tgui/interfaces/GenPop.js @@ -1,76 +1,123 @@ -// NSV13 +// Adapted From NSV13 +import { clamp, toFixed } from 'common/math'; import { Fragment } from 'inferno'; -import { useBackend } from '../backend'; -import { Button, Section, ProgressBar } from '../components'; +import { useBackend, useLocalState, useSharedState } from '../backend'; +import { Button, Section, ProgressBar, Input } from '../components'; import { Window } from '../layouts'; -import { toFixed } from 'common/math'; export const GenPop = (props, context) => { const { act, data } = useBackend(context); + + const { desired_name = '', desired_details = '', crime_list = {} } = data; + + // Local state for the time of the prisoner. + const [time, setTime] = useSharedState(context, 'time', 0); + + // Local state to determine which modifiers we have active + const [resistedMod, setResistedMod] = useSharedState(context, 'resisted', false); + const [attemptedMod, setAttemptedMod] = useSharedState(context, 'attempted', false); + const [elevatedMod, setElevatedMod] = useSharedState(context, 'repeat_offender', false); + + // Local state for the name of the crime being issued + const [crimeName, setCrimeName] = useSharedState(context, 'crimeName', 'No crime'); + + // Local state for the name of the crime details + const [crimeDetails, setCrimeDetails] = useSharedState(context, 'crimeDetails', 'No details provided'); + + // Local state for the current category that we are browsing + const [crimeCategory, setCrimeCategory] = useSharedState( + context, + 'crimeCategory', + crime_list && crime_list.length > 0 ? Object.keys(crime_list)[0] : null + ); + + const resetLocalState = () => { + // Set back to the default crime name + setCrimeName('No crime'); + setTime(3000); + setCrimeDetails('No details provided'); + setResistedMod(false); + setAttemptedMod(false); + setElevatedMod(false); + }; + + const getProcessedTime = () => { + return ( + (time + // Back to major crime (9000) + + (attemptedMod ? (time >= 36000 ? -27000 : -3000) : 0) + // Set to 36000 if a crime over 900 deciseconds was repeated. + + (elevatedMod ? (time >= 9000 ? 360000 - time : 3000) : 0)) + // Resisting arrest applies to everything at the end + * (resistedMod ? 1.2 : 1) + ); + }; + return ( - +
-
+
+ {Object.keys(crime_list[crimeCategory] || {}).map((key) => { + let value = crime_list[crimeCategory][key]; return (
+
+
+
+ Identity: {String(data.desired_name || 'No name entered')}
+ Crime: {String(crimeName)}
+ Sentence: {String(getProcessedTime() / 600)} min
+
act('edit_details')} />}> + {desired_details} +
+
- {Object.keys(data.allPrisoners).map(key => { + {Object.keys(data.allPrisoners).map((key) => { let value = data.allPrisoners[key]; return ( -
-
- ); diff --git a/tgui/packages/tgui/interfaces/Workshop.js b/tgui/packages/tgui/interfaces/Workshop.js new file mode 100644 index 00000000000..ecf087bffba --- /dev/null +++ b/tgui/packages/tgui/interfaces/Workshop.js @@ -0,0 +1,33 @@ +import { useBackend } from '../backend'; +import { Button, Section } from '../components'; +import { Window } from '../layouts'; + +export const Workshop = (props, context) => { + const { act, data } = useBackend(context); + const { default_programs = [], program } = data; + return ( + + +
act('shutdown')} /> + }> + {default_programs.map((def_program) => ( +
+
+
+ ); +};