From 5dc1d36ee43c714d69c4e756aa55c99b679ac046 Mon Sep 17 00:00:00 2001 From: Jeremiah <42397676+jlsnow301@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:03:12 -0700 Subject: [PATCH] Bitrunning: Combat domain [READY] (#84196) ## About The Pull Request Finally dusts off this project to make a deathmatch style bitrunning map. Don't be too intimidated by the file diff, lots of code organization + resized a large map. Changes: 1. Reuses the gateway beach map as a combat zone (99% of the file diff) (maptainers: i just added spawners and areas) 2. Alters how bitrunning handles spawning: Custom spawns are now available, which can be anything Misc organization: - Splits netpod.dm into separate files. - Fixes some wording in vdom map documentation. - Organizes vdom variables a bit. - Adds a permanent hololadder spawn. How bitrunning deathmatch works: - Temporary spawners are offered to both ghosts and bitrunners. - Runners spawn in like usual. Ghost can use the spawner menu. - Ghosts work to prevent avatars from collecting side objectives or try to cause mass brain damage. - The domain completes after a number of deaths accrue. Any faction. Blood for the blood god, etc. - This map can be played solo. ANY deaths. ## Why It's Good For The Game I've been toying with the idea of a deathmatch style map for some time. I liked syndicate assault, the spawners were intentionally left there, and the possibility of player-controlled players made the experience more tense and challenging. This PR leans into this idea: The virtual world is dangerous. Players get a chance to compete on both sides here. It offers a lot of variety to bitrunning other than "run for box". It's also very lucrative if ghosts join in. ## Changelog :cl: add: Added a bitrunning deathmatch map: Island Brawl. Both ghosts and runners get many more spawns than normal. fix: Lowered the static vision time in domain load in. /:cl: --- _maps/virtual_domains/README.md | 5 +- _maps/virtual_domains/island_brawl.dmm | 12262 ++++++++++++++++ .../dcs/signals/signals_bitrunning.dm | 6 + code/controllers/subsystem/bitrunning.dm | 3 +- .../components/bitrunning_points.dm | 6 +- code/modules/bitrunning/netpod/_netpod.dm | 137 + code/modules/bitrunning/netpod/container.dm | 74 + code/modules/bitrunning/netpod/outfitting.dm | 30 + code/modules/bitrunning/netpod/signals.dm | 64 + code/modules/bitrunning/netpod/tools.dm | 22 + code/modules/bitrunning/netpod/ui.dm | 41 + code/modules/bitrunning/netpod/utils.dm | 144 + code/modules/bitrunning/objects/landmarks.dm | 5 + code/modules/bitrunning/objects/netpod.dm | 490 - code/modules/bitrunning/outfits.dm | 50 + code/modules/bitrunning/server/_parent.dm | 6 + code/modules/bitrunning/server/loot.dm | 6 + .../modules/bitrunning/server/map_handling.dm | 20 + .../bitrunning/server/obj_generation.dm | 37 +- .../bitrunning/server/signal_handlers.dm | 6 + code/modules/bitrunning/server/threats.dm | 8 + code/modules/bitrunning/server/util.dm | 93 +- code/modules/bitrunning/spawners.dm | 19 +- .../virtual_domain/domains/island_brawl.dm | 46 + .../virtual_domain/domains/pirates.dm | 1 + .../domains/syndicate_assault.dm | 1 + .../virtual_domain/virtual_domain.dm | 94 +- icons/effects/bitrunning.dmi | Bin 3048 -> 3268 bytes tgstation.dme | 9 +- .../tgui/interfaces/QuantumConsole.tsx | 38 +- 30 files changed, 13139 insertions(+), 584 deletions(-) create mode 100644 _maps/virtual_domains/island_brawl.dmm create mode 100644 code/modules/bitrunning/netpod/_netpod.dm create mode 100644 code/modules/bitrunning/netpod/container.dm create mode 100644 code/modules/bitrunning/netpod/outfitting.dm create mode 100644 code/modules/bitrunning/netpod/signals.dm create mode 100644 code/modules/bitrunning/netpod/tools.dm create mode 100644 code/modules/bitrunning/netpod/ui.dm create mode 100644 code/modules/bitrunning/netpod/utils.dm delete mode 100644 code/modules/bitrunning/objects/netpod.dm create mode 100644 code/modules/bitrunning/virtual_domain/domains/island_brawl.dm diff --git a/_maps/virtual_domains/README.md b/_maps/virtual_domains/README.md index 6e9abc65568..f0a8a1ebfd2 100644 --- a/_maps/virtual_domains/README.md +++ b/_maps/virtual_domains/README.md @@ -1,11 +1,12 @@ # Making new virtual domains ## REQUIRED: -1. One way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signable landmark if you have a points system. +1. One way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signal landmark if you have a points system. 2. Place a virtual domain baseturf helper in each area. 3. If you're using modular safehouses, ensure that the map has ONE tile marked with the safehouse modular map loader (and set the KEY). it will need an open 7x6 area. 4. Placing a safehouse area is redundant, but it will ensure there is power in the starting safehouse. 5. Create the dm file that defines the map qualities. You can use the existing ones as a template. +6. Place a virtual domain baseturf helper in each area. ## Converting an existing map 1. Create a new map using the existing map's size - give yourself enough room to enclose it with a binary wall. There's no need for any space outside of it, so ensure that it fits and is enclosed, nothing outside of this. @@ -18,7 +19,7 @@ You shouldn't need to fully enclose your map in 15 tiles of binary filler. Using For areas, ideally just one on the map and one for the safehouse. Vdoms should never last so long as to need individual area power and atmos unless you're specifically going for a gimmick. -Use modular mob segments! Use modular map segments! Add some variety to your maps! Just make sure you've set your map to have "is_modular" afterwards. +Make it modular: Add modular map and mob segments! It adds variety. Just make sure you've set your map to have "is_modular" afterwards. Adding some open tile padding around the safehouse is a good touch. About 7 tiles West/East for the visual effect of a larger map. diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm new file mode 100644 index 00000000000..dd2ed14f2f3 --- /dev/null +++ b/_maps/virtual_domains/island_brawl.dmm @@ -0,0 +1,12262 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"al" = ( +/obj/structure/flora/coconuts{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"as" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"aw" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"aA" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"aD" = ( +/obj/item/storage/medkit/regular{ + pixel_y = 15; + pixel_x = -2 + }, +/obj/structure/table/glass, +/obj/item/emergency_bed{ + pixel_y = 6 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"aE" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"aQ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/sailor, +/turf/open/floor/wood, +/area/virtual_domain) +"aY" = ( +/obj/structure/table/wood, +/obj/item/tape{ + pixel_y = 7; + pixel_x = 11 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"aZ" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/food/watermelonslice, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ba" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"bb" = ( +/obj/item/circular_saw{ + pixel_y = 4 + }, +/obj/item/scalpel{ + pixel_y = 15 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"bp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"bx" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"bD" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/melon_soda{ + pixel_y = 13; + pixel_x = -9 + }, +/obj/item/fishing_rod{ + pixel_x = 8; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"bE" = ( +/turf/open/floor/wood, +/area/virtual_domain) +"bK" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"bT" = ( +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"bX" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"bY" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"cc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"ce" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/virtual_domain) +"cg" = ( +/obj/machinery/medical_kiosk, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ch" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"cp" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = 15 + }, +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"cr" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/north{ + id = "beach_room_9"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/claymore/cutlass{ + desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; + force = 0; + name = "foam cutlass"; + throwforce = 0 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ct" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"cB" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/pirate, +/turf/open/floor/wood, +/area/virtual_domain) +"cC" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain) +"cE" = ( +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"cH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 7"; + id_tag = "beach_room_7" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"cK" = ( +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = -8 + }, +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"cO" = ( +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"cW" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"db" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 11"; + id_tag = "beach_room_11" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"de" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dj" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Hotel's Facilities" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dl" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/hotsauce{ + pixel_y = 9; + pixel_x = -3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"du" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"dv" = ( +/obj/structure/table, +/obj/item/wrench{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"dA" = ( +/obj/structure/table/bronze, +/obj/item/paper_bin/carbon{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"dD" = ( +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dG" = ( +/obj/effect/turf_decal/siding/blue, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dH" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/virtual_domain) +"dS" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/table_clock{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"dW" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"dX" = ( +/obj/item/toy/seashell{ + pixel_y = -5 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"dY" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c100{ + pixel_y = 5 + }, +/obj/item/toy/cards/deck{ + pixel_y = 13; + pixel_x = -5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ee" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"ef" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eh" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -13; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"en" = ( +/turf/open/floor/eighties, +/area/virtual_domain) +"ev" = ( +/obj/structure/mineral_door/sandstone{ + name = "Sandcastle" + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ew" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/landmark/bitrunning/loot_signal, +/turf/open/indestructible/binary, +/area/virtual_domain/protected_space/fullbright) +"eH" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/virtual_domain/fullbright) +"eJ" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"eK" = ( +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"eM" = ( +/obj/item/trash/can{ + pixel_y = -5; + pixel_x = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eO" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/food_cart, +/turf/open/floor/plating, +/area/virtual_domain) +"fe" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -2; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"fg" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"fv" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"fH" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/blue{ + pixel_x = -11; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"fI" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/protected_space/fullbright) +"fJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain) +"fL" = ( +/obj/machinery/computer/order_console/cook, +/turf/open/floor/wood/large, +/area/virtual_domain) +"fY" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/binoculars{ + pixel_y = 20 + }, +/obj/item/megaphone{ + pixel_y = 2; + pixel_x = 1 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"gc" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"gf" = ( +/obj/machinery/button/door/directional/south{ + id = "beach_room_5"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"gi" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/stack/arcadeticket{ + pixel_y = 12; + pixel_x = -16 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"gs" = ( +/obj/structure/closet/crate, +/obj/item/clothing/suit/hooded/carp_costume, +/obj/item/clothing/head/hooded/carp_hood, +/obj/item/toy/plush/carpplushie, +/obj/item/toy/plush/shark, +/turf/open/floor/eighties, +/area/virtual_domain) +"gw" = ( +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"gA" = ( +/obj/effect/turf_decal/sand{ + density = 1 + }, +/obj/effect/decal/fakelattice, +/turf/open/floor/pod/light{ + density = 1 + }, +/area/virtual_domain/fullbright) +"gB" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/plastic, +/area/virtual_domain) +"gC" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"gH" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/large, +/area/virtual_domain) +"gI" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 2; + pixel_y = -13 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"gK" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hos/double{ + name = "bedsheet"; + desc = "A bedsheet from the beach hotel." + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"gL" = ( +/turf/open/misc/beach/coast/corner, +/area/virtual_domain/fullbright) +"gN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"gP" = ( +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"gV" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 25 + }, +/obj/structure/flora/coconuts{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"hh" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/shovel{ + pixel_y = 15; + pixel_x = -8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ho" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"hu" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/beach/sand, +/area/virtual_domain/protected_space/fullbright) +"hA" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"hB" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"hD" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/button/door/directional/south{ + id = "BeachGarage" + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"hM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "BeachBoats" + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"hT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/power/smes/full, +/turf/open/floor/plating, +/area/virtual_domain) +"hZ" = ( +/obj/structure/table/bronze, +/obj/item/storage/bag/tray, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ii" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ij" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/virtual_domain/fullbright) +"ik" = ( +/obj/structure/dresser, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"il" = ( +/obj/structure/chair/plastic, +/obj/item/fishing_rod{ + pixel_x = 11; + pixel_y = -8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"io" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"iy" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north{ + layer = 2.9 + }, +/obj/structure/chair/stool/directional/south, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = -2; + pixel_x = 2 + }, +/obj/item/bikehorn/airhorn{ + pixel_y = -15; + pixel_x = -13 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"iF" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = -11; + pixel_y = 9 + }, +/obj/item/phone{ + pixel_y = 9; + pixel_x = 8 + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"iP" = ( +/obj/structure/chair/plastic, +/obj/item/clothing/head/collectable/paper{ + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves."; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"iQ" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_3"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"iU" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"iY" = ( +/obj/item/storage/bag/tray, +/obj/item/food/grown/watermelon{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"jb" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"jm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/plating, +/area/virtual_domain) +"jn" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"jp" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/neck/necklace/dope, +/obj/item/clothing/suit/jacket/letterman, +/turf/open/floor/wood, +/area/virtual_domain) +"jq" = ( +/obj/structure/musician/piano, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"jr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"jw" = ( +/obj/machinery/space_heater, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"jK" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 15; + pixel_x = -1 + }, +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"jL" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"jP" = ( +/turf/open/indestructible/binary, +/area/virtual_domain/protected_space/fullbright) +"jV" = ( +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"jW" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ka" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ke" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"ky" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"kD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"kI" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"kJ" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"kL" = ( +/obj/structure/billboard/space_cola, +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"kN" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lc" = ( +/obj/machinery/space_heater, +/obj/machinery/button/door/directional/north{ + id = "beach_room_2"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"lh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/floor/plating, +/area/virtual_domain) +"lk" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lx" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"lz" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lA" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"lF" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/o2{ + pixel_y = 17; + pixel_x = -1 + }, +/obj/item/storage/medkit/brute{ + pixel_y = 23; + pixel_x = -1 + }, +/obj/item/food/lollipop{ + pixel_y = 8; + pixel_x = 12 + }, +/obj/item/food/lollipop{ + pixel_y = 5; + pixel_x = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 9 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"lG" = ( +/obj/item/toy/seashell{ + pixel_y = 11; + pixel_x = -7 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"lI" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/large, +/area/virtual_domain) +"lJ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 7 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"lP" = ( +/obj/structure/chair, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"lU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Temporary Holding Cell" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"lW" = ( +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"mi" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mv" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mx" = ( +/obj/machinery/door/airlock/wood{ + name = "Arcade" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"mJ" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -10; + pixel_x = -5 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -2; + pixel_x = 9 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -4; + pixel_x = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Tropical Kitchen" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"mP" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 10; + pixel_x = -17 + }, +/obj/item/fishing_rod{ + pixel_x = -13; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mV" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"mW" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nc" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"nk" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"nR" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nX" = ( +/obj/structure/table/wood, +/obj/item/melee/baseball_bat{ + pixel_y = 3; + pixel_x = 6 + }, +/obj/item/clothing/glasses/blindfold/white{ + pixel_y = 7; + pixel_x = -5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"oa" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"ob" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"og" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain) +"oq" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"os" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 12; + pixel_x = -7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ot" = ( +/turf/template_noop, +/area/template_noop) +"ow" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/wood/large, +/area/virtual_domain) +"oC" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"oE" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/glasses/heat, +/obj/item/clothing/head/cowboy/brown, +/turf/open/floor/wood, +/area/virtual_domain) +"oJ" = ( +/obj/item/flashlight/flare/torch{ + pixel_x = -11; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"oQ" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"oX" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"oZ" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"pj" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/camera{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/camera_film{ + pixel_y = -11; + pixel_x = -10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"pq" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_syndie, +/turf/open/floor/wood, +/area/virtual_domain) +"pv" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/virtual_domain) +"py" = ( +/turf/open/floor/iron/stairs, +/area/virtual_domain/fullbright) +"pz" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/costume/lobsterhat, +/turf/open/floor/wood, +/area/virtual_domain) +"pC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"pE" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Rooms" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"pJ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_red, +/turf/open/floor/wood, +/area/virtual_domain) +"pV" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 5; + pixel_x = 13 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"pX" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"qa" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"qb" = ( +/obj/machinery/button/door/directional/west{ + id = "beach_room_1"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"qc" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/clothing, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"qB" = ( +/obj/item/toy/seashell{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"qH" = ( +/obj/structure/bed/medical/emergency, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"qR" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"qZ" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ra" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rj" = ( +/obj/machinery/grill, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rl" = ( +/obj/structure/rack, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = -7 + }, +/obj/item/melee/skateboard/hoverboard, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = 7 + }, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"rn" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"ro" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"rw" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_4"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rz" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rB" = ( +/obj/item/toy/seashell{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rD" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rE" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_11"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rG" = ( +/obj/machinery/telecomms/allinone, +/obj/item/wirecutters{ + pixel_y = 9 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"rI" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 12"; + id_tag = "beach_room_12" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rK" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rQ" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rR" = ( +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/virtual_domain) +"rW" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"sa" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet3beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"sh" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 9; + dir = 1; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/virtual_domain) +"si" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/enzyme{ + layer = 5; + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/food/seaweedsheet{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/food/seaweedsheet{ + pixel_x = -15; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"sl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = 17; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"st" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_8"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"sz" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sC" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sI" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 2; + pixel_x = 5 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"sO" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_x = 15; + pixel_y = -11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sR" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sV" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"sW" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 5"; + id_tag = "beach_room_5" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"ta" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"th" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tk" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"tw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"ty" = ( +/obj/item/trash/boritos/purple{ + pixel_y = -16; + pixel_x = -5 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"tI" = ( +/obj/structure/sign/departments/custodian/directional/north{ + pixel_x = -32 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"tM" = ( +/obj/structure/table/wood, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"tQ" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tW" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tX" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/ketchup{ + pixel_y = 14; + pixel_x = 1 + }, +/obj/item/reagent_containers/condiment/mayonnaise{ + pixel_y = 8; + pixel_x = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"up" = ( +/obj/item/storage/box/syringes{ + pixel_y = 14; + pixel_x = -5 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 3; + pixel_x = 4 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"ut" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"uu" = ( +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"uz" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uC" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uD" = ( +/obj/structure/table/wood, +/obj/item/food/seaweedsheet, +/obj/item/kitchen/rollingpin{ + pixel_x = -12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"uH" = ( +/obj/structure/bonfire, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uI" = ( +/obj/structure/bed, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"uX" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uY" = ( +/turf/open/floor/carpet, +/area/virtual_domain) +"vx" = ( +/obj/structure/table/glass, +/obj/item/storage/box/coffeepack{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 10; + pixel_x = 11 + }, +/obj/item/storage/fancy/donut_box{ + pixel_y = 18; + pixel_x = -11 + }, +/obj/item/food/donut/berry{ + pixel_y = 5; + pixel_x = -6 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"vF" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"vM" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"vU" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"wb" = ( +/turf/open/misc/beach/coast{ + dir = 5 + }, +/area/virtual_domain/fullbright) +"wf" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ww" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"wx" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"wz" = ( +/obj/structure/rack, +/obj/item/mop, +/obj/item/extinguisher, +/turf/open/floor/wood/large, +/area/virtual_domain) +"wC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"wH" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 6; + pixel_x = 11 + }, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"wI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/shower/directional/south, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"wN" = ( +/obj/item/cigbutt{ + pixel_y = 21; + pixel_x = -13 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"wO" = ( +/obj/structure/dresser, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"wT" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"wZ" = ( +/obj/item/clothing/head/soft/green, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xe" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toiletfarbeach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"xg" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain) +"xj" = ( +/obj/item/toy/seashell{ + pixel_x = -8; + pixel_y = 9 + }, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"xk" = ( +/obj/structure/closet/crate/freezer, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/rawcrab, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xw" = ( +/obj/item/kirbyplants/organic/applebush{ + pixel_x = 7 + }, +/obj/item/kirbyplants/organic/plant17{ + pixel_y = 2; + pixel_x = -8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"xx" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/eighties, +/area/virtual_domain) +"xJ" = ( +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"xO" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"xP" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xR" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 3; + pixel_x = -2 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"xT" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood/large, +/area/virtual_domain) +"yc" = ( +/obj/structure/closet/gmcloset, +/turf/open/floor/plastic, +/area/virtual_domain) +"yg" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"yy" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/red, +/area/virtual_domain/fullbright) +"yz" = ( +/obj/structure/table/bronze, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"yB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"yG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain) +"yI" = ( +/obj/structure/dresser, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"yJ" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/item/food/grown/banana/bunch, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"yN" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"yQ" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_10"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/table_clock{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ze" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"zg" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"zm" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/mesh{ + pixel_y = 1; + pixel_x = 1 + }, +/obj/item/clothing/suit/toggle/labcoat{ + pixel_y = 9; + pixel_x = -8 + }, +/obj/item/storage/box/bodybags{ + pixel_y = 17; + pixel_x = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"zn" = ( +/obj/structure/table/optable, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"zp" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"zq" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -11; + pixel_y = -2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zH" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zL" = ( +/obj/structure/table/bronze, +/obj/item/paper/paperslip{ + pixel_y = 6; + pixel_x = 10 + }, +/obj/item/pen/fourcolor{ + pixel_y = 7; + pixel_x = 1 + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"zO" = ( +/obj/item/retractor{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/cautery{ + pixel_y = 10 + }, +/obj/item/hemostat{ + pixel_y = -11 + }, +/obj/item/bonesetter{ + pixel_y = -12 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"zS" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Ac" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ae" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"Ag" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/eighties, +/area/virtual_domain) +"Ai" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"Aj" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Al" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Aq" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ay" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/brute{ + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/storage/medkit/o2{ + pixel_y = 15; + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"AG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"AK" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/plastic, +/area/virtual_domain) +"AX" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"AZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"Bc" = ( +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -5; + pixel_x = -11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Bf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Bk" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 2"; + id_tag = "beach_room_2" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Bq" = ( +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Bx" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -12; + pixel_y = -6 + }, +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Bz" = ( +/obj/structure/closet, +/obj/item/key/atv{ + pixel_x = -4 + }, +/obj/item/key/atv{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/key/atv{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/effect/decal/cleanable/oil, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/heat, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"BB" = ( +/obj/item/toy/plush/moth{ + pixel_y = 5 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/fullbright) +"BD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BI" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BM" = ( +/obj/structure/closet/crate/bin, +/obj/item/flashlight/glowstick/yellow, +/obj/item/trash/candy, +/turf/open/floor/eighties, +/area/virtual_domain) +"BU" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BV" = ( +/obj/structure/sign/directions/dorms/directional/north{ + pixel_y = 35 + }, +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 29 + }, +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood/large, +/area/virtual_domain) +"BW" = ( +/obj/structure/dresser, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Co" = ( +/obj/machinery/processor, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Cw" = ( +/obj/structure/sign/poster/official/fruit_bowl/directional/north, +/turf/open/floor/carpet, +/area/virtual_domain) +"CA" = ( +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 18; + pixel_x = 9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"CH" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"CP" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 8; + pixel_x = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"CQ" = ( +/obj/structure/closet/crate/trashcart/laundry, +/turf/open/floor/plastic, +/area/virtual_domain) +"CR" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"CS" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 1"; + id_tag = "beach_room_1" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"CU" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_6"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/clothing/suit/jacket/leather/biker, +/turf/open/floor/wood, +/area/virtual_domain) +"CV" = ( +/obj/item/toy/seashell{ + pixel_x = 8; + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Dg" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Do" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Dq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Dt" = ( +/obj/machinery/icecream_vat, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Dx" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"DA" = ( +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = 14 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"DG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"DL" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/stock_parts/power_store/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/clothing/head/soft/mime{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"DP" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain) +"DR" = ( +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"DS" = ( +/obj/machinery/door/airlock/wood{ + name = "Changing Room" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"DT" = ( +/obj/structure/table/wood, +/obj/item/knife/kitchen{ + pixel_y = 12; + pixel_x = -13 + }, +/obj/item/clothing/head/utility/chefhat, +/turf/open/floor/wood/large, +/area/virtual_domain) +"DU" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 10"; + id_tag = "beach_room_10" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"Eb" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ej" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Er" = ( +/obj/effect/turf_decal/sand, +/obj/structure/bedsheetbin{ + pixel_y = 3; + pixel_x = -1 + }, +/obj/structure/table, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Et" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"EA" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toiletfarbeach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/iron/white, +/area/virtual_domain) +"EI" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"EP" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 3"; + id_tag = "beach_room_3" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"EQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"ET" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/light{ + pixel_x = -14; + pixel_y = 15 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"EY" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/virtual_domain) +"Fk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = 12; + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Fp" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Fx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"FB" = ( +/obj/machinery/medical_kiosk, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"FE" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/directional/north, +/turf/open/floor/plastic, +/area/virtual_domain) +"FO" = ( +/obj/structure/chair/plastic, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"FX" = ( +/turf/open/floor/carpet/green, +/area/virtual_domain/fullbright) +"Ga" = ( +/obj/item/stack/arcadeticket{ + pixel_y = -1; + pixel_x = -6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Gm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Go" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/obj/item/clothing/glasses/salesman, +/turf/open/floor/wood, +/area/virtual_domain) +"Gp" = ( +/obj/structure/no_effect_signpost{ + pixel_y = 6; + desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Gq" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Gw" = ( +/turf/open/indestructible/binary, +/area/virtual_domain/fullbright) +"Gx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance/two, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"GD" = ( +/obj/effect/landmark/bitrunning/permanent_exit, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/protected_space/fullbright) +"GI" = ( +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"GK" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/large, +/area/virtual_domain) +"GQ" = ( +/obj/item/toy/seashell{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"GX" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/virtual_domain) +"GY" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"Hd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Ho" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop{ + pixel_y = 5 + }, +/obj/item/multitool{ + pixel_x = -8; + pixel_y = -8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Hp" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/apron/chef{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HE" = ( +/obj/machinery/griddle, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HH" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"HI" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HK" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/food_packaging, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"HO" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 9"; + id_tag = "beach_room_9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"HP" = ( +/turf/open/water/beach, +/area/virtual_domain) +"HR" = ( +/obj/structure/sign/poster/official/tactical_game_cards/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/eighties, +/area/virtual_domain) +"HT" = ( +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/defibrillator_mount/directional/east, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"HV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain) +"Ib" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"If" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"In" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"It" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Iw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"IA" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"IF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"IG" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "BeachGarage" + }, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"II" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"IJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/blood_filter{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/surgical_drapes{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/surgical_drapes{ + pixel_x = 13; + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"IL" = ( +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"IS" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain) +"IX" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Jb" = ( +/obj/structure/table/glass, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 13; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Jc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Jd" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Je" = ( +/obj/structure/table/bronze, +/obj/item/table_clock{ + pixel_y = 13 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Jp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Jv" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -6 + }, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Jw" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"JF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"JG" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"JH" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"JJ" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 8"; + id_tag = "beach_room_8" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"JN" = ( +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"JU" = ( +/obj/item/instrument/guitar{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"Ka" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_7"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/clothing/suit/apron/overalls, +/turf/open/floor/wood, +/area/virtual_domain) +"Ko" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"Ks" = ( +/obj/structure/table/glass, +/obj/machinery/microwave{ + pixel_y = 15 + }, +/obj/item/cigbutt{ + pixel_y = 2; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"KH" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"KI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/virtual_domain) +"KJ" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood/large, +/area/virtual_domain) +"KL" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/jumbo, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/turf/open/floor/wood/large, +/area/virtual_domain) +"KP" = ( +/obj/item/clothing/head/soft/black{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"KS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"KT" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"KZ" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"La" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/virtual_domain) +"Ld" = ( +/obj/structure/table/wood, +/obj/item/cigarette/cigar{ + pixel_y = 16; + pixel_x = -2 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Lm" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"LD" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet1beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"LN" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"LR" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"LV" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"LY" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ma" = ( +/obj/machinery/vending/games, +/turf/open/floor/eighties, +/area/virtual_domain) +"Mb" = ( +/turf/open/floor/wood/large, +/area/virtual_domain) +"Md" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/wellcheers{ + pixel_y = -10; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Mj" = ( +/obj/structure/table, +/obj/item/weldingtool{ + pixel_y = -7; + pixel_x = 4 + }, +/obj/item/trash/can{ + pixel_y = 10; + pixel_x = -5 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Ml" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plastic, +/area/virtual_domain) +"Mo" = ( +/obj/machinery/door/airlock/wood{ + name = "Docks" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Mr" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Mx" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger{ + pixel_y = 13; + pixel_x = 21 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 1; + pixel_x = 18 + }, +/obj/item/stack/medical/gauze{ + pixel_x = -15; + pixel_y = 10 + }, +/obj/item/storage/belt/medical{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"MA" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MH" = ( +/obj/item/toy/seashell{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MO" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -12; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/stamp{ + pixel_y = 14; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"MR" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"MT" = ( +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"MV" = ( +/obj/item/radio/off{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes{ + pixel_y = 10; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"MX" = ( +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MZ" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_12"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"Nc" = ( +/obj/item/tank/internals/anesthetic{ + pixel_y = 4 + }, +/obj/item/stack/medical/bone_gel{ + pixel_y = 16; + pixel_x = -7 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Ne" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Nj" = ( +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Np" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Nt" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/eighties, +/area/virtual_domain) +"NB" = ( +/obj/item/storage/box/fishing_hooks{ + pixel_y = 14 + }, +/obj/item/storage/box/fishing_lines{ + pixel_y = 12; + pixel_x = 18 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NC" = ( +/mob/living/basic/crab, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NT" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"NU" = ( +/obj/machinery/vending/medical{ + req_access = "201" + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"NZ" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"Of" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Og" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -5; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ol" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/virtual_domain) +"Om" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hop/double{ + desc = "A blue bedsheet. Likely from the beach hotel."; + name = "blue bedsheet" + }, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"Or" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Oy" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"OA" = ( +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"OK" = ( +/obj/item/storage/box/gloves{ + pixel_y = 14; + pixel_x = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"OM" = ( +/turf/open/floor/iron/stairs/old, +/area/virtual_domain/fullbright) +"OO" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16; + pixel_x = 12 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"OV" = ( +/mob/living/basic/crab/kreb, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Po" = ( +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/plastic, +/area/virtual_domain) +"Pq" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 5 + }, +/obj/item/reagent_containers/condiment/coconut_milk{ + pixel_y = 14; + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"PD" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"PE" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/virtual_domain) +"PG" = ( +/obj/structure/table/bronze, +/obj/item/food/grown/banana/bunch{ + pixel_y = 10; + offset_at_init = 0 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"PH" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"PJ" = ( +/obj/item/cigbutt{ + pixel_y = -11; + pixel_x = -15 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"PR" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"PZ" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = 6 + }, +/obj/item/camera_film{ + pixel_y = 4; + pixel_x = -2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Qc" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qj" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"Qk" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet2beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/white, +/area/virtual_domain) +"Qm" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qq" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qu" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Qv" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Admin" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Dear IT: Please fix the fax machine" + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Qx" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"QG" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/wrench{ + pixel_y = -1; + pixel_x = 6 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"QH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 6"; + id_tag = "beach_room_6" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"QI" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"QN" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/obj/item/clothing/head/soft/black, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"QX" = ( +/obj/machinery/vending/boozeomat/all_access{ + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"QY" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/storage/medkit/o2{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Rc" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 31 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Rd" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet, +/area/virtual_domain) +"Re" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 3; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/soda_cans/pwr_game{ + pixel_y = 12; + pixel_x = -8 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Rf" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Rk" = ( +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Beach Hotel Fax"; + name = "Beach Hotel's Fax Machine"; + pixel_y = 8; + visible_to_network = 0 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Rs" = ( +/obj/machinery/door/airlock/wood{ + name = "Garage" + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Rw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 1" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ry" = ( +/obj/structure/closet{ + name = "Holding Cell Storage" + }, +/obj/item/taperecorder, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Rz" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"RB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RF" = ( +/obj/effect/turf_decal/siding/wood, +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"RJ" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 16; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RM" = ( +/obj/effect/baseturf_helper/beach/water, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RO" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = -7 + }, +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = 13; + pixel_y = -7 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RP" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -10; + pixel_y = -8 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"RS" = ( +/obj/structure/table/wood, +/obj/item/food/donut/plain{ + pixel_y = -2; + pixel_x = 14 + }, +/obj/item/assembly/signaler{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_y = 11; + pixel_x = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Sb" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 10 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Sc" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 18; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 12; + pixel_x = -7 + }, +/obj/item/clothing/head/hats/tophat{ + pixel_y = 2; + pixel_x = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Se" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Sf" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"So" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Sr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/decal/cleanable/cobweb, +/obj/item/wheelchair, +/turf/open/floor/plating, +/area/virtual_domain) +"Su" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 4"; + id_tag = "beach_room_4" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"Sx" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Sz" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"SJ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/sand, +/obj/item/clothing/shoes/sandal{ + pixel_y = 4; + pixel_x = 8 + }, +/obj/item/clothing/shoes/sandal{ + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -7; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"SL" = ( +/obj/machinery/door/airlock/wood{ + name = "Trash Disposal" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"SM" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"SO" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"SR" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"Ta" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/virtual_domain) +"Tb" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Tq" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Tr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Tt" = ( +/obj/machinery/recharge_station, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Tw" = ( +/obj/effect/turf_decal/stripes/white/full, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ty" = ( +/turf/open/floor/carpet, +/area/virtual_domain/fullbright) +"TB" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/obj/machinery/vending/cola/red, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"TC" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"TK" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_x = -14 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"TM" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"TO" = ( +/obj/structure/closet/crate/bin, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"TR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain) +"TS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 7; + pixel_x = -9 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/item/clothing/gloves/latex, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"TW" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 7; + pixel_x = -3 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"TY" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"TZ" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ub" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Ud" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/cigbutt{ + pixel_y = -9; + pixel_x = 13 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Uf" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet2beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"Ug" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Uk" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Um" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/miljacket, +/turf/open/floor/wood, +/area/virtual_domain) +"Uy" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"UE" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"UI" = ( +/obj/machinery/door/airlock/wood{ + name = "Janitorial" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"UJ" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"UO" = ( +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/eighties, +/area/virtual_domain) +"US" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"UW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"UZ" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -8 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 5 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -12; + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Va" = ( +/obj/machinery/door/airlock/wood{ + name = "Employees' Only" + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"Vs" = ( +/obj/structure/table/wood, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = 10 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"VD" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"VI" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood/large, +/area/virtual_domain) +"VK" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Cabin" + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"VL" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/fullbright) +"We" = ( +/obj/structure/table/bronze, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = 9; + pixel_y = 7; + name = "Tropical Mixing for Tropical Bartenders" + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = -12 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Wg" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Wm" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"Ws" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/virtual_domain) +"WG" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"WX" = ( +/obj/structure/marker_beacon/teal, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Xe" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"Xl" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Xt" = ( +/turf/open/floor/plastic, +/area/virtual_domain) +"Xu" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Xx" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Beach Access" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"XJ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Locker Room" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"XO" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"XP" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/virtual_domain) +"XT" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"XW" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Yb" = ( +/obj/structure/sign/poster/contraband/pwr_game/directional/west, +/turf/open/floor/eighties, +/area/virtual_domain) +"Yd" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 3; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Yo" = ( +/turf/closed/wall/mineral/sandstone, +/area/virtual_domain/fullbright) +"Yr" = ( +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 19; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Yz" = ( +/obj/item/trash/candy{ + pixel_y = 9; + pixel_x = -9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"YD" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"YI" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet1beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/virtual_domain) +"YM" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"YN" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"YP" = ( +/obj/structure/table/glass, +/obj/item/paper{ + pixel_y = 7; + pixel_x = 2 + }, +/obj/item/screwdriver{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 4; + pixel_x = -6 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 7 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"YR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/vending/cola/red, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"YW" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"YZ" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Zd" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Zj" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Zn" = ( +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Zp" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/virtual_domain) +"Zs" = ( +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Zy" = ( +/obj/structure/sign/chalkboard_menu{ + pixel_y = 32 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Zz" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZB" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet3beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = -13 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/iron/white, +/area/virtual_domain) +"ZE" = ( +/obj/structure/table/bronze, +/turf/open/floor/carpet, +/area/virtual_domain) +"ZH" = ( +/obj/item/kirbyplants/organic/plant24{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/structure/table, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ZI" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZV" = ( +/obj/structure/chair/plastic, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = -1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZX" = ( +/obj/structure/table/bronze, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ZY" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) + +(1,1,1) = {" +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(2,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(3,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(4,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(5,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(6,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(7,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(8,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +LR +Bf +Bf +Bf +qa +cO +LR +Bf +Bf +Bf +HH +Bf +Bf +Bf +qa +cO +LR +Bf +Bf +Bf +qa +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(9,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +Jd +vF +Zd +io +tw +cO +Jd +vF +Zd +io +Jp +vF +Zd +io +tw +cO +Jd +vF +Zd +PD +tw +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(10,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Lm +AZ +AZ +eK +cO +eK +Lm +AZ +AZ +eK +Lm +AZ +AZ +eK +cO +eK +Lm +AZ +AZ +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(11,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +CH +uY +PE +Bq +eK +Bq +MZ +gw +PE +Bq +bE +uY +oE +Bq +eK +Bq +iQ +gw +jp +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(12,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +cB +Rd +bE +db +Mb +rI +bE +cW +aQ +Bq +jw +Rd +bE +Su +Mb +EP +bE +cW +La +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(13,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +yI +gK +rE +Bq +Mb +Bq +yI +ch +Xe +Bq +wO +gK +rw +Bq +Mb +Bq +Je +Om +Zp +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(14,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Bq +Bq +Bq +pv +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(15,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +vF +nk +bE +XT +PE +Bq +Mb +Mb +yg +Mb +Mb +Mb +Mb +yg +Mb +Mb +Mb +Mb +yg +gH +Bq +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(16,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +aw +AZ +Go +cW +bE +DU +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(17,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +xR +AZ +Zp +Om +yQ +Bq +Mb +Bq +cr +uY +dH +Bq +Um +gw +gf +Bq +pv +Bq +lc +uY +pq +eK +cO +eH +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(18,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Gm +Bq +Bq +Mb +HO +bE +Rd +La +Bq +Ae +cW +bE +sW +Mb +Bk +bE +Rd +La +eK +eH +tk +qB +ka +MH +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +oX +"} +(19,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +vF +dW +bE +GX +dH +Bq +Mb +Bq +ik +gK +ZX +Bq +yI +Om +dS +Bq +Mb +Bq +ik +gK +ZX +eK +tk +CV +wZ +QI +gI +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(20,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +KZ +AZ +pz +Rd +bE +JJ +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +BI +ka +mP +rB +bD +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(21,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +xR +AZ +BW +gK +st +Bq +Mb +Mb +yg +Mb +Bq +xg +Bq +Mb +Mb +Mb +Mb +yg +Mb +Mb +Xx +TC +JN +ka +ka +ka +ka +ka +rD +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(22,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Bq +Bq +Bq +Mb +Bq +Bq +cH +Bq +Bq +Bq +QH +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +NB +rD +ka +ka +ka +BI +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(23,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +eK +eK +Bq +Fk +Yr +wz +Bq +Mb +Bq +Ka +gw +PE +Bq +CU +uY +bE +Bq +Mb +CS +qb +gw +pJ +eK +ka +ka +eK +Rw +eK +eK +eK +Ej +nc +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(24,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +tf +GK +XP +Bq +pv +Bq +bE +cW +La +Bq +PE +Rd +La +Bq +Mb +Bq +wx +cW +La +eK +Sf +eK +Bq +Mb +Dx +Mb +Bq +eK +Ej +ka +ka +ka +nc +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(25,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +IX +Mb +Mb +Bq +pE +Bq +ik +Om +gc +Bq +yI +gK +ZX +Bq +pE +Bq +Zp +Om +eJ +Bq +eK +Bq +jb +dY +lI +Aq +MR +Bq +eK +th +ka +ka +ka +ka +nc +EI +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(26,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +ow +Bq +UI +Bq +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +Bq +BV +Mb +Mb +ho +ho +ho +Mb +Rz +AZ +ka +sz +ka +ka +yy +ka +ka +ka +ka +ka +nc +EI +ij +cO +cO +cO +cO +eH +EI +EI +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(27,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +LR +Bf +eK +Bq +Bq +tI +Mb +Mb +Mb +Mb +Mb +Mb +JG +Mb +Mb +Mb +Mb +Mb +Mb +JG +Mb +dj +Mb +Mb +IS +gN +Al +Mb +Mb +Mb +xw +AZ +ka +ka +ka +Md +BB +ka +ka +ka +rD +ka +ka +ka +nc +ij +cO +cO +cO +oa +sz +th +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(28,1,1) = {" +SR +cO +cO +cO +cO +cO +LR +lS +wN +xJ +SL +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +dj +Mb +Mb +So +EY +UW +Mb +Mb +ZH +AZ +AZ +JN +ka +ka +ka +ka +ka +ka +DR +ka +ka +BD +ka +sz +nc +EI +EI +EI +tk +ka +ka +ka +ka +ka +sz +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(29,1,1) = {" +SR +cO +cO +cO +cO +cO +Jd +Yz +xJ +eK +Bq +Bq +yG +yG +Bq +Qv +Bq +Bq +Bq +Bq +Bq +DP +TY +DP +Bq +Bq +Bq +Bq +Bq +Bq +pv +LV +II +Qq +Mb +Mb +AZ +AZ +JN +JN +ka +ka +ka +ka +ka +TZ +oC +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +Oy +ka +Dg +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(30,1,1) = {" +SR +cO +cO +cO +cO +cO +Jd +mV +xJ +eK +Jb +zS +lW +lW +PJ +lW +Qu +Bq +lF +bx +jL +qH +gP +FB +NU +Bq +CQ +CQ +Bq +cK +Mb +dA +Mb +Mb +Mb +Mb +eK +sR +JN +de +JN +ka +ka +ka +rD +ka +ka +ka +ka +eK +AZ +AZ +eK +ka +eK +AZ +AZ +eK +uC +ka +ka +Nj +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(31,1,1) = {" +SR +cO +cO +cO +cO +cO +Ud +bT +Wg +eK +vx +lW +Ug +aY +Ug +lW +YP +Gq +zm +Wm +gP +gP +gP +gP +gP +Va +Xt +Xt +Bq +Cw +uY +zL +uY +uY +uY +uY +VK +Ty +JN +JN +JN +ka +ka +th +ka +ka +ka +ka +eK +Bq +Qx +Qx +Bq +AZ +Bq +BM +gs +Bq +eK +rD +ka +DR +LN +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(32,1,1) = {" +SR +cO +cO +cO +cO +cO +Jc +If +Wg +eK +Ks +lW +Ho +RS +Ld +lW +Rk +Bq +Mx +gP +gP +up +gP +gP +TO +Bq +Ml +Xt +Bq +uY +Rd +ZE +uY +uY +uY +Ta +eK +Ty +Ty +JN +JN +ka +ka +ka +ka +ka +ka +ka +eK +UO +en +ty +Yb +en +HR +gi +Ai +Ga +eK +ka +ka +ka +nR +ka +gL +VL +JH +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(33,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +Jc +IF +eK +HK +lW +qR +MO +pX +PJ +rG +Bq +CP +HT +gP +aD +OK +gP +Ay +Bq +Ml +Xt +Bq +Cw +uY +iF +uY +uY +uY +uY +VK +Ty +Ty +Ty +JN +ka +ka +ka +ka +ka +ka +ka +eK +Bq +Ma +xx +en +pV +Nt +dB +Mr +Mb +AZ +ka +ka +ka +rD +ka +cE +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(34,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +lW +lW +KT +DA +In +Bq +eK +AZ +Bq +gP +gP +gP +Bq +Bq +Bq +FE +Xt +Bq +PG +Mb +oQ +Mb +Mb +Mb +eK +eK +wf +Ty +Ty +Ty +ka +ka +ka +rD +ka +ka +sz +ka +eK +AZ +Bq +wT +wT +Ag +Mb +Vs +Mb +eK +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(35,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +lW +rW +Ry +MV +Bq +eK +zO +bb +eK +Uy +Bq +ee +Bq +Ml +Po +gB +Xt +Bq +Bq +Mb +IS +gN +Al +Mb +AZ +wf +SJ +JN +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +th +ka +JN +eK +AZ +AZ +Bq +Mb +Re +fg +eK +as +ka +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +SR +"} +(36,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +lU +yG +yG +Bq +eK +IJ +xJ +xJ +xJ +xJ +eK +AZ +Bq +Ml +AK +Xt +Xt +Xt +Va +Mb +So +sh +UW +Mb +AZ +AZ +SJ +JN +JN +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +JN +eK +mx +AZ +eK +Ib +JN +ka +ka +ka +Oy +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(37,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +GI +GI +YW +eK +cO +TS +mV +xJ +xJ +xJ +tw +cO +eK +Bq +yc +yc +yc +Bq +Bq +Bq +LV +Ne +Qq +Mb +Qc +AZ +SJ +JN +JN +ka +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +ka +JN +ka +ka +ta +YD +dp +ct +ka +ka +ka +JN +ka +ka +ka +NT +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +SR +"} +(38,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +lx +uI +ba +YW +lx +cO +bp +rn +zn +Nc +yB +pC +cO +cO +eK +Bq +Bq +Bq +Bq +Sr +Bq +kD +Bq +Mb +Mb +Tt +AZ +Er +JN +rD +ka +ka +Ty +Ty +Ty +ka +ka +ka +rD +ka +JN +JN +JN +ka +JN +ka +JN +ka +JN +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(39,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +zp +Bq +eK +cO +Jc +fe +du +AG +pC +cO +cO +cO +eK +hT +lh +TR +jm +TR +TR +TR +Bq +Ws +KJ +fg +eK +JN +ka +ka +ka +ka +ka +Ty +Ty +Ty +ka +ka +ka +JN +JN +JN +ka +JN +ka +JN +JN +ka +ka +ka +JN +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +SR +"} +(40,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +TR +TR +HV +TR +TR +eP +KI +Bq +eK +eK +eK +ka +ka +Xl +ka +sz +ka +ka +Gp +Ty +Ty +JN +JN +JN +JN +JN +ka +ka +JN +JN +ka +ka +JN +ka +ka +ka +ka +ka +RO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(41,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +Ol +TR +TR +DG +Gx +Bq +eK +eK +rD +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +JN +JN +JN +JN +JN +JN +ka +NH +eK +eK +AZ +AZ +eK +eK +ky +ka +JN +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(42,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +Bq +ce +cC +Bq +eK +mJ +ka +ka +ka +Yo +Yo +Yo +ka +ka +ka +ka +ka +rD +JN +JN +JN +ka +ka +JN +JN +yJ +eK +QX +hA +Ac +Sc +eK +YR +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +SR +"} +(43,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +eK +eK +bY +Et +ka +ra +Yo +Yo +bX +Yo +Yo +sz +ka +ka +ka +ka +JN +JN +jr +ka +ka +ka +JN +eK +Bq +Qm +Mb +Mb +Mb +jK +aA +JF +ka +ka +FO +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(44,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +UZ +Yo +bX +hh +bX +Yo +sz +ka +lA +US +IA +JN +JN +ka +ka +ka +ka +JN +mL +Mb +GK +Se +vU +Mb +rR +yN +UE +ka +ka +Bx +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(45,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +zq +Yo +bX +kN +bX +ev +ka +ka +NZ +NZ +eK +JN +JN +ka +ka +ka +ka +Sb +eK +Zy +lJ +tM +Hp +Mb +rR +yN +UE +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +SR +"} +(46,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +Bc +Yo +sl +bX +bX +Yo +sz +ka +NZ +YI +LD +JN +JN +rD +ka +ka +ka +eK +eK +pv +uD +DT +Mb +Mb +We +yN +UE +ka +ka +Eb +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(47,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +Yo +Yo +bX +Yo +Yo +sz +ka +NZ +kI +eK +JN +JN +ka +ka +ka +GQ +eK +VI +Mb +si +Co +Mb +Fp +Pq +Sz +Fx +ka +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(48,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +Yo +Yo +Yo +ka +ka +ka +NZ +Qk +Uf +JN +JN +ka +ka +ka +ka +AZ +HE +Mb +jW +Mb +Mb +dl +eK +Fx +ka +ka +ka +th +Zn +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(49,1,1) = {" +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +sz +ka +ka +ka +th +ka +eK +kI +kI +eK +JN +JN +ka +ka +ka +ka +AZ +fL +Mb +Mb +Mb +hZ +rR +UE +ka +ka +ka +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(50,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +rD +ka +ka +ka +ka +ka +NZ +ZB +sa +JN +JN +ka +th +ka +ka +AZ +xT +Mb +Mb +Og +SO +Np +Fx +ka +as +ka +ka +ka +sC +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +SR +"} +(51,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +th +ka +ka +ka +ka +ka +ka +eK +eK +eK +JN +JN +ka +ka +rD +ka +eK +xT +Do +KL +tX +Np +Fx +ka +ka +ka +ka +ka +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(52,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +RM +ka +ka +ka +eK +rK +JN +JN +JN +ka +ka +ka +ka +eK +eK +AZ +AZ +eK +cc +ka +ka +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(53,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +ZI +ka +ka +as +ka +cg +JN +JN +ka +ka +ka +ka +ka +ka +os +ka +eM +ka +rD +ka +ka +ka +ka +ka +rj +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(54,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +tW +ka +ka +th +ka +ka +ka +ka +ka +JN +JN +ka +ka +ka +ka +th +ka +BI +ka +ka +as +ka +ka +ka +ka +ka +ka +xk +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +SR +"} +(55,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +Rc +Of +ka +ka +rD +ka +ka +ka +ka +JN +JN +ka +ka +ka +ka +ka +ka +sz +ka +ka +ka +ka +ka +QY +fY +gA +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(56,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +ka +ka +ka +JN +JN +JN +lk +Or +uX +qZ +ka +ka +ka +rD +ka +ka +ka +iy +ut +OM +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(57,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +XO +ka +ka +ka +ka +ka +ka +ka +as +JN +JN +kL +TB +ze +mv +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(58,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ET +tW +ka +XW +CA +ka +ka +ka +JN +JN +IL +wH +ze +mv +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +rD +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +SR +"} +(59,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +bY +CR +ka +zH +LN +DR +ka +ka +ka +JN +JN +IL +eh +ze +mv +ka +rD +ka +ka +th +ka +ka +th +ka +ka +Oy +ka +ka +BU +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(60,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +wb +bY +MT +ka +ka +ka +ka +ka +JN +JN +uz +It +It +MA +ka +ka +ka +ka +ka +ka +tW +tW +tW +tW +ka +ka +ka +il +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(61,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +TZ +RJ +ka +JN +JN +JN +Yd +ka +ka +ka +ka +dD +ka +ka +ka +TM +SM +SM +SM +SM +LY +ZY +ka +cp +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +SR +"} +(62,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +oa +ka +FX +FX +ka +JN +JN +ka +ka +ka +ka +ka +ka +ka +sz +ZV +FO +dG +ka +ka +ka +ka +ka +PR +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(63,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +JN +JN +ka +ka +ka +ka +ka +ka +OO +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(64,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +JN +JN +ka +mi +ka +ka +ka +ka +ka +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +th +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +SR +"} +(65,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +cO +cO +oa +rD +ka +ka +JN +JN +ka +ka +ka +ka +rD +ka +JN +ka +ka +ka +dG +ka +Dg +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(66,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +JN +JN +JN +JN +JN +ka +ka +ka +fI +jP +fI +lP +dG +ka +ka +ka +ka +ka +PR +Oy +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(67,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +ka +JN +JN +JN +ka +JN +JN +ka +JN +GD +ew +fI +sO +dG +Tw +Tw +Tw +Tw +Tw +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +cO +SR +"} +(68,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +eH +Ko +ka +ka +rD +JN +JN +ka +yz +ka +ka +ka +Gw +fI +jP +hu +lP +dG +ka +ka +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(69,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +ka +Dt +ka +JN +JN +ka +ka +ka +ka +JN +ka +ka +th +ka +ka +dG +ka +ka +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(70,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +eH +EI +rl +ka +ka +ka +ka +ka +JN +JN +JN +ka +ka +ka +ka +ka +ka +rD +FO +FO +dG +ka +ka +ka +ka +ka +PR +al +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(71,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +th +ka +ka +eK +eK +eK +eK +qc +JN +JN +ka +ka +ka +ka +ka +JN +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +xj +ij +cO +cO +JH +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(72,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +Oy +eK +eK +Bq +ro +ro +fg +eK +oZ +tQ +ka +ka +eO +PZ +ka +ka +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(73,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +eK +Bq +ro +Ub +Sx +Sx +Sx +XJ +bK +ii +tQ +ka +pj +fH +ka +ka +ka +ka +ka +mW +Xu +Xu +Xu +Xu +WG +lz +ka +iP +ka +lG +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(74,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +ka +eK +ro +Sx +Sx +Sx +Sx +Sx +XJ +bK +bK +TC +ka +ka +ka +rD +ka +ka +ka +ka +th +iU +iU +iU +iU +ka +ka +ka +hB +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(75,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +sz +ka +ka +eK +Bq +DS +Bq +Bq +ro +Sx +eK +bK +bK +TC +ka +ka +ka +ka +ka +ka +ka +ka +rD +ka +ka +ka +ka +ka +rD +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(76,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +sz +JN +eK +KH +uu +KH +Bq +ro +Sx +TW +bK +bK +TC +ka +ka +th +ka +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +ka +ka +gC +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(77,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +Rs +Bq +Bq +uu +uu +Bq +Bq +Sx +TK +bK +bK +TC +ka +ka +ka +tW +tW +tW +ka +tW +tW +ka +ka +ka +ka +ka +ka +ka +FO +ka +dX +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(78,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +jV +dv +Bq +KH +uu +Qj +Bq +Sx +sI +bK +bK +TC +ka +ka +ka +tW +tW +tW +ka +tW +tW +ka +ka +ka +ka +ka +sR +ka +Jv +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(79,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +eK +Tq +hD +Bq +Bq +xO +uu +Bq +Bq +zg +bK +vM +VD +ka +ka +rD +ka +ka +ka +ka +ka +ka +ka +ka +ka +tW +ka +ka +ka +Oy +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(80,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +Bz +Tb +UJ +Bq +aE +uu +KH +Bq +RF +YD +VD +ka +ka +ka +ka +ka +Rf +Tr +Tr +Tr +Zz +ka +ka +FO +uH +xP +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(81,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +eK +eK +jV +ke +Bq +aE +uu +KH +eK +GY +ka +ka +ka +ka +th +ka +Rf +zK +OA +OA +OA +RB +Zz +Oy +oJ +iU +ka +ka +ka +YN +gL +VL +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +"} +(82,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +sz +AX +eK +IG +IG +eK +Bq +KH +Bq +eK +wI +ka +ka +ka +ka +ka +ka +rz +jq +OA +OA +OA +OA +ob +ka +ka +ka +ka +Zj +rD +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(83,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +eK +eK +eK +kJ +ka +OV +ka +ka +ka +ka +ka +rQ +ww +OA +OA +OA +OA +py +ka +Dg +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(84,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +ka +sR +ka +ka +ka +ka +ka +ka +ka +KP +eK +eK +eK +eK +eK +eK +eK +Uk +ka +ka +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(85,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +Oy +ka +ka +ka +ka +ka +ka +tW +tW +ka +tW +tW +Rf +eK +Bq +RP +YM +Ub +Mj +sV +fg +eK +ka +ka +gL +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(86,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +NZ +NZ +eK +ka +ka +ka +ka +ka +ka +ka +rz +Mo +Sx +jn +YZ +YZ +jn +YZ +QG +Bq +eK +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +"} +(87,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +NZ +EA +xe +ka +ka +ef +ef +ef +ef +NC +ta +eK +DL +Dq +Dq +Dq +Dq +Dq +KS +QN +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(88,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +eK +eK +eK +ka +oq +ka +ka +ka +ka +ka +ka +eK +Bq +Aj +Aj +Aj +Aj +Aj +Hd +hM +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(89,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +PH +ka +ka +aZ +iY +ka +ka +ka +MX +ka +JU +eK +fJ +og +HP +HP +HP +HP +wC +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(90,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +Oy +ka +ka +ka +ka +nX +gL +Jw +VL +eK +HI +EQ +HP +HP +HP +HP +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(91,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +gV +ka +ka +fv +gL +bY +bY +VL +cO +cO +eK +eK +Zs +Iw +Iw +Iw +eK +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(92,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +bY +bY +bY +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(93,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(94,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(95,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(96,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(97,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(98,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index 150c2608022..23461a90a11 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -42,8 +42,14 @@ #define COMSIG_BITRUNNER_STATION_SPAWN "bitrunner_station_spawn" // Ladder + /// from /obj/structure/hololadder/disconnect() #define COMSIG_BITRUNNER_LADDER_SEVER "bitrunner_ladder_sever" /// Sent when a server console is emagged #define COMSIG_BITRUNNER_SERVER_EMAGGED "bitrunner_server_emagged" + +// Spawners + +/// from /obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn() : (mob/living/runner) +#define COMSIG_BITRUNNER_SPAWNED "bitrunner_spawned" diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm index 2b303911e42..78afb101945 100644 --- a/code/controllers/subsystem/bitrunning.dm +++ b/code/controllers/subsystem/bitrunning.dm @@ -24,7 +24,8 @@ SUBSYSTEM_DEF(bitrunning) var/can_view = domain.difficulty < scanner_tier && domain.cost <= points + 5 var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 - levels += list(list( + UNTYPED_LIST_ADD(levels, list( + "announce_ghosts"= domain.announce_to_ghosts, "cost" = domain.cost, "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", "difficulty" = domain.difficulty, diff --git a/code/modules/bitrunning/components/bitrunning_points.dm b/code/modules/bitrunning/components/bitrunning_points.dm index 328a70679e6..ea8f63f76d8 100644 --- a/code/modules/bitrunning/components/bitrunning_points.dm +++ b/code/modules/bitrunning/components/bitrunning_points.dm @@ -5,6 +5,7 @@ /// A special condition limits this from spawning a crate var/points_received = 0 + /datum/component/bitrunning_points/Initialize(datum/lazy_template/virtual_domain/domain) . = ..() if(!isturf(parent)) @@ -12,6 +13,7 @@ RegisterSignal(domain, COMSIG_BITRUNNER_GOAL_POINT, PROC_REF(on_add_points)) + /// Listens for points to be added which will eventually spawn a crate. /datum/component/bitrunning_points/proc/on_add_points(datum/source, points_to_add) SIGNAL_HANDLER @@ -23,12 +25,14 @@ reveal() + /// Spawns the crate with some effects /datum/component/bitrunning_points/proc/reveal() playsound(src, 'sound/magic/blink.ogg', 50, TRUE) var/turf/tile = parent - new /obj/structure/closet/crate/secure/bitrunning/encrypted(tile) + var/obj/structure/closet/crate/secure/bitrunning/encrypted/crate = new() + crate.forceMove(tile) // Triggers any on-move effects on that turf var/datum/effect_system/spark_spread/quantum/sparks = new(tile) sparks.set_up(number = 5, location = tile) diff --git a/code/modules/bitrunning/netpod/_netpod.dm b/code/modules/bitrunning/netpod/_netpod.dm new file mode 100644 index 00000000000..2208c56a741 --- /dev/null +++ b/code/modules/bitrunning/netpod/_netpod.dm @@ -0,0 +1,137 @@ +#define BASE_DISCONNECT_DAMAGE 40 + + +/obj/machinery/netpod + name = "netpod" + + base_icon_state = "netpod" + circuit = /obj/item/circuitboard/machine/netpod + desc = "A link to the netverse. It has an assortment of cables to connect yourself to a virtual domain." + icon = 'icons/obj/machines/bitrunning.dmi' + icon_state = "netpod" + max_integrity = 300 + obj_flags = BLOCKS_CONSTRUCTION + state_open = TRUE + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY + + /// Whether we have an ongoing connection + var/connected = FALSE + /// A player selected outfit by clicking the netpod + var/datum/outfit/netsuit = /datum/outfit/job/bitrunner + /// Holds this to see if it needs to generate a new one + var/datum/weakref/avatar_ref + /// The linked quantum server + var/datum/weakref/server_ref + /// The amount of brain damage done from force disconnects + var/disconnect_damage + /// Static list of outfits to select from + var/list/cached_outfits = list() + + +/obj/machinery/netpod/post_machine_initialize() + . = ..() + + disconnect_damage = BASE_DISCONNECT_DAMAGE + find_server() + + RegisterSignal(src, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_damage_taken)) + RegisterSignal(src, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_loss)) + RegisterSignals(src, list(COMSIG_QDELETING, COMSIG_MACHINERY_BROKEN),PROC_REF(on_broken)) + + register_context() + update_appearance() + + +/obj/machinery/netpod/Destroy() + . = ..() + + QDEL_LIST(cached_outfits) + + +/obj/machinery/netpod/examine(mob/user) + . = ..() + + if(isnull(server_ref?.resolve())) + . += span_infoplain("It's not connected to anything.") + . += span_infoplain("Netpods must be built within 4 tiles of a server.") + return + + if(!isobserver(user)) + . += span_infoplain("Drag yourself into the pod to engage the link.") + . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.") + . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.") + + if(isnull(occupant)) + . += span_infoplain("It's currently unoccupied.") + return + + . += span_infoplain("It's currently occupied by [occupant].") + + if(isobserver(user)) + . += span_notice("As an observer, you can click this netpod to jump to its avatar.") + return + + . += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.") + + +/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Select Outfit" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/crowbar) && occupant) + context[SCREENTIP_CONTEXT_LMB] = "Pry Open" + return CONTEXTUAL_SCREENTIP_SET + + +/obj/machinery/netpod/update_icon_state() + if(!is_operational) + icon_state = base_icon_state + return ..() + + if(state_open) + icon_state = base_icon_state + "_open_active" + return ..() + + if(panel_open) + icon_state = base_icon_state + "_panel" + return ..() + + icon_state = base_icon_state + "_closed" + if(occupant) + icon_state += "_active" + + return ..() + + +/obj/machinery/netpod/mouse_drop_receive(mob/target, mob/user, params) + var/mob/living/carbon/player = user + + if(!iscarbon(player) || !is_operational || !state_open || player.buckled) + return + + close_machine(target) + + +/obj/machinery/netpod/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!state_open && user == occupant) + container_resist_act(user) + + +/obj/machinery/netpod/attack_ghost(mob/dead/observer/our_observer) + var/our_target = avatar_ref?.resolve() + if(isnull(our_target) || !our_observer.orbit(our_target)) + return ..() + + +/// When the server is upgraded, drops brain damage a little +/obj/machinery/netpod/proc/on_server_upgraded(obj/machinery/quantum_server/source) + SIGNAL_HANDLER + + disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - source.servo_bonus) + + +#undef BASE_DISCONNECT_DAMAGE diff --git a/code/modules/bitrunning/netpod/container.dm b/code/modules/bitrunning/netpod/container.dm new file mode 100644 index 00000000000..61655445445 --- /dev/null +++ b/code/modules/bitrunning/netpod/container.dm @@ -0,0 +1,74 @@ +/obj/machinery/netpod/Exited(atom/movable/gone, direction) + . = ..() + if(!state_open && gone == occupant) + container_resist_act(gone) + + +/obj/machinery/netpod/relaymove(mob/living/user, direction) + if(!state_open) + container_resist_act(user) + + +/obj/machinery/netpod/container_resist_act(mob/living/user) + user.visible_message(span_notice("[occupant] emerges from [src]!"), + span_notice("You climb out of [src]!"), + span_notice("With a hiss, you hear a machine opening.")) + open_machine() + + +/obj/machinery/netpod/open_machine(drop = TRUE, density_to_set = FALSE) + playsound(src, 'sound/machines/tramopen.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_opening", src) + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_OPENED) + update_use_power(IDLE_POWER_USE) + + return ..() + + +/obj/machinery/netpod/close_machine(mob/user, density_to_set = TRUE) + if(!state_open || panel_open || !is_operational || !iscarbon(user)) + return + + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + ..() + + enter_matrix() + + +/obj/machinery/netpod/default_pry_open(obj/item/crowbar, mob/living/pryer) + if(isnull(occupant) || !iscarbon(occupant)) + if(!state_open) + if(panel_open) + return FALSE + open_machine() + else + shut_pod() + + return TRUE + + pryer.visible_message( + span_danger("[pryer] starts prying open [src]!"), + span_notice("You start to pry open [src]."), + span_notice("You hear loud prying on metal.") + ) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + + SEND_SIGNAL(src, COMSIG_BITRUNNER_CROWBAR_ALERT, pryer) + + if(do_after(pryer, 15 SECONDS, src)) + if(!state_open) + sever_connection() + open_machine() + + return TRUE + + +/// Closes the machine without shoving in an occupant +/obj/machinery/netpod/proc/shut_pod() + state_open = FALSE + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + set_density(TRUE) + + update_appearance() diff --git a/code/modules/bitrunning/netpod/outfitting.dm b/code/modules/bitrunning/netpod/outfitting.dm new file mode 100644 index 00000000000..07f25154198 --- /dev/null +++ b/code/modules/bitrunning/netpod/outfitting.dm @@ -0,0 +1,30 @@ +/// Creates a list of outfit entries for the UI. +/obj/machinery/netpod/proc/make_outfit_collection(identifier, list/outfit_list) + var/list/collection = list( + "name" = identifier, + "outfits" = list() + ) + + for(var/datum/outfit/outfit as anything in outfit_list) + var/outfit_name = initial(outfit.name) + if(findtext(outfit_name, "(") != 0 || findtext(outfit_name, "-") != 0) // No special variants please + continue + + collection["outfits"] += list(list("path" = outfit, "name" = outfit_name)) + + return list(collection) + + +/// Resolves a path to an outfit. +/obj/machinery/netpod/proc/resolve_outfit(text) + var/path = text2path(text) + if(!ispath(path, /datum/outfit)) + return + + for(var/wardrobe in cached_outfits) + for(var/outfit in wardrobe["outfits"]) + if(path == outfit["path"]) + return path + + message_admins("[usr]:[usr.ckey] attempted to select an unavailable outfit from a netpod") + return diff --git a/code/modules/bitrunning/netpod/signals.dm b/code/modules/bitrunning/netpod/signals.dm new file mode 100644 index 00000000000..8f8416aeb7b --- /dev/null +++ b/code/modules/bitrunning/netpod/signals.dm @@ -0,0 +1,64 @@ +/// Machine has been broken - handles signals and reverting sprites +/obj/machinery/netpod/proc/on_broken(datum/source) + SIGNAL_HANDLER + + sever_connection() + + +/// Checks the integrity, alerts occupants +/obj/machinery/netpod/proc/on_damage_taken(datum/source, damage_amount) + SIGNAL_HANDLER + + if(isnull(occupant) || !connected) + return + + var/total = max_integrity - damage_amount + var/integrity = (atom_integrity / total) * 100 + if(integrity > 50) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_INTEGRITY) + + +/// Puts points on the current occupant's card account +/obj/machinery/netpod/proc/on_domain_complete(datum/source, atom/movable/crate, reward_points) + SIGNAL_HANDLER + + if(isnull(occupant) || !connected) + return + + var/mob/living/player = occupant + + var/datum/bank_account/account = player.get_bank_account() + if(isnull(account)) + return + + account.bitrunning_points += reward_points * 100 + + +/// The domain has been fully purged, so we should double check our avatar is deleted +/obj/machinery/netpod/proc/on_domain_scrubbed(datum/source) + SIGNAL_HANDLER + + var/mob/avatar = avatar_ref?.resolve() + if(isnull(avatar)) + return + + QDEL_NULL(avatar) + + +/// Boots out anyone in the machine && opens it +/obj/machinery/netpod/proc/on_power_loss(datum/source) + SIGNAL_HANDLER + + if(state_open) + return + + if(isnull(occupant) || !connected) + connected = FALSE + open_machine() + return + + sever_connection() + + diff --git a/code/modules/bitrunning/netpod/tools.dm b/code/modules/bitrunning/netpod/tools.dm new file mode 100644 index 00000000000..0d31bdab866 --- /dev/null +++ b/code/modules/bitrunning/netpod/tools.dm @@ -0,0 +1,22 @@ +/obj/machinery/netpod/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + attack_hand(user) + return ITEM_INTERACT_SUCCESS + + if(default_pry_open(tool, user) || default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + + +/obj/machinery/netpod/screwdriver_act(mob/living/user, obj/item/tool) + if(occupant) + balloon_alert(user, "in use!") + return ITEM_INTERACT_SUCCESS + + if(state_open) + balloon_alert(user, "close first.") + return ITEM_INTERACT_SUCCESS + + if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", "[base_icon_state]_closed", tool)) + update_appearance() // sometimes icon doesnt properly update during flick() + ui_close(user) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/bitrunning/netpod/ui.dm b/code/modules/bitrunning/netpod/ui.dm new file mode 100644 index 00000000000..93719fe64eb --- /dev/null +++ b/code/modules/bitrunning/netpod/ui.dm @@ -0,0 +1,41 @@ +/obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) + if(!is_operational || occupant) + return + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NetpodOutfits") + ui.set_autoupdate(FALSE) + ui.open() + + +/obj/machinery/netpod/ui_data() + var/list/data = list() + + data["netsuit"] = netsuit + return data + + +/obj/machinery/netpod/ui_static_data() + var/list/data = list() + + if(!length(cached_outfits)) + cached_outfits += make_outfit_collection("Jobs", subtypesof(/datum/outfit/job)) + + data["collections"] = cached_outfits + + return data + + +/obj/machinery/netpod/ui_act(action, params) + . = ..() + if(.) + return TRUE + switch(action) + if("select_outfit") + var/datum/outfit/new_suit = resolve_outfit(params["outfit"]) + if(new_suit) + netsuit = new_suit + return TRUE + + return FALSE diff --git a/code/modules/bitrunning/netpod/utils.dm b/code/modules/bitrunning/netpod/utils.dm new file mode 100644 index 00000000000..6e0033fe02d --- /dev/null +++ b/code/modules/bitrunning/netpod/utils.dm @@ -0,0 +1,144 @@ +/// Puts the occupant in netpod stasis, basically short-circuiting environmental conditions +/obj/machinery/netpod/proc/add_healing(mob/living/target) + if(target != occupant) + return + + target.AddComponent(/datum/component/netpod_healing, pod = src) + target.playsound_local(src, 'sound/effects/submerge.ogg', 20, vary = TRUE) + target.extinguish_mob() + update_use_power(ACTIVE_POWER_USE) + + +/// Disconnects the occupant after a certain time so they aren't just hibernating in netpod stasis. A balance change +/obj/machinery/netpod/proc/auto_disconnect() + if(isnull(occupant) || state_open || connected) + return + + var/mob/player = occupant + player.playsound_local(src, 'sound/effects/splash.ogg', 60, TRUE) + to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) + open_machine() + + +/// Handles occupant post-disconnection effects like damage, sounds, etc +/obj/machinery/netpod/proc/disconnect_occupant(cause_damage = FALSE) + connected = FALSE + + var/mob/living/mob_occupant = occupant + if(isnull(occupant) || mob_occupant.stat == DEAD) + open_machine() + return + + mob_occupant.playsound_local(src, 'sound/magic/blink.ogg', 25, TRUE) + mob_occupant.set_static_vision(2 SECONDS) + mob_occupant.set_temp_blindness(1 SECONDS) + mob_occupant.Paralyze(2 SECONDS) + + if(!is_operational) + open_machine() + return + + var/heal_time = 1 + if(mob_occupant.health < mob_occupant.maxHealth) + heal_time = (mob_occupant.stat + 2) * 5 + addtimer(CALLBACK(src, PROC_REF(auto_disconnect)), heal_time SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) + + if(!cause_damage) + return + + mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) + INVOKE_ASYNC(mob_occupant, TYPE_PROC_REF(/mob/living, emote), "scream") + to_chat(mob_occupant, span_danger("You've been forcefully disconnected from your avatar! Your thoughts feel scrambled!")) + + +/** + * ### Enter Matrix + * Finds any current avatars from this chair - or generates a new one + * + * New avatars cost 1 attempt, and this will eject if there's none left + * + * Connects the mind to the avatar if everything is ok + */ +/obj/machinery/netpod/proc/enter_matrix() + var/mob/living/carbon/human/neo = occupant + if(!ishuman(neo) || neo.stat == DEAD || isnull(neo.mind)) + balloon_alert(neo, "invalid occupant.") + return + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + balloon_alert(neo, "no server connected!") + return + + var/datum/lazy_template/virtual_domain/generated_domain = server.generated_domain + if(isnull(generated_domain) || !server.is_ready) + balloon_alert(neo, "nothing loaded!") + return + + var/mob/living/carbon/current_avatar = avatar_ref?.resolve() + if(isnull(current_avatar) || current_avatar.stat != CONSCIOUS) // We need a viable avatar + current_avatar = server.start_new_connection(neo, netsuit) + if(isnull(current_avatar)) + balloon_alert(neo, "out of bandwidth!") + return + + neo.set_static_vision(2 SECONDS) + add_healing(occupant) + + if(!validate_entry(neo, current_avatar)) + open_machine() + return + + current_avatar.AddComponent( \ + /datum/component/avatar_connection, \ + old_mind = neo.mind, \ + old_body = neo, \ + server = server, \ + pod = src, \ + help_text = generated_domain.help_text, \ + ) + + connected = TRUE + + +/// Finds a server and sets the server_ref +/obj/machinery/netpod/proc/find_server() + var/obj/machinery/quantum_server/server = server_ref?.resolve() + if(server) + return server + + server = locate(/obj/machinery/quantum_server) in oview(4, src) + if(isnull(server)) + return + + server_ref = WEAKREF(server) + RegisterSignal(server, COMSIG_MACHINERY_REFRESH_PARTS, PROC_REF(on_server_upgraded)) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_complete)) + RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_SCRUBBED, PROC_REF(on_domain_scrubbed)) + + return server + + +/// Severs the connection with the current avatar +/obj/machinery/netpod/proc/sever_connection() + if(isnull(occupant) || !connected) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_SEVER) + + +/// Checks for cases to eject/fail connecting an avatar +/obj/machinery/netpod/proc/validate_entry(mob/living/neo, mob/living/avatar) + if(!do_after(neo, 2 SECONDS, src)) + return FALSE + + // Very invalid + if(QDELETED(neo) || QDELETED(avatar) || QDELETED(src) || !is_operational) + return FALSE + + // Invalid + if(occupant != neo || isnull(neo.mind) || neo.stat > SOFT_CRIT || avatar.stat == DEAD) + return FALSE + + return TRUE diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index 3b38493edff..ea55b96979e 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -12,6 +12,11 @@ name = "Bitrunning hololadder spawn" icon_state = "hololadder" +/// A permanent exit for the domain +/obj/effect/landmark/bitrunning/permanent_exit + name = "Bitrunning permanent exit" + icon_state = "perm_exit" + /// Where the crates need to be taken /obj/effect/landmark/bitrunning/cache_goal_turf name = "Bitrunning goal turf" diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm deleted file mode 100644 index 1d4e905d6e1..00000000000 --- a/code/modules/bitrunning/objects/netpod.dm +++ /dev/null @@ -1,490 +0,0 @@ -#define BASE_DISCONNECT_DAMAGE 40 - -/obj/machinery/netpod - name = "netpod" - - base_icon_state = "netpod" - circuit = /obj/item/circuitboard/machine/netpod - desc = "A link to the netverse. It has an assortment of cables to connect yourself to a virtual domain." - icon = 'icons/obj/machines/bitrunning.dmi' - icon_state = "netpod" - max_integrity = 300 - obj_flags = BLOCKS_CONSTRUCTION - state_open = TRUE - interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY - - /// Whether we have an ongoing connection - var/connected = FALSE - /// A player selected outfit by clicking the netpod - var/datum/outfit/netsuit = /datum/outfit/job/bitrunner - /// Holds this to see if it needs to generate a new one - var/datum/weakref/avatar_ref - /// The linked quantum server - var/datum/weakref/server_ref - /// The amount of brain damage done from force disconnects - var/disconnect_damage - /// Static list of outfits to select from - var/list/cached_outfits = list() - -/obj/machinery/netpod/post_machine_initialize() - . = ..() - - disconnect_damage = BASE_DISCONNECT_DAMAGE - find_server() - - RegisterSignal(src, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_damage_taken)) - RegisterSignal(src, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_loss)) - RegisterSignals(src, list(COMSIG_QDELETING, COMSIG_MACHINERY_BROKEN),PROC_REF(on_broken)) - - register_context() - update_appearance() - -/obj/machinery/netpod/Destroy() - . = ..() - - QDEL_LIST(cached_outfits) - -/obj/machinery/netpod/examine(mob/user) - . = ..() - - if(isnull(server_ref?.resolve())) - . += span_infoplain("It's not connected to anything.") - . += span_infoplain("Netpods must be built within 4 tiles of a server.") - return - - if(!isobserver(user)) - . += span_infoplain("Drag yourself into the pod to engage the link.") - . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.") - . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.") - - if(isnull(occupant)) - . += span_infoplain("It's currently unoccupied.") - return - - . += span_infoplain("It's currently occupied by [occupant].") - - if(isobserver(user)) - . += span_notice("As an observer, you can click this netpod to jump to its avatar.") - return - - . += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.") - - - -/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(isnull(held_item)) - context[SCREENTIP_CONTEXT_LMB] = "Select Outfit" - return CONTEXTUAL_SCREENTIP_SET - - if(istype(held_item, /obj/item/crowbar) && occupant) - context[SCREENTIP_CONTEXT_LMB] = "Pry Open" - return CONTEXTUAL_SCREENTIP_SET - - -/obj/machinery/netpod/update_icon_state() - if(!is_operational) - icon_state = base_icon_state - return ..() - - if(state_open) - icon_state = base_icon_state + "_open_active" - return ..() - - if(panel_open) - icon_state = base_icon_state + "_panel" - return ..() - - icon_state = base_icon_state + "_closed" - if(occupant) - icon_state += "_active" - - return ..() - -/obj/machinery/netpod/mouse_drop_receive(mob/target, mob/user, params) - var/mob/living/carbon/player = user - - if(!iscarbon(player) || !is_operational || !state_open || player.buckled) - return - - close_machine(target) - -/obj/machinery/netpod/crowbar_act(mob/living/user, obj/item/tool) - if(user.combat_mode) - attack_hand(user) - return ITEM_INTERACT_SUCCESS - - if(default_pry_open(tool, user) || default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/netpod/screwdriver_act(mob/living/user, obj/item/tool) - if(occupant) - balloon_alert(user, "in use!") - return ITEM_INTERACT_SUCCESS - - if(state_open) - balloon_alert(user, "close first.") - return ITEM_INTERACT_SUCCESS - - if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", "[base_icon_state]_closed", tool)) - update_appearance() // sometimes icon doesnt properly update during flick() - ui_close(user) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/netpod/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(!state_open && user == occupant) - container_resist_act(user) - -/obj/machinery/netpod/Exited(atom/movable/gone, direction) - . = ..() - if(!state_open && gone == occupant) - container_resist_act(gone) - -/obj/machinery/netpod/relaymove(mob/living/user, direction) - if(!state_open) - container_resist_act(user) - -/obj/machinery/netpod/container_resist_act(mob/living/user) - user.visible_message(span_notice("[occupant] emerges from [src]!"), - span_notice("You climb out of [src]!"), - span_notice("With a hiss, you hear a machine opening.")) - open_machine() - -/obj/machinery/netpod/open_machine(drop = TRUE, density_to_set = FALSE) - playsound(src, 'sound/machines/tramopen.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_opening", src) - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_OPENED) - update_use_power(IDLE_POWER_USE) - - return ..() - -/obj/machinery/netpod/close_machine(mob/user, density_to_set = TRUE) - if(!state_open || panel_open || !is_operational || !iscarbon(user)) - return - - playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_closing", src) - ..() - - enter_matrix() - -/obj/machinery/netpod/default_pry_open(obj/item/crowbar, mob/living/pryer) - if(isnull(occupant) || !iscarbon(occupant)) - if(!state_open) - if(panel_open) - return FALSE - open_machine() - else - shut_pod() - - return TRUE - - pryer.visible_message( - span_danger("[pryer] starts prying open [src]!"), - span_notice("You start to pry open [src]."), - span_notice("You hear loud prying on metal.") - ) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - - SEND_SIGNAL(src, COMSIG_BITRUNNER_CROWBAR_ALERT, pryer) - - if(do_after(pryer, 15 SECONDS, src)) - if(!state_open) - sever_connection() - open_machine() - - return TRUE - -/obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) - if(!is_operational || occupant) - return - - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NetpodOutfits") - ui.set_autoupdate(FALSE) - ui.open() - -/obj/machinery/netpod/ui_data() - var/list/data = list() - - data["netsuit"] = netsuit - return data - -/obj/machinery/netpod/ui_static_data() - var/list/data = list() - - if(!length(cached_outfits)) - cached_outfits += make_outfit_collection("Jobs", subtypesof(/datum/outfit/job)) - - data["collections"] = cached_outfits - - return data - -/obj/machinery/netpod/ui_act(action, params) - . = ..() - if(.) - return TRUE - switch(action) - if("select_outfit") - var/datum/outfit/new_suit = resolve_outfit(params["outfit"]) - if(new_suit) - netsuit = new_suit - return TRUE - - return FALSE - -/obj/machinery/netpod/attack_ghost(mob/dead/observer/our_observer) - var/our_target = avatar_ref?.resolve() - if(isnull(our_target) || !our_observer.orbit(our_target)) - return ..() - -/// Puts the occupant in netpod stasis, basically short-circuiting environmental conditions -/obj/machinery/netpod/proc/add_healing(mob/living/target) - if(target != occupant) - return - - target.AddComponent(/datum/component/netpod_healing, pod = src) - target.playsound_local(src, 'sound/effects/submerge.ogg', 20, vary = TRUE) - target.extinguish_mob() - update_use_power(ACTIVE_POWER_USE) - -/// Disconnects the occupant after a certain time so they aren't just hibernating in netpod stasis. A balance change -/obj/machinery/netpod/proc/auto_disconnect() - if(isnull(occupant) || state_open || connected) - return - - var/mob/player = occupant - player.playsound_local(src, 'sound/effects/splash.ogg', 60, TRUE) - to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) - open_machine() - -/// Handles occupant post-disconnection effects like damage, sounds, etc -/obj/machinery/netpod/proc/disconnect_occupant(cause_damage = FALSE) - connected = FALSE - - var/mob/living/mob_occupant = occupant - if(isnull(occupant) || mob_occupant.stat == DEAD) - open_machine() - return - - mob_occupant.playsound_local(src, 'sound/magic/blink.ogg', 25, TRUE) - mob_occupant.set_static_vision(2 SECONDS) - mob_occupant.set_temp_blindness(1 SECONDS) - mob_occupant.Paralyze(2 SECONDS) - - if(!is_operational) - open_machine() - return - - var/heal_time = 1 - if(mob_occupant.health < mob_occupant.maxHealth) - heal_time = (mob_occupant.stat + 2) * 5 - addtimer(CALLBACK(src, PROC_REF(auto_disconnect)), heal_time SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) - - if(!cause_damage) - return - - mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) - mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) - INVOKE_ASYNC(mob_occupant, TYPE_PROC_REF(/mob/living, emote), "scream") - to_chat(mob_occupant, span_danger("You've been forcefully disconnected from your avatar! Your thoughts feel scrambled!")) - -/** - * ### Enter Matrix - * Finds any current avatars from this chair - or generates a new one - * - * New avatars cost 1 attempt, and this will eject if there's none left - * - * Connects the mind to the avatar if everything is ok - */ -/obj/machinery/netpod/proc/enter_matrix() - var/mob/living/carbon/human/neo = occupant - if(!ishuman(neo) || neo.stat == DEAD || isnull(neo.mind)) - balloon_alert(neo, "invalid occupant.") - return - - var/obj/machinery/quantum_server/server = find_server() - if(isnull(server)) - balloon_alert(neo, "no server connected!") - return - - var/datum/lazy_template/virtual_domain/generated_domain = server.generated_domain - if(isnull(generated_domain) || !server.is_ready) - balloon_alert(neo, "nothing loaded!") - return - - var/mob/living/carbon/current_avatar = avatar_ref?.resolve() - if(isnull(current_avatar) || current_avatar.stat != CONSCIOUS) // We need a viable avatar - var/obj/structure/hololadder/wayout = server.generate_hololadder() - if(isnull(wayout)) - balloon_alert(neo, "out of bandwidth!") - return - current_avatar = server.generate_avatar(wayout, netsuit) - avatar_ref = WEAKREF(current_avatar) - server.stock_gear(current_avatar, neo, generated_domain) - - neo.set_static_vision(3 SECONDS) - add_healing(occupant) - - if(!validate_entry(neo, current_avatar)) - open_machine() - return - - current_avatar.AddComponent( \ - /datum/component/avatar_connection, \ - old_mind = neo.mind, \ - old_body = neo, \ - server = server, \ - pod = src, \ - help_text = generated_domain.help_text, \ - ) - - connected = TRUE - -/// Finds a server and sets the server_ref -/obj/machinery/netpod/proc/find_server() - var/obj/machinery/quantum_server/server = server_ref?.resolve() - if(server) - return server - - server = locate(/obj/machinery/quantum_server) in oview(4, src) - if(isnull(server)) - return - - server_ref = WEAKREF(server) - RegisterSignal(server, COMSIG_MACHINERY_REFRESH_PARTS, PROC_REF(on_server_upgraded)) - RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_COMPLETE, PROC_REF(on_domain_complete)) - RegisterSignal(server, COMSIG_BITRUNNER_DOMAIN_SCRUBBED, PROC_REF(on_domain_scrubbed)) - - return server - -/// Creates a list of outfit entries for the UI. -/obj/machinery/netpod/proc/make_outfit_collection(identifier, list/outfit_list) - var/list/collection = list( - "name" = identifier, - "outfits" = list() - ) - - for(var/datum/outfit/outfit as anything in outfit_list) - var/outfit_name = initial(outfit.name) - if(findtext(outfit_name, "(") != 0 || findtext(outfit_name, "-") != 0) // No special variants please - continue - - collection["outfits"] += list(list("path" = outfit, "name" = outfit_name)) - - return list(collection) - -/// Machine has been broken - handles signals and reverting sprites -/obj/machinery/netpod/proc/on_broken(datum/source) - SIGNAL_HANDLER - - sever_connection() - -/// Checks the integrity, alerts occupants -/obj/machinery/netpod/proc/on_damage_taken(datum/source, damage_amount) - SIGNAL_HANDLER - - if(isnull(occupant) || !connected) - return - - var/total = max_integrity - damage_amount - var/integrity = (atom_integrity / total) * 100 - if(integrity > 50) - return - - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_INTEGRITY) - -/// Puts points on the current occupant's card account -/obj/machinery/netpod/proc/on_domain_complete(datum/source, atom/movable/crate, reward_points) - SIGNAL_HANDLER - - if(isnull(occupant) || !connected) - return - - var/mob/living/player = occupant - - var/datum/bank_account/account = player.get_bank_account() - if(isnull(account)) - return - - account.bitrunning_points += reward_points * 100 - -/// The domain has been fully purged, so we should double check our avatar is deleted -/obj/machinery/netpod/proc/on_domain_scrubbed(datum/source) - SIGNAL_HANDLER - - var/mob/avatar = avatar_ref?.resolve() - if(isnull(avatar)) - return - - QDEL_NULL(avatar) - -/// Boots out anyone in the machine && opens it -/obj/machinery/netpod/proc/on_power_loss(datum/source) - SIGNAL_HANDLER - - if(state_open) - return - - if(isnull(occupant) || !connected) - connected = FALSE - open_machine() - return - - sever_connection() - -/// When the server is upgraded, drops brain damage a little -/obj/machinery/netpod/proc/on_server_upgraded(obj/machinery/quantum_server/source) - SIGNAL_HANDLER - - disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - source.servo_bonus) - -/// Resolves a path to an outfit. -/obj/machinery/netpod/proc/resolve_outfit(text) - var/path = text2path(text) - if(!ispath(path, /datum/outfit)) - return - - for(var/wardrobe in cached_outfits) - for(var/outfit in wardrobe["outfits"]) - if(path == outfit["path"]) - return path - - message_admins("[usr]:[usr.ckey] attempted to select an unavailable outfit from a netpod") - return - -/// Severs the connection with the current avatar -/obj/machinery/netpod/proc/sever_connection() - if(isnull(occupant) || !connected) - return - - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_SEVER) - -/// Closes the machine without shoving in an occupant -/obj/machinery/netpod/proc/shut_pod() - state_open = FALSE - playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_closing", src) - set_density(TRUE) - - update_appearance() - -/// Checks for cases to eject/fail connecting an avatar -/obj/machinery/netpod/proc/validate_entry(mob/living/neo, mob/living/avatar) - if(!do_after(neo, 2 SECONDS, src)) - return FALSE - - // Very invalid - if(QDELETED(neo) || QDELETED(avatar) || QDELETED(src) || !is_operational) - return FALSE - - // Invalid - if(occupant != neo || isnull(neo.mind) || neo.stat > SOFT_CRIT || avatar.stat == DEAD) - return FALSE - - return TRUE - -#undef BASE_DISCONNECT_DAMAGE diff --git a/code/modules/bitrunning/outfits.dm b/code/modules/bitrunning/outfits.dm index 41a65b228ff..c0bb01ebc06 100644 --- a/code/modules/bitrunning/outfits.dm +++ b/code/modules/bitrunning/outfits.dm @@ -10,12 +10,62 @@ suit = /obj/item/clothing/suit/jacket/trenchcoat id = /obj/item/card/id/advanced + /datum/outfit/echolocator/post_equip(mob/living/carbon/human/user, visualsOnly) . = ..() user.psykerize() + /datum/outfit/bitductor name = "Bitrunning Abductor" uniform = /obj/item/clothing/under/abductor gloves = /obj/item/clothing/gloves/fingerless shoes = /obj/item/clothing/shoes/jackboots + + +/datum/outfit/beachbum_combat + name = "Beachbum: Island Combat" + id = /obj/item/card/id/advanced + l_pocket = null + r_pocket = null + shoes = /obj/item/clothing/shoes/sandal + uniform = /obj/item/clothing/under/pants/jeans + /// Available ranged weapons + var/list/ranged_weaps = list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/rifle/boltaction, + /obj/item/gun/ballistic/automatic/mini_uzi, + /obj/item/gun/ballistic/automatic/pistol/deagle, + /obj/item/gun/ballistic/rocketlauncher/unrestricted, + /obj/item/gun/ballistic/automatic/ar, + + ) + /// Corresponding ammo + var/list/corresponding_ammo = list( + /obj/item/ammo_box/magazine/m9mm, + /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/magazine/uzim9mm, + /obj/item/ammo_box/magazine/m50, + /obj/item/food/pizzaslice/dank, // more silly, less destructive + /obj/item/ammo_box/magazine/m223, + ) + + +/datum/outfit/beachbum_combat/post_equip(mob/living/carbon/human/bum, visualsOnly) + . = ..() + + var/choice = rand(1, length(ranged_weaps)) + var/weapon = ranged_weaps[choice] + bum.put_in_active_hand(new weapon) + + var/ammo = corresponding_ammo[choice] + var/obj/item/ammo1 = new ammo + var/obj/item/ammo2 = new ammo + + if(!bum.equip_to_slot_if_possible(new ammo, ITEM_SLOT_LPOCKET)) + ammo1.forceMove(get_turf(bum)) + if(!bum.equip_to_slot_if_possible(new ammo, ITEM_SLOT_RPOCKET)) + ammo2.forceMove(get_turf(bum)) + + if(prob(50)) + bum.equip_to_slot_if_possible(new /obj/item/clothing/glasses/sunglasses, ITEM_SLOT_EYES) diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 8a8d2eed913..541d36ad5d7 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -77,12 +77,18 @@ . += span_infoplain("Can be resource intensive to run. Ensure adequate power supply.") + var/upgraded = FALSE if(capacitor_coefficient < 1) . += span_infoplain("- Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.") + upgraded = TRUE if(servo_bonus > 0.2) . += span_infoplain("- Its manipulation potential is increasing rewards by [servo_bonus]x.") . += span_infoplain("- Injury from unsafe ejection reduced [servo_bonus * 100]%.") + upgraded = TRUE + + if(!upgraded) + . += span_notice("Its output is suboptimal. Improved components will grant domain information, reduce cooldowns and increase rewards.") if(!is_ready) . += span_notice("It is currently cooling down. Give it a few moments.") diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index 83d26daa607..0e6ff30cd24 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -4,6 +4,7 @@ #define GRADE_A "A" #define GRADE_S "S" + /// Handles calculating rewards based on number of players, parts, threats, etc /obj/machinery/quantum_server/proc/calculate_rewards() var/rewards_base = 0.8 @@ -20,6 +21,7 @@ return rewards_base + /// Handles spawning the (new) crate and deleting the former /obj/machinery/quantum_server/proc/generate_loot(obj/cache, obj/machinery/byteforge/chosen_forge) SSblackbox.record_feedback("tally", "bitrunning_domain_primary_completed", 1, generated_domain.key) @@ -55,6 +57,8 @@ chosen_forge.start_to_spawn(reward_cache) return TRUE + +/// Builds secondary loot if the achievements were met /obj/machinery/quantum_server/proc/generate_secondary_loot(obj/curiosity, obj/machinery/byteforge/chosen_forge) SSblackbox.record_feedback("tally", "bitrunning_domain_secondary_completed", 1, generated_domain.key) spark_at_location(curiosity) // abracadabra! @@ -65,6 +69,7 @@ chosen_forge.start_to_spawn(reward_curiosity) return TRUE + /// Returns the markdown text containing domain completion information /obj/machinery/quantum_server/proc/get_completion_certificate(time_difference, grade) var/base_points = generated_domain.reward_points @@ -126,6 +131,7 @@ return generated_domain.difficulty >= BITRUNNER_DIFFICULTY_MEDIUM && (grade in passing_grades) + /// Grades the player's run based on several factors /obj/machinery/quantum_server/proc/grade_completion(completion_time) var/score = length(spawned_threat_refs) * 5 diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index 5bfa7813910..f98332f7e8d 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -24,6 +24,7 @@ reset() + /// Links all the loading processes together - does validation for booting a map /obj/machinery/quantum_server/proc/cold_boot_map(map_key) if(!is_ready) @@ -69,8 +70,15 @@ if(broadcasting) start_broadcasting_network(BITRUNNER_CAMERA_NET) + if(generated_domain.announce_to_ghosts) + notify_ghosts("Bitrunners have loaded a domain that offers ghost interactions. Check the spawners menu for more information.", + src, + "Matrix Glitch", + ) + return TRUE + /// Initializes a new domain if the given key is valid and the user has enough points /obj/machinery/quantum_server/proc/load_domain(map_key) for(var/datum/lazy_template/virtual_domain/available in SSbitrunning.all_domains) @@ -82,6 +90,7 @@ return FALSE + /// Loads in necessary map items like hololadder spawns, caches, etc /obj/machinery/quantum_server/proc/load_map_items() var/turf/goal_turfs = list() @@ -116,6 +125,15 @@ var/turf/signaler_turf = get_turf(thing) signaler_turf.AddComponent(/datum/component/bitrunning_points, generated_domain) qdel(thing) + continue + + if(istype(thing, /obj/effect/landmark/bitrunning/permanent_exit)) + var/turf/tile = get_turf(thing) + exit_turfs += tile + qdel(thing) + + new /obj/structure/hololadder(tile) + if(!length(exit_turfs)) CRASH("Failed to find exit turfs on generated domain.") @@ -134,6 +152,7 @@ return TRUE + /// Stops the current virtual domain and disconnects all users /obj/machinery/quantum_server/proc/reset(fast = FALSE) is_ready = FALSE @@ -155,6 +174,7 @@ stop_broadcasting_network(BITRUNNER_CAMERA_NET) + /// Tries to clean up everything in the domain /obj/machinery/quantum_server/proc/scrub_vdom() sever_connections() /// just in case someone's connected diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 34a870a3426..dabac8ae62d 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -15,6 +15,7 @@ new /obj/structure/closet/crate/secure/bitrunning/encrypted(chosen_turf) return TRUE + /// Attempts to spawn a lootbox /obj/machinery/quantum_server/proc/attempt_spawn_curiosity(list/possible_turfs) if(!length(possible_turfs)) // Out of turfs to place a curiosity @@ -35,9 +36,10 @@ new /obj/item/storage/lockbox/bitrunning/encrypted(chosen_turf) return chosen_turf + /// Generates a new avatar for the bitrunner. -/obj/machinery/quantum_server/proc/generate_avatar(obj/structure/hololadder/wayout, datum/outfit/netsuit) - var/mob/living/carbon/human/avatar = new(wayout.loc) +/obj/machinery/quantum_server/proc/generate_avatar(turf/destination, datum/outfit/netsuit) + var/mob/living/carbon/human/avatar = new(destination) var/outfit_path = generated_domain.forced_outfit || netsuit var/datum/outfit/to_wear = new outfit_path() @@ -61,8 +63,9 @@ if(istype(hat)) hat.set_armor(/datum/armor/none) - for(var/obj/thing in avatar.held_items) - qdel(thing) + if(!generated_domain.forced_outfit) + for(var/obj/thing in avatar.held_items) + qdel(thing) var/obj/item/storage/backpack/bag = avatar.back if(istype(bag)) @@ -88,32 +91,9 @@ network = BITRUNNER_CAMERA_NET, \ emp_proof = TRUE, \ ) + return avatar -/// Generates a new hololadder for the bitrunner. Effectively a respawn attempt. -/obj/machinery/quantum_server/proc/generate_hololadder() - if(!length(exit_turfs)) - return - - if(retries_spent >= length(exit_turfs)) - return - - var/turf/destination - for(var/turf/dest_turf in exit_turfs) - if(!locate(/obj/structure/hololadder) in dest_turf) - destination = dest_turf - break - - if(isnull(destination)) - return - - var/obj/structure/hololadder/wayout = new(destination, src) - if(isnull(wayout)) - return - - retries_spent += 1 - - return wayout /// Loads in any mob segments of the map /obj/machinery/quantum_server/proc/load_mob_segments() @@ -142,6 +122,7 @@ return TRUE + /// Scans over neo's contents for bitrunning tech disks. Loads the items or abilities onto the avatar. /obj/machinery/quantum_server/proc/stock_gear(mob/living/carbon/human/avatar, mob/living/carbon/human/neo, datum/lazy_template/virtual_domain/generated_domain) var/domain_forbids_items = generated_domain.forbids_disk_items diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm index 0e5e949e8bb..f5d2840143e 100644 --- a/code/modules/bitrunning/server/signal_handlers.dm +++ b/code/modules/bitrunning/server/signal_handlers.dm @@ -4,12 +4,14 @@ sever_connections() + /// Whenever a corpse spawner makes a new corpse, add it to the list of potential mutations /obj/machinery/quantum_server/proc/on_corpse_spawned(datum/source, mob/living/corpse) SIGNAL_HANDLER mutation_candidate_refs.Add(WEAKREF(corpse)) + /// Being qdeleted - make sure the circuit and connected mobs go with it /obj/machinery/quantum_server/proc/on_delete(datum/source) SIGNAL_HANDLER @@ -26,6 +28,7 @@ if(circuit) qdel(circuit) + /// Whenever something enters the send tiles, check if it's a loot crate. If so, alert players. /obj/machinery/quantum_server/proc/on_goal_turf_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER @@ -51,6 +54,7 @@ generate_secondary_loot(arrived, chosen_forge, generated_domain) return + /// Handles examining the server. Shows cooldown time and efficiency. /obj/machinery/quantum_server/proc/on_goal_turf_examined(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER @@ -58,6 +62,7 @@ examine_text += span_info("Beneath your gaze, the floor pulses subtly with streams of encoded data.") examine_text += span_info("It seems to be part of the location designated for retrieving encrypted payloads.") + /// Scans over the inbound created_atoms from lazy templates /obj/machinery/quantum_server/proc/on_template_loaded(datum/lazy_template/source, list/created_atoms) SIGNAL_HANDLER @@ -98,6 +103,7 @@ /// Just in case there's any special handling for the domain generated_domain.setup_domain(created_atoms) + /// Handles when cybercops are summoned into the area or ghosts click a ghost role spawner /obj/machinery/quantum_server/proc/on_threat_created(datum/source, mob/living/threat) SIGNAL_HANDLER diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index 25a891c03b2..28d91aa4b37 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -4,6 +4,7 @@ SEND_SIGNAL(src, COMSIG_BITRUNNER_THREAT_CREATED) threat.AddComponent(/datum/component/virtual_entity, src) + /// Choses which antagonist role is spawned based on threat /obj/machinery/quantum_server/proc/get_antagonist_role() var/list/available = list() @@ -19,6 +20,7 @@ return chosen + /// Selects a target to mutate. Gives two attempts, then crashes if it fails. /obj/machinery/quantum_server/proc/get_mutation_target() var/datum/weakref/target_ref = pick(mutation_candidate_refs) @@ -35,6 +37,7 @@ resolved = target_ref.resolve() return resolved + /// Finds any mobs with minds in the zones and gives them the bad news /obj/machinery/quantum_server/proc/notify_spawned_threats() for(var/datum/weakref/baddie_ref as anything in spawned_threat_refs) @@ -52,10 +55,12 @@ to_chat(baddie, span_userdanger("You have been flagged for deletion! Thank you for your service.")) + /// Removes a specific threat - used when station spawning /obj/machinery/quantum_server/proc/remove_threat(mob/living/threat) spawned_threat_refs.Remove(WEAKREF(threat)) + /// Selects the role and waits for a ghost orbiter /obj/machinery/quantum_server/proc/setup_glitch(datum/antagonist/bitrunning_glitch/forced_role) if(!validate_mutation_candidates()) @@ -83,6 +88,7 @@ spawn_glitch(chosen_role, mutation_target, chosen_one) return mutation_target + /// Orbit poll has concluded - spawn the antag /obj/machinery/quantum_server/proc/spawn_glitch(datum/antagonist/bitrunning_glitch/chosen_role, mob/living/mutation_target, mob/dead/observer/ghost) if(QDELETED(mutation_target)) @@ -121,6 +127,7 @@ add_threats(new_mob) + /// Oh boy - transports the antag station side /obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge) antag.balloon_alert(antag, "scanning...") @@ -165,6 +172,7 @@ do_teleport(antag, get_turf(chosen_forge), forced = TRUE, asoundin = 'sound/magic/ethereal_enter.ogg', asoundout = 'sound/magic/ethereal_exit.ogg', channel = TELEPORT_CHANNEL_QUANTUM) + /// Removes any invalid candidates from the list /obj/machinery/quantum_server/proc/validate_mutation_candidates() for(var/datum/weakref/creature_ref as anything in mutation_candidate_refs) diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 6b5352bde6c..ab267a34cd3 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -1,11 +1,13 @@ #define MAX_DISTANCE 4 // How far crates can spawn from the server + /// Resets the cooldown state and updates icons /obj/machinery/quantum_server/proc/cool_off() is_ready = TRUE update_appearance() radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY) + /// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals /obj/machinery/quantum_server/proc/get_avatar_data() var/list/hosted_avatars = list() @@ -31,6 +33,49 @@ return hosted_avatars + +/// I grab the atom here so I can signal it / manipulate spawners etc +/obj/machinery/quantum_server/proc/get_avatar_destination() as /atom + // Branch A: Custom spawns + if(length(generated_domain.custom_spawns)) + var/atom/valid_spawner + + while(isnull(valid_spawner)) + var/atom/chosen = pick(generated_domain.custom_spawns) + if(QDELETED(chosen)) + generated_domain.custom_spawns -= chosen + continue + + valid_spawner = chosen + break + + return valid_spawner + + // Branch B: Hololadders + if(!length(exit_turfs)) + return + + if(retries_spent >= length(exit_turfs)) + return + + var/turf/exit_tile + for(var/turf/dest_turf in exit_turfs) + if(!locate(/obj/structure/hololadder) in dest_turf) + exit_tile = dest_turf + break + + if(isnull(exit_tile)) + return + + var/obj/structure/hololadder/wayout = new(exit_tile, src) + if(isnull(wayout)) + return + + retries_spent += 1 + + return wayout + + /// Locates any turfs with forges on them, returns a random one /obj/machinery/quantum_server/proc/get_random_nearby_forge() var/list/nearby_forges = list() @@ -40,6 +85,7 @@ return pick(nearby_forges) + /// Gets a random available domain given the current points. /obj/machinery/quantum_server/proc/get_random_domain_id() if(points < 1) @@ -85,6 +131,7 @@ SEND_SIGNAL(src, COMSIG_BITRUNNER_QSRV_SEVER) + /// Do some magic teleport sparks /obj/machinery/quantum_server/proc/spark_at_location(obj/cache) playsound(cache, 'sound/magic/blink.ogg', 50, vary = TRUE) @@ -92,16 +139,33 @@ sparks.set_up(5, location = get_turf(cache)) sparks.start() -/// Returns a turf if it's not dense, else will find a neighbor. -/obj/machinery/quantum_server/proc/validate_turf(turf/chosen_turf) - if(!chosen_turf.is_blocked_turf()) - return chosen_turf - for(var/turf/tile in get_adjacent_open_turfs(chosen_turf)) - if(!tile.is_blocked_turf()) - return chosen_turf +/// Starts building a new avatar for the player. +/// Called by netpods when they don't have a current avatar. +/// This is a procedural proc which links several others together. +/obj/machinery/quantum_server/proc/start_new_connection(mob/living/carbon/human/neo, datum/outfit/netsuit) as /mob/living/carbon/human + var/atom/entry_atom = get_avatar_destination() + if(isnull(entry_atom)) + return + + var/mob/living/carbon/new_avatar = generate_avatar(get_turf(entry_atom), netsuit) + stock_gear(new_avatar, neo, generated_domain) + + // Cleanup for domains with one time use custom spawns + if(!length(generated_domain.custom_spawns)) + return new_avatar + + // If we're spawning from some other fuckery, no need for this + if(istype(entry_atom, /obj/effect/mob_spawn/ghost_role/human/virtual_domain)) + var/obj/effect/mob_spawn/ghost_role/human/virtual_domain/spawner = entry_atom + spawner.artificial_spawn(new_avatar) + + if(!generated_domain.keep_custom_spawns) + generated_domain.custom_spawns -= entry_atom + qdel(entry_atom) + + return new_avatar -#undef MAX_DISTANCE /// Toggles broadcast on and off /obj/machinery/quantum_server/proc/toggle_broadcast() @@ -116,3 +180,16 @@ // And we only flip TVs when there's a domain, because otherwise there's no cams to watch set_network_broadcast_status(BITRUNNER_CAMERA_NET, broadcasting) return TRUE + + +/// Returns a turf if it's not dense, else will find a neighbor. +/obj/machinery/quantum_server/proc/validate_turf(turf/chosen_turf) + if(!chosen_turf.is_blocked_turf()) + return chosen_turf + + for(var/turf/tile in get_adjacent_open_turfs(chosen_turf)) + if(!tile.is_blocked_turf()) + return chosen_turf + + +#undef MAX_DISTANCE diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 5fa889ac655..4b5f79a43b1 100644 --- a/code/modules/bitrunning/spawners.dm +++ b/code/modules/bitrunning/spawners.dm @@ -3,12 +3,9 @@ prompt_name = "a virtual domain debug entity" flavour_text = "You probably shouldn't be seeing this, contact a coder!" you_are_text = "You are NOT supposed to be here. How did you let this happen?" - important_text = "You must eliminate any bitrunners from the domain." + important_text = "Bitrunning is a crime, and your primary threat." temp_body = TRUE -/obj/effect/mob_spawn/ghost_role/human/virtual_domain/Initialize(mapload) - . = ..() - notify_ghosts("The [name] has been created. The virtual world calls for aid!", src, "Virtual Insanity!") /obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor) var/datum/mind/ghost_mind = mob_possessor.mind @@ -19,6 +16,12 @@ spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor) + +/// Simulates a ghost role spawn without calling special(), ie a bitrunner spawn instead of a ghost. +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn(mob/living/runner) + SEND_SIGNAL(src, COMSIG_BITRUNNER_SPAWNED, runner) + + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate name = "Virtual Pirate Remains" desc = "Some inanimate bones. They feel like they could spring to life at any moment!" @@ -27,22 +30,25 @@ icon_state = "remains" prompt_name = "a virtual skeleton pirate" you_are_text = "You are a virtual pirate. Yarrr!" - flavour_text = "You have awoken, without instruction. There's a LANDLUBBER after yer booty. Stop them!" + flavour_text = " There's a LANDLUBBER after yer booty. Stop them!" + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.fully_replace_character_name(spawned_mob.real_name, "[pick(strings(PIRATE_NAMES_FILE, "generic_beginnings"))][pick(strings(PIRATE_NAMES_FILE, "generic_endings"))]") + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie name = "Virtual Syndicate Sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper_s" prompt_name = "a virtual syndicate operative" you_are_text = "You are a virtual syndicate operative." - flavour_text = "You have awoken, without instruction. Alarms blare! We are being boarded!" + flavour_text = "Alarms blare! We are being boarded!" outfit = /datum/outfit/virtual_syndicate spawner_job_path = /datum/job/space_syndicate + /datum/outfit/virtual_syndicate name = "Virtual Syndie" id = /obj/item/card/id/advanced/chameleon @@ -53,5 +59,6 @@ shoes = /obj/item/clothing/shoes/combat implants = list(/obj/item/implant/weapons_auth) + /datum/outfit/virtual_syndicate/post_equip(mob/living/carbon/human/user, visualsOnly) user.faction |= ROLE_SYNDICATE diff --git a/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm b/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm new file mode 100644 index 00000000000..b745a4746aa --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm @@ -0,0 +1,46 @@ +/datum/lazy_template/virtual_domain/island_brawl + name = "Island Brawl" + announce_to_ghosts = TRUE + cost = BITRUNNER_COST_HIGH + desc = "A 'peaceful' island tucked away in the middle of nowhere. This map will auto-complete after a number of deaths have occurred." + difficulty = BITRUNNER_DIFFICULTY_HIGH + forced_outfit = /datum/outfit/beachbum_combat + help_text = "There may be bounties laid out across the island, but the primary objective is to survive. Deaths on the island will count towards the final score." + key = "island_brawl" + map_name = "island_brawl" + reward_points = BITRUNNER_REWARD_HIGH + secondary_loot = list( + /obj/item/toy/beach_ball = 2, + /obj/item/clothing/shoes/sandal = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/gun/ballistic/automatic/mini_uzi = 1, + ) + + +/datum/lazy_template/virtual_domain/island_brawl/setup_domain(list/created_atoms) + for(var/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander/spawner in created_atoms) + custom_spawns += spawner + + RegisterSignals(spawner, list(COMSIG_GHOSTROLE_SPAWNED, COMSIG_BITRUNNER_SPAWNED), PROC_REF(on_spawn)) + + +/// Someone has spawned in, so we check for their death +/datum/lazy_template/virtual_domain/island_brawl/proc/on_spawn(datum/source, mob/living/spawned_mob) + SIGNAL_HANDLER + + RegisterSignals(spawned_mob, list(COMSIG_LIVING_DEATH), PROC_REF(on_death)) + + +/// Mob has died, so we add a point to the domain +/datum/lazy_template/virtual_domain/island_brawl/proc/on_death(datum/source, gibbed) + SIGNAL_HANDLER + + add_points(1) + + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander + name = "Islander" + outfit = /datum/outfit/beachbum_combat + prompt_name = "a combat beach bum" + you_are_text = "You are a virtual islander." + flavour_text = "Don't let anyone ruin your idyllic vacation spot. Coordinate with others- or don't!" diff --git a/code/modules/bitrunning/virtual_domain/domains/pirates.dm b/code/modules/bitrunning/virtual_domain/domains/pirates.dm index 52d86a71211..b8bff6dbeb3 100644 --- a/code/modules/bitrunning/virtual_domain/domains/pirates.dm +++ b/code/modules/bitrunning/virtual_domain/domains/pirates.dm @@ -1,5 +1,6 @@ /datum/lazy_template/virtual_domain/pirates name = "Corsair Cove" + announce_to_ghosts = TRUE cost = BITRUNNER_COST_MEDIUM desc = "Battle your way to the hidden treasure, seize the booty, and make a swift escape before the pirates turn the tide." difficulty = BITRUNNER_DIFFICULTY_MEDIUM diff --git a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm index 5f754dd433a..f81bc6daae2 100644 --- a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm +++ b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm @@ -1,5 +1,6 @@ /datum/lazy_template/virtual_domain/syndicate_assault name = "Syndicate Assault" + announce_to_ghosts = TRUE cost = BITRUNNER_COST_MEDIUM desc = "Board the enemy ship and recover the stolen cargo." difficulty = BITRUNNER_DIFFICULTY_MEDIUM diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index 21898daad72..f81f6186cbe 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -7,50 +7,82 @@ map_name = "None" key = "Virtual Domain" place_on_top = TRUE - - /// Cost of this map to load - var/cost = BITRUNNER_COST_NONE - /// Any outfit that you wish to force on avatars. Overrides preferences - var/datum/outfit/forced_outfit - /// The description of the map for the console UI - var/desc = "A map." - /// Affects the ui and ability to scan info. - var/difficulty = BITRUNNER_DIFFICULTY_NONE + /// Whether to tell observers this map is being used + var/announce_to_ghosts = FALSE /// The map file to load var/filename = "virtual_domain.dmm" - /// If this domain blocks the use of items from disks, for whatever reason - var/forbids_disk_items = FALSE - /// If this domain blocks the use of spells from disks, for whatever reason - var/forbids_disk_spells = FALSE - /// Information given to connected clients via ability - var/help_text - /// Whether to display this as a modular map - var/is_modular = FALSE - /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. - var/list/datum/modular_mob_segment/mob_modules = list() - /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount - var/list/completion_loot - /// An accoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. - var/list/secondary_loot = list() - /// Number of secondary loot boxes generated. Resets when the domain is reloaded. - var/secondary_loot_generated - /// Forces all mob modules to only load once - var/modular_unique_mobs = FALSE - // Name to show in the UI - var/name = "Virtual Domain" - /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. - var/reward_points = BITRUNNER_REWARD_MIN /// The start time of the map. Used to calculate time taken var/start_time /// This map is specifically for unit tests. Shouldn't display in game var/test_only = FALSE + + /** + * Generic settings / UI + */ + + /// Cost of this map to load + var/cost = BITRUNNER_COST_NONE + /// The description of the map for the console UI + var/desc = "A map." + /// Affects the ui and ability to scan info. + var/difficulty = BITRUNNER_DIFFICULTY_NONE + /// Write these to help complete puzzles and other objectives. Viewed in the domain info ability. + var/help_text + // Name to show in the UI + var/name = "Virtual Domain" + /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. + var/reward_points = BITRUNNER_REWARD_MIN + + /** + * Player customization + */ + + /// If this domain blocks the use of items from disks, for whatever reason + var/forbids_disk_items = FALSE + /// If this domain blocks the use of spells from disks, for whatever reason + var/forbids_disk_spells = FALSE + /// Any outfit that you wish to force on avatars. Overrides preferences + var/datum/outfit/forced_outfit + + /** + * Loot + */ + + /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount + var/list/completion_loot + /// An assoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. + var/list/secondary_loot = list() + /// Number of secondary loot boxes generated. Resets when the domain is reloaded. + var/secondary_loot_generated /// Has this domain been beaten with high enough score to spawn a tech disk? var/disk_reward_spawned = FALSE + /** + * Modularity + */ + + /// Whether to display this as a modular map + var/is_modular = FALSE + /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. + var/list/datum/modular_mob_segment/mob_modules = list() + /// Forces all mob modules to only load once + var/modular_unique_mobs = FALSE + + /** + * Spawning + */ + + /// Looks for random landmarks to spawn on. + var/list/custom_spawns = list() + /// Set TRUE if you want reusable custom spawners + var/keep_custom_spawns = FALSE + + /// Sends a point to any loot signals on the map /datum/lazy_template/virtual_domain/proc/add_points(points_to_add) SEND_SIGNAL(src, COMSIG_BITRUNNER_GOAL_POINT, points_to_add) + /// Overridable proc to be called after the map is loaded. /datum/lazy_template/virtual_domain/proc/setup_domain(list/created_atoms) return diff --git a/icons/effects/bitrunning.dmi b/icons/effects/bitrunning.dmi index 8efa429389c3a50521ec4f2c366279a3505cf993..9a2e9c0228a5791d81f0fd976d272eca335b7654 100644 GIT binary patch delta 2562 zcmV+d3jOuy7sMHmBmu9nC2s+OPt6a)DBd#O!yp$0dTb8k*&7L$@)y>D7l z9U6QA>!caUmaOsuqpM_Igs@y-BtQAz;$m00~A+S{HJO5w}#s%r9#&R7E9W zlu?v1uu;`f4#J$>AD5N%z4)$eLJNP2-lsZWXJuAQ^ON4&EHEb|_tCT396JYthB5A* z!0HZe@~4@Sx~-nyc>v@|b}-q)SI__e2>D4wK~#90?VE>t6h#=u=Q267ktirA0Tn?+ zLey?6aX{HE>BmMMQ^6T{<^ z_qekA<>vkEH{Z_gEPDw3FH|tBG{tlK*JLy%tu)0!n2Ns%CBs+|F4WYf9i)|VyjaZs z65a>|jc&x=*_#wDf^hsb3`0|ODFSJw94Ft+{1T?_SiG<|8Gx=V#{Pv?ju2fYZ%(+9 zS=Dp1Vv!TbD`f!sfiKJ3qXU0H1&24r0mzfK??f43W<{>FKMIqs1Sm$#(718qp#2?2*u+Ha?b5vu)x$ z{{%o30|6++0SH%Q&6Whfe)}H)IuJBx&Ovh;=QbWZZ`L6bo2Rujwc5ma|0gpL8*0I_ zu68=xXtFo5B>{hM=wYD4K}Ud&1cQ0=W*ybk+;p_tY7=MvwaE;`4mMy}U&jGRf3PJ1 zFn_^<1;>Dn1s!*MK}^0~q3n4}ysd$cMWE+2;DtQY`WK!ucnibTa4^ z(4s|)8fUe&wY8ku(tH|k-xTNjUor#I0iPWIj@%|L$9IYw$6sEO4;7C>+L_sY~PFM(lYUr$c|OL_fm z@AWT2UI2d&nQ~}o-?Ko_MLna13Bc0>n6}Ua;PVaiH2?%b*@7uUrnpbd)c{^@0FN1{ z0mMV~eV;S*48S7|z#|`kuLkfrfF^@r@B2zZ3jor97Qoj4PM@A*c6Kvx7M4iKmTymo+412TUA_4gqL4=q5u9>8x01RX%T7JxtW z043!gK=TB^*Jr5Yl~nC>09BkcfJg%>gA$mR;GqU+ryHOKAPDL>??W{qHP-+@hRA*d zui5g5ImwY4AkYE?Z2OfpKyt^rQ3cRW0o1!82T-P%ZND0Tk0a^~>37o*KtB#>;_&bc z0G@vifE{YoBOR?_ayU@LJqn;6%E>UTYu^aq(fsHDJS_k_+N%!*Rsg>4aLb>10NwdO zF90Atfcc!y)1J}z`nZj9o^pXij(#(oTM@0o0RIcE;3a06sbA z^GpD`@9U@kh<#l%yJgc$%}J*TAmC4h0uG=&t@dpI0xdwGIc=wtN5jmBPFvIfffgVz z1Mumi8o&=UlUFhQR!>~S6$mu|o58B$hyo}lrzHabnYfkc1Wsu{_|yRHWPYrqL~3S7lIL=*{Z+p^ZBiM=2S9_ zqy|}BP1jv1hER|X0Obbo^w*N@01Qz*pZ;okei@oJ%`N*}8^}p%KdRpW2Bx+H8c<*8 zB7-(mfF(?P$@UfwFY&&<03Ay^FTQ`|QcV3XBjN!^D3dS5}av zm7)Y`!XpBgb_!igq=dc1PFQvaP#Wb zCm0NMOTE(IS89+q9U|hNfWCN5a!ukVX(*L*N+cCalMG}CDcRNLK=^mH`(B4yk zJ8Az{KzCJFRlDv+E9EXgA_sr2T>ses$=RVLKK z0O0;|c@_1C^gqzm^{?&(ZSNs<$!ietvwEtBAet0j{ zdILOCt~|>8Ve=n*Jl3ojiOm4%f!IC+mCEubn15FnelpcG%J}_3uL6HS{_$Phf6bbw zo=&yxPIsfVjuw4 z_taVfJYTK8fL^5j82s0+eJSo=lgxniUBz|)7?a@_W3v4(WAIPd-JTf&Y7-$NbYZU`t>RfWILAUw(zY z{$^cw_r>9Qb_Sl>3$jkja{=IQ!T-CZPzo=Bf9Lm66Lb!e8V6RgCMLN6egOX;fBG3d z{qk#f_iwmUCdl#o0&9TZA^(4LkWZbR-QC@P#>RoHmV0#^0O7x2{P~-H{O3a;=&)=5 YUx~aG+hhoDIRF3v07*qoM6N<$f?xW~BmuIqC2s)(z`($>lmSEmf3lKgcK`qY0d!JMQvg8b*k%9#0JeHm zSad{Xb7OL8aCB*JZU6vyoQ;sn3c@fDMc2t!gmzm>>to@@P@crkz0AKqe~w zy{QFVsMO7H?&UB86N{oc)Qu>QHNS!*ZAY;en>6F>rj^GK)+^2sbdP=xG?GtdUBATU1GQfc8RvTsGRb_+8tD7L2@4b-GRRB%9_Z zy|+0~gu3&KX9s&e5%dF$KiybVP5J!!14DXg#T>Qdi2wiyB1uF+RCt{2n~8hWL>R_r zJ6)SX6|hBGR4ige)Pg`kk*dW55!-qqe|Qv&B3|H?WY>qbc;c$K3Zm$Gu--QowH^rG zin8AKee3_>H%GF`rgJoDw>&<5m+o%zk$HbJ^JS7R6omd4iYa!g;*tGJdTGqFQxykc zD*oZ9FpLG^SV?Kn!L!pFkH>pI2=4-dMt5PK?86g|gRuYI4MS690RqoXZ=4+4f9pY* zx?|^!eRu)r&baT7Yh^g1+vLM=cQUJTZWfPo0`E>Q0R6(Zz5S5^pqRlM;{fD`wr}J| zfSJX)g8s-IbRj@IZ(T42+>R3%c_bsB12i6Y74X*?fxw?UK+Hox2i>5XhBqO~%lPoq zk3#=~9MA)Bv&3-wXfXd$!!soge}OaooS-0W{bxZh0KWWpC&B^96EGNqwx0)poowi1 z@wodH`5b)f0NoCTMN0w8cRuYD#i0H3065(y@1DVMH4HQyR8di}E75MC5hF%u#*O?u z8{Yi)0Pu-tDOesL7&da`$Wfr(D=RCjsz#6A12ksLnCcq6xZ%#TQRdBmf5Y!zQtF%p z{DjE+j~zR9Pf#UoziO|&LF2}atKO$ZFK#&VOp?#Y=f58S#qy_N40!5a{e z3(jcOi8KGw!V&OYY{0U-j02GQU|SBr!bOV~oe4S%boM#b^V$|KZfkC7ZakL*DB_4O zf(0Ysz1+n}pUYiKe`kxw+ZQfbavtb>(9)$#tDD-|+FCAXX!{7hVLq7<38fQqc0{%Uf0~Yeiad=Q30{0_C2YQh(m(F9|f>?&LQ+zd#E> zm#uKxSH=0QKp+Pk0{3Pl0Kf^`F9%%#x)O91Xbz~g)lD!}f1KZ82hM_0-4Tc`T4My( zff8R1^ajvh{{2##MI}(|9O&Y-m@)_3-W*(nr~oEXjiI7_Qv*R3HI)`B08Y)n2 z;vKXk00cqUf@*|Raf_OZ0nEq%CNmHNI4{xh7H0?tV3G#l6%D`=16UkDGJ;@lSwcb$ z0MdXIz>)w^e|H&x4b}#)IJ9g#YqE*G$1lafO!I5 zVt^#=fEa)vh~s%TAu$k?%I6ageDfcP}z z0Ky?={TBo9bwoTu^3&7>kgo%hIJ`^+fGGoDmm2X(M{}554g_(N0*IG#vP{d`R|1%H zd}IKo6o6gr#g_st084hc zIsmp5z?R&$)8bK48PT#u3}8zEY&8HcAH@Kce=R9qo$^~;xHwNB!~m><6~z$+5EiEi z1pq1B610F58W27)K$6tQlIH^sfG~&P{E^tJAJNd-UsByV^}le4Y4IijP$dbR!PG+h z6ip2vc@T_vWh*}1;`Ob#a!M#xQiU|0rpulbL&%N>fFc8!@@L6<0E(!bPyRGLx)e>T ze`?DC*G_U%I*1x{fT7ZMNJAP3U9Hg03b2x?k7j1UXI}w2I=fa~b1kO+*AexVAR@r^ zH{7@y)Byy{9|-yiU`7DIH&OpoiUH6;C@R3s+&^^-O#xJNfLpnLY7O0787c>Y|DvD| za2xke(_cBiJ%oQmfIC)W;*Zm7$=15Qe@_4_Ou_@;juiQg`!v3D{aqM^Sq6An5)R<* z4I5JT!1$-{#hFY7he^Tw?+=6lz-0dK!}nwSz}g4^$*=$q()mw=HfGjmvJatk;ie!N zs17v&T>s3&nMbnONBe5+03>Jy9|GX9RBAo-hv9!bn|&fIK=2WQCcu;A{GU`&=@j7k4r z$KbzpYiCgbApf?#fzX>|{4stDfBd(;T~vT~-rYtf{XH`O9q9cJ0APDj0hl&__z}#1 z7uo^-xsQtv@JT1h|4%SF85b)*8vdz8`htHAL!SAcK|_$ bUi<$6*^|uoQT#~c00000NkvXXu0mjf_t;b? diff --git a/tgstation.dme b/tgstation.dme index 4f6c96dd3d0..54b4c057dd1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3498,6 +3498,13 @@ #include "code\modules\bitrunning\components\netpod_healing.dm" #include "code\modules\bitrunning\components\npc_friendly.dm" #include "code\modules\bitrunning\components\virtual_entity.dm" +#include "code\modules\bitrunning\netpod\_netpod.dm" +#include "code\modules\bitrunning\netpod\container.dm" +#include "code\modules\bitrunning\netpod\outfitting.dm" +#include "code\modules\bitrunning\netpod\signals.dm" +#include "code\modules\bitrunning\netpod\tools.dm" +#include "code\modules\bitrunning\netpod\ui.dm" +#include "code\modules\bitrunning\netpod\utils.dm" #include "code\modules\bitrunning\objects\byteforge.dm" #include "code\modules\bitrunning\objects\clothing.dm" #include "code\modules\bitrunning\objects\debug.dm" @@ -3507,7 +3514,6 @@ #include "code\modules\bitrunning\objects\landmarks.dm" #include "code\modules\bitrunning\objects\loot_box.dm" #include "code\modules\bitrunning\objects\loot_crate.dm" -#include "code\modules\bitrunning\objects\netpod.dm" #include "code\modules\bitrunning\objects\quantum_console.dm" #include "code\modules\bitrunning\objects\vendor.dm" #include "code\modules\bitrunning\orders\bepis.dm" @@ -3537,6 +3543,7 @@ #include "code\modules\bitrunning\virtual_domain\domains\fredingtonfastingbear.dm" #include "code\modules\bitrunning\virtual_domain\domains\gondola_asteroid.dm" #include "code\modules\bitrunning\virtual_domain\domains\hierophant.dm" +#include "code\modules\bitrunning\virtual_domain\domains\island_brawl.dm" #include "code\modules\bitrunning\virtual_domain\domains\pipedream.dm" #include "code\modules\bitrunning\virtual_domain\domains\pirates.dm" #include "code\modules\bitrunning\virtual_domain\domains\psyker_shuffle.dm" diff --git a/tgui/packages/tgui/interfaces/QuantumConsole.tsx b/tgui/packages/tgui/interfaces/QuantumConsole.tsx index c42a7ce9402..08ec428bc4d 100644 --- a/tgui/packages/tgui/interfaces/QuantumConsole.tsx +++ b/tgui/packages/tgui/interfaces/QuantumConsole.tsx @@ -47,6 +47,7 @@ type Avatar = { }; type Domain = { + announce_ghosts: BooleanLike; cost: number; desc: string; difficulty: number; @@ -74,10 +75,11 @@ enum Difficulty { High, } -const isConnected = (data: Data): data is Data & { connected: 1 } => - data.connected === 1; +function isConnected(data: Data): data is Data & { connected: 1 } { + return data.connected === 1; +} -const getColor = (difficulty: number) => { +function getColor(difficulty: number) { switch (difficulty) { case Difficulty.Low: return 'yellow'; @@ -88,9 +90,9 @@ const getColor = (difficulty: number) => { default: return 'green'; } -}; +} -export const QuantumConsole = (props) => { +export function QuantumConsole(props) { const { data } = useBackend(); return ( @@ -101,9 +103,9 @@ export const QuantumConsole = (props) => { ); -}; +} -const AccessView = (props) => { +function AccessView(props) { const { act, data } = useBackend(); const [tab, setTab] = useSharedState('tab', 0); @@ -228,22 +230,24 @@ const AccessView = (props) => { act('stop_domain')} tooltip="Begins shutdown. Will notify anyone connected." - /> + > + Stop Domain + ); -}; +} -const DomainEntry = (props: DomainEntryProps) => { +function DomainEntry(props: DomainEntryProps) { const { domain: { + announce_ghosts, cost, desc, difficulty, @@ -275,6 +279,8 @@ const DomainEntry = (props: DomainEntryProps) => { buttonName = 'Deploy'; } + const canView = name !== '???'; + return ( { title={ <> {name} - {!!is_modular && name !== '???' && } - {!!has_secondary_objectives && name !== '???' && ( - - )} + {!!is_modular && canView && } + {!!has_secondary_objectives && canView && } + {!!announce_ghosts && canView && } } > @@ -303,6 +308,7 @@ const DomainEntry = (props: DomainEntryProps) => { {desc} {!!is_modular && ' (Modular)'} {!!has_secondary_objectives && ' (Secondary Objective Available)'} + {!!announce_ghosts && ' (Ghost Interaction)'} @@ -322,7 +328,7 @@ const DomainEntry = (props: DomainEntryProps) => { ); -}; +} const AvatarDisplay = (props) => { const { act, data } = useBackend();