diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index d239ef3547b6..7b21400ae95c 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -46,9 +46,9 @@ jobs: - name: Install rust-g run: | bash tools/ci/install_rust_g.sh - - name: Install auxlua + - name: Install dreamluau run: | - bash tools/ci/install_auxlua.sh + bash tools/ci/install_dreamluau.sh - name: Configure version run: | echo "BYOND_MAJOR=${{ inputs.major }}" >> $GITHUB_ENV diff --git a/_maps/map_files/Blueshift/Blueshift.dmm b/_maps/map_files/Blueshift/Blueshift.dmm index 7fefba480550..f09b65eadda5 100644 --- a/_maps/map_files/Blueshift/Blueshift.dmm +++ b/_maps/map_files/Blueshift/Blueshift.dmm @@ -2951,7 +2951,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ cycle_id = "greater-sec-maint-cluster" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/external, +/obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/department/security/greater) "aEu" = ( @@ -9651,8 +9651,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "bSQ" = ( @@ -19386,9 +19387,6 @@ /obj/item/pen/fountain{ pixel_y = 10 }, -/obj/item/stamp/centcom{ - pixel_x = 6 - }, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "dJh" = ( @@ -33140,7 +33138,7 @@ /obj/machinery/door/firedoor, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison/upper) @@ -35335,16 +35333,7 @@ dir = 8 }, /obj/structure/window/spawner/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/suit/armor/centcom_formal, +/obj/structure/closet/secure_closet/nanotrasen_representative, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "gPh" = ( @@ -39111,7 +39100,8 @@ /obj/machinery/door/airlock/corporate{ name = "Representative's Office" }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "hCU" = ( @@ -41030,7 +41020,7 @@ name = "Equipment Room" }, /obj/effect/turf_decal/delivery/blue, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark, /area/station/security/lockers) "hVo" = ( @@ -54697,7 +54687,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch" }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/construction, +/obj/effect/mapping_helpers/airlock/access/all/engineering/aux_base, /turf/open/floor/plating, /area/station/construction/mining/aux_base) "kzV" = ( @@ -54800,6 +54790,7 @@ name = "Premium Cozy Chair" }, /obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/nanotrasen_representative, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "kAU" = ( @@ -59503,7 +59494,7 @@ name = "Security Maintenance" }, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/plating, /area/station/maintenance/department/security/upper) "lzT" = ( @@ -70915,11 +70906,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/hallway/secondary/entry) -"nOw" = ( -/obj/item/clothing/accessory/medal/silver/bureaucracy, -/obj/item/clothing/accessory/medal/gold/ordom, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "nOE" = ( /obj/structure/barricade/security, /obj/effect/turf_decal/stripes, @@ -73721,8 +73707,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/nt_rep) "ooF" = ( @@ -76177,7 +76164,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, /turf/open/floor/iron/dark/side{ dir = 4 }, @@ -81111,9 +81098,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/duct, /obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/wood, /area/station/command/heads_quarters/nt_rep) "pLg" = ( @@ -88249,7 +88237,7 @@ /obj/structure/window/reinforced/tinted/spawner/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/toiletbong, -/obj/item/bodypart/head/simian, +/obj/item/bodypart/head/monkey, /obj/effect/decal/cleanable/blood/old{ icon_state = "floor5-old" }, @@ -95742,7 +95730,7 @@ }, /obj/effect/turf_decal/delivery/blue, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark, /area/station/security/lockers) @@ -103858,7 +103846,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Gear Room" }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark, /area/station/security/lockers) "ueE" = ( @@ -106999,7 +106987,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron/dark/textured_large, /area/station/security/lockers) "uIq" = ( @@ -117609,7 +117597,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /turf/open/floor/iron, /area/station/security/prison/upper) "wGO" = ( @@ -123003,6 +122991,8 @@ /obj/item/pen/fountain{ pixel_y = 5 }, +/obj/item/clothing/accessory/medal/gold/ordom, +/obj/item/clothing/accessory/medal/silver/bureaucracy, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/nt_rep) "xLj" = ( @@ -214752,7 +214742,7 @@ jrA ide ide ide -nOw +oTn bhf rre ide diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 1ecac79517d0..30e07bfe4643 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -16133,6 +16133,22 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) +"fvw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/freezer{ + name = "Coldroom" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/disposalpipe/segment, +/obj/machinery/duct, +/turf/open/floor/iron/dark/textured, +/area/station/service/kitchen/coldroom) "fvz" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -21959,22 +21975,6 @@ /obj/machinery/duct, /turf/open/floor/iron/large, /area/station/hallway/secondary/service) -"hoq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/airlock/freezer{ - name = "Coldroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured, -/area/station/service/kitchen/coldroom) "hoR" = ( /obj/effect/turf_decal/siding/thinplating{ dir = 1 @@ -29587,6 +29587,11 @@ "jQu" = ( /turf/open/floor/wood, /area/station/commons/locker) +"jQS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/plating, +/area/station/maintenance/port) "jRl" = ( /obj/machinery/door/window/left/directional/south, /obj/structure/table/wood/fancy, @@ -38515,12 +38520,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/vaporwave, /area/station/command/heads_quarters/rd) -"mSe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mopbucket, -/obj/item/mop, -/turf/open/floor/plating, -/area/station/maintenance/port) "mSx" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -57722,11 +57721,6 @@ /obj/effect/spawner/random/entertainment/coin, /turf/open/floor/iron, /area/station/commons/dorms) -"tsD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/caution_sign, -/turf/open/floor/plating, -/area/station/maintenance/port) "tsL" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -62596,6 +62590,11 @@ /obj/item/instrument/eguitar, /turf/open/floor/wood, /area/station/maintenance/starboard/fore) +"uZv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/barbervend, +/turf/open/floor/plating, +/area/station/maintenance/port) "uZz" = ( /obj/machinery/camera/directional/south{ c_tag = "Engineering - Atmospherics, External HFR Room, South"; @@ -90638,13 +90637,13 @@ pWG iay pWG vqJ -hoq +fvw sWm bia bia sWm sWm -hoq +fvw sjw nKV vBA @@ -91677,7 +91676,7 @@ hlF qXb jiL bnl -tsD +uZv slx dgd bnl @@ -91934,7 +91933,7 @@ gMs qwd nUi bnl -mSe +jQS kSL mNd ejD diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index c3c9e36d4045..cdf49c32d306 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -2226,30 +2226,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal) -"axw" = ( -/obj/structure/table/wood, -/obj/item/folder/blue{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/folder/blue, -/obj/item/paper_bin/carbon, -/obj/item/stamp{ - pixel_x = -6 - }, -/obj/item/stamp/denied{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp/centcom{ - pixel_x = 6 - }, -/obj/item/pen/fountain{ - pixel_y = 10 - }, -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/nt_rep) "axz" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -6170,6 +6146,22 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/freezer, /area/station/security/prison/toilet) +"buu" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/machinery/door/airlock/freezer{ + name = "Coldroom" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "buK" = ( /obj/structure/table/wood/fancy, /turf/open/floor/iron/grimy, @@ -13785,6 +13777,11 @@ }, /turf/open/floor/iron/white, /area/station/medical/storage) +"djP" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/barbervend, +/turf/open/floor/iron/dark, +/area/station/service/barber) "djQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -21417,20 +21414,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"fcl" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/item/reagent_containers/cup/bowl{ - pixel_y = 3 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = -8; - pixel_y = 23 - }, -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) "fco" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -26760,20 +26743,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/plating, /area/station/maintenance/port) -"goE" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/suit/armor/centcom_formal, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "goG" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -26887,25 +26856,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"gqf" = ( -/obj/effect/turf_decal/tile/red/opposingcorners{ - dir = 1 - }, -/obj/structure/rack, -/obj/effect/turf_decal/bot_red, -/obj/item/clothing/suit/apron/chef{ - desc = "A white smock used by barbers to remain hair free."; - name = "barber smock" - }, -/obj/item/razor{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/razor{ - pixel_x = -2 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/barber) "gqm" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -32292,22 +32242,6 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/dark, /area/station/command/bridge) -"hFP" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/machinery/door/airlock/freezer{ - name = "Coldroom" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/duct, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "hFZ" = ( /obj/item/reagent_containers/cup/beaker, /obj/item/reagent_containers/syringe/antiviral, @@ -41520,6 +41454,21 @@ }, /turf/open/floor/plating, /area/station/maintenance/disposal) +"jMp" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/effect/turf_decal/siding/dark_blue/end, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/carpet/neon/simple/blue/nodots, +/area/station/command/heads_quarters/blueshield) "jMq" = ( /obj/structure/safe, /obj/item/clothing/neck/stethoscope, @@ -49014,13 +48963,6 @@ }, /turf/open/floor/iron, /area/station/science/research) -"lzM" = ( -/obj/item/paper/pamphlet/violent_video_games, -/obj/effect/spawner/random/entertainment/money_small, -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/service/barber) "lzQ" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -49766,6 +49708,21 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"lIa" = ( +/obj/structure/chair/comfy/brown{ + color = "#c45c57"; + desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; + dir = 8; + name = "Premium Cozy Chair" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/nt_rep) "lIl" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -50936,6 +50893,20 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/captain) +"lUM" = ( +/obj/machinery/door/airlock/corporate{ + name = "Blueshield's Quarters" + }, +/obj/effect/turf_decal/siding/dark_blue/end{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/carpet/neon/simple/blue/nodots, +/area/station/command/heads_quarters/blueshield) "lUN" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, @@ -62782,19 +62753,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/chapel) -"oTo" = ( -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/effect/turf_decal/siding/dark_blue/end, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/carpet/neon/simple/blue/nodots, -/area/station/command/heads_quarters/blueshield) "oTs" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -68467,6 +68425,27 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/bridge) +"qkn" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/folder/blue, +/obj/item/paper_bin/carbon, +/obj/item/stamp{ + pixel_x = -6 + }, +/obj/item/stamp/denied{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/fountain{ + pixel_y = 10 + }, +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/nt_rep) "qko" = ( /obj/item/kirbyplants/random, /obj/effect/turf_decal/tile/brown/half{ @@ -76393,6 +76372,34 @@ }, /turf/open/floor/iron/dark, /area/station/science/server) +"sfX" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/effect/turf_decal/bot_red, +/obj/item/clothing/suit/apron/chef{ + desc = "A white smock used by barbers to remain hair free."; + name = "barber smock" + }, +/obj/item/scissors{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/item/razor{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/scissors{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/razor{ + pixel_x = -2; + pixel_y = 0 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) "sge" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -77123,18 +77130,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/medical/medbay/lobby) -"sqx" = ( -/obj/machinery/door/airlock/corporate{ - id_tag = "Repdoor"; - name = "Representative's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "sqI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -82121,19 +82116,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/locker) -"tBd" = ( -/obj/machinery/door/airlock/corporate{ - name = "Blueshield's Quarters" - }, -/obj/effect/turf_decal/siding/dark_blue/end{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/carpet/neon/simple/blue/nodots, -/area/station/command/heads_quarters/blueshield) "tBf" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -88184,6 +88166,19 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/department/science) +"uWX" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "Repdoor"; + name = "Representative's Office" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "uXg" = ( /obj/effect/turf_decal/trimline/hot_pink/filled/line{ dir = 4 @@ -91101,20 +91096,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"vFM" = ( -/obj/structure/chair/comfy/brown{ - color = "#c45c57"; - desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; - dir = 8; - name = "Premium Cozy Chair" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/nt_rep) "vFU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -93318,6 +93299,17 @@ }, /turf/open/floor/iron, /area/station/medical/storage) +"wjs" = ( +/obj/effect/turf_decal/tile/red/opposingcorners{ + dir = 1 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = -8; + pixel_y = 23 + }, +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/iron/cafeteria, +/area/station/service/barber) "wjA" = ( /obj/effect/turf_decal/trimline/green/filled/corner{ dir = 4 @@ -99968,6 +99960,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/service/abandoned_gambling_den/gaming) +"xMu" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "xMy" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -133127,7 +133124,7 @@ sIE pVw hXw btc -hFP +buu xAt pEs oTB @@ -133156,7 +133153,7 @@ nXK qAQ aej wce -lzM +djP dvG kKK bNh @@ -135212,7 +135209,7 @@ nXK qAQ qtE tBf -gqf +sfX dvG tGq iEl @@ -135467,7 +135464,7 @@ wjF uED saD lpq -fcl +wjs xpI qAQ dvG @@ -137762,7 +137759,7 @@ uMA wjO dOZ pwG -tBd +lUM siG siG diL @@ -138022,7 +138019,7 @@ kOj hPv jyy fDC -oTo +jMp vsW tFF bog @@ -143674,9 +143671,9 @@ dvy nnk kOj kqH -axw +qkn gVc -sqx +uWX tch aPY bog @@ -143930,7 +143927,7 @@ sLK dvy lSl pwG -vFM +lIa eJl lLF piR @@ -144444,7 +144441,7 @@ skZ dvy lSl pwG -goE +xMu xkN gti piR diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index be852ed8eab3..45651ea6c53c 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -71,6 +71,23 @@ /obj/item/clothing/head/helmet/skull, /turf/open/misc/asteroid/snow/icemoon, /area/icemoon/underground/explored) +"abJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Teleport Access" + }, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/teleporter, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/iron, +/area/station/command/teleporter) "abL" = ( /obj/machinery/light/directional/north, /obj/structure/sign/warning/secure_area/directional/north, @@ -2625,34 +2642,6 @@ /obj/machinery/meter/layer4, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"aTw" = ( -/obj/structure/table/wood, -/obj/item/folder/blue{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/folder/blue, -/obj/item/stamp/denied{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp{ - pixel_x = -6 - }, -/obj/item/paper_bin/carbon{ - pixel_x = 14; - pixel_y = 3 - }, -/obj/item/pen/fountain{ - pixel_y = 10 - }, -/obj/item/stamp/centcom{ - pixel_x = 6 - }, -/obj/structure/window/spawner/directional/west, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "aTG" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -3444,6 +3433,10 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central) +"beB" = ( +/obj/machinery/vending/barbervend, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "beO" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -10837,22 +10830,6 @@ /obj/structure/ladder, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"dmG" = ( -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/obj/machinery/door/airlock/corporate{ - id_tag = "Repdoor"; - name = "Representative's Office" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "dmI" = ( /obj/machinery/chem_master, /obj/effect/turf_decal/tile/yellow/full, @@ -24054,9 +24031,6 @@ "hHN" = ( /turf/open/floor/iron, /area/station/engineering/atmos) -"hHU" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/crew_quarters/bar) "hHV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ dir = 1 @@ -27923,6 +27897,10 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine/plasma, /area/station/engineering/atmos) +"iUc" = ( +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/plating, +/area/station/maintenance/department/crew_quarters/bar) "iUd" = ( /obj/machinery/conveyor{ dir = 6; @@ -28941,17 +28919,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/grass, /area/station/service/hydroponics) -"jly" = ( -/obj/structure/chair/comfy/brown{ - color = "#c45c57"; - desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; - dir = 4; - name = "Premium Cozy Chair" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "jlF" = ( /obj/machinery/computer/arcade/amputation{ dir = 4 @@ -33337,6 +33304,19 @@ }, /turf/open/floor/glass/reinforced, /area/station/engineering/atmos/pumproom) +"kFN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/blueshield) "kFO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -42885,6 +42865,31 @@ /obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/iron, /area/station/cargo/office) +"nEC" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/folder/blue, +/obj/item/stamp/denied{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp{ + pixel_x = -6 + }, +/obj/item/paper_bin/carbon{ + pixel_x = 14; + pixel_y = 3 + }, +/obj/item/pen/fountain{ + pixel_y = 10 + }, +/obj/structure/window/spawner/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "nEZ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -46524,6 +46529,23 @@ /obj/machinery/light/warm/directional/west, /turf/open/floor/iron, /area/station/security/prison/workout) +"oKk" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "Repdoor"; + name = "Representative's Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "oKv" = ( /obj/item/trash/popcorn, /turf/open/floor/plating, @@ -50580,18 +50602,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) -"pYs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/effect/landmark/navigate_destination, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/blueshield) "pYz" = ( /obj/machinery/door/firedoor/border_only, /turf/open/floor/iron/dark/corner{ @@ -50904,6 +50914,18 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/security/processing) +"qeW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/machinery/camera/directional/north{ + c_tag = "Teleporter" + }, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "qfh" = ( /turf/open/floor/iron/recharge_floor, /area/station/science/robotics/mechbay) @@ -55810,27 +55832,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) -"rLe" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/suit/armor/centcom_formal, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Teleporter" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "rLo" = ( /turf/open/floor/plating, /area/station/cargo/miningdock) @@ -56539,21 +56540,6 @@ /obj/machinery/duct, /turf/open/floor/glass/reinforced, /area/station/science/xenobiology) -"rXN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Teleport Access" - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/all/command/teleporter, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) "rXX" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -58297,6 +58283,21 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark, /area/station/hallway/primary/central) +"sAF" = ( +/obj/structure/sign/warning/secure_area/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/corporate{ + id_tag = "Repdoor"; + name = "Representative's Office" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/airlock/access/any/command/teleporter, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/iron, +/area/station/maintenance/central/lesser) "sAI" = ( /obj/machinery/camera{ c_tag = "Morgue Hallway" @@ -59355,19 +59356,6 @@ /obj/structure/microscope, /turf/open/floor/iron/grimy, /area/station/security/prison/work) -"sTV" = ( -/obj/structure/sign/warning/secure_area/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/corporate{ - id_tag = "Repdoor"; - name = "Representative's Office" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/airlock/access/all/command/teleporter, -/turf/open/floor/iron, -/area/station/maintenance/central/lesser) "sUi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -72309,6 +72297,18 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/service) +"xdg" = ( +/obj/structure/chair/comfy/brown{ + color = "#c45c57"; + desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; + dir = 4; + name = "Premium Cozy Chair" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "xdl" = ( /obj/structure/cable, /turf/open/floor/iron/white, @@ -178000,8 +178000,8 @@ fWU fWU dMS fkJ -hHU -hHU +beB +iUc dMS nCJ dMS @@ -233005,7 +233005,7 @@ gfr fnv pPM fjt -pYs +kFN umE ujA eYd @@ -237636,7 +237636,7 @@ lpM tYq sqU olH -rLe +qeW euf jzn olH @@ -237893,8 +237893,8 @@ nkb anu xLF olH -aTw -jly +nEC +xdg fXb olH nKe @@ -238923,7 +238923,7 @@ sIt sIt log olH -dmG +oKk olH aTG hGh @@ -239181,7 +239181,7 @@ wdg pqu bVv mZe -sTV +sAF pwf oUL qKz @@ -239440,7 +239440,7 @@ gJR sIt log mhQ -rXN +abJ mhQ mhQ cjR diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 2fbc8db0e329..7e0a1fb2f4fa 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -4515,6 +4515,10 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) +"bxw" = ( +/obj/structure/sign/warning/secure_area, +/turf/closed/wall/r_wall, +/area/station/command/heads_quarters/nt_rep) "bxx" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -4586,16 +4590,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/port) -"bza" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "bzb" = ( /obj/structure/grille, /obj/effect/turf_decal/stripes/line{ @@ -4758,18 +4752,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) -"bBr" = ( -/obj/machinery/door/airlock/engineering{ - name = "Emergency Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "bBE" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -6544,10 +6526,6 @@ }, /turf/open/floor/carpet/neon/simple/green, /area/station/science/xenobiology) -"ccz" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/closed/mineral/random/labormineral, -/area/space/nearstation) "ccG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6820,6 +6798,13 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/port/greater) +"cfQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/nt_rep) "cfR" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/delivery, @@ -6907,21 +6892,6 @@ }, /turf/open/floor/iron/recharge_floor, /area/station/maintenance/port/aft) -"cgW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/blueshield) "cgX" = ( /obj/structure/rack, /obj/item/wirecutters{ @@ -8158,16 +8128,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/eva, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) -"czv" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/nt_rep) "czy" = ( /obj/machinery/door/airlock/external/glass{ name = "Supply Door Airlock" @@ -9227,12 +9187,6 @@ }, /turf/open/floor/circuit, /area/station/ai_monitored/turret_protected/ai_upload) -"cTi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "cTw" = ( /obj/item/toy/plush/lizard_plushie, /turf/open/floor/plating, @@ -9820,10 +9774,6 @@ dir = 4 }, /area/station/hallway/primary/fore) -"dcm" = ( -/obj/structure/sign/warning/secure_area, -/turf/closed/wall, -/area/station/command/heads_quarters/nt_rep) "dcn" = ( /obj/effect/turf_decal/bot, /obj/machinery/quantum_server{ @@ -10522,13 +10472,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/engineering/atmos) -"doj" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "dok" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -10785,19 +10728,6 @@ /obj/machinery/portable_atmospherics/canister, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"drC" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/blood/old, -/obj/item/clothing/gloves/color/black, -/obj/item/wrench, -/obj/structure/sign/warning/no_smoking{ - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "drG" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -12263,6 +12193,11 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/dark, /area/station/security/courtroom) +"dRs" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "dRv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -12783,6 +12718,13 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/engineering/lobby) +"eaI" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "eaR" = ( /obj/effect/turf_decal/trimline/piss_yellow/filled/line{ dir = 4 @@ -13295,31 +13237,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark, /area/station/security/prison/garden) -"eix" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/item/paper_bin{ - pixel_x = -5 - }, -/obj/item/pen{ - pixel_x = -5 - }, -/obj/item/stamp{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/stamp/centcom{ - pixel_y = 7 - }, -/obj/item/stamp/denied{ - pixel_x = 6; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/dark_green/opposingcorners{ - dir = 1 - }, -/turf/open/floor/stone, -/area/station/command/heads_quarters/nt_rep) "eiz" = ( /obj/structure/cable, /obj/machinery/duct, @@ -13363,13 +13280,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"eiY" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "eja" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -13449,9 +13359,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) -"ekM" = ( -/turf/closed/wall, -/area/station/hallway/primary/aft) "ekY" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/plumbed, @@ -14269,17 +14176,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/security/execution/education) -"eAa" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/item/storage/toolbox/emergency, -/obj/item/flashlight, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "eAk" = ( /obj/machinery/light/small/directional/east, /obj/structure/chair/wood{ @@ -15553,6 +15449,12 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard) +"eVO" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/wood, +/area/station/maintenance/department/crew_quarters/bar) "eVP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/corner{ @@ -18897,6 +18799,12 @@ }, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/bomb) +"fWu" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/vending/barbervend, +/turf/open/floor/wood, +/area/station/maintenance/department/crew_quarters/bar) "fWB" = ( /obj/machinery/airalarm/directional/west, /obj/machinery/rnd/production/techfab/department/service, @@ -18909,6 +18817,16 @@ }, /turf/open/floor/iron/dark, /area/station/hallway/secondary/service) +"fWC" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/blood/old, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "fWZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -20592,6 +20510,22 @@ /obj/machinery/digital_clock/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"gyW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/blueshield) "gzb" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/grille/broken, @@ -20873,11 +20807,6 @@ /obj/machinery/growing/tray, /turf/open/floor/grass, /area/station/security/prison/garden) -"gDW" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/station/maintenance/department/crew_quarters/bar) "gEZ" = ( /obj/machinery/shower/directional/north, /obj/effect/turf_decal/box/red, @@ -22659,6 +22588,14 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"hhG" = ( +/obj/structure/grille/broken, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "hhO" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -22978,11 +22915,6 @@ /obj/effect/turf_decal/trimline/piss_yellow/filled/line, /turf/open/floor/iron/dark/textured_large, /area/station/maintenance/port/fore) -"hlP" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/department/crew_quarters/bar) "hlW" = ( /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, @@ -26711,13 +26643,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"ipg" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "iph" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -29251,6 +29176,19 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) +"iYw" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Nanotrasen Representative's Office" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/nt_rep) "iYx" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood, @@ -30614,16 +30552,6 @@ /obj/structure/cable, /turf/open/floor/iron/showroomfloor, /area/station/security/office) -"juj" = ( -/obj/effect/spawner/random/decoration/glowstick, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "juq" = ( /obj/structure/flora/grass/jungle/a/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -31642,6 +31570,17 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/station/engineering/hallway) +"jMC" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "jMF" = ( /obj/structure/closet/emcloset/anchored, /obj/effect/turf_decal/bot, @@ -32093,6 +32032,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/command/bridge) +"jTW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "jUa" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -32528,15 +32477,6 @@ /obj/structure/cable, /turf/open/floor/engine, /area/station/ai_monitored/turret_protected/ai) -"kbv" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "kbO" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -32763,6 +32703,12 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/restrooms) +"kgt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "kgD" = ( /obj/machinery/power/solar{ id = "aftstarboard"; @@ -32851,6 +32797,17 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/courtroom) +"kiN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "kiO" = ( /obj/structure/lattice, /obj/structure/sign/warning/secure_area/directional/west, @@ -33143,13 +33100,6 @@ dir = 8 }, /area/station/maintenance/port/fore) -"koE" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/radio/intercom/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "koO" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -34483,12 +34433,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/kitchen, /area/station/security/prison/mess) -"kKP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/closed/wall, -/area/station/hallway/primary/central) "kKX" = ( /obj/effect/turf_decal/bot, /obj/machinery/holopad, @@ -34795,23 +34739,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/engineering) -"kQd" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/suit/armor/centcom_formal, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/nt_rep) "kQj" = ( /obj/effect/turf_decal/bot, /obj/machinery/status_display/door_timer{ @@ -36896,6 +36823,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central) +"lzP" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "lzQ" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/disposalpipe/segment, @@ -36987,9 +36922,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/maintenance/fore) -"lAU" = ( -/turf/closed/wall, -/area/station/command/heads_quarters/nt_rep) "lAV" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ dir = 4 @@ -37981,18 +37913,6 @@ /obj/effect/landmark/start/librarian, /turf/open/floor/cult, /area/station/service/library) -"lRa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "lRg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -39339,6 +39259,16 @@ /obj/structure/sign/warning/docking, /turf/closed/wall/rust, /area/station/maintenance/starboard) +"mna" = ( +/obj/effect/spawner/random/decoration/glowstick, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "mnb" = ( /obj/machinery/status_display/ai/directional/east, /obj/machinery/door/airlock{ @@ -42144,6 +42074,15 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron, /area/station/engineering/atmos) +"niB" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "niL" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -42700,15 +42639,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"nsQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/box, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "nsX" = ( /obj/structure/plaque/static_plaque/atmos, /turf/closed/wall, @@ -43513,6 +43443,17 @@ /obj/item/food/grown/poppy, /turf/open/floor/iron/dark, /area/station/service/chapel) +"nGG" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/item/storage/toolbox/emergency, +/obj/item/flashlight, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "nGJ" = ( /obj/effect/mapping_helpers/iannewyear, /turf/open/floor/wood, @@ -44254,6 +44195,17 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/dark, /area/station/cargo/storage) +"nRP" = ( +/obj/machinery/door/airlock/engineering{ + name = "Emergency Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "nSe" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -46723,23 +46675,6 @@ /obj/machinery/dna_scannernew, /turf/open/floor/iron/dark, /area/station/science/genetics) -"oNo" = ( -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/effect/decal/cleanable/blood/old, -/obj/item/weldingtool{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/clothing/head/utility/welding{ - pixel_y = 5 - }, -/obj/item/crowbar/red, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "oNr" = ( /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, @@ -47860,14 +47795,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"peT" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "peY" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48540,6 +48467,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"pnR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/nt_rep) "pop" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50019,15 +49953,6 @@ }, /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/chapel/monastery) -"pNV" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "pNY" = ( /obj/machinery/computer/security/mining{ dir = 8 @@ -53146,6 +53071,12 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"qOV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "qOW" = ( /obj/machinery/light/small/red/directional/west, /obj/effect/turf_decal/trimline/dark/filled/line{ @@ -53214,9 +53145,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/misc/asteroid/airless, /area/space/nearstation) -"qQg" = ( -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "qQj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -53454,21 +53382,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/bar/atrium) -"qTK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/engineering{ - name = "Emergency Storage" - }, -/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) "qTY" = ( /obj/structure/table, /obj/item/surgical_drapes, @@ -59333,13 +59246,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/chapel) -"sKM" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/closet/secure_closet/nanotrasen_consultant, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/nt_rep) "sKV" = ( /obj/structure/closet/crate/wooden/toy, /obj/effect/turf_decal/box, @@ -59462,6 +59368,14 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"sMg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) "sMi" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60428,13 +60342,6 @@ /obj/machinery/telecomms/processor/preset_three, /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) -"tdv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) "tdG" = ( /obj/machinery/shower/directional/south, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -60590,6 +60497,9 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"tfv" = ( +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "tfG" = ( /obj/effect/spawner/random/vending/colavend, /obj/effect/turf_decal/tile/red{ @@ -61923,17 +61833,6 @@ }, /turf/open/floor/iron/dark, /area/station/maintenance/department/crew_quarters/bar) -"tBT" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) "tCh" = ( /obj/machinery/computer/robotics{ dir = 1 @@ -61982,6 +61881,28 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/textured_large, /area/station/service/chapel/funeral) +"tDt" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/item/paper_bin{ + pixel_x = -5 + }, +/obj/item/pen{ + pixel_x = -5 + }, +/obj/item/stamp{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/stamp/denied{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/dark_green/opposingcorners{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/command/heads_quarters/nt_rep) "tDu" = ( /obj/structure/chair/pew{ dir = 8 @@ -62530,6 +62451,23 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"tNX" = ( +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/effect/decal/cleanable/blood/old, +/obj/item/weldingtool{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_y = 5 + }, +/obj/item/crowbar/red, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "tNY" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/corner{ @@ -62814,6 +62752,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"tTz" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/nt_rep) "tTD" = ( /obj/machinery/light/directional/north, /obj/structure/chair/sofa/bench, @@ -64240,15 +64189,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/cargo/sorting) -"uqT" = ( -/obj/structure/grille/broken, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/primary/aft) "uqW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -64675,18 +64615,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"uyD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Nanotrasen Representative's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/nt_rep) "uyR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/showroomfloor, @@ -65538,6 +65466,19 @@ /obj/machinery/power/turbine/turbine_outlet, /turf/open/floor/engine, /area/station/maintenance/disposal/incinerator) +"uNA" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/blood/old, +/obj/item/clothing/gloves/color/black, +/obj/item/wrench, +/obj/structure/sign/warning/no_smoking{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "uNO" = ( /turf/closed/wall, /area/station/commons/toilet/restrooms) @@ -65852,6 +65793,21 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/dark, /area/station/science/lab) +"uTj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/airlock/engineering{ + name = "Emergency Storage" + }, +/obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "uTt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66064,9 +66020,6 @@ }, /turf/open/floor/iron, /area/station/security/prison) -"uXZ" = ( -/turf/closed/wall/rust, -/area/station/hallway/primary/aft) "uYp" = ( /obj/structure/chair/stool/bar/directional/west, /turf/open/floor/wood, @@ -66994,6 +66947,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/starboard) +"vny" = ( +/obj/machinery/door/airlock/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres, +/obj/effect/mapping_helpers/airlock/access/any/security/maintenance, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "vnC" = ( /obj/effect/spawner/structure/window/hollow/reinforced/directional{ dir = 9 @@ -71299,17 +71259,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"wxG" = ( -/obj/machinery/asteroid_magnet{ - center_x = 176; - center_y = 177; - area_size = 7 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/science/explab) "wxI" = ( /obj/item/kirbyplants{ icon_state = "plant-05" @@ -71564,6 +71513,15 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/engineering/hallway) +"wBF" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/department/security/upper) "wCe" = ( /obj/effect/turf_decal/delivery, /obj/structure/closet/emcloset, @@ -73124,6 +73082,17 @@ }, /turf/open/floor/stone, /area/station/command/heads_quarters/nt_rep) +"xbW" = ( +/obj/machinery/asteroid_magnet{ + center_x = 176; + center_y = 178; + area_size = 7 + }, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/showroomfloor, +/area/station/science/explab) "xbZ" = ( /obj/machinery/portable_atmospherics/scrubber/huge, /obj/effect/turf_decal/delivery, @@ -73594,6 +73563,13 @@ }, /turf/open/floor/plating, /area/station/command/gateway) +"xjy" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/item/radio/intercom/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/security/upper) "xjz" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/chair/sofa/corp/right, @@ -74361,6 +74337,12 @@ }, /turf/open/floor/grass, /area/station/medical/pathology) +"xxi" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/closed/wall, +/area/station/maintenance/department/security/upper) "xxk" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/cmo) @@ -99139,9 +99121,9 @@ qNZ jwQ sbO qea -lAU -dcm -lAU +nYX +bxw +nYX nYX nYX nYX @@ -99396,11 +99378,11 @@ vrb vrb vrb kDc -lAU -sKM +nYX +pnR sOq -czv -kQd +tTz +cfQ jhS nYX rKL @@ -99653,7 +99635,7 @@ bCE pcX skH pFr -lAU +nYX upR pRB blu @@ -99910,11 +99892,11 @@ fkL xDc obQ taX -lAU +nYX gSZ wpv guv -eix +tDt xbP nYX cUk @@ -100167,7 +100149,7 @@ lXe xDc xDc xDc -lAU +nYX wgn tOY hUl @@ -100424,9 +100406,9 @@ uAA dLk uAA uwR -lAU -uyD -lAU +nYX +iYw +nYX cme iEU wHo @@ -100683,7 +100665,7 @@ apv hoK vUP iGs -lAU +nYX qsR qsR qsR @@ -101457,7 +101439,7 @@ apv apv apv sYQ -jQE +doA wYq doA soQ @@ -102229,7 +102211,7 @@ jQE aXQ rIb tfn -vkh +doA iET gaC kml @@ -102486,7 +102468,7 @@ ulS sye fNe bDs -vkh +doA gDB eGu ych @@ -102724,8 +102706,8 @@ lbO dcf bWI lbO -hlP -gDW +fWu +eVO cXT auS nrJ @@ -102743,7 +102725,7 @@ uTt tzI fNe rqW -vkh +doA doA ufh ych @@ -103258,17 +103240,17 @@ gDv hQF fNe tuF -qTK -qQg -koE -peT -oNo -ekM -juj -doj -ekM +uTj +tfv +xjy +lzP +tNX +doA +mna +dRs +doA aJK -tdv +kgt obH eeq fhw @@ -103515,18 +103497,18 @@ lUD tzI gWw fQC -kKP -qQg -bza -cTi -ipg -eiY -cTi -uqT -bBr -lRa -nsQ -wWm +xxi +tfv +fWC +qOV +eaI +vny +qOV +hhG +nRP +kiN +sMg +jTW gmG fgb deI @@ -103772,15 +103754,15 @@ lUD tzI fNe uok -vkh -ekM -tBT -drC -kbv -uXZ -pNV -eAa -ekM +doA +doA +jMC +uNA +niB +wYq +wBF +nGG +doA jIA jhg xXz @@ -104030,14 +104012,14 @@ tzI fNe wgX fNI -ekM -ekM -ekM -ekM -ekM -ekM -ekM -ekM +doA +doA +doA +doA +doA +doA +doA +doA ayY ojG wWm @@ -105301,7 +105283,7 @@ hLu hLu hLu hLu -cgW +gyW hLu hLu cEr @@ -107552,7 +107534,7 @@ aeu aeu aeu aeu -ccz +aeu aeu aeu aaa @@ -119877,23 +119859,23 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ohI +acK +acK +acK +acK +acK +acK +ohI +acK +ohI +acK +acK +acK +acK +acK +acK +ohI aaa aaa aaa @@ -120134,23 +120116,23 @@ aaa aaa aaa aaa -aaa -aaa -ohI -acK -acK -acK -acK -acK -ohI -acK -ohI -acK -acK -acK acK +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp acK -ohI aaa aaa aaa @@ -120391,8 +120373,6 @@ aaa aaa aaa aaa -aaa -aaa acK cBp cBp @@ -120407,6 +120387,8 @@ cBp cBp cBp cBp +cBp +cBp acK aaa aeo @@ -120648,8 +120630,6 @@ aaa aaa aaa aaa -aaa -aaa acK cBp cBp @@ -120664,6 +120644,8 @@ cBp cBp cBp cBp +cBp +cBp acK aaa acK @@ -120905,8 +120887,6 @@ aaa aaa aaa aaa -aaa -aaa acK cBp cBp @@ -120921,6 +120901,8 @@ cBp cBp cBp cBp +cBp +cBp acK acK acK @@ -121162,8 +121144,6 @@ aeU aaa aaa aaa -aaa -aaa acK cBp cBp @@ -121178,6 +121158,8 @@ cBp cBp cBp cBp +cBp +cBp acK acK mcE @@ -121419,8 +121401,6 @@ aeU aaa aaa aaa -aaa -aaa acK cBp cBp @@ -121435,6 +121415,8 @@ cBp cBp cBp cBp +cBp +cBp acK mcE mcE @@ -121676,8 +121658,6 @@ aeU aeU aaa aaa -aaa -aaa ohI cBp cBp @@ -121692,6 +121672,8 @@ cBp cBp cBp cBp +cBp +cBp ohI bsf dLM @@ -121933,8 +121915,6 @@ aeu aeU aaa aaa -aaa -aaa acK cBp cBp @@ -121949,9 +121929,11 @@ cBp cBp cBp cBp +cBp +cBp acK bsf -wxG +xbW nCZ tiL izr @@ -122190,8 +122172,6 @@ aUz aeU aaa aaa -aaa -aaa ohI cBp cBp @@ -122206,6 +122186,8 @@ cBp cBp cBp cBp +cBp +cBp ohI bsf xzw @@ -122447,8 +122429,6 @@ aeU aeU aaa aaa -aaa -aaa acK cBp cBp @@ -122463,6 +122443,8 @@ cBp cBp cBp cBp +cBp +cBp acK mcE mcE @@ -122704,8 +122686,6 @@ aeU aeU aaa aaa -aaa -aaa acK cBp cBp @@ -122720,6 +122700,8 @@ cBp cBp cBp cBp +cBp +cBp acK acK mcE @@ -122961,8 +122943,6 @@ aeU aeU aaa aaa -aaa -aaa acK cBp cBp @@ -122977,6 +122957,8 @@ cBp cBp cBp cBp +cBp +cBp acK acK acK @@ -123218,8 +123200,6 @@ aap aaa aaa aaa -aaa -aaa acK cBp cBp @@ -123234,6 +123214,8 @@ cBp cBp cBp cBp +cBp +cBp acK aaa acK @@ -123475,8 +123457,6 @@ aeu aeu aaa aaa -aaa -aaa acK cBp cBp @@ -123491,6 +123471,8 @@ cBp cBp cBp cBp +cBp +cBp acK aaa aaa @@ -123732,23 +123714,23 @@ aeu aeu aeu aaa -aaa -aaa -ohI -acK -acK -acK -acK -acK -ohI -acK -ohI -acK -acK -acK acK +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp +cBp acK -ohI aaa aaa aaa @@ -123989,23 +123971,23 @@ aeu aeu aeu aeu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +ohI +acK +acK +acK +acK +acK +acK +ohI +acK +ohI +acK +acK +acK +acK +acK +acK +ohI aaa aaa aaa diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 38cecb0c9aeb..d4d9cd3fb0cf 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -166,18 +166,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/disposal) -"adG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "adS" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, @@ -465,16 +453,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"aiz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "aiW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -678,6 +656,19 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"amJ" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "amV" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -869,6 +860,11 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/cargo/quartermaster) +"aqd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "aqh" = ( /obj/machinery/door/airlock/maintenance{ name = "Research Maintenance" @@ -896,6 +892,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"aqz" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "aqG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -961,6 +965,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) +"arW" = ( +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) "ase" = ( /obj/machinery/airalarm/directional/west, /obj/effect/mapping_helpers/airalarm/tlv_no_checks, @@ -1061,14 +1069,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"atU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/service/bar/backroom) "atV" = ( /obj/machinery/recharger{ pixel_y = 4 @@ -1120,12 +1120,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) -"auy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/spawner/directional/west, -/turf/open/floor/carpet, -/area/station/service/theater) "auH" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -1337,6 +1331,15 @@ "ayg" = ( /turf/open/floor/engine/o2, /area/station/engineering/atmos) +"ayh" = ( +/obj/machinery/light/small/directional/west, +/obj/item/clothing/mask/animal/horsehead, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/south, +/obj/item/clothing/mask/fakemoustache, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "ayr" = ( /turf/open/floor/iron, /area/station/engineering/break_room) @@ -1415,19 +1418,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"aAb" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Theater - Stage" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/item/radio/intercom/directional/east, -/obj/structure/table/wood, -/obj/item/clothing/glasses/monocle, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater) "aAg" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/disposalpipe/segment, @@ -1713,6 +1703,19 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"aFo" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "aFv" = ( /obj/machinery/newscaster/directional/north, /obj/structure/table/wood, @@ -1760,6 +1763,22 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"aGA" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "aGD" = ( /obj/structure/closet/crate/coffin, /obj/machinery/door/window/left/directional/east{ @@ -1768,6 +1787,12 @@ }, /turf/open/floor/plating, /area/station/service/chapel/funeral) +"aGF" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/iron, +/area/station/commons/lounge) "aGH" = ( /obj/machinery/door/firedoor, /obj/structure/cable, @@ -1937,6 +1962,13 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) +"aIF" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "aIQ" = ( /obj/structure/cable, /obj/machinery/station_map/engineering/directional/west, @@ -2106,11 +2138,6 @@ "aKP" = ( /turf/closed/wall/r_wall, /area/station/engineering/supermatter/room) -"aLk" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "aLr" = ( /obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ dir = 1 @@ -2260,19 +2287,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) -"aNN" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "aNO" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/item/food/grown/harebell, @@ -2439,13 +2453,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/sorting) -"aPV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "aPX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1 @@ -2721,6 +2728,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) +"aUZ" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/small/directional/south, +/obj/machinery/digital_clock/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) "aVd" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2878,25 +2895,21 @@ /obj/effect/turf_decal/trimline/brown/filled/line, /turf/open/floor/iron, /area/station/construction/storage_wing) -"aXt" = ( -/obj/structure/table/wood, -/obj/item/toy/mecha/honk{ - pixel_y = 12 - }, -/obj/item/toy/dummy, -/obj/item/lipstick/purple{ - pixel_x = -2; - pixel_y = -2 +"aXy" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/kitchen, +/obj/effect/mapping_helpers/airlock/access/any/service/bar, +/obj/effect/mapping_helpers/airlock/access/any/service/kitchen, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/obj/item/lipstick/jade{ - pixel_x = 2; - pixel_y = 2 +/obj/machinery/door/airlock/public{ + name = "Kitchen" }, -/obj/item/lipstick/black, -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/theater) +/turf/open/floor/iron, +/area/station/service/kitchen) "aXE" = ( /obj/machinery/door/airlock/maintenance{ name = "Service Maintenance" @@ -3055,6 +3068,12 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"aZs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/closed/wall, +/area/station/service/theater) "aZv" = ( /obj/machinery/door/poddoor/shutters/preopen{ dir = 1; @@ -3098,6 +3117,12 @@ /obj/machinery/duct, /turf/open/floor/stone, /area/station/science/xenobiology) +"bai" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "bau" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -3624,6 +3649,25 @@ /obj/machinery/clonepod, /turf/open/floor/iron/dark, /area/station/science/genetics) +"bkv" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Kitchen" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "bkF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -3940,6 +3984,15 @@ dir = 4 }, /area/station/service/chapel) +"bpt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/gambling, +/obj/effect/spawner/random/entertainment/gambling, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/commons/lounge) "bpu" = ( /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -3978,15 +4031,13 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"bpY" = ( -/obj/machinery/light/small/directional/west, -/obj/item/clothing/mask/animal/horsehead, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/south, -/obj/item/clothing/mask/fakemoustache, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) +"bpT" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "bqk" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/atmos/glass{ @@ -4185,13 +4236,6 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"btI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) "btK" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 1 @@ -4224,6 +4268,18 @@ /obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"buf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/window/spawner/directional/west, +/obj/structure/sign/poster/random/directional/north, +/obj/effect/spawner/random/structure/musician/piano/random_piano, +/turf/open/floor/wood/large, +/area/station/service/theater) "bug" = ( /obj/structure/lattice, /obj/item/tank/internals/oxygen/empty, @@ -4455,15 +4511,6 @@ "bzH" = ( /turf/closed/wall, /area/station/cargo/sorting) -"bzI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/east, -/obj/structure/table/wood, -/obj/item/food/pie/cream, -/turf/open/floor/wood/large, -/area/station/service/theater) "bzO" = ( /obj/structure/table, /obj/machinery/plantgenes, @@ -4600,12 +4647,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/robotics/lab) -"bCk" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) "bCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -4647,6 +4688,17 @@ "bDq" = ( /turf/closed/wall/r_wall, /area/station/engineering/transit_tube) +"bDC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/station/service/theater) "bDK" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 8 @@ -4666,11 +4718,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/fore) -"bDR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/service/theater) "bDW" = ( /turf/closed/wall, /area/station/maintenance/department/engine) @@ -4704,14 +4751,18 @@ /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"bEU" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/computer/slot_machine{ - pixel_y = 2 +"bFe" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "bFr" = ( /obj/item/paper_bin{ pixel_x = -2; @@ -4741,15 +4792,6 @@ "bGC" = ( /turf/closed/wall, /area/station/hallway/primary/central) -"bGJ" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "bGL" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -5017,11 +5059,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"bMp" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/bar/backroom) "bMt" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/reinforced, @@ -5073,16 +5110,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/station/service/bar/backroom) -"bNh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "bNk" = ( /obj/machinery/photocopier, /obj/machinery/camera/directional/east{ @@ -5378,16 +5405,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"bTl" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "bTq" = ( /obj/machinery/camera/motion/directional/south{ c_tag = "AI Upload Chamber - Port"; @@ -5408,6 +5425,13 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron/white, /area/station/command/heads_quarters/rd) +"bTV" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "bUc" = ( /obj/machinery/shower/directional/west, /obj/effect/landmark/start/assistant, @@ -5679,6 +5703,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/engine, /area/station/science/xenobiology) +"cbr" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/station/service/theater) "cbz" = ( /turf/closed/wall, /area/station/cargo/storage) @@ -5875,24 +5906,6 @@ /obj/machinery/air_sensor/ordnance_burn_chamber, /turf/open/floor/engine/vacuum, /area/station/science/ordnance/burnchamber) -"cgR" = ( -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/structure/table, -/obj/item/reagent_containers/cup/beaker/large, -/obj/item/reagent_containers/cup/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/rag{ - pixel_x = -4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "cha" = ( /obj/machinery/door/airlock/research/glass{ name = "Ordnance Lab" @@ -5969,6 +5982,12 @@ /obj/effect/turf_decal/tile/neutral/anticorner/contrasted, /turf/open/floor/iron, /area/station/security/courtroom) +"ciK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ciQ" = ( /obj/machinery/computer/order_console/bitrunning{ dir = 1 @@ -6201,6 +6220,15 @@ /obj/structure/closet/crate/engineering/electrical, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/solars/port/aft) +"cnJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/east, +/obj/structure/table/wood, +/obj/item/food/pie/cream, +/turf/open/floor/wood/large, +/area/station/service/theater) "cnK" = ( /turf/closed/wall, /area/station/engineering/main) @@ -6409,13 +6437,6 @@ /obj/structure/cable, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/medical/coldroom) -"cqI" = ( -/obj/effect/landmark/start/bartender, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "cqQ" = ( /obj/machinery/corral_corner{ mapping_id = "6" @@ -6478,12 +6499,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms) -"crT" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, -/area/station/service/theater) "csb" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 @@ -6608,6 +6623,17 @@ "cur" = ( /turf/open/floor/plating, /area/station/maintenance/fore) +"cuu" = ( +/obj/structure/table/wood, +/obj/item/staff/broom, +/obj/item/wrench, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) "cuw" = ( /obj/effect/landmark/generic_maintenance_landmark, /obj/machinery/shower/directional/south, @@ -6823,12 +6849,6 @@ /obj/structure/sign/poster/random/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) -"cwW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "cwX" = ( /obj/machinery/door/window/brigdoor{ name = "Command Desk"; @@ -7038,19 +7058,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) -"cAx" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/suit/armor/centcom_formal, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "cAB" = ( /obj/machinery/light/directional/west, /obj/structure/extinguisher_cabinet/directional/west, @@ -7110,12 +7117,6 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) -"cBW" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "cCs" = ( /obj/effect/decal/cleanable/dirt, /obj/item/storage/belt/utility/full, @@ -7123,6 +7124,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) +"cCu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) "cCN" = ( /obj/item/stack/sheet/iron/fifty, /obj/item/stack/sheet/iron/fifty, @@ -7204,6 +7211,23 @@ }, /turf/open/floor/iron, /area/station/engineering/main) +"cDX" = ( +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"cEr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "cEv" = ( /obj/item/food/grown/wheat, /obj/item/food/grown/watermelon, @@ -7226,26 +7250,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"cFU" = ( -/obj/machinery/reagentgrinder{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/shaker{ - pixel_x = -6 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Bar - Counter" - }, -/obj/structure/table, -/obj/machinery/requests_console/directional/south{ - department = "Bar"; - name = "Bar Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "cFW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7434,6 +7438,15 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/carpet, /area/station/commons/dorms) +"cKQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) "cLc" = ( /obj/structure/chair/office, /obj/effect/landmark/start/quartermaster, @@ -7480,6 +7493,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/service/library) +"cLD" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) "cLN" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/firealarm/directional/west, @@ -7551,16 +7568,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"cNA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "cNS" = ( /turf/open/floor/iron, /area/station/maintenance/port/aft) @@ -7714,12 +7721,6 @@ /obj/effect/landmark/start/gary, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"cRC" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/closed/wall, -/area/station/service/theater) "cRM" = ( /obj/machinery/growing/soil, /obj/machinery/camera/directional/west{ @@ -8097,6 +8098,26 @@ }, /turf/open/floor/iron, /area/station/medical/medbay/lobby) +"cYI" = ( +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = -6 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Bar - Counter" + }, +/obj/structure/table, +/obj/machinery/requests_console/directional/south{ + department = "Bar"; + name = "Bar Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "cYL" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; @@ -8208,6 +8229,14 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) +"daw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "daz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atm/directional/north, @@ -8233,19 +8262,6 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"daS" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "daT" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, /turf/open/floor/iron, @@ -8307,11 +8323,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) -"dbH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) "dbX" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8332,13 +8343,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/bitden) -"dce" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater) "dcF" = ( /obj/effect/landmark/event_spawn, /obj/effect/decal/cleanable/dirt, @@ -8441,19 +8445,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ded" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/deepfryer, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "deg" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -8541,10 +8532,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) -"dfp" = ( -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "dfB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, @@ -8596,6 +8583,14 @@ "dgD" = ( /turf/closed/wall, /area/station/security/range) +"dgE" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "dgS" = ( /obj/machinery/rnd/production/techfab/department/security, /turf/open/floor/iron/dark, @@ -8662,6 +8657,21 @@ }, /turf/open/floor/iron, /area/station/construction/storage_wing) +"dhE" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron, +/area/station/command/heads_quarters/blueshield) "dhF" = ( /obj/machinery/smartfridge/organ, /turf/open/floor/iron/dark, @@ -8728,6 +8738,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central) +"diU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "diX" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/iron/dark, @@ -9333,6 +9351,14 @@ "duI" = ( /turf/closed/wall, /area/station/command/bridge) +"dvh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "dvk" = ( /obj/structure/table, /obj/machinery/light/directional/west, @@ -9702,13 +9728,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"dDq" = ( -/obj/effect/landmark/start/bartender, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "dDx" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -9937,24 +9956,17 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) -"dHV" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/effect/landmark/navigate_destination, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron, -/area/station/command/heads_quarters/blueshield) "dIy" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/central) +"dIz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "dIA" = ( /obj/structure/rack, /obj/item/wrench/medical, @@ -9999,6 +10011,13 @@ /obj/machinery/door/window/right/directional/west, /turf/open/floor/wood, /area/station/command/heads_quarters/captain/private) +"dJj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "dJK" = ( /turf/open/floor/iron/stairs/right{ dir = 1 @@ -10179,16 +10198,6 @@ /obj/machinery/bluespace_vendor/directional/south, /turf/open/floor/iron, /area/station/commons/locker) -"dLY" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/soap, -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood/large, -/area/station/service/theater) "dMb" = ( /obj/structure/table, /obj/item/analyzer, @@ -10263,14 +10272,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/storage) -"dMX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "dNw" = ( /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, @@ -10632,10 +10633,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/commons/locker) -"dTD" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/wood, -/area/station/commons/lounge) "dTK" = ( /obj/machinery/holopad/secure{ pixel_x = 9; @@ -10820,10 +10817,6 @@ /obj/effect/spawner/random/trash/garbage, /turf/open/floor/plating, /area/station/security/prison/safe) -"dXE" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/service/theater) "dXH" = ( /obj/structure/chair, /obj/effect/landmark/start/assistant, @@ -10933,6 +10926,18 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white, /area/station/science/explab) +"dZj" = ( +/obj/structure/table, +/obj/item/scissors{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/razor{ + pixel_x = 6; + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "dZm" = ( /turf/closed/wall, /area/station/commons/storage/tools) @@ -11053,6 +11058,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/primary/central) +"eaL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/theater) "eaN" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -11083,13 +11094,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"ebq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "ebr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=0-SecurityDesk"; @@ -11328,15 +11332,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos/pumproom) -"efg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/lounge) "eft" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/structure/closet/secure_closet/security/sec, @@ -11355,6 +11350,13 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"efV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) "efY" = ( /obj/structure/chair/office{ dir = 1 @@ -11448,6 +11450,13 @@ /obj/machinery/atmospherics/components/unary/bluespace_sender, /turf/open/floor/iron, /area/station/engineering/atmos) +"egW" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ehg" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 @@ -11752,6 +11761,14 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"elE" = ( +/obj/machinery/smartfridge/drinks, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) "elJ" = ( /turf/closed/wall/r_wall, /area/station/science/server) @@ -12003,14 +12020,6 @@ /obj/effect/landmark/start/assistant, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"epO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "epW" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -12153,16 +12162,6 @@ "esk" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tcomms) -"esv" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "esH" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -12235,6 +12234,19 @@ /obj/structure/light_construct/small/directional/east, /turf/open/floor/wood, /area/station/maintenance/port/aft) +"etz" = ( +/obj/structure/window/spawner/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/item/clothing/glasses/regular/hipster{ + name = "Hipster Glasses" + }, +/turf/open/floor/wood/large, +/area/station/service/theater) "etA" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -12525,6 +12537,16 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/pathology) +"eyP" = ( +/obj/effect/landmark/start/clown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) +"eyT" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "ezb" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/filingcabinet{ @@ -12573,13 +12595,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/service/bar) -"eAk" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "eAL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -12660,13 +12675,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/captain, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) -"eCQ" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) "eCS" = ( /obj/machinery/door/airlock/external{ name = "Space Shack" @@ -12769,10 +12777,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) -"eEN" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) "eEV" = ( /obj/effect/turf_decal/box/white{ color = "#52B4E9" @@ -12850,6 +12854,14 @@ /obj/effect/spawner/random/vending/colavend, /turf/open/floor/iron, /area/station/hallway/primary/port) +"eHL" = ( +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/station/commons/lounge) "eHR" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -12860,20 +12872,28 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"eIw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "eIy" = ( /obj/structure/cable, /obj/machinery/photocopier, /turf/open/floor/carpet, /area/station/command/heads_quarters/hop) +"eIA" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -6; + pixel_y = 5 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "eIO" = ( /turf/closed/wall, /area/station/maintenance/department/medical/central) @@ -13528,6 +13548,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) +"eVV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/mirror/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "eVX" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -13574,11 +13599,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmospherics_engine) -"eWG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/mirror/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) "eWO" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -13833,6 +13853,14 @@ dir = 1 }, /area/station/science/lobby) +"fan" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/station/service/theater) "fao" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/flora/bush/sparsegrass/style_random, @@ -13992,18 +14020,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/corner, /area/station/engineering/atmos) -"feQ" = ( -/obj/structure/table/wood, -/obj/item/lipstick{ - pixel_y = 5 - }, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/theater) "feV" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/latex, @@ -14052,6 +14068,23 @@ /obj/effect/landmark/start/security_assistant, /turf/open/floor/iron, /area/station/security/brig) +"ffs" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/kitchen) "ffv" = ( /obj/structure/table, /obj/item/plate, @@ -14093,12 +14126,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"fge" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/wood/poker, -/turf/open/floor/wood, -/area/station/commons/lounge) "fgl" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -14360,6 +14387,15 @@ /obj/machinery/power/port_gen/pacman/pre_loaded, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"fjf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "fjn" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -14369,6 +14405,12 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/port) +"fjq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) "fjD" = ( /turf/closed/wall, /area/station/commons/toilet/auxiliary) @@ -14377,12 +14419,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron, /area/station/cargo/sorting) -"fjY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) "fkb" = ( /obj/effect/turf_decal/tile/yellow{ dir = 4 @@ -14418,6 +14454,16 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"fks" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "fkC" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -14709,6 +14755,11 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/storage) +"foU" = ( +/obj/structure/window/spawner/directional/west, +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/service/theater) "fpi" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -14780,6 +14831,14 @@ /obj/item/storage/secure/briefcase, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"fqM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "fqN" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -14965,6 +15024,15 @@ /obj/effect/landmark/start/gary, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"fvd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/cook, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "fvB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -15000,6 +15068,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"fwt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) "fwz" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /turf/open/floor/iron/dark, @@ -15388,6 +15462,14 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"fFc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/bar/backroom) "fFi" = ( /obj/machinery/computer/crew{ dir = 4 @@ -15996,10 +16078,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"fQT" = ( -/obj/effect/landmark/start/mime, -/turf/open/floor/carpet, -/area/station/service/theater) "fQW" = ( /obj/machinery/door/airlock/mining/glass{ name = "Mining Dock" @@ -16112,6 +16190,15 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"fSN" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance/three, +/obj/item/clothing/mask/cigarette/pipe{ + pixel_x = 0; + pixel_y = 16 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) "fTm" = ( /obj/machinery/door/airlock/security/glass{ name = "Permabrig Visitation" @@ -16137,6 +16224,14 @@ }, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"fTy" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light/floor, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "fTE" = ( /obj/machinery/duct, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -16213,18 +16308,20 @@ /obj/effect/turf_decal/tile/brown/half/contrasted, /turf/open/floor/iron, /area/station/cargo/sorting) -"fVr" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 +"fVy" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" }, -/obj/machinery/firealarm/directional/south, -/obj/structure/table/wood, -/obj/item/stack/sheet/cloth/ten, -/obj/item/toy/crayon/spraycan, -/obj/item/stack/rods/ten, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/large, -/area/station/service/theater) +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/kitchen) "fVA" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -16292,6 +16389,19 @@ "fWA" = ( /turf/closed/wall/r_wall, /area/station/maintenance/starboard/greater) +"fWC" = ( +/obj/machinery/button/door/directional/east{ + id = "kitchen_counter"; + name = "Kitchen Counter Shutters Control"; + req_access = list("kitchen") + }, +/obj/structure/table, +/obj/machinery/processor{ + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "fWE" = ( /obj/structure/table/wood/fancy/green, /obj/item/storage/secure/safe/directional/north, @@ -16594,27 +16704,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"gbq" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/south{ - pixel_x = -6 - }, -/obj/machinery/button/door/directional/south{ - id = "kitchen_service"; - name = "Service Shutter Control"; - pixel_x = 6; - req_access = list("kitchen") - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "gbG" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/item/storage/box/lights/mixed, @@ -16677,11 +16766,6 @@ }, /turf/open/floor/grass, /area/station/science/research) -"gcW" = ( -/obj/structure/window/spawner/directional/west, -/obj/machinery/light/floor, -/turf/open/floor/carpet, -/area/station/service/theater) "gdb" = ( /turf/closed/wall/r_wall, /area/station/security/range) @@ -16888,16 +16972,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"ghq" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/holopad, -/turf/open/floor/carpet, -/area/station/service/theater) -"ghw" = ( -/obj/effect/landmark/start/clown, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) "ghK" = ( /obj/structure/rack, /obj/item/tank/internals/oxygen, @@ -17011,16 +17085,6 @@ /obj/machinery/vending/wardrobe/jani_wardrobe, /turf/open/floor/iron, /area/station/service/janitor) -"gjH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "gjN" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 4 @@ -17125,14 +17189,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"glJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/carpet, -/area/station/service/theater) "glW" = ( /obj/structure/showcase/machinery/microwave{ dir = 1; @@ -17298,6 +17354,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/solars/port/aft) +"gnR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/service/theater) "gnS" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -17449,6 +17514,12 @@ }, /turf/open/floor/plating, /area/station/science/genetics) +"gqp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/commons/lounge) "gqr" = ( /obj/machinery/conveyor{ dir = 1; @@ -17756,15 +17827,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/locker) -"gwc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "gwd" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -17817,6 +17879,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos) +"gxf" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/commons/lounge) "gxn" = ( /obj/structure/nestbox, /turf/open/floor/sandy_dirt, @@ -18311,6 +18378,13 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"gHx" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "gHE" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -18555,6 +18629,11 @@ /obj/effect/landmark/start/scientist, /turf/open/floor/iron/white/smooth_large, /area/station/science/explab) +"gMb" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/chair/stool/directional/south, +/turf/open/floor/wood, +/area/station/commons/lounge) "gMc" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral, @@ -18585,6 +18664,12 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"gMz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/spawner/directional/west, +/turf/open/floor/carpet, +/area/station/service/theater) "gMA" = ( /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 1 @@ -18909,12 +18994,6 @@ /obj/machinery/station_map/engineering/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"gTc" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "gTh" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -19052,13 +19131,6 @@ /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"gUM" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, -/obj/effect/turf_decal/delivery, -/obj/machinery/light_switch/directional/north, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "gUP" = ( /obj/structure/chair{ dir = 1 @@ -19084,12 +19156,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"gVa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) "gVj" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/yellow{ @@ -19136,17 +19202,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/brig) -"gWh" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"gWl" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "gWn" = ( /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, @@ -19203,33 +19258,10 @@ /obj/item/restraints/handcuffs, /turf/open/floor/carpet, /area/station/security/detectives_office) -"gXj" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/theater) "gXl" = ( /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/floor/grass, /area/station/medical/pathology) -"gXo" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "gXp" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, @@ -19621,6 +19653,32 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, /turf/closed/wall, /area/station/engineering/atmos/pumproom) +"hdw" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = 7; + pixel_y = 2 + }, +/obj/item/pen/fountain{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/stamp{ + pixel_x = -1; + pixel_y = 17 + }, +/obj/item/stamp/denied{ + pixel_x = -9; + pixel_y = 12 + }, +/obj/item/phone{ + pixel_x = -5; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "hdx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19657,6 +19715,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"hdY" = ( +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "hdZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -19857,11 +19921,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/storage/tech) -"hhN" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "hio" = ( /obj/effect/turf_decal/tile/bar, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -19903,6 +19962,16 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) +"hiG" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Bar - Starboard" + }, +/obj/structure/cable, +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "hiM" = ( /obj/machinery/food_cart, /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ @@ -20247,6 +20316,11 @@ "hmM" = ( /turf/open/floor/sandy_dirt, /area/station/service/hydroponics) +"hmR" = ( +/obj/structure/table, +/obj/structure/cable, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "hne" = ( /obj/machinery/door/window/brigdoor{ name = "Justice Chamber"; @@ -20412,6 +20486,10 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"hpo" = ( +/obj/structure/table, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "hps" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/camera/directional/north{ @@ -20436,6 +20514,16 @@ }, /turf/open/floor/iron, /area/station/science/robotics/mechbay) +"hqg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "hqj" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) @@ -20478,39 +20566,10 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"hqW" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -6; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "hrh" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, /turf/open/floor/iron/dark/airless, /area/station/science/ordnance/freezerchamber) -"hri" = ( -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) "hrG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20523,15 +20582,6 @@ /obj/structure/cable, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) -"hrM" = ( -/obj/machinery/vending/boozeomat, -/obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = -28 - }, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "hsp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -20540,11 +20590,6 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/maintenance/solars/port/fore) -"hsE" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/wood, -/area/station/commons/lounge) "hsF" = ( /obj/machinery/door/airlock{ id_tag = "AuxToilet3"; @@ -20558,6 +20603,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/service/chapel) +"hsW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Kitchen Window"; + req_access = list("kitchen") + }, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen_service"; + name = "Service Shutter" + }, +/obj/item/pen, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) "hsZ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/wood, @@ -20638,6 +20700,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) +"htQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/poker, +/turf/open/floor/wood, +/area/station/commons/lounge) "htS" = ( /obj/structure/fluff/iced_abductor, /turf/open/misc/asteroid/basalt/airless, @@ -20660,6 +20728,20 @@ dir = 1 }, /area/station/engineering/atmos) +"hua" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "huj" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, @@ -20998,11 +21080,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/port) -"hyX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "hyZ" = ( /obj/machinery/flasher/directional/east{ id = "AI"; @@ -21060,12 +21137,6 @@ /obj/structure/cable, /turf/open/floor/iron/white, /area/station/science/cytology) -"hAc" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/bar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "hAk" = ( /obj/structure/cable, /obj/effect/landmark/start/hangover, @@ -21715,12 +21786,6 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"hNC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) "hND" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -21862,6 +21927,15 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"hQN" = ( +/obj/effect/landmark/navigate_destination/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/reagent_containers/cup/rag, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "hQT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21925,6 +21999,15 @@ /obj/effect/landmark/start/cargo_technician, /turf/open/floor/iron, /area/station/cargo/sorting) +"hRF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "hRQ" = ( /obj/machinery/disposal/bin{ pixel_x = -2; @@ -22151,10 +22234,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"hWo" = ( -/obj/structure/chair/wood/wings, -/turf/open/floor/carpet, -/area/station/service/theater) "hWx" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -22444,19 +22523,6 @@ "hZQ" = ( /turf/closed/wall/r_wall, /area/station/maintenance/port/fore) -"hZR" = ( -/obj/machinery/door/airlock/corporate{ - id_tag = "Repdoor"; - name = "Representative's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/obj/effect/landmark/navigate_destination, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "hZV" = ( /turf/closed/wall/r_wall, /area/station/medical/morgue) @@ -22571,22 +22637,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/purple/visible, /turf/closed/wall, /area/station/engineering/atmos) -"ici" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/door/airlock/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) "icj" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22786,10 +22836,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"iga" = ( -/obj/item/kirbyplants/potty, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "ign" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -22836,12 +22882,6 @@ }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"igQ" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "igS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -22955,16 +22995,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/plating, /area/station/maintenance/fore) -"iin" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Bar - Starboard" - }, -/obj/structure/cable, -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "iio" = ( /obj/effect/turf_decal/tile/purple/fourcorners, /obj/machinery/door/airlock/command{ @@ -22998,6 +23028,12 @@ /obj/machinery/air_sensor/mix_tank, /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) +"iiZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "ije" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -23010,6 +23046,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/service/hydroponics) +"ijC" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) "ijF" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/mess, @@ -23258,18 +23298,6 @@ /obj/item/pai_card, /turf/open/floor/wood, /area/station/service/library) -"inI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "inL" = ( /obj/machinery/status_display/evac/directional/north, /obj/effect/turf_decal/stripes/line{ @@ -23768,21 +23796,10 @@ }, /turf/open/floor/iron/kitchen_coldroom/freezerfloor, /area/station/service/kitchen/coldroom) -"iuM" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination/kitchen, -/obj/effect/mapping_helpers/airlock/access/any/service/bar, -/obj/effect/mapping_helpers/airlock/access/any/service/kitchen, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/airlock/public{ - name = "Kitchen" - }, -/turf/open/floor/iron, -/area/station/service/kitchen) +"iuP" = ( +/obj/item/kirbyplants/potty, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "iva" = ( /obj/machinery/door/airlock/maintenance{ name = "Security Maintenance" @@ -24249,11 +24266,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"iCY" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iCZ" = ( /obj/machinery/corral_corner{ mapping_id = "6" @@ -24283,17 +24295,6 @@ /obj/effect/landmark/start/security_officer, /turf/open/floor/iron/dark, /area/station/security/range) -"iDC" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/wood, -/area/station/service/theater) "iDG" = ( /obj/structure/table, /obj/item/stock_parts/scanning_module{ @@ -24477,18 +24478,6 @@ /obj/item/modular_computer/laptop/preset/civilian, /turf/open/floor/wood, /area/station/service/cafeteria) -"iHh" = ( -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iHn" = ( /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 4 @@ -24544,22 +24533,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) -"iIT" = ( -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/requests_console/directional/south{ - department = "Kitchen"; - name = "Kitchen Requests Console" - }, -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo" - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "iIW" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/yellow, @@ -24684,23 +24657,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"iJM" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/kitchen) "iKh" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24789,6 +24745,12 @@ }, /turf/open/floor/iron, /area/station/security/brig) +"iLL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/wood, +/area/station/commons/lounge) "iLV" = ( /obj/structure/table/wood/fancy/orange, /obj/item/clothing/mask/cigarette/cigar{ @@ -25183,6 +25145,24 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"iQJ" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker/large, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "iQO" = ( /obj/machinery/firealarm/directional/west, /obj/structure/sink/directional/east, @@ -25524,6 +25504,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, /area/station/commons/dorms) +"iVn" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "iVs" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -26355,12 +26342,6 @@ }, /turf/open/floor/iron/freezer, /area/station/hallway/primary/aft) -"jjF" = ( -/obj/structure/table/reinforced, -/obj/item/holosign_creator/robot_seat/bar, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "jjL" = ( /obj/machinery/light/small/directional/east, /obj/machinery/computer/security/telescreen/entertainment/directional/east, @@ -26468,6 +26449,11 @@ "jlU" = ( /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"jlV" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/bar/backroom) "jlY" = ( /obj/structure/urinal/directional/north, /obj/effect/landmark/start/hangover, @@ -26576,10 +26562,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"job" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "joj" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -26822,10 +26804,6 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) -"jsn" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/commons/lounge) "jso" = ( /obj/structure/cable, /obj/machinery/door/firedoor, @@ -27364,6 +27342,14 @@ /obj/machinery/light/floor/has_bulb, /turf/open/floor/stone, /area/station/science/xenobiology) +"jzy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "jzC" = ( /obj/machinery/door/window/right/directional/north{ dir = 8; @@ -28128,17 +28114,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"jNV" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/large, -/area/station/service/theater) "jNX" = ( /obj/structure/window/reinforced/spawner/directional/north, /mob/living/carbon/human/species/monkey, @@ -28440,6 +28415,22 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"jTf" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/kitchen/rollingpin, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "jTy" = ( /obj/structure/table/wood, /obj/item/book/granter/action/spell/smoke/lesser{ @@ -28461,6 +28452,10 @@ /obj/machinery/pdapainter/security, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"jTM" = ( +/obj/effect/landmark/start/mime, +/turf/open/floor/carpet, +/area/station/service/theater) "jTN" = ( /obj/machinery/portable_atmospherics/pump, /obj/effect/turf_decal/siding/purple{ @@ -28963,12 +28958,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/bridge) -"kcs" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) "kcu" = ( /obj/structure/table, /obj/item/stack/sheet/iron{ @@ -29179,14 +29168,6 @@ /obj/machinery/light/floor/has_bulb, /turf/open/floor/engine, /area/station/science/xenobiology) -"khA" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "khD" = ( /obj/machinery/door/airlock/maintenance{ name = "Crematorium Maintenance" @@ -29256,6 +29237,15 @@ }, /turf/open/floor/iron, /area/mine/maintenance/public) +"kjz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "kjG" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 1 @@ -29519,6 +29509,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"knR" = ( +/obj/structure/table/wood, +/obj/item/lipstick{ + pixel_y = 5 + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/theater) "knT" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Post - Cargo" @@ -29872,16 +29874,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"ktP" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "ktW" = ( /obj/structure/showcase/cyborg/old{ dir = 8; @@ -29931,13 +29923,6 @@ /obj/machinery/vending/cigarette, /turf/open/floor/iron/dark, /area/station/hallway/primary/aft) -"kuA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/theater) "kuB" = ( /obj/structure/window/spawner/directional/east, /turf/open/floor/iron/dark, @@ -30373,6 +30358,10 @@ "kCZ" = ( /turf/closed/wall, /area/station/service/hydroponics) +"kDw" = ( +/obj/effect/landmark/start/hangover, +/turf/open/floor/carpet, +/area/station/service/theater) "kDG" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -30613,6 +30602,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) +"kJy" = ( +/obj/structure/chair/wood/wings, +/turf/open/floor/carpet, +/area/station/service/theater) "kJH" = ( /obj/structure/table/wood, /obj/machinery/light/directional/south, @@ -30842,26 +30835,11 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"kND" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "kNO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /obj/effect/turf_decal/trimline/yellow/filled/end, /turf/open/floor/iron/textured, /area/station/medical/medbay/central) -"kNT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/station/service/theater) "kNV" = ( /obj/machinery/door/airlock/engineering{ name = "Port Quarter Solar Access" @@ -30990,6 +30968,12 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/engineering) +"kPx" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) "kPA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/box, @@ -31710,6 +31694,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/security/prison/visit) +"lbw" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/station/service/theater) "lbH" = ( /mob/living/basic/chicken{ name = "Featherbottom"; @@ -31862,19 +31850,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/solars/starboard/fore) -"leJ" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/item/clothing/glasses/regular/hipster{ - name = "Hipster Glasses" - }, -/turf/open/floor/wood/large, -/area/station/service/theater) "lfc" = ( /obj/machinery/newscaster/directional/north, /obj/effect/turf_decal/stripes/corner{ @@ -32001,6 +31976,14 @@ /obj/item/storage/medkit/brute, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"lhz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/station/service/theater) "lhD" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/spawner/random/trash/janitor_supplies, @@ -32481,15 +32464,6 @@ /obj/item/stock_parts/cell/high, /turf/open/floor/iron/white, /area/station/medical/pharmacy) -"loh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "lop" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -33254,9 +33228,6 @@ /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/iron, /area/station/cargo/sorting) -"lBA" = ( -/turf/open/floor/wood/large, -/area/station/commons/lounge) "lBN" = ( /obj/structure/table, /obj/effect/turf_decal/delivery, @@ -33515,17 +33486,6 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"lIB" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/entertainment/lighter, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/bar) "lIM" = ( /obj/structure/table, /obj/item/stack/package_wrap{ @@ -33620,6 +33580,16 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"lKz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/soap, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/service/theater) "lKA" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden{ dir = 6 @@ -33745,6 +33715,11 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"lMd" = ( +/obj/structure/sink/kitchen/directional/west, +/mob/living/basic/goat/pete, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "lMq" = ( /turf/open/misc/asteroid/basalt/airless, /area/space/nearstation) @@ -33872,6 +33847,22 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/genetics) +"lOw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) +"lOB" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/lounge) "lOK" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -34124,10 +34115,29 @@ /obj/structure/sign/directions/ptl/directional/north, /turf/open/floor/iron/dark, /area/station/engineering/break_room) +"lSt" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Kitchen - Cold Room" + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) "lSw" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/science/cytology) +"lSx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "lSz" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -34139,6 +34149,11 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"lTh" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "lTj" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -34575,14 +34590,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"lYR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "lYY" = ( /obj/machinery/duct, /obj/machinery/corral_corner{ @@ -34655,6 +34662,10 @@ /obj/item/book/codex_gigas, /turf/open/floor/iron/vaporwave, /area/station/service/library) +"maF" = ( +/obj/structure/closet/secure_closet/nanotrasen_representative, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "maJ" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, @@ -34737,15 +34748,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"mcn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/griddle, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "mcP" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -34816,6 +34818,18 @@ /obj/machinery/status_display/evac/directional/south, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"mex" = ( +/obj/machinery/door/airlock{ + name = "Theater Stage" + }, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "mez" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -35089,6 +35103,12 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"miQ" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "miX" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -35309,36 +35329,6 @@ }, /turf/open/floor/iron, /area/station/commons/fitness/recreation) -"mnq" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/pen/fountain{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/stamp/centcom{ - pixel_x = 9; - pixel_y = 17 - }, -/obj/item/stamp{ - pixel_x = -1; - pixel_y = 17 - }, -/obj/item/stamp/denied{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/phone{ - pixel_x = -5; - pixel_y = -2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "mnx" = ( /obj/structure/sign/directions/evac{ pixel_y = 1 @@ -35467,11 +35457,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) -"mpx" = ( -/obj/structure/sink/kitchen/directional/west, -/mob/living/basic/goat/pete, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "mpC" = ( /obj/structure/rack, /obj/item/clothing/under/rank/prisoner, @@ -35599,6 +35584,24 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) +"msq" = ( +/obj/machinery/light_switch/directional/west{ + pixel_y = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/holosign_creator/robot_seat/restaurant, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "mst" = ( /obj/effect/landmark/start/gary, /turf/open/floor/plating, @@ -35611,14 +35614,6 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"msT" = ( -/obj/structure/table, -/obj/item/food/dough, -/obj/item/knife{ - pixel_x = -13 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "msW" = ( /obj/machinery/light/directional/north, /obj/structure/sign/warning/secure_area/directional/north, @@ -35712,11 +35707,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"mtX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "mue" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -35792,6 +35782,12 @@ /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/station/science/explab) +"mva" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/mob/living/carbon/human/species/monkey/punpun, +/turf/open/floor/iron, +/area/station/service/bar) "mvg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35800,18 +35796,6 @@ }, /turf/open/floor/carpet, /area/station/service/library) -"mvk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) "mvR" = ( /turf/closed/wall/r_wall, /area/station/science/lab) @@ -35883,12 +35867,6 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) -"mwS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) "mxg" = ( /obj/machinery/shower/directional/west, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -35957,16 +35935,6 @@ /obj/effect/landmark/start/depsec/science, /turf/open/floor/iron, /area/station/security/checkpoint/science) -"myG" = ( -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/turf/closed/wall, -/area/station/commons/lounge) "myH" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 1 @@ -36086,6 +36054,19 @@ }, /turf/open/floor/iron/freezer, /area/station/security/prison/shower) +"mAk" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Theater - Stage" + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/obj/structure/table/wood, +/obj/item/clothing/glasses/monocle, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) "mAm" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ @@ -36235,6 +36216,22 @@ /obj/item/kirbyplants/random/dead, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"mCq" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/requests_console/directional/south{ + department = "Kitchen"; + name = "Kitchen Requests Console" + }, +/obj/effect/mapping_helpers/requests_console/supplies, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "mCL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -36358,14 +36355,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) -"mFj" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/camera/directional/north{ - c_tag = "Bar - Fore" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "mFm" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37166,6 +37155,16 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/medical/medbay/lobby) +"mTm" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "mTp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -37237,6 +37236,27 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/atmos, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"mUO" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/south{ + pixel_x = -6 + }, +/obj/machinery/button/door/directional/south{ + id = "kitchen_service"; + name = "Service Shutter Control"; + pixel_x = 6; + req_access = list("kitchen") + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "mUQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -38110,13 +38130,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"njC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/cigarette, -/turf/open/floor/wood, -/area/station/commons/lounge) "njE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -38232,6 +38245,11 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/security/office) +"nlu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) "nlL" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -38638,6 +38656,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"nru" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "nrG" = ( /obj/machinery/light/directional/west, /obj/machinery/recharge_station, @@ -38742,12 +38773,14 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/iron/white, /area/station/science/lab) -"ntj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 +"nti" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) +/obj/machinery/light/floor, +/turf/open/floor/wood, +/area/station/commons/lounge) "ntk" = ( /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 8 @@ -39007,15 +39040,6 @@ /obj/structure/bookcase/random/reference, /turf/open/floor/wood, /area/station/service/library) -"nxA" = ( -/obj/effect/landmark/navigate_destination/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/reagent_containers/cup/rag, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "nxF" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -39292,15 +39316,6 @@ }, /turf/open/floor/iron/white/smooth_large, /area/station/medical/surgery/aft) -"nCd" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/lounge) "nCs" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -39356,6 +39371,10 @@ }, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"nDE" = ( +/obj/item/kirbyplants/organic/plant10, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "nDP" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -39544,12 +39563,6 @@ /obj/structure/easel, /turf/open/floor/plating, /area/station/maintenance/disposal) -"nIo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) "nIP" = ( /obj/structure/table/glass, /obj/item/paper_bin{ @@ -39635,20 +39648,6 @@ /obj/effect/turf_decal/trimline/red/filled/corner, /turf/open/floor/iron, /area/station/security/brig) -"nJY" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/desk_bell{ - pixel_x = 7 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/kitchen) "nKr" = ( /obj/docking_port/stationary{ dir = 8; @@ -39943,6 +39942,15 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"nPh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/griddle, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "nPt" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39962,6 +39970,16 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/prison/garden) +"nQb" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "nQh" = ( /obj/structure/window/spawner/directional/west, /obj/machinery/conveyor{ @@ -40093,6 +40111,15 @@ "nSe" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"nSf" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "nSs" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 @@ -40265,6 +40292,9 @@ /obj/item/bouquet/poppy, /turf/open/floor/plating/airless, /area/space/nearstation) +"nVW" = ( +/turf/open/floor/wood/large, +/area/station/commons/lounge) "nWh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40291,6 +40321,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"nWs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "nWu" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment{ @@ -40655,6 +40693,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/office) +"ocs" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ocv" = ( /obj/structure/table/wood/fancy/green, /obj/structure/statue/bronze/marx{ @@ -40772,13 +40816,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/catwalk_floor/iron_dark, /area/station/maintenance/solars/port/fore) -"oeQ" = ( -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "oeR" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, @@ -40881,12 +40918,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/iron/dark, /area/station/maintenance/aft/lesser) -"ogs" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/iron, -/area/station/commons/lounge) "ogF" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -40927,16 +40958,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ohn" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/siding/wood, -/obj/effect/landmark/start/clown, -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater) "ohp" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -41173,6 +41194,18 @@ /obj/structure/sign/poster/random/directional/south, /turf/open/floor/plating, /area/station/hallway/secondary/service) +"olX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/food/pie/cream, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/kitchen) "ome" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41252,6 +41285,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"onP" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) "oog" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -41410,6 +41449,12 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) +"oqq" = ( +/obj/structure/table/reinforced, +/obj/item/holosign_creator/robot_seat/bar, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "oqK" = ( /obj/structure/rack, /obj/item/clothing/suit/hazardvest, @@ -41572,6 +41617,13 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"otc" = ( +/obj/structure/cable, +/obj/machinery/door/window/right/directional/west{ + name = "Theater Stage" + }, +/turf/open/floor/carpet, +/area/station/service/theater) "ote" = ( /obj/structure/table, /obj/item/computer_disk{ @@ -41622,6 +41674,11 @@ }, /turf/open/floor/holofloor/dark, /area/station/science/cytology) +"ouf" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) "oul" = ( /obj/effect/turf_decal/tile/bar, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -41800,12 +41857,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/medical/office) -"owi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "owv" = ( /obj/machinery/computer/atmos_alert, /obj/effect/turf_decal/tile/brown/half/contrasted{ @@ -41927,6 +41978,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"oyQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood, +/area/station/commons/lounge) "ozi" = ( /obj/machinery/disposal/bin, /obj/machinery/camera/directional/east{ @@ -43004,6 +43062,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/gravity_generator) +"oUb" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "oUh" = ( /obj/structure/reagent_dispensers/watertank, /obj/effect/turf_decal/stripes/corner{ @@ -43165,19 +43234,6 @@ /obj/effect/mapping_helpers/airlock/access/any/command/hop, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) -"oXd" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "oXl" = ( /obj/machinery/telecomms/server/presets/science, /turf/open/floor/circuit/telecomms/mainframe, @@ -43591,24 +43647,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/heads_quarters/captain/private) -"pek" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock{ - name = "Theater Backstage" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/theatre, -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/door/firedoor, -/turf/open/floor/wood, -/area/station/service/theater) -"peF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/wood, -/area/station/commons/lounge) "peM" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos/storage/gas) @@ -43716,6 +43754,12 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"pgT" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) "pgU" = ( /obj/structure/chair{ dir = 4 @@ -44001,24 +44045,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/pathology) -"pmZ" = ( -/obj/machinery/light_switch/directional/west{ - pixel_y = 26 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pnc" = ( /obj/structure/window/spawner/directional/south, /obj/machinery/door/window/right/directional/east{ @@ -44102,12 +44128,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"pof" = ( -/obj/structure/table/reinforced, -/obj/effect/spawner/random/entertainment/lighter, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "pom" = ( /turf/open/floor/iron, /area/station/engineering/storage_shared) @@ -44144,6 +44164,15 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"pph" = ( +/obj/structure/cable, +/obj/structure/table, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "ppB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -44633,15 +44662,6 @@ /obj/item/gavelhammer, /turf/open/floor/iron, /area/station/security/courtroom) -"pyc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/gambling, -/obj/effect/spawner/random/entertainment/gambling, -/obj/effect/spawner/random/entertainment/gambling, -/turf/open/floor/wood, -/area/station/commons/lounge) "pyd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -44780,12 +44800,6 @@ }, /turf/open/floor/wood, /area/station/service/cafeteria) -"pAr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "pAW" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ dir = 4 @@ -45045,6 +45059,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"pGg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/closed/wall, +/area/station/service/theater) "pGn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -45190,9 +45210,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/engineering/atmos/storage/gas) -"pIz" = ( -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "pID" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -45312,14 +45329,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/station/tcommsat/computer) -"pKw" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/station/commons/lounge) "pKB" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/mining, @@ -45551,6 +45560,20 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/cult, /area/station/service/chapel/funeral) +"pPb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/smartfridge/food, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/turf/open/floor/iron, +/area/station/service/kitchen) "pPl" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -45607,6 +45630,15 @@ }, /turf/open/floor/stone, /area/station/science/xenobiology) +"pQl" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) "pQo" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ dir = 5 @@ -45709,6 +45741,16 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/command) +"pRc" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/service/bar) "pRe" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -46114,13 +46156,6 @@ /obj/effect/landmark/navigate_destination/library, /turf/open/floor/carpet, /area/station/service/library) -"pZQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) "qad" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -46300,22 +46335,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron, /area/station/service/hydroponics/garden) -"qdI" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "qdT" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -46363,6 +46382,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"qeG" = ( +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "qeJ" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, @@ -46565,6 +46593,10 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"qhd" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall, +/area/station/commons/lounge) "qhx" = ( /obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/tile/purple, @@ -46659,6 +46691,10 @@ /obj/effect/turf_decal/stripes/white/line, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) +"qiU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "qiY" = ( /obj/machinery/growing/tray, /obj/effect/turf_decal/bot, @@ -46714,6 +46750,11 @@ }, /turf/open/floor/plating, /area/station/medical/abandoned) +"qkk" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/holopad, +/turf/open/floor/carpet, +/area/station/service/theater) "qkl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -46902,6 +46943,20 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/circuits) +"qnf" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/structure/desk_bell{ + pixel_x = 7 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/kitchen) "qnj" = ( /obj/structure/window/spawner/directional/west, /turf/open/floor/grass, @@ -47000,6 +47055,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"qom" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "qos" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -47187,15 +47246,6 @@ /obj/machinery/newscaster/directional/south, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"qrO" = ( -/obj/machinery/chem_dispenser/drinks{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "qrQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/bar{ @@ -47406,6 +47456,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/holding_cell) +"quW" = ( +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/medical{ + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall, +/area/station/commons/lounge) "qvC" = ( /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, @@ -47492,6 +47552,10 @@ dir = 1 }, /area/station/service/chapel) +"qxi" = ( +/obj/machinery/vending/barbervend, +/turf/open/floor/plating, +/area/station/maintenance/port) "qxr" = ( /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -47930,15 +47994,6 @@ /obj/item/pipe_dispenser, /turf/open/floor/iron, /area/station/engineering/main) -"qFo" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "qFv" = ( /obj/machinery/door/poddoor/shutters{ dir = 8; @@ -47960,6 +48015,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/engineering/atmos) +"qFM" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "qFP" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -48036,13 +48098,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"qHd" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "qHh" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 9 @@ -48431,6 +48486,18 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/carpet, /area/station/command/bridge) +"qNZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "qOs" = ( /obj/machinery/door/airlock/maintenance{ name = "Genetics Maintenance" @@ -48504,6 +48571,25 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"qPd" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) +"qPn" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/wood, +/area/station/service/theater) "qPs" = ( /obj/structure/lattice/catwalk, /obj/structure/marker_beacon/indigo, @@ -48553,6 +48639,23 @@ }, /turf/open/floor/iron/dark, /area/station/medical/break_room) +"qQF" = ( +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) +"qQV" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/siding/wood, +/obj/effect/landmark/start/clown, +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood/large, +/area/station/service/theater) "qQX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -48608,16 +48711,6 @@ /obj/machinery/light/dim/directional/east, /turf/open/floor/grass, /area/station/security/bitden) -"qRD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/service/bar) "qRI" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -48827,6 +48920,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/space_hut) +"qVb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "qVc" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/iron/dark, @@ -48897,6 +49000,16 @@ /obj/machinery/portable_atmospherics/pump, /turf/open/floor/iron/white, /area/station/science/explab) +"qWl" = ( +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "qWq" = ( /obj/machinery/asteroid_magnet{ center_x = 32; @@ -49201,14 +49314,6 @@ /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) -"rbe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "rbs" = ( /obj/structure/cable, /obj/structure/table, @@ -49376,23 +49481,6 @@ /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/station/science/ordnance) -"reS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "rfb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -49565,14 +49653,6 @@ /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, /area/station/solars/port/fore) -"riL" = ( -/obj/machinery/restaurant_portal/restaurant, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) "riW" = ( /obj/structure/plasticflaps/opaque, /obj/machinery/door/window/left/directional/north{ @@ -49637,6 +49717,11 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"rkx" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "rkz" = ( /obj/machinery/computer/records/pathology{ dir = 4 @@ -49721,10 +49806,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/fore) -"rls" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/station/service/theater) "rlu" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -49970,14 +50051,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"rqb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "rqT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -50092,6 +50165,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/fore) +"rsM" = ( +/obj/structure/table, +/obj/item/food/dough, +/obj/item/knife{ + pixel_x = -13 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "rtd" = ( /obj/machinery/camera/motion/directional/east{ c_tag = "E.V.A. Storage" @@ -50167,14 +50248,6 @@ }, /turf/open/floor/cult, /area/station/service/chapel/office) -"rtZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "ruc" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/iron/dark, @@ -50593,11 +50666,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/textured_large, /area/station/security/bitden) -"rAg" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater) "rAo" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/reagent_dispensers/watertank, @@ -51088,13 +51156,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) -"rIk" = ( -/obj/structure/cable, -/obj/machinery/door/window/right/directional/west{ - name = "Theater Stage" - }, -/turf/open/floor/carpet, -/area/station/service/theater) "rIG" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/shutters/preopen{ @@ -51492,15 +51553,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/engineering/main) -"rPg" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/lounge) "rPh" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/highsecurity{ @@ -51741,6 +51793,12 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"rTk" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/station/service/theater) "rTw" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -51788,14 +51846,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/mine/maintenance/public) -"rTQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "rTV" = ( /obj/machinery/firealarm/directional/west, /obj/structure/table, @@ -51992,14 +52042,6 @@ /obj/item/flashlight/lamp, /turf/open/floor/iron/dark, /area/station/security/execution/education) -"rXF" = ( -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/commons/lounge) "rXJ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/chair/stool/directional/east, @@ -52132,6 +52174,10 @@ /obj/item/reagent_containers/syringe, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) +"rZs" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "rZt" = ( /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ dir = 8 @@ -52405,11 +52451,6 @@ "sdb" = ( /turf/open/floor/plating, /area/station/science/ordnance/testlab) -"sdf" = ( -/obj/structure/window/spawner/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/service/theater) "sdn" = ( /obj/item/target, /obj/structure/training_machine, @@ -52484,20 +52525,6 @@ /obj/machinery/duct, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"sej" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"sew" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) "sey" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -52507,6 +52534,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"sez" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/effect/landmark/start/mime, +/turf/open/floor/carpet, +/area/station/service/theater) "seN" = ( /obj/structure/sign/directions/evac, /turf/closed/wall/r_wall, @@ -52550,14 +52584,6 @@ "sfA" = ( /turf/open/floor/carpet, /area/station/medical/psychology) -"sfD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "sfF" = ( /obj/machinery/duct, /obj/effect/turf_decal/trimline/blue/filled/end, @@ -52805,6 +52831,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/science/lab) +"skz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/plating, +/area/station/maintenance/port) "slc" = ( /obj/effect/decal/cleanable/dirt, /obj/vehicle/ridden/janicart, @@ -53591,6 +53622,11 @@ /obj/effect/landmark/start/janitor, /turf/open/floor/iron, /area/station/service/janitor) +"szM" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "szO" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -53833,9 +53869,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/security/warden) -"sEh" = ( -/turf/open/floor/carpet, -/area/station/service/theater) "sEk" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/neutral{ @@ -54012,6 +54045,11 @@ "sIe" = ( /turf/closed/wall/r_wall, /area/station/security/execution/transfer) +"sIp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sIs" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -54177,20 +54215,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/command/bridge) -"sLp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "sLD" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -54286,6 +54310,13 @@ }, /turf/open/floor/iron, /area/station/science/circuits) +"sNc" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "sNi" = ( /turf/open/floor/wood, /area/station/service/theater) @@ -54580,6 +54611,13 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"sSu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "sSx" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -54691,6 +54729,15 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"sTT" = ( +/obj/machinery/vending/boozeomat, +/obj/structure/sign/picture_frame/portrait/bar{ + pixel_y = -28 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "sUi" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk, @@ -55118,14 +55165,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/rd, /turf/open/floor/iron/dark, /area/station/science/server) -"tbq" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/commons/lounge) "tck" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55600,16 +55639,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"tju" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "tjG" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/simple/orange/visible, @@ -55748,6 +55777,13 @@ /obj/effect/mapping_helpers/airlock/access/all/service/hydroponics, /turf/open/floor/iron, /area/station/service/hydroponics) +"tlN" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/theater) "tlZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -56127,6 +56163,10 @@ "tsd" = ( /turf/closed/wall, /area/station/maintenance/space_hut) +"tso" = ( +/obj/machinery/oven/range, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "tst" = ( /obj/effect/turf_decal/tile/neutral, /obj/structure/cable, @@ -56411,15 +56451,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/minisat, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/aisat_interior) -"txi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/cook, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "txk" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=14.5-Recreation"; @@ -56733,13 +56764,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/science/research) -"tEy" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "tEP" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -56986,6 +57010,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central) +"tKx" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/costume/sombrero/green, +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood/large, +/area/station/service/theater) "tKA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/bot, @@ -57133,13 +57168,6 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/hos) -"tLU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "tMe" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /obj/machinery/light/small/directional/east, @@ -57386,16 +57414,6 @@ dir = 1 }, /area/station/engineering/atmos/storage/gas) -"tRL" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/chem_master/condimaster{ - desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; - name = "HoochMaster Deluxe" - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "tRU" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/dark, @@ -57697,18 +57715,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) -"tXH" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/food/pie/cream, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/kitchen) "tXU" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -57926,6 +57932,13 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/plating, /area/station/maintenance/disposal) +"ubz" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) "ubB" = ( /obj/structure/table/reinforced, /obj/item/folder/blue{ @@ -58145,11 +58158,6 @@ }, /turf/open/floor/iron, /area/station/security/office) -"uey" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/station/commons/lounge) "ueB" = ( /obj/machinery/airalarm/directional/south, /obj/effect/turf_decal/tile/yellow/half/contrasted, @@ -58170,6 +58178,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/security/brig) +"uft" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) "ufu" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -58360,6 +58375,13 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"uiz" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/theater) "uiB" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, @@ -58368,13 +58390,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"uiK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "ujk" = ( /obj/machinery/atmospherics/pipe/smart/simple/dark/visible, /obj/effect/turf_decal/siding/purple{ @@ -58449,14 +58464,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/service) -"uky" = ( -/obj/machinery/smartfridge/drinks, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) "ukN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 @@ -58504,6 +58511,14 @@ }, /turf/open/floor/iron/white, /area/station/science/lobby) +"umA" = ( +/obj/machinery/restaurant_portal/restaurant, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) "umI" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -58545,6 +58560,11 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron/white, /area/station/security/prison/mess) +"umP" = ( +/obj/structure/window/spawner/directional/west, +/obj/machinery/light/floor, +/turf/open/floor/carpet, +/area/station/service/theater) "umS" = ( /obj/item/radio/intercom/directional/west, /obj/machinery/computer/records/security{ @@ -58688,6 +58708,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/security/interrogation) +"upE" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/wood, +/area/station/commons/lounge) "upR" = ( /obj/structure/table, /obj/machinery/recharger{ @@ -58711,6 +58735,14 @@ }, /turf/open/floor/iron, /area/station/service/hydroponics) +"upX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) "upZ" = ( /obj/item/radio/intercom/directional/north, /obj/machinery/light/small/directional/north, @@ -58979,14 +59011,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/starboard) -"utS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/service/bar) "utT" = ( /obj/structure/table/wood, /obj/effect/decal/cleanable/dirt, @@ -59163,12 +59187,17 @@ "uwQ" = ( /turf/closed/wall/r_wall, /area/station/engineering/atmos) -"uwU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"uwY" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/entertainment/lighter, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/turf/open/floor/wood, -/area/station/commons/lounge) +/turf/open/floor/iron, +/area/station/service/bar) "uxa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -59507,6 +59536,18 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron/dark, /area/station/security/evidence) +"uCX" = ( +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "uCZ" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -60173,13 +60214,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port) -"uOO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/lounge) "uOS" = ( /obj/machinery/door/airlock/grunge{ name = "Morgue" @@ -60305,6 +60339,13 @@ /obj/machinery/telecomms/server/presets/common, /turf/open/floor/circuit/telecomms/mainframe, /area/station/tcommsat/server) +"uRr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "uRu" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -60817,14 +60858,6 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) -"vdX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "veO" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 8 @@ -60846,12 +60879,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/white/smooth_large, /area/station/medical/treatment_center) -"vfm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/mob/living/carbon/human/species/monkey/punpun, -/turf/open/floor/iron, -/area/station/service/bar) "vfv" = ( /obj/machinery/conveyor{ dir = 4; @@ -60881,13 +60908,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"vgb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "vgd" = ( /obj/machinery/door/airlock/engineering{ name = "Telecomms Storage" @@ -60975,6 +60995,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/service/chapel/office) +"vhU" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "vhV" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -61010,6 +61038,25 @@ /obj/effect/landmark/start/atmospheric_technician, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"viZ" = ( +/obj/structure/table/wood, +/obj/item/toy/mecha/honk{ + pixel_y = 12 + }, +/obj/item/toy/dummy, +/obj/item/lipstick/purple{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/lipstick/jade{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/black, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/theater) "vjd" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -61068,10 +61115,6 @@ }, /turf/open/floor/wood, /area/station/cargo/quartermaster) -"vjx" = ( -/obj/machinery/light/floor, -/turf/open/floor/wood, -/area/station/commons/lounge) "vjA" = ( /obj/structure/cable, /obj/machinery/holopad/secure, @@ -61107,21 +61150,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"vjI" = ( -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/sink/directional/east, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"vjR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "vjS" = ( /obj/effect/landmark/start/paramedic, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -61199,6 +61227,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/aft/greater) +"vky" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/chem_master/condimaster{ + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments."; + name = "HoochMaster Deluxe" + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "vkz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -61317,18 +61355,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"vmE" = ( -/obj/machinery/door/airlock{ - name = "Theater Stage" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) "vmH" = ( /obj/machinery/door/airlock/security{ name = "Customs Desk" @@ -61505,6 +61531,14 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/customs) +"vpu" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/theater) "vpB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -61596,13 +61630,6 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/service/hydroponics) -"vqN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/theater) "vqU" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -61614,17 +61641,6 @@ /obj/structure/sink/directional/west, /turf/open/floor/iron/white, /area/station/science/research) -"vrF" = ( -/obj/structure/table/reinforced, -/obj/structure/desk_bell{ - pixel_x = -11 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) "vrJ" = ( /obj/machinery/porta_turret/ai{ dir = 8 @@ -61836,11 +61852,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"vwi" = ( -/obj/structure/table, -/obj/item/clothing/mask/cigarette/pipe, -/turf/open/floor/plating, -/area/station/maintenance/port) "vwN" = ( /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -61863,10 +61874,6 @@ /obj/effect/spawner/random/bureaucracy/paper, /turf/open/floor/plating, /area/station/maintenance/port) -"vwV" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall, -/area/station/commons/lounge) "vxa" = ( /mob/living/basic/slime, /turf/open/floor/engine, @@ -62043,17 +62050,6 @@ }, /turf/open/floor/iron/white, /area/station/science/research) -"vBY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "vCa" = ( /obj/structure/window/reinforced/spawner/directional/north{ layer = 2.9 @@ -62066,6 +62062,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"vCk" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "vCr" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -62233,19 +62238,6 @@ /obj/structure/closet/secure_closet/medical1, /turf/open/floor/wood/parquet, /area/station/medical/pathology) -"vEO" = ( -/obj/machinery/button/door/directional/east{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters Control"; - req_access = list("kitchen") - }, -/obj/structure/table, -/obj/machinery/processor{ - pixel_y = 12 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "vET" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -62290,6 +62282,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, /area/station/command/heads_quarters/captain/private) +"vFy" = ( +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sink/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "vFB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -62846,6 +62849,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, /area/station/maintenance/disposal/incinerator) +"vQl" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "vQs" = ( /turf/closed/wall, /area/station/cargo/warehouse) @@ -62855,6 +62866,12 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"vQF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) "vQI" = ( /obj/structure/sign/warning/pods, /turf/closed/wall/r_wall, @@ -62979,15 +62996,6 @@ /obj/item/storage/fancy/cigarettes/cigpack_uplift, /turf/open/floor/iron/white, /area/station/medical/abandoned) -"vSa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/large, -/area/station/service/theater) "vSo" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -63062,26 +63070,6 @@ "vTX" = ( /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) -"vUn" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "vUM" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -63619,6 +63607,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"wcK" = ( +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "wcL" = ( /obj/machinery/door/window/right/directional/north{ base_state = "left"; @@ -63749,6 +63740,12 @@ }, /turf/open/floor/iron, /area/station/cargo/sorting) +"wex" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "wez" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/dark, @@ -64034,14 +64031,6 @@ /obj/structure/rack, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"wjK" = ( -/obj/item/clothing/head/hats/tophat, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron, -/area/station/service/bar) "wjQ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -64109,18 +64098,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, /area/station/science/research) -"wkI" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Kitchen - Cold Room" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) "wkL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -64170,6 +64147,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/science/robotics/lab) +"wmA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/cigarette, +/turf/open/floor/wood, +/area/station/commons/lounge) "wmB" = ( /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, @@ -64267,6 +64251,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/storage) +"woZ" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) "wpo" = ( /obj/item/storage/box/matches{ pixel_x = -2; @@ -64388,6 +64382,13 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/circuit/green, /area/station/science/robotics/mechbay) +"wsg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/station/commons/lounge) "wsq" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -64754,12 +64755,6 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"wyV" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/closed/wall, -/area/station/service/theater) "wza" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64813,6 +64808,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) +"wzI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/station/service/theater) "wzK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -65323,23 +65323,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) -"wKs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - name = "Kitchen Window"; - req_access = list("kitchen") - }, -/obj/machinery/door/firedoor, -/obj/item/paper, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_service"; - name = "Service Shutter" - }, -/obj/item/pen, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) "wKu" = ( /obj/structure/cable, /turf/open/floor/wood, @@ -65432,17 +65415,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark, /area/station/ai_monitored/aisat/exterior) -"wMk" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/costume/sombrero/green, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood/large, -/area/station/service/theater) "wMx" = ( /obj/effect/turf_decal/bot, /obj/effect/landmark/start/hangover, @@ -65452,6 +65424,20 @@ /obj/effect/spawner/random/structure/crate, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"wMM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/duct, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "wMY" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -65516,6 +65502,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/gateway) +"wNM" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/camera/directional/north{ + c_tag = "Bar - Fore" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/commons/lounge) "wNN" = ( /obj/effect/turf_decal/plaque{ icon_state = "L9" @@ -65703,20 +65697,6 @@ }, /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai) -"wPv" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "wPB" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/engine/air, @@ -65774,6 +65754,17 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/science/lab) +"wQc" = ( +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = -11 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) "wQj" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ dir = 8 @@ -65938,20 +65929,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/surgery/theatre) -"wSc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/smartfridge/food, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - dir = 1; - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "wSe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -66310,16 +66287,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"wYn" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/obj/machinery/light/small/directional/south, -/obj/machinery/digital_clock/directional/south, -/turf/open/floor/iron, -/area/station/service/bar) "wYo" = ( /obj/machinery/airalarm/directional/east, /obj/machinery/light/directional/south, @@ -66477,11 +66444,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) -"xbw" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "xbE" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood{ @@ -66712,6 +66674,18 @@ }, /turf/open/floor/iron/white, /area/station/science/cytology) +"xfw" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + name = "Theater Backstage" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/theatre, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/station/service/theater) "xfx" = ( /obj/structure/table/glass, /obj/item/stack/medical/mesh, @@ -66893,6 +66867,20 @@ /obj/machinery/meter, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) +"xhf" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "Repdoor"; + name = "Representative's Office" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/landmark/navigate_destination, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "xhh" = ( /turf/open/floor/plating/airless, /area/station/science/ordnance/bomb) @@ -67131,6 +67119,16 @@ "xlF" = ( /turf/open/floor/iron, /area/station/service/hydroponics) +"xlT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "xlU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -67287,6 +67285,12 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) +"xoC" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "xoK" = ( /obj/effect/landmark/start/botanist, /obj/effect/turf_decal/tile/green{ @@ -67347,15 +67351,6 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"xqv" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "xqI" = ( /obj/machinery/computer/security/labor{ dir = 8 @@ -67584,14 +67579,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/maintenance/aft/lesser) -"xva" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/theater) "xvd" = ( /obj/structure/closet/emcloset, /obj/effect/turf_decal/delivery, @@ -68251,17 +68238,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/disposal) -"xGB" = ( -/obj/structure/table/wood, -/obj/item/staff/broom, -/obj/item/wrench, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, -/area/station/service/theater) "xGD" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/purple, @@ -68299,10 +68275,6 @@ }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"xIC" = ( -/obj/item/kirbyplants/organic/plant10, -/turf/open/floor/wood/large, -/area/station/commons/lounge) "xID" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -68435,10 +68407,6 @@ /obj/structure/machine/assembly_bench, /turf/open/floor/wood, /area/station/smithing) -"xLR" = ( -/obj/machinery/oven/range, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "xMl" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=15-Court"; @@ -68470,12 +68438,6 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/service/cafeteria) -"xMY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/theater) "xNb" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68492,6 +68454,14 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"xNi" = ( +/obj/item/clothing/head/hats/tophat, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/bar) "xNm" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -68570,6 +68540,22 @@ }, /turf/open/floor/wood, /area/station/command/heads_quarters/blueshield) +"xOv" = ( +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/machinery/door/airlock/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) "xOw" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -68637,28 +68623,10 @@ /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"xPg" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/gambling, -/turf/open/floor/wood, -/area/station/commons/lounge) -"xPh" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Kitchen" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +"xPk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/obj/machinery/duct, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "xPm" = ( @@ -68696,6 +68664,9 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) +"xPL" = ( +/turf/open/floor/carpet, +/area/station/service/theater) "xPN" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -68724,6 +68695,18 @@ /obj/structure/extinguisher_cabinet/directional/east, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"xQi" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) "xQx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68757,13 +68740,6 @@ /obj/machinery/exodrone_launcher, /turf/open/floor/plating, /area/station/cargo/drone_bay) -"xQS" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/effect/landmark/start/mime, -/turf/open/floor/carpet, -/area/station/service/theater) "xQT" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/turf_decal/siding/wood{ @@ -68955,6 +68931,23 @@ /obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"xVn" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron, +/area/station/service/kitchen) "xVq" = ( /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -69235,6 +69228,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"xYX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/service/bar) "xZb" = ( /obj/effect/spawner/random/structure/grille, /turf/open/floor/plating, @@ -69325,6 +69326,19 @@ }, /turf/open/floor/iron/checker, /area/station/science/research) +"yaB" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/deepfryer, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) "yaD" = ( /obj/structure/table, /obj/item/stack/rods/fifty, @@ -69480,18 +69494,6 @@ }, /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) -"ydq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/window/spawner/directional/west, -/obj/structure/sign/poster/random/directional/north, -/obj/effect/spawner/random/structure/musician/piano/random_piano, -/turf/open/floor/wood/large, -/area/station/service/theater) "ydr" = ( /obj/machinery/camera/directional/east{ c_tag = "Auxiliary Tool Storage" @@ -69585,20 +69587,6 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/pathology) -"yfn" = ( -/obj/machinery/vending/dinnerware, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "yfq" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -69618,6 +69606,38 @@ }, /turf/open/floor/engine/n2o, /area/station/engineering/atmos) +"yfz" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + dir = 1; + id = "kitchen_counter"; + name = "Kitchen Counter Shutters" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/kitchen) +"yfG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/table/wood, +/obj/item/stack/sheet/cloth/ten, +/obj/item/toy/crayon/spraycan, +/obj/item/stack/rods/ten, +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood/large, +/area/station/service/theater) "yfI" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, /turf/closed/wall/r_wall, @@ -69783,11 +69803,6 @@ }, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) -"ykj" = ( -/obj/structure/table, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) "ykn" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/airlock/external{ @@ -86504,7 +86519,7 @@ lMY pOa mrN gXe -vwi +dZj tql pOa aDl @@ -87016,7 +87031,7 @@ fjD tmI fjD pOa -cIW +fSN rwB tYi vXH @@ -87789,8 +87804,8 @@ oyx pOa xgG vJY -gDZ -wev +skz +qxi pOa uOH uOH @@ -99099,7 +99114,7 @@ tnE mOi fWE kqB -cAx +maF tvE ibX htd @@ -99349,7 +99364,7 @@ syo eDL lSz tst -dHV +dhE xOl iag eZZ @@ -100635,11 +100650,11 @@ syo cnA nNw dmK -hZR +xhf iME ejm uKL -mnq +hdw xAB jCA tvE @@ -100896,7 +100911,7 @@ pdV neg kfb hrH -igQ +gHx aHC avc tvE @@ -102679,12 +102694,12 @@ uZj ghl xZW uOX -myG +quW rac bvJ bvJ -qFo -cNA +vCk +qVb bvJ bvJ pTS @@ -102937,18 +102952,18 @@ jHu fRS twN lkc -hhN -uOO +rkx +oyQ hkG xEJ yjc -oeQ -xIC -hri -qRD -dfp -tRL -hrM +qQF +nDE +xQi +pRc +qom +vky +sTT eQE bNf vZM @@ -103194,18 +103209,18 @@ aEr fRS twN rac -mFj +wNM kMr jSf gjr hnr -qHd -bGJ -vrF -tju -uiK -lYR -loh +bpT +nSf +wQc +fks +dIz +daw +kjz nxH mVY pQC @@ -103451,18 +103466,18 @@ vFB fRS twN rac -ogs +aGF wCL gPh hkG wPE -cwW -tbq -aLk -pAr -wjK -cqI -cFU +bai +qPd +szM +wex +xNi +iVn +cYI eQE oWH nBf @@ -103713,13 +103728,13 @@ kSw oPx gvm uhP -ebq -tbq -pof -owi -nxA -hyX -wYn +wsg +qPd +hdY +iiZ +hQN +eyT +aUZ eQE eEf rOM @@ -103966,19 +103981,19 @@ fRS tLx bvJ dYK -vjx +arW gae uFf qVt -kND -tbq -jjF -vfm -gWl -epO -qrO +dJj +qPd +oqq +mva +qFM +dvh +qeG eQE -atU +fFc qfB dDH pkK @@ -104221,22 +104236,22 @@ dZm mta pxl tUu -efg +cKQ xDw riZ nGK nGK -gVa -eIw -bTl -lIB -dDq -rbe -utS -bNh +vQF +hRF +woZ +uwY +sNc +fqM +xYX +xlT eQE mFC -bMp +jlV eQE bOA eLI @@ -104478,16 +104493,16 @@ dAn vFB fRS twN -gwc +fjf lWm gvm vLM wSs -njC -cwW -lBA -uky -ici +wmA +bai +nVW +elE +xOv pTS pTS pTS @@ -104740,17 +104755,17 @@ lWm kdN wSs jGA -pyc -cwW -vgb -iuM -esv -vjI -pmZ -qdI -xPh -yfn -gbq +bpt +bai +lSx +aXy +mTm +vFy +msq +aGA +bkv +hua +mUO uIs amu gsr @@ -104993,21 +105008,21 @@ vFB fRS cAf bvJ -rXF -uey +eHL +nlu fSd fSd -peF -kND -vjR -wSc -esv -dMX -vBY +gqp +dJj +qiU +pPb +mTm +vQl +oUb wXc xzj vMb -adG +bFe tqe qmy ltv @@ -105250,22 +105265,22 @@ dOw fRS tUv rac -riL -bCk +umA +kPx hkG qpM qVt -cwW -ktP -vUn -esv -vdX -mtX -xqv -gWh +bai +nQb +yfz +mTm +diU +sIp +pph +hpo fWW -rTQ -wKs +jzy +hsW jER rMA ukv @@ -105507,21 +105522,21 @@ cjP tqU vhI rac -khA -kcs -dTD -jsn -fjY -aPV -rPg -tXH -esv -xLR -mtX -ykj -msT +aqz +pgT +upE +cLD +cCu +uRr +pQl +olX +mTm +tso +sIp +hmR +rsM dVm -hqW +eIA uIs qVM aJI @@ -105764,21 +105779,21 @@ vFB fRS tUv rac -bEU -kcs -hsE -jsn -btI -cwW -tbq -iJM -esv -xbw -mtX -ykj -gWh +vhU +pgT +gMb +cLD +efV +bai +qPd +xVn +mTm +lTh +sIp +hmR +hpo lPi -cgR +iQJ uIs jui rhc @@ -106021,21 +106036,21 @@ vFB pKi axU rac -iin -pKw +hiG +nti wKu wKu -mwS -rqb -nCd -nJY -esv -xLR -sej +iLL +fTy +lOB +qnf +mTm +tso +xPk hED -hAc -tEy -iIT +xoC +egW +mCq uIs mAV vqp @@ -106278,19 +106293,19 @@ vFB fRS tUv bvJ -uwU +onP kSw nGK nGK -hNC -gjH -sew -wPv -esv -ntj -txi -iCY -gXo +fwt +qWl +dgE +fVy +mTm +ciK +fvd +cDX +jTf huG huG huG @@ -106534,23 +106549,23 @@ xww jsv tlZ aPF -vwV -jsn -dTD +qhd +cLD +upE wSs -xPg -fge -eAk -iga -reS -cBW +gxf +htQ +bTV +iuP +ffs +ocs klS -mcn +nPh mlu -ded +yaB huG -gUM -wkI +aIF +lSt phS huG iNQ @@ -106792,22 +106807,22 @@ aEr sDs jYi obG -ydq +buf mzn -sdf -gcW -auy -rIk -leJ +foU +umP +gMz +otc +etz uIs -tLU -pIz -sfD +sSu +wcK +nWs ebK -sLp +wMM laT mSS -aiz +hqg hiM huG wVd @@ -107049,22 +107064,22 @@ dFp fRS tUv obG -ohn -sEh -hWo -ghq -kNT +qQV +xPL +kJy +qkk +fan wBT -fVr +yfG uIs -vEO -gTc -inI -iHh -aNN +fWC +miQ +qNZ +uCX +nru huG -mpx -oXd +lMd +aFo apt huG jWj @@ -107306,22 +107321,22 @@ vFB usY huX obG -rAg -xMY -dXE -xQS +ouf +eaL +kDw +sez yaO -vqN -dce +uiz +lOw obG -cRC +pGg obG obG obG obG obG huG -daS +amJ gKS huG olP @@ -107563,20 +107578,20 @@ fdE gaN iqB obG -crT -bDR -bDR -glJ -kuA -pZQ -vSa -pek -mvk -nIo -eWG -dbH -aXt -bpY +rTk +wzI +wzI +lhz +cbr +uft +gnR +xfw +cEr +fjq +eVV +aqd +viZ +ayh huG iuJ tNQ @@ -107820,19 +107835,19 @@ fAv fRS tUv obG -xGB -wMk -feQ -jNV -bzI -dLY -aAb -wyV -iDC -gXj +cuu +tKx +knR +bDC +cnJ +lKz +mAk +aZs +qPn +tlN sNi -fQT -eCQ +jTM +ubz mMu huG hEl @@ -108080,16 +108095,16 @@ unL unL unL unL -vmE +mex unL unL unL unL unL unL -rls -sEh -ghw +lbw +xPL +eyP cwb unL qyB @@ -108345,8 +108360,8 @@ lzL scG unL jcY -eEN -xva +ijC +vpu deX rJk ofe @@ -108597,9 +108612,9 @@ fWA fWA fWA fWA -job +rZs yaf -rtZ +upX unL unL unL diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 4b2a65a6fe51..4f6bd4e03623 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -12280,7 +12280,7 @@ fQ fQ fQ aj -pU +aj pU pU wr @@ -12796,7 +12796,7 @@ pU aj aj aj -pU +aj sy wE pU @@ -13054,7 +13054,7 @@ aj aj aj aj -pU +aj pU pU uU @@ -13312,7 +13312,7 @@ fQ aj aj aj -pU +aj pU uU uU @@ -15378,8 +15378,8 @@ aj aj aj aj -pU -pU +aj +aj aj aj aj @@ -15894,7 +15894,7 @@ aj fQ aj aj -pU +aj uU uU uU @@ -16673,7 +16673,7 @@ aj aj aj aj -pU +aj pU pU uU @@ -16925,7 +16925,7 @@ aj aj fQ aj -pU +aj ad pU aj @@ -16937,7 +16937,7 @@ aj aj uU uU -pU +aj aj aj aj @@ -17198,7 +17198,7 @@ aj aj aj aj -pU +aj uU uU uU @@ -17438,7 +17438,7 @@ fQ fQ fQ fQ -pU +aj aj aj aj @@ -17696,7 +17696,7 @@ fQ fQ fQ fQ -pU +aj aj aj fQ @@ -19536,7 +19536,7 @@ pU pU aj aj -pU +aj pU uU uU @@ -19793,8 +19793,8 @@ ai ai pU aj -pU -pU +aj +aj uU uU uU @@ -24939,7 +24939,7 @@ ZY pU aj aj -pU +aj pU pU pU @@ -25195,7 +25195,7 @@ ZY pU aj aj -pU +aj pU pU pU @@ -25965,7 +25965,7 @@ ZY ZY aj aj -pU +aj JD RP RP @@ -26222,7 +26222,7 @@ ZY pU aj aj -pU +aj JD RP RP @@ -26992,7 +26992,7 @@ ZY ZY aj aj -pU +aj pU JD RP @@ -27763,7 +27763,7 @@ ZY ZY aj aj -pU +aj pU rN RP @@ -28278,7 +28278,7 @@ ZY pU aj aj -pU +aj pU pU pU @@ -28536,7 +28536,7 @@ ZY aj aj aj -pU +aj pU pU aj @@ -29049,7 +29049,7 @@ ZY ZY ZY pU -pU +aj aj aj aj @@ -29584,7 +29584,7 @@ aj Od qx Od -pU +aj an dJ rF @@ -30613,7 +30613,7 @@ pV Xw aj aj -pU +aj cU aj aj @@ -30864,12 +30864,12 @@ aj aj aj aj -pU -pU +aj +aj kt yh kt -pU +aj pU zU pU @@ -31121,8 +31121,8 @@ aj aj aj pU -pU -pU +aj +aj jc Kh jc @@ -33703,7 +33703,7 @@ kt HO jc Ae -pU +aj aj aj pU @@ -33964,7 +33964,7 @@ qe aj aj aj -pU +aj pU pU aj @@ -34218,11 +34218,11 @@ pU pU dJ pU -pU -pU aj aj -pU +aj +aj +aj pU aj aj @@ -34477,12 +34477,12 @@ dJ dJ dJ pU -pU aj aj aj aj -pU +aj +aj pU aj aj diff --git a/_maps/map_files/Ouroboros/Ouroboros.dmm b/_maps/map_files/Ouroboros/Ouroboros.dmm index e5d5b6ba4de2..687cebfbafa0 100644 --- a/_maps/map_files/Ouroboros/Ouroboros.dmm +++ b/_maps/map_files/Ouroboros/Ouroboros.dmm @@ -18629,7 +18629,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/navigate_destination, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/blueshield) "fAT" = ( @@ -18962,7 +18963,8 @@ name = "Consultant's Office" }, /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/any/command/captain, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/nt_rep) "fHm" = ( @@ -35331,7 +35333,8 @@ /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room/council) "kuV" = ( @@ -43644,10 +43647,6 @@ pixel_y = 4 }, /obj/item/paper/fluff/ids_for_dummies, -/obj/item/stamp/centcom{ - pixel_x = 4; - pixel_y = 4 - }, /obj/item/stamp/denied{ pixel_x = -7; pixel_y = 9 @@ -60188,7 +60187,8 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/access/any/command/captain, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/nt_rep) "rPM" = ( @@ -72380,12 +72380,11 @@ /area/station/commons/lounge) "vuC" = ( /obj/item/clothing/accessory/medal/gold/ordom, -/obj/item/clothing/gloves/combat, /obj/effect/turf_decal/stripes/line{ dir = 9 }, /obj/effect/turf_decal/bot, -/obj/structure/closet/secure_closet/nanotrasen_consultant, +/obj/structure/closet/secure_closet/nanotrasen_representative, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/nt_rep) "vuD" = ( @@ -75916,6 +75915,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/nanotrasen_representative, /turf/open/floor/wood, /area/station/command/heads_quarters/nt_rep) "wsb" = ( @@ -79208,7 +79208,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/iron/dark/smooth_large, /area/station/command/heads_quarters/blueshield) "xsq" = ( diff --git a/_maps/map_files/Theseus/Theseus.dmm b/_maps/map_files/Theseus/Theseus.dmm index 59b5309e78dd..ba4605424523 100644 --- a/_maps/map_files/Theseus/Theseus.dmm +++ b/_maps/map_files/Theseus/Theseus.dmm @@ -1255,12 +1255,9 @@ /turf/open/floor/carpet, /area/station/service/chapel) "auc" = ( -/obj/machinery/door/window/brigdoor/right/directional/north{ - id = "Cell 2"; - name = "Cell 2"; - dir = 4 +/obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ + id = "Cell 2" }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5436,7 +5433,7 @@ "bHk" = ( /obj/effect/turf_decal/tile/red/fourcorners, /obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/armory, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/glass{ name = "Equipment Room" @@ -7164,12 +7161,9 @@ /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/nt_rep) "cit" = ( -/obj/machinery/door/window/brigdoor/right/directional/north{ - id = "Cell 1"; - name = "Cell 1"; - dir = 4 +/obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ + id = "Cell 1" }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -14653,7 +14647,6 @@ }, /area/station/engineering/hallway) "erV" = ( -/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/red/filled/line{ dir = 8 }, @@ -14661,6 +14654,8 @@ dir = 4 }, /obj/machinery/camera/directional/west, +/obj/machinery/rnd/production/techfab/department/security, +/obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/station/security/office) "esb" = ( @@ -17522,7 +17517,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 5 }, -/obj/machinery/suit_storage_unit/open, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/iron, /area/station/security/office) "fnq" = ( @@ -18624,7 +18619,8 @@ id_tag = "BSdoor"; name = "Blueshield's Office" }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, /turf/open/floor/wood, /area/station/command/heads_quarters/blueshield) "fGn" = ( @@ -23870,12 +23866,9 @@ /turf/open/floor/iron, /area/station/engineering/atmos/upper) "hkt" = ( -/obj/machinery/door/window/brigdoor/right/directional/north{ - id = "Cell 3"; - name = "Cell 3"; - dir = 4 +/obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ + id = "Cell 3" }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39995,7 +39988,7 @@ }, /obj/structure/cable, /obj/effect/turf_decal/tile/red/fourcorners, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -41321,6 +41314,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/holopad/secure, /obj/structure/cable, +/obj/effect/landmark/start/blueshield, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/blueshield) "mmY" = ( @@ -43499,6 +43493,9 @@ }, /obj/structure/cable, /obj/item/radio/intercom/command/directional/north, +/obj/item/clothing/mask/cigarette/pipe{ + pixel_x = -5 + }, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "mWY" = ( @@ -48038,6 +48035,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/landmark/start/blueshield, /turf/open/floor/carpet/royalblue, /area/station/command/heads_quarters/blueshield) "org" = ( @@ -49776,26 +49774,15 @@ /turf/open/floor/iron/dark, /area/station/security/interrogation) "oSE" = ( -/obj/structure/closet/secure_closet/personal/cabinet, /obj/item/modular_computer/laptop/preset/civilian{ pixel_y = 3; pixel_x = 6 }, -/obj/item/clothing/mask/cigarette/pipe{ - pixel_x = -5 - }, -/obj/item/clothing/suit/armor/centcom_formal, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/head/hats/centhat, -/obj/item/clothing/head/hats/centcom_cap, -/obj/item/clothing/under/rank/centcom/centcom_skirt, -/obj/item/clothing/under/rank/centcom/commander, -/obj/item/clothing/under/rank/centcom/intern, -/obj/item/clothing/under/rank/centcom/officer_skirt, -/obj/item/clothing/under/rank/centcom/officer, -/obj/item/clothing/accessory/medal/gold/ordom, -/obj/item/clothing/accessory/medal/silver/bureaucracy, /obj/machinery/light/warm/directional/south, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/obj/item/clothing/accessory/medal/silver/bureaucracy, +/obj/item/clothing/accessory/medal/gold/ordom, +/obj/item/clothing/accessory/medal/gold/ordom, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "oSI" = ( @@ -53815,10 +53802,6 @@ pixel_x = -5; pixel_y = 3 }, -/obj/item/stamp/centcom{ - pixel_x = 5; - pixel_y = 7 - }, /obj/item/pen{ pixel_x = 4; pixel_y = -4 @@ -56429,12 +56412,9 @@ /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "qQs" = ( -/obj/machinery/door/window/brigdoor/right/directional/north{ - id = "Cell 4"; - name = "Cell 4"; - dir = 4 +/obj/machinery/door/window/brigdoor/security/cell/left/directional/east{ + id = "Cell 4" }, -/obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/effect/turf_decal/tile/red/fourcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -58677,6 +58657,7 @@ "rxE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/landmark/start/blueshield, /turf/open/floor/wood, /area/station/command/heads_quarters/blueshield) "rxK" = ( @@ -62309,8 +62290,9 @@ /obj/machinery/door/airlock/bathroom{ name = "Restroom" }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, /obj/machinery/duct, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/nt_rep) "sCg" = ( @@ -69169,11 +69151,10 @@ /turf/open/floor/iron, /area/station/service/bar) "uzj" = ( -/obj/machinery/rnd/production/techfab/department/security, -/obj/effect/turf_decal/bot, /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, /obj/machinery/light/directional/north, +/obj/item/kirbyplants/random, /turf/open/floor/iron/grimy, /area/station/security/office) "uzm" = ( @@ -72562,7 +72543,8 @@ /obj/machinery/door/airlock/corporate{ name = "Representative's Office" }, -/obj/effect/mapping_helpers/airlock/access/all/command/general, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/nt_rep) "vxI" = ( @@ -77087,6 +77069,7 @@ /obj/structure/window/spawner/directional/east, /obj/item/storage/secure/safe/directional/north, /obj/structure/cable, +/obj/effect/landmark/start/nanotrasen_representative, /turf/open/floor/carpet/green, /area/station/command/heads_quarters/nt_rep) "wRq" = ( @@ -81517,7 +81500,7 @@ /obj/effect/turf_decal/trimline/red/filled/line{ dir = 9 }, -/obj/machinery/suit_storage_unit/open, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/iron, /area/station/security/office) "yhk" = ( diff --git a/_maps/map_files/Voidraptor/VoidRaptor.dmm b/_maps/map_files/Voidraptor/VoidRaptor.dmm index 38e488dff5ac..308aca204c1c 100644 --- a/_maps/map_files/Voidraptor/VoidRaptor.dmm +++ b/_maps/map_files/Voidraptor/VoidRaptor.dmm @@ -48,6 +48,12 @@ }, /turf/open/floor/plating, /area/station/engineering/supermatter) +"aaK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/station/service/forge) "aaV" = ( /obj/effect/turf_decal/bot, /obj/machinery/telecomms/processor/preset_one, @@ -80,6 +86,22 @@ dir = 4 }, /area/station/medical/storage) +"abx" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Blueshield's Equipment Room" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/blueshield) "abC" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 @@ -4991,21 +5013,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/textured_large, /area/station/security/prison/work) -"bvz" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Blueshield's Equipment Room" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/blueshield) "bvI" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -5890,6 +5897,10 @@ }, /turf/open/floor/iron/dark/textured, /area/station/medical/medbay/central) +"bLg" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood/large, +/area/station/service/forge) "bLi" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 6 @@ -7162,12 +7173,6 @@ dir = 4 }, /area/station/command/gateway) -"cgx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/large, -/area/station/service/barber) "cgA" = ( /obj/machinery/status_display/ai, /turf/closed/wall, @@ -7568,7 +7573,7 @@ /area/station/science/ordnance/testlab) "cnc" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -8949,6 +8954,9 @@ "cHR" = ( /turf/closed/wall, /area/station/security/checkpoint/customs) +"cHZ" = ( +/turf/open/floor/wood/large, +/area/station/service/forge) "cIc" = ( /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, @@ -9374,6 +9382,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured, /area/station/maintenance/disposal/incinerator) +"cOO" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/wood/large, +/area/station/service/forge) "cOS" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -10787,12 +10801,6 @@ /obj/effect/turf_decal/trimline/blue/mid_joiner, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) -"diV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/service/barber) "diX" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/green/corner{ @@ -11663,7 +11671,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Aft Central Primary Hallway" }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /turf/open/floor/iron/dark/textured_large, /area/station/security/execution/transfer) "dwb" = ( @@ -11798,6 +11806,10 @@ dir = 8 }, /area/station/cargo/office) +"dxY" = ( +/obj/machinery/light/cold/directional/south, +/turf/open/floor/wood/large, +/area/station/service/forge) "dyd" = ( /obj/effect/mapping_helpers/airlock/access/all/science/ordnance, /obj/machinery/door/airlock/maintenance_hatch{ @@ -11907,10 +11919,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/textured, /area/station/hallway/primary/aft) -"dzC" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) "dzE" = ( /obj/structure/chair/comfy/beige{ dir = 1 @@ -12469,32 +12477,6 @@ dir = 1 }, /area/station/security/office) -"dGZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/corporate{ - name = "Consultant's Quarters" - }, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood/end, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/nt_rep) "dHa" = ( /obj/structure/bookcase/random/religion, /obj/effect/turf_decal/siding/wood{ @@ -15343,6 +15325,31 @@ /obj/item/storage/toolbox/mechanical, /turf/open/floor/engine, /area/station/tcommsat/computer) +"etM" = ( +/obj/machinery/door/airlock/corporate{ + name = "Blueshield's Quarters" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/end, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/blueshield) "etW" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -17176,6 +17183,21 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/storage/tcomms) +"eUO" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Command - Blueshield's Gear Room"; + name = "command camera" + }, +/obj/structure/closet/secure_closet/tac{ + req_access = list("captain") + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/blueshield) "eUT" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, /obj/effect/turf_decal/trimline/neutral/filled/line, @@ -17508,15 +17530,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/south, /turf/open/floor/iron, /area/station/commons/vacant_room) -"faf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/wood{ - dir = 8 - }, -/obj/structure/railing/wood, -/obj/machinery/electroplater, -/turf/open/floor/wood/large, -/area/station/service/barber) "fal" = ( /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron/textured, @@ -17779,6 +17792,16 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/iron/textured, /area/station/maintenance/aft) +"feu" = ( +/obj/structure/chair/comfy/brown{ + color = "#439C1E"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "fey" = ( /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -20862,6 +20885,10 @@ /obj/structure/sign/poster/random/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) +"gce" = ( +/obj/machinery/material_analyzer, +/turf/open/floor/wood/large, +/area/station/service/forge) "gcg" = ( /obj/structure/closet/crate/goldcrate, /obj/item/stack/spacecash/c500, @@ -21880,25 +21907,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"gqG" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Blueshield's Equipment Room" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "Bridge Blast Door" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/blueshield) "gqN" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -22816,14 +22824,6 @@ /obj/effect/turf_decal/bot_red, /turf/open/floor/iron/dark/textured_large, /area/station/security/execution/education) -"gDL" = ( -/obj/structure/railing/wood{ - dir = 8 - }, -/obj/structure/anvil, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood/large, -/area/station/service/barber) "gDP" = ( /obj/structure/sign/gym{ pixel_y = 32 @@ -23225,6 +23225,10 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark/textured_large, /area/station/medical/storage) +"gJo" = ( +/obj/structure/fake_stairs/wood/directional/east, +/turf/open/floor/wood/large, +/area/station/service/forge) "gJs" = ( /obj/structure/chair/office, /turf/open/floor/iron/textured_large, @@ -23501,10 +23505,6 @@ "gNe" = ( /turf/open/floor/iron/textured_large, /area/station/hallway/secondary/entry) -"gNh" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, -/area/station/service/barber) "gNi" = ( /obj/item/flashlight/lantern, /obj/effect/turf_decal/stripes/line{ @@ -24738,7 +24738,7 @@ /turf/open/floor/iron/textured_large, /area/station/hallway/primary/aft) "hdK" = ( -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security/old/glass{ name = "Prison Wing" @@ -27747,6 +27747,28 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/maintenance/department/engine/atmos/lesser) +"hWz" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/corporate{ + id_tag = "consultantdoor"; + name = "Consultant's Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/nt_rep) "hWF" = ( /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 1 @@ -28451,6 +28473,7 @@ /obj/effect/turf_decal/bot, /obj/effect/spawner/random/armory/riot_shield, /obj/machinery/light/cold/directional/south, +/obj/item/clothing/suit/armor/riot, /turf/open/floor/iron/dark/textured_edge, /area/station/ai_monitored/security/armory) "iiB" = ( @@ -29920,6 +29943,28 @@ dir = 4 }, /area/station/security/checkpoint/science/research) +"izV" = ( +/obj/structure/table/wood, +/obj/item/stamp/denied{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/stamp{ + pixel_x = -7; + pixel_y = 1 + }, +/obj/item/folder/red{ + pixel_x = 11; + pixel_y = 4 + }, +/obj/item/folder/blue{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/green, +/area/station/command/heads_quarters/nt_rep) "izY" = ( /obj/machinery/door/airlock/grunge{ name = "Chapel" @@ -29990,10 +30035,10 @@ /turf/open/floor/wood/large, /area/station/commons/fitness/recreation/entertainment) "iAE" = ( -/obj/machinery/suit_storage_unit/security, /obj/machinery/firealarm/directional/north, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/red/diagonal_centre, +/obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron/dark/diagonal, /area/station/security/office) "iAF" = ( @@ -30054,6 +30099,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, /area/station/service/chapel/funeral) +"iBW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/service/forge) "iCa" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -30061,32 +30112,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/aft/upper) -"iCg" = ( -/obj/structure/table/wood, -/obj/item/stamp/denied{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/stamp{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/item/folder/red{ - pixel_x = 11; - pixel_y = 4 - }, -/obj/item/folder/blue{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/stamp/centcom{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "iCx" = ( /obj/structure/chair/plastic{ dir = 4 @@ -30297,27 +30322,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/engineering/atmos/pumproom) -"iGu" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/command/captain, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/corporate{ - id_tag = "consultantdoor"; - name = "Consultant's Office" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/nt_rep) "iGy" = ( /obj/structure/sign/logo{ icon_state = "nanotrasen_sign3"; @@ -31308,12 +31312,6 @@ }, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"iVy" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/stone, -/area/station/service/barber) "iVz" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning{ dir = 8 @@ -32705,30 +32703,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/textured, /area/station/maintenance/port/greater) -"jor" = ( -/obj/machinery/door/airlock/corporate{ - name = "Blueshield's Quarters" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/wood/end, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/wood/large, -/area/station/command/heads_quarters/blueshield) "jos" = ( /obj/machinery/vending/coffee{ default_price = 0; @@ -34118,13 +34092,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/kitchen, /area/station/service/kitchen/abandoned) -"jFt" = ( -/obj/structure/railing/wood{ - dir = 8 - }, -/obj/structure/machine/assembly_bench, -/turf/open/floor/wood/large, -/area/station/service/barber) "jFA" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -34378,7 +34345,6 @@ /turf/open/floor/plating, /area/station/engineering/storage/tech) "jJr" = ( -/obj/machinery/suit_storage_unit/security, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/red/diagonal_centre, /obj/machinery/light/cold/directional/north, @@ -34722,9 +34688,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) -"jOd" = ( -/turf/open/floor/stone, -/area/station/service/barber) "jOe" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -34890,10 +34853,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/engine, /area/station/engineering/supermatter/room) -"jQM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/large, -/area/station/service/barber) "jQR" = ( /obj/machinery/door/window/left/directional/south{ name = "Research Test Chamber"; @@ -39671,7 +39630,7 @@ /obj/machinery/door/airlock/security{ name = "Isolation Cell" }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/security/execution/transfer) @@ -40214,11 +40173,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/large, /area/station/commons/fitness/recreation) -"lov" = ( -/obj/machinery/arc_forge, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, -/area/station/service/barber) "loF" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_large, @@ -40509,26 +40463,6 @@ /obj/effect/turf_decal/siding/thinplating/dark/end, /turf/open/floor/iron/checker, /area/station/medical/pathology) -"ltz" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/mining{ - name = "Mining Lobby" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/quartermaster) "ltB" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -41448,6 +41382,12 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen/abandoned) +"lGE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/station/service/forge) "lGH" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -41541,7 +41481,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Prison Satellite Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/maintenance/department/security/greater) @@ -42558,6 +42498,12 @@ }, /turf/open/floor/iron/textured, /area/station/engineering/atmos) +"lUY" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/greenglow, +/obj/machinery/vending/barbervend, +/turf/open/floor/iron/textured, +/area/station/maintenance/aft/lesser) "lUZ" = ( /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 8 @@ -42974,6 +42920,33 @@ /obj/effect/turf_decal/siding/wood, /turf/open/floor/wood/large, /area/station/service/library) +"maV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/corporate{ + name = "Consultant's Quarters" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/end, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/wood/large, +/area/station/command/heads_quarters/nt_rep) "mbc" = ( /obj/structure/railing{ dir = 4 @@ -43150,7 +43123,7 @@ /turf/open/floor/wood, /area/station/commons/vacant_room/office) "mep" = ( -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/all/security/brig, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43941,6 +43914,32 @@ /obj/effect/turf_decal/tile/neutral/diagonal_centre, /turf/open/floor/iron/dark/diagonal, /area/station/security/execution/transfer) +"mpM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/mining{ + name = "Quatermaster's Ouarters" + }, +/obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/effect/turf_decal/siding/wood/end, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/textured_large, +/area/station/cargo/quartermaster) "mpN" = ( /obj/effect/turf_decal/siding/wood{ dir = 9 @@ -44068,7 +44067,7 @@ /obj/machinery/door/airlock/maintenance_hatch{ name = "Prison Satellite Maintenance" }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/security/execution/transfer) "msv" = ( @@ -44206,27 +44205,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/construction/mining/aux_base) -"mvl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/blueshield) "mvz" = ( /obj/effect/turf_decal/trimline/yellow/filled/warning, /obj/structure/disposalpipe/segment{ @@ -44858,10 +44836,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/maintenance/disposal) -"mFh" = ( -/obj/machinery/light/cold/directional/north, -/turf/open/floor/wood/large, -/area/station/service/barber) "mFl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -45113,7 +45087,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Aft Central Primary Hallway" }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /turf/open/floor/iron/dark/textured_large, /area/station/security/office) "mJs" = ( @@ -46300,22 +46274,6 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/commons/dorms) -"mYF" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Command - Blueshield's Gear Room"; - name = "command camera" - }, -/obj/structure/closet/secure_closet/tac{ - req_access = list("captain") - }, -/obj/item/radio/intercom/directional/south, -/obj/item/clothing/gloves/military, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/blueshield) "mYL" = ( /obj/effect/turf_decal/trimline/red/filled/warning{ dir = 1 @@ -46368,32 +46326,6 @@ /obj/structure/table/wood/fancy/blue, /turf/open/floor/wood/large, /area/station/security/courtroom) -"mZJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ - name = "Mining Lobby" - }, -/obj/effect/mapping_helpers/airlock/access/all/supply/qm, -/obj/effect/turf_decal/siding/wood/end, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/textured_large, -/area/station/cargo/quartermaster) "mZO" = ( /obj/effect/turf_decal/arrows/white{ color = "#00AAFF"; @@ -46524,6 +46456,15 @@ /obj/machinery/holopad, /turf/open/floor/carpet, /area/station/security/detectives_office) +"naT" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/obj/item/clothing/accessory/medal/gold/ordom, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/nt_rep) "naW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood/large, @@ -46670,7 +46611,7 @@ /turf/open/floor/plating/airless, /area/station/engineering/power_room) "ndR" = ( -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/machinery/door/airlock/maintenance_hatch{ name = "Security Maintenance" }, @@ -47339,7 +47280,7 @@ /area/station/maintenance/port/upper) "nnj" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/general, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -48217,7 +48158,6 @@ }, /area/station/hallway/primary/fore) "nzM" = ( -/obj/structure/table/reinforced, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -48229,7 +48169,7 @@ pixel_x = 32 }, /obj/effect/turf_decal/delivery, -/obj/item/clothing/suit/armor/riot, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, @@ -49896,12 +49836,6 @@ }, /turf/open/floor/iron/freezer, /area/station/medical/pharmacy) -"nYc" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/wood/large, -/area/station/service/barber) "nYj" = ( /obj/structure/flora/grass/jungle, /obj/structure/window/fulltile, @@ -50631,6 +50565,10 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/central) +"ojR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood/large, +/area/station/service/forge) "ojT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -51078,12 +51016,6 @@ dir = 8 }, /area/station/science/robotics/lab) -"oqn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/stone, -/area/station/service/barber) "oqu" = ( /obj/effect/turf_decal/tile/blue/full, /obj/structure/window/spawner/directional/west, @@ -51446,17 +51378,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron/textured, /area/station/security/checkpoint/supply) -"ovo" = ( -/obj/structure/closet/secure_closet/nanotrasen_consultant, -/obj/item/clothing/accessory/medal/gold/ordom, -/obj/item/storage/briefcase/secure, -/obj/item/clothing/gloves/combat, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/command/heads_quarters/nt_rep) "ovT" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -52818,9 +52739,9 @@ /turf/open/floor/catwalk_floor, /area/station/maintenance/solars/starboard/aft) "oPQ" = ( -/obj/structure/tank_dispenser/oxygen, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/red/diagonal_centre, +/obj/vehicle/ridden/secway, /turf/open/floor/iron/dark/diagonal, /area/station/security/office) "oPU" = ( @@ -53260,6 +53181,15 @@ /obj/item/pai_card, /turf/open/floor/wood/large, /area/station/science/research) +"oVD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/railing/wood, +/obj/machinery/electroplater, +/turf/open/floor/wood/large, +/area/station/service/forge) "oVM" = ( /obj/structure/railing, /obj/structure/cable, @@ -55076,6 +55006,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/textured_large, /area/station/engineering/storage_shared) +"ptj" = ( +/obj/machinery/arc_forge, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone, +/area/station/service/forge) "ptC" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -58961,7 +58896,7 @@ /area/station/medical/morgue) "qtc" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/effect/turf_decal/stripes/line{ dir = 4 }, @@ -59604,6 +59539,12 @@ /obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/iron/textured, /area/station/maintenance/port/central) +"qDa" = ( +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood/large, +/area/station/service/forge) "qDk" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/morgue) @@ -61403,6 +61344,10 @@ dir = 1 }, /area/station/hallway/primary/aft) +"rcc" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone, +/area/station/service/forge) "rcf" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/bot, @@ -62117,6 +62062,13 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white/textured_edge, /area/station/science/explab) +"rmI" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/machine/assembly_bench, +/turf/open/floor/wood/large, +/area/station/service/forge) "rmP" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -63483,10 +63435,6 @@ /obj/machinery/smartfridge/organ, /turf/open/floor/iron/dark/textured_large, /area/station/medical/morgue) -"rIQ" = ( -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood/large, -/area/station/service/barber) "rIU" = ( /obj/effect/turf_decal/stripes/end{ dir = 4 @@ -64271,12 +64219,6 @@ dir = 1 }, /area/station/hallway/primary/fore) -"rUo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood/large, -/area/station/service/barber) "rUr" = ( /obj/machinery/door/airlock/security/glass{ name = "Brig Control" @@ -68672,6 +68614,26 @@ }, /turf/open/floor/iron/white/textured_large, /area/station/science/research) +"tcx" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Blueshield's Equipment Room" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "Bridge Blast Door" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/blueshield) "tcz" = ( /obj/structure/window/reinforced/survival_pod/spawner/directional/south, /obj/structure/window/reinforced/survival_pod/spawner/directional/west, @@ -69432,10 +69394,6 @@ /obj/machinery/atm/directional/south, /turf/open/floor/wood/large, /area/station/service/theater) -"tnp" = ( -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/iron/textured, -/area/station/maintenance/aft/lesser) "tnv" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -71118,10 +71076,6 @@ dir = 8 }, /area/station/security/brig) -"tJJ" = ( -/obj/structure/fake_stairs/wood/directional/east, -/turf/open/floor/wood/large, -/area/station/service/barber) "tJM" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 8 @@ -71324,13 +71278,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/storage) -"tMp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/fake_stairs/wood/directional/east, -/obj/effect/landmark/start/gary/uncommon, -/turf/open/floor/wood/large, -/area/station/service/barber) "tMq" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72603,6 +72550,11 @@ /obj/effect/turf_decal/tile/dark_green/diagonal_centre, /turf/open/floor/iron/white/diagonal, /area/station/medical/pathology) +"uhc" = ( +/obj/effect/decal/cleanable/glass, +/obj/structure/closet/secure_closet/barber, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) "uhe" = ( /turf/closed/wall, /area/station/cargo/lobby) @@ -73805,6 +73757,10 @@ }, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/break_room) +"uvN" = ( +/obj/machinery/light/cold/directional/north, +/turf/open/floor/wood/large, +/area/station/service/forge) "uvW" = ( /obj/structure/chair/office{ dir = 4 @@ -74967,12 +74923,6 @@ /obj/structure/window/reinforced/plasma/spawner/directional/south, /turf/open/floor/iron/textured, /area/station/maintenance/aft/lesser) -"uLH" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/textured, -/area/station/maintenance/aft/lesser) "uLI" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -75361,6 +75311,9 @@ /obj/structure/flora/bush/jungle/a/style_3, /turf/open/floor/grass, /area/station/science/research) +"uRJ" = ( +/turf/open/floor/stone, +/area/station/service/forge) "uRS" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75445,15 +75398,6 @@ "uTv" = ( /turf/open/floor/engine/vacuum, /area/station/engineering/atmos) -"uTz" = ( -/obj/structure/chair/comfy/brown{ - color = "#439C1E"; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet/green, -/area/station/command/heads_quarters/nt_rep) "uTD" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -75610,7 +75554,7 @@ /area/station/command/cc_dock) "uVM" = ( /obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, +/obj/effect/mapping_helpers/airlock/access/any/security/permabrig, /obj/machinery/door/airlock/security/glass{ name = "Prison Wing" }, @@ -76226,6 +76170,26 @@ dir = 8 }, /area/station/hallway/secondary/command) +"vfL" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/access/all/supply/qm, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/mining{ + name = "Quatermaster's Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/textured_large, +/area/station/cargo/quartermaster) "vfM" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -76664,6 +76628,12 @@ /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/textured, /area/station/engineering/atmos/pumproom) +"vma" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/stone, +/area/station/service/forge) "vmd" = ( /obj/structure/trash_pile, /turf/open/floor/iron/textured, @@ -77538,6 +77508,14 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron/dark/textured_edge, /area/station/hallway/primary/fore) +"vyF" = ( +/obj/structure/railing/wood{ + dir = 8 + }, +/obj/structure/anvil, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood/large, +/area/station/service/forge) "vyI" = ( /obj/effect/turf_decal/trimline/dark_red/corner{ dir = 1 @@ -77746,6 +77724,28 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/engine, /area/station/engineering/atmos/storage/gas) +"vCH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/iron/dark/textured_large, +/area/station/command/heads_quarters/blueshield) "vCI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -77769,10 +77769,6 @@ }, /turf/open/floor/iron/textured_large, /area/station/cargo/warehouse) -"vDd" = ( -/obj/machinery/material_analyzer, -/turf/open/floor/wood/large, -/area/station/service/barber) "vDe" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -78781,6 +78777,11 @@ }, /turf/open/floor/engine, /area/station/engineering/main) +"vRQ" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/space_heater, +/turf/open/floor/iron/textured, +/area/station/maintenance/aft/lesser) "vRS" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -79032,8 +79033,8 @@ /obj/effect/turf_decal/tile/dark_red/half{ dir = 4 }, -/obj/vehicle/ridden/secway, /obj/effect/turf_decal/bot, +/obj/machinery/suit_storage_unit/security, /turf/open/floor/iron/dark/textured_edge{ dir = 4 }, @@ -82485,10 +82486,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_large, /area/station/cargo/sorting) -"wQg" = ( -/obj/machinery/light/cold/directional/south, -/turf/open/floor/wood/large, -/area/station/service/barber) "wQo" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/green/filled/warning{ @@ -83954,6 +83951,13 @@ /obj/item/stack/cable_coil, /turf/open/floor/iron/textured, /area/station/science/research/abandoned) +"xpM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/fake_stairs/wood/directional/east, +/obj/effect/landmark/start/gary/uncommon, +/turf/open/floor/wood/large, +/area/station/service/forge) "xpO" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, /obj/item/radio/intercom/directional/south, @@ -86691,9 +86695,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/lounge) -"ydK" = ( -/turf/open/floor/wood/large, -/area/station/service/barber) "yea" = ( /obj/machinery/atmospherics/components/binary/pump, /obj/effect/turf_decal/trimline/dark_red/filled/line{ @@ -114270,11 +114271,11 @@ mJy twz gDd bsI -jOd -jOd -lov -ydK -ydK +uRJ +uRJ +ptj +cHZ +cHZ wjI lGy eWu @@ -114527,11 +114528,11 @@ tzk vSd wue bsI -jOd -jOd -gNh -rUo -wQg +uRJ +uRJ +rcc +lGE +dxY wjI lGy lQf @@ -114784,11 +114785,11 @@ dje dje dje dje -oqn -oqn -iVy -jQM -ydK +iBW +iBW +vma +ojR +cHZ wjI lGy mlv @@ -115041,11 +115042,11 @@ wuT izJ bJt dje -gDL -jFt -faf -tMp -tJJ +vyF +rmI +oVD +xpM +gJo wjI vWf hpp @@ -115298,11 +115299,11 @@ grA bYs pKo dje -mFh -ydK -diV -cgx -nYc +uvN +cHZ +aaK +qDa +cOO wjI vWf eWu @@ -115555,11 +115556,11 @@ iTJ wpv lBP dje -ydK -vDd -ydK -cgx -rIQ +cHZ +gce +cHZ +qDa +bLg wjI vWf mlv @@ -117057,7 +117058,7 @@ bMb joM cmH iZr -mvl +vCH iuB cmH wxS @@ -118087,7 +118088,7 @@ cmH vEu ohi kPk -jor +etM imV uaz cmH @@ -118600,7 +118601,7 @@ doJ cmH gTg cmH -bvz +abx cmH cmH cmH @@ -118859,7 +118860,7 @@ dIf cmH fwV mNY -mYF +eUO cmH dWs xMq @@ -119372,7 +119373,7 @@ eip lAb cmH cmH -gqG +tcx cmH cmH agB @@ -122713,7 +122714,7 @@ xlE xlE xlE kFc -ovo +naT xlE xlE ygP @@ -122969,7 +122970,7 @@ lje qhM kzL jlB -dGZ +maV jlB xlE lPh @@ -123482,8 +123483,8 @@ baK fgd pIk wMB -iCg -uTz +izV +feu iVF xlE eCx @@ -123994,7 +123995,7 @@ usB xlE npK xlE -iGu +hWz xlE vJB spI @@ -127431,7 +127432,7 @@ xud dOV nAt out -mZJ +mpM out vjU ftw @@ -127948,7 +127949,7 @@ inx vkv gST nAt -ltz +vfL vrK nAt pqh @@ -130058,7 +130059,7 @@ pSJ vty rgH iay -uLH +lUY ufe ntn gLb @@ -130315,7 +130316,7 @@ dNh kLl cQb iay -dzC +uhc iXX uVV xRx @@ -130572,7 +130573,7 @@ pSJ kLl eQi iay -tnp +vRQ uVV uVV shE diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 5d8e91a53c79..7ece1d482cb5 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2359,26 +2359,6 @@ /obj/structure/mirror/directional/west, /turf/open/floor/iron/showroomfloor, /area/ruin/powered/clownplanet) -"aiL" = ( -/obj/structure/table, -/obj/item/razor{ - pixel_x = 9; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/rag{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/reagent_containers/cup/bottle{ - desc = "A small bottle of Barber's Aid."; - list_reagents = list(/datum/reagent/barbers_aid=30); - name = "Barber's Aid bottle"; - pixel_x = -2; - pixel_y = 10 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/wood/large, -/area/station/service/barber) "aiT" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 4 @@ -7661,6 +7641,30 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security/prison) +"brQ" = ( +/obj/structure/table, +/obj/item/razor{ + pixel_x = 9; + pixel_y = 1 + }, +/obj/item/reagent_containers/cup/bottle{ + desc = "A small bottle of Barber's Aid."; + list_reagents = list(/datum/reagent/barbers_aid=30); + name = "Barber's Aid bottle"; + pixel_x = -7; + pixel_y = 11 + }, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/item/scissors{ + pixel_x = 1; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/station/service/barber) "brZ" = ( /obj/structure/chair/office/light{ dir = 1 @@ -9912,6 +9916,49 @@ /obj/effect/turf_decal/tile/red/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"caC" = ( +/obj/structure/rack/wooden, +/obj/item/perfume/amber{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/perfume/cologne{ + pixel_x = -4; + pixel_y = 10 + }, +/obj/item/perfume/wood{ + pixel_y = 10 + }, +/obj/item/perfume/mint{ + pixel_x = 4; + pixel_y = 10 + }, +/obj/item/perfume/cherry{ + pixel_x = -8; + pixel_y = -5 + }, +/obj/item/perfume/jasmine{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/perfume/pear{ + pixel_y = -5 + }, +/obj/item/perfume/rose{ + pixel_x = 4; + pixel_y = -5 + }, +/obj/item/perfume/vanilla{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/item/perfume/strawberry{ + pixel_x = 8; + pixel_y = -5 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/wood, +/area/station/service/barber) "caD" = ( /obj/effect/turf_decal/trimline/purple/filled/line, /obj/structure/chair{ @@ -12944,29 +12991,6 @@ dir = 8 }, /area/station/command/teleporter) -"dau" = ( -/obj/structure/table, -/obj/item/clothing/head/wig, -/obj/item/clothing/head/wig{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/clothing/head/wig{ - pixel_x = 4; - pixel_y = -5 - }, -/obj/item/clothing/mask/fakemoustache, -/obj/item/clothing/mask/fakemoustache{ - pixel_x = -4; - pixel_y = -5 - }, -/obj/item/clothing/mask/fakemoustache, -/obj/item/clothing/mask/fakemoustache{ - pixel_x = 8; - pixel_y = -5 - }, -/turf/open/floor/plating, -/area/station/service/barber) "daQ" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -13882,6 +13906,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/security/prison) +"dpb" = ( +/obj/machinery/door/airlock{ + id_tag = "commissarydoor"; + name = "Barber Storage" + }, +/turf/open/floor/iron/checker, +/area/station/service/barber) "dpd" = ( /turf/open/misc/grass/jungle, /area/station/science/lower) @@ -16384,9 +16415,6 @@ /obj/structure/industrial_lift/public, /turf/open/floor/plating/elevatorshaft, /area/station/cargo/miningdock) -"eep" = ( -/turf/open/floor/plating, -/area/station/service/barber) "eer" = ( /obj/structure/chair/pew, /obj/effect/landmark/start/hangover, @@ -18547,6 +18575,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/closed/wall/r_wall, /area/station/science/ordnance/burnchamber) +"ePd" = ( +/obj/machinery/vending/barbervend, +/turf/open/floor/iron/checker, +/area/station/service/barber) "ePj" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ dir = 1 @@ -20837,16 +20869,6 @@ /obj/structure/cable, /turf/open/floor/iron/dark, /area/station/command/bridge) -"fzO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/door/airlock/wood{ - name = "Representative Bedroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "fzZ" = ( /obj/effect/turf_decal/stripes{ dir = 1 @@ -23505,6 +23527,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/maintenance/department/science) +"gwq" = ( +/obj/machinery/camera/motion/directional/north{ + c_tag = "Secure - Nuclear Storage"; + network = list("ss13","secure") + }, +/obj/structure/closet/secure_closet/nanotrasen_representative, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/nt_rep) "gwy" = ( /obj/structure/sign/warning/no_smoking{ pixel_x = -28 @@ -24732,6 +24762,9 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/dark, /area/station/science/ordnance/storage) +"gPu" = ( +/turf/open/floor/iron/checker, +/area/station/service/barber) "gPw" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -24975,6 +25008,14 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/white, /area/station/science/research) +"gST" = ( +/obj/machinery/door/airlock/corporate{ + name = "Blueshield's Quarters" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/carpet/neon/simple/blue/nodots, +/area/station/command/heads_quarters/blueshield) "gTl" = ( /obj/structure/lattice/catwalk, /obj/effect/mapping_helpers/airlock/cyclelink_helper, @@ -29843,6 +29884,16 @@ /obj/machinery/newscaster/directional/east, /turf/open/floor/carpet, /area/station/security/detectives_office) +"ixV" = ( +/obj/structure/chair/comfy/brown{ + color = "#c45c57"; + desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; + dir = 4; + name = "Premium Cozy Chair" + }, +/obj/effect/landmark/start/nanotrasen_representative, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "iyc" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) @@ -30305,6 +30356,19 @@ }, /turf/open/floor/carpet, /area/station/command/meeting_room) +"iGV" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "Repdoor"; + name = "Representative's Office" + }, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "iHr" = ( /obj/structure/sink{ dir = 4; @@ -34322,6 +34386,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/grimy, /area/station/hallway/secondary/entry) +"jTg" = ( +/obj/structure/closet, +/obj/item/clothing/head/soft/red, +/obj/item/clothing/head/soft/green{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/clothing/suit/apron/overalls, +/obj/item/clothing/suit/apron/overalls, +/turf/open/floor/iron/checker, +/area/station/service/barber) "jTj" = ( /obj/structure/railing, /obj/effect/turf_decal/trimline/dark_blue/arrow_cw, @@ -38025,6 +38100,20 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/smooth, /area/station/hallway/primary/tram/right) +"kYn" = ( +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/item/clothing/accessory/medal/silver/bureaucracy, +/obj/item/clothing/accessory/medal/gold/ordom, +/obj/item/flashlight/lamp/green{ + pixel_x = 5; + pixel_y = 16 + }, +/turf/open/floor/wood/parquet, +/area/station/command/heads_quarters/nt_rep) "kYp" = ( /obj/structure/industrial_lift/tram, /obj/structure/window/reinforced/tram/directional/south, @@ -40029,18 +40118,6 @@ /obj/item/wrench, /turf/open/floor/iron/white, /area/station/maintenance/department/science) -"lFC" = ( -/obj/machinery/door/airlock/corporate{ - id_tag = "Repdoor"; - name = "Representative's Office" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "lFH" = ( /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, @@ -40791,13 +40868,6 @@ /obj/effect/landmark/start/paramedic, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"lTf" = ( -/obj/machinery/door/airlock{ - id_tag = "commissarydoor"; - name = "Barber Storage" - }, -/turf/open/floor/plating, -/area/station/service/barber) "lTx" = ( /obj/effect/turf_decal/stripes/white/line, /obj/effect/turf_decal/siding/wideplating/dark{ @@ -49140,14 +49210,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/white, /area/station/science/lower) -"oCT" = ( -/obj/item/modular_computer/laptop/preset/civilian{ - pixel_y = 7 - }, -/obj/structure/table/wood, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/nt_rep) "oCX" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ @@ -52095,6 +52157,30 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/commons/fitness/recreation) +"pBl" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table, +/obj/item/clothing/head/wig, +/obj/item/clothing/head/wig{ + pixel_x = 4; + pixel_y = -5 + }, +/obj/item/clothing/head/wig{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/clothing/mask/fakemoustache, +/obj/item/clothing/mask/fakemoustache, +/obj/item/clothing/mask/fakemoustache{ + pixel_x = -4; + pixel_y = -5 + }, +/obj/item/clothing/mask/fakemoustache{ + pixel_x = 8; + pixel_y = -5 + }, +/turf/open/floor/iron/checker, +/area/station/service/barber) "pBx" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/turf_decal/stripes/asteroid/full, @@ -54558,13 +54644,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/science/robotics/mechbay) -"qoq" = ( -/obj/machinery/door/airlock/corporate{ - name = "Blueshield's Quarters" - }, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/turf/open/floor/carpet/neon/simple/blue/nodots, -/area/station/command/heads_quarters/blueshield) "qos" = ( /obj/machinery/exodrone_launcher, /obj/effect/decal/cleanable/dirt, @@ -55865,20 +55944,6 @@ /obj/machinery/computer/crew, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"qIq" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = 5; - pixel_y = 16 - }, -/obj/item/clothing/accessory/medal/gold/ordom, -/obj/item/clothing/accessory/medal/silver/bureaucracy, -/obj/structure/table/wood, -/obj/machinery/camera/motion/directional/north{ - c_tag = "Secure - Nuclear Storage"; - network = list("ss13","secure") - }, -/turf/open/floor/wood/parquet, -/area/station/command/heads_quarters/nt_rep) "qIs" = ( /obj/structure/closet/secure_closet/security, /obj/effect/turf_decal/trimline/red/filled/line, @@ -56742,6 +56807,19 @@ /obj/item/radio/intercom/directional/east, /turf/open/floor/iron/white, /area/station/science/ordnance) +"qWx" = ( +/obj/machinery/door/airlock/corporate{ + id_tag = "BSdoor"; + name = "Blueshield's Office" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/landmark/navigate_destination, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/turf/open/floor/carpet/neon/simple/blue/nodots, +/area/station/command/heads_quarters/blueshield) "qWy" = ( /obj/item/kirbyplants/random, /obj/machinery/newscaster/directional/south, @@ -58946,28 +59024,6 @@ }, /turf/open/floor/iron/dark, /area/station/service/hydroponics) -"rHs" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/paper/fluff/gateway, -/obj/item/pen/fountain{ - pixel_y = 10 - }, -/obj/item/stamp/centcom{ - pixel_x = 6 - }, -/obj/item/stamp/denied{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stamp{ - pixel_x = -6 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "rHu" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Science Maintenance Hatch" @@ -61003,18 +61059,6 @@ }, /turf/open/floor/iron/white, /area/station/science/lower) -"sqP" = ( -/obj/machinery/door/airlock/corporate{ - id_tag = "BSdoor"; - name = "Blueshield's Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/access/all/admin/general, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/carpet/neon/simple/blue/nodots, -/area/station/command/heads_quarters/blueshield) "sqQ" = ( /obj/machinery/door/airlock/medical{ name = "Surgery B" @@ -62089,23 +62133,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/entrance, /turf/open/floor/iron, /area/station/security/brig) -"sHA" = ( -/obj/structure/table, -/obj/item/razor, -/obj/item/reagent_containers/cup/rag{ - pixel_x = 8; - pixel_y = 15 - }, -/obj/item/reagent_containers/cup/bottle{ - desc = "A small bottle of Barber's Aid."; - list_reagents = list(/datum/reagent/barbers_aid=30); - name = "Barber's Aid bottle"; - pixel_x = 10; - pixel_y = 3 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/wood/large, -/area/station/service/barber) "sHH" = ( /turf/closed/wall/r_wall, /area/station/command/heads_quarters/ce) @@ -68232,6 +68259,25 @@ /obj/effect/turf_decal/siding/thinplating, /turf/open/floor/iron, /area/station/hallway/primary/tram/center) +"uCs" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/paper/fluff/gateway, +/obj/item/pen/fountain{ + pixel_y = 10 + }, +/obj/item/stamp/denied{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/stamp{ + pixel_x = -6 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "uCv" = ( /obj/effect/turf_decal/siding/wood, /turf/open/floor/iron/grimy, @@ -72753,6 +72799,17 @@ }, /turf/open/floor/circuit/telecomms/server, /area/station/science/server) +"vSo" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Representative Bedroom" + }, +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep, +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield, +/turf/open/floor/wood, +/area/station/command/heads_quarters/nt_rep) "vSt" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/south, @@ -73121,10 +73178,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"vZB" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/wood/large, -/area/station/service/barber) "vZD" = ( /obj/item/kirbyplants/random/dead, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73947,10 +74000,6 @@ }, /turf/open/floor/iron, /area/station/security/checkpoint/supply) -"wna" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/service/barber) "wng" = ( /obj/structure/cable, /obj/structure/table, @@ -74617,17 +74666,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/construction/engineering) -"wxa" = ( -/obj/structure/closet, -/obj/item/clothing/head/soft/red, -/obj/item/clothing/head/soft/green{ - pixel_x = 4; - pixel_y = -1 - }, -/obj/item/clothing/suit/apron/overalls, -/obj/item/clothing/suit/apron/overalls, -/turf/open/floor/plating, -/area/station/service/barber) "wxb" = ( /obj/structure/cable, /obj/structure/disposalpipe/junction/yjunction{ @@ -77761,15 +77799,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"xAQ" = ( -/obj/structure/chair/comfy/brown{ - color = "#c45c57"; - desc = "Remarkably soft, with plush cozy cushions, premium memory-foam and covered in stain-resistant fabric. Made by Kat-Kea???!"; - dir = 4; - name = "Premium Cozy Chair" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/nt_rep) "xAR" = ( /obj/machinery/door/airlock/security{ name = "Prison Workshop" @@ -95289,7 +95318,7 @@ jWs oVM oVM lRi -qIq +gwq dUv ozL aAa @@ -95546,7 +95575,7 @@ lqD oYr nkB lRi -oCT +kYn wXp svE qLy @@ -95805,7 +95834,7 @@ kCj lRi bYI bYI -fzO +vSo lQM pZW pZW @@ -96061,7 +96090,7 @@ mgS kCj lRi nhN -xAQ +ixV igP lQM unC @@ -96318,7 +96347,7 @@ mgS bLk lRi hjX -rHs +uCs qLG lQM wOa @@ -97605,7 +97634,7 @@ rUR rUR rUR gnH -lFC +iGV bEz tpc lQM @@ -99147,7 +99176,7 @@ rUR rUR rUR uzS -sqP +qWx pnp bJM lQM @@ -99915,7 +99944,7 @@ kLz kLz lRF gfH -qoq +gST bML lyI iUN @@ -114577,8 +114606,8 @@ rcU rcU qWy mGw -dau -wxa +jTg +ePd mGw nvU nag @@ -114834,8 +114863,8 @@ eTW eTW izQ mGw -eep -wna +gPu +pBl mGw mjf iaA @@ -115090,9 +115119,9 @@ tqd nzC lML fFl -lTf -eep -eep +dpb +gPu +gPu mGw coX fJo @@ -115342,7 +115371,7 @@ iRL iRL ykX mGw -vZB +caC bja nar ahj @@ -115599,11 +115628,11 @@ iRL cXm ykX mGw -sHA +brQ sYl unD sYl -aiL +brQ mGw aaa aaa diff --git a/auxlua.dll b/auxlua.dll deleted file mode 100755 index 4f712c26d82e..000000000000 Binary files a/auxlua.dll and /dev/null differ diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index e670e05f4ce8..02faa4f529df 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -34,6 +34,10 @@ #define ACCESS_CAPTAIN "captain" /// Access used for the Head of Personnel's personal quarters in mapping, as well as the security console and other HoP-related things. #define ACCESS_HOP "hop" +/// Access for Blueshield to their office and locker, as well as access to the NT Representitive Office +#define ACCESS_BLUESHIELD "blueshield" ///monkestation edit +/// Access for NT Rep to their office and locker, as well as access to the Blueshield Office +#define ACCESS_NT_REPRESENTATVE "nt_rep" ///monkestation edit /// Security's General Access. In mapping, grants access to spaces such as to the "meeting room" or firing range, as well as being the general access that Tablet/Computer Programs check for "heads". Also unlocks other types of security equipment. #define ACCESS_SECURITY "security" @@ -51,7 +55,7 @@ #define ACCESS_HOS "hos" /// Access for the detective to get into their office, the medical data console, and some other detective-related stuff. #define ACCESS_DETECTIVE "detective" -/// Access for the brig physician to get basic access to medical tools, but not all encompassing access to medical under normal manning. MONKESTATION EDIT +/// Access for the brig physician to get basic access to medical tools, but not all encompassing access to medical under normal manning. #define ACCESS_BRIG_PHYSICIAN "brig_physician" /// MONKESTATION EDIT /// Engineering General Access, grants access to the standard parts of engineering (as well as the Supermatter and related equipment). diff --git a/code/__DEFINES/clothing_paths.dm b/code/__DEFINES/clothing_paths.dm index 9c7ef699a3ec..613937e2c8c3 100644 --- a/code/__DEFINES/clothing_paths.dm +++ b/code/__DEFINES/clothing_paths.dm @@ -1,14 +1,3 @@ -#define SIMIAN_UNIFORM_ICON 'monkestation/icons/mob/clothing/species/simian/uniform.dmi' -#define SIMIAN_SUIT_ICON 'monkestation/icons/mob/clothing/species/simian/suit.dmi' -#define SIMIAN_BACK_ICON 'monkestation/icons/mob/clothing/species/simian/back.dmi' -#define SIMIAN_BELT_ICON 'monkestation/icons/mob/clothing/species/simian/belts.dmi' -#define SIMIAN_GLASSES_ICON 'monkestation/icons/mob/clothing/species/simian/glasses.dmi' -#define SIMIAN_GLOVES_ICON 'monkestation/icons/mob/clothing/species/simian/gloves.dmi' -#define SIMIAN_NECK_ICON 'monkestation/icons/mob/clothing/species/simian/neck.dmi' -#define SIMIAN_SHOES_ICON 'monkestation/icons/mob/clothing/species/simian/shoes.dmi' - - - #define LOADOUT_ITEM_BELT "belt" #define LOADOUT_ITEM_EARS "ears" #define LOADOUT_ITEM_GLASSES "glasses" diff --git a/code/__DEFINES/color_matrix/simian_matrix.dm b/code/__DEFINES/color_matrix/lizard_matrix.dm similarity index 91% rename from code/__DEFINES/color_matrix/simian_matrix.dm rename to code/__DEFINES/color_matrix/lizard_matrix.dm index cd3580993e05..050519d55df9 100644 --- a/code/__DEFINES/color_matrix/simian_matrix.dm +++ b/code/__DEFINES/color_matrix/lizard_matrix.dm @@ -1,4 +1,6 @@ // These COLORPIXEL defines indicate the pixel position on the base sprite of a clothing piece from which the color will be taken. +// Only 4 of these are used, for digi lizards. Rest have been removed once Simians were changed to use filters instead. +/* #define GLASSES_COLORPIXEL_X_1 10 #define GLASSES_COLORPIXEL_Y_1 16 #define GLASSES_COLORPIXEL_X_2 18 @@ -40,12 +42,15 @@ #define CLOAK_COLORPIXEL_X_2 12 #define CLOAK_COLORPIXEL_Y_2 22 +*/ #define UNDER_COLORPIXEL_X_1 15 #define UNDER_COLORPIXEL_Y_1 17 #define UNDER_COLORPIXEL_X_2 10 #define UNDER_COLORPIXEL_Y_2 19 +/* #define UNDER_COLORPIXEL_X_3 15 #define UNDER_COLORPIXEL_Y_3 10 #define BACK_COLORPIXEL_X_1 13 #define BACK_COLORPIXEL_Y_1 18 +*/ diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 6d73b04a78e6..8fa72b137e64 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -352,3 +352,6 @@ GLOBAL_LIST_INIT(cable_colors, list( CABLE_COLOR_YELLOW = CABLE_HEX_COLOR_YELLOW, CABLE_COLOR_BROWN = CABLE_HEX_COLOR_BROWN )) + +//Monkestation non-modular change: This has to be here because we use it in setup_consistent_human_dna +#define COLOR_MONKEY_BROWN "#cd8765" diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index c1cc99efbc57..a552b7a7d446 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -128,6 +128,20 @@ #define ALT_STYLE 1 #define DIGITIGRADE_STYLE 2 +///Inventory slots that can be blacklisted by a species from being equipped into +DEFINE_BITFIELD(no_equip_flags, list( + "EXOSUIT" = ITEM_SLOT_OCLOTHING, + "JUMPSUIT" = ITEM_SLOT_ICLOTHING, + "GLOVES" = ITEM_SLOT_GLOVES, + "GLASSES" = ITEM_SLOT_EYES, + "EARPIECES" = ITEM_SLOT_EARS, + "MASKS" = ITEM_SLOT_MASK, + "HATS" = ITEM_SLOT_HEAD, + "SHOES" = ITEM_SLOT_FEET, + "BACKPACKS" = ITEM_SLOT_BACK, + "TIES" = ITEM_SLOT_NECK, +)) + //Flags (actual flags, fucker ^) for /obj/item/var/supports_variations_flags ///No alternative sprites based on bodytype #define CLOTHING_NO_VARIATION (1<<0) @@ -135,10 +149,8 @@ #define CLOTHING_DIGITIGRADE_VARIATION (1<<1) ///The sprite works fine for digitigrade legs as-is. #define CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON (1<<2) -///has a sprite for monkeys -#define CLOTHING_MONKEY_VARIATION (1<<3) ///Has a sprite for snouted heads specifically. -#define CLOTHING_SNOUTED_VARIATION (1<<4) +#define CLOTHING_SNOUTED_VARIATION (1<<3) //flags for covering body parts #define GLASSESCOVERSEYES (1<<0) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index e5f0e432f708..6018a55967c6 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -83,7 +83,6 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define islizard(A) (is_species(A, /datum/species/lizard)) #define isashwalker(A) (is_species(A, /datum/species/lizard/ashwalker)) #define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) -#define issimian(A) (is_species(A, /datum/species/simian)) //Monkestation Addition #define ispodperson(A) (is_species(A, /datum/species/pod)) #define isflyperson(A) (is_species(A, /datum/species/fly)) #define isjellyperson(A) (is_species(A, /datum/species/jelly)) diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index a183d79b9150..e4df3157fdfd 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -190,6 +190,9 @@ #define DEPARTMENT_BITFLAG_CENTRAL_COMMAND (1<<11) #define DEPARTMENT_CENTRAL_COMMAND "Central Command" +#define DEPARTMENT_BITFLAG_LATE (1<<12) +#define DEPARTMENT_LATE "Late Join" + /* Job datum job_flags */ /// Whether the mob is announced on arrival. #define JOB_ANNOUNCE_ARRIVAL (1<<0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index a0d08b7644e5..ae2897289448 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -113,9 +113,8 @@ #define SPECIES_LIZARD_SILVER "silverscale" #define SPECIES_NIGHTMARE "nightmare" #define SPECIES_MONKEY "monkey" -#define SPECIES_MONKEY_FREAK "monkey_freak" -#define SPECIES_MONKEY_HUMAN_LEGGED "monkey_human_legged" #define SPECIES_MOTH "moth" +#define SPECIES_TUNDRA "tundra_moth" //Monkestation Addition #define SPECIES_MUSHROOM "mush" #define SPECIES_PLASMAMAN "plasmaman" #define SPECIES_PODPERSON "pod" @@ -126,6 +125,10 @@ #define SPECIES_VAMPIRE "vampire" #define SPECIES_ZOMBIE "zombie" #define SPECIES_ZOMBIE_INFECTIOUS "memezombie" +#define SPECIES_ZOMBIE_INFECTIOUS_RUNNER "runnerzombie" //Monkestation Addition +#define SPECIES_ZOMBIE_INFECTIOUS_TANK "tankzombie" //monkestation edit +#define SPECIES_ZOMBIE_INFECTIOUS_SPITTER "spitterzombie" //monkestation edit +#define SPECIES_ZOMBIE_INFECTIOUS_BLOATER "bloaterzombie" //monkestation edit #define SPECIES_ZOMBIE_KROKODIL "krokodil_zombie" #define SPECIES_OOZELING "oozeling" #define SPECIES_IPC "ipc" @@ -649,17 +652,22 @@ // - They do not start at 0 for futureproofing // - They skip numbers for futureproofing as well // Otherwise they are completely arbitrary -#define HUMAN_HEIGHT_DWARF 2 -#define HUMAN_HEIGHT_SHORTEST 4 -#define HUMAN_HEIGHT_SHORT 6 -#define HUMAN_HEIGHT_MEDIUM 8 -#define HUMAN_HEIGHT_TALL 10 -#define HUMAN_HEIGHT_TALLEST 12 +#define MONKEY_HEIGHT_DWARF 2 +#define MONKEY_HEIGHT_MEDIUM 4 +#define HUMAN_HEIGHT_DWARF 6 +#define HUMAN_HEIGHT_SHORTEST 8 +#define HUMAN_HEIGHT_SHORT 10 +#define HUMAN_HEIGHT_MEDIUM 12 +#define HUMAN_HEIGHT_TALL 14 +#define HUMAN_HEIGHT_TALLER 16 +#define HUMAN_HEIGHT_TALLEST 18 /// Assoc list of all heights, cast to strings, to """"tuples""""" /// The first """tuple""" index is the upper body offset /// The second """tuple""" index is the lower body offset GLOBAL_LIST_INIT(human_heights_to_offsets, list( + "[MONKEY_HEIGHT_DWARF]" = list(-9, -3), + "[MONKEY_HEIGHT_MEDIUM]" = list(-7, -4), "[HUMAN_HEIGHT_DWARF]" = list(-5, -4), "[HUMAN_HEIGHT_SHORTEST]" = list(-2, -1), "[HUMAN_HEIGHT_SHORT]" = list(-1, -1), @@ -672,21 +680,19 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// Total number of layers for mob overlays /// KEEP THIS UP-TO-DATE OR SHIT WILL BREAK /// Also consider updating layers_to_offset -#define TOTAL_LAYERS 35 +#define TOTAL_LAYERS 34 /// Mutant race multiparts - Lbelly -#define ACCESSORIES_LAYER 35 +#define ACCESSORIES_LAYER 34 /// Mutations layer - Tk headglows, cold resistance glow, etc -#define MUTATIONS_LAYER 34 +#define MUTATIONS_LAYER 33 /// Mutantrace features (tail when looking south) that must appear behind the body parts -#define BODY_BEHIND_LAYER 33 +#define BODY_BEHIND_LAYER 32 /// Layer for bodyparts that should appear behind every other bodypart - Mostly, legs when facing WEST or EAST -#define BODYPARTS_LOW_LAYER 32 +#define BODYPARTS_LOW_LAYER 31 /// Layer for most bodyparts, appears above BODYPARTS_LOW_LAYER and below BODYPARTS_HIGH_LAYER -#define BODYPARTS_LAYER 31 +#define BODYPARTS_LAYER 30 /// Mutantrace features (snout, body markings) that must appear above the body parts -#define BODY_ADJ_LAYER 30 -// Eyes, lips(makeup) -#define FACE_LAYER 29 +#define BODY_ADJ_LAYER 29 /// Underwear, undershirts, socks #define BODY_LAYER 28 /// Mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) @@ -773,7 +779,6 @@ GLOBAL_LIST_INIT(layers_to_offset, list( "[ID_LAYER]" = UPPER_BODY, "[FACEMASK_LAYER]" = UPPER_BODY, monkestation end */ - "[FACE_LAYER]" = UPPER_BODY, // These two are cached, and have their appearance shared(?), so it's safer to just not touch it "[MUTATIONS_LAYER]" = NO_MODIFY, "[FRONT_MUTATIONS_LAYER]" = NO_MODIFY, diff --git a/code/__DEFINES/research/anomalies.dm b/code/__DEFINES/research/anomalies.dm index faf1163efd8a..a051fb2ff8be 100644 --- a/code/__DEFINES/research/anomalies.dm +++ b/code/__DEFINES/research/anomalies.dm @@ -20,18 +20,11 @@ GLOBAL_LIST_INIT(bioscrambler_parts_blacklist, typecacheof(list( /obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva, - // Re-add the ones below this line when the bug with offset is fixed - /obj/item/bodypart/leg/left/monkey, - /obj/item/bodypart/leg/right/monkey, - /obj/item/bodypart/leg/left/tallboy, - /obj/item/bodypart/leg/right/tallboy, ))) /// Blacklist of limb IDs which should not appear when bioscrambled, mostly because they looks awful and buggy. GLOBAL_LIST_INIT(bioscrambler_limb_id_blacklist, list( BODYPART_ID_PSYKER, - SPECIES_SIMIAN, - SPECIES_MONKEY, SPECIES_GOBLIN, SPECIES_TERATOMA, )) diff --git a/code/__DEFINES/species_clothing_paths.dm b/code/__DEFINES/species_clothing_paths.dm index 745d6e51a0ab..c9863360558c 100644 --- a/code/__DEFINES/species_clothing_paths.dm +++ b/code/__DEFINES/species_clothing_paths.dm @@ -6,10 +6,6 @@ ///The dmi for humanoid oversuits #define DEFAULT_SUIT_FILE 'icons/mob/clothing/suits/default.dmi' -//MONKEY PATHS -///The dmi for monkey uniforms -#define MONKEY_UNIFORM_FILE 'icons/mob/species/monkey/uniform.dmi' - //DIGITIGRADE PATHS ///The dmi containing digitigrade uniforms #define DIGITIGRADE_UNIFORM_FILE 'monkestation/icons/mob/species/misc/uniform_digi.dmi' diff --git a/code/__DEFINES/traits/monkestation/declarations.dm b/code/__DEFINES/traits/monkestation/declarations.dm index e3e0abafd7a2..40e82200d5e2 100644 --- a/code/__DEFINES/traits/monkestation/declarations.dm +++ b/code/__DEFINES/traits/monkestation/declarations.dm @@ -22,7 +22,7 @@ /// The mob's nanites are sending a monitoring signal visible on diag HUD. #define TRAIT_NANITE_MONITORING "nanite_monitoring" /// This mob can vault over climable structures. -#define TRAIT_VAULTING "vaulting" //simian trait +#define TRAIT_VAULTING "vaulting" /// Ethereals with this trait will not suffer negative effects from overcharge. #define TRAIT_ETHEREAL_NO_OVERCHARGE "ethereal_no_overcharge" /// Oozelings with this trait will not lose limbs from low blood/nutrition. @@ -55,6 +55,8 @@ #define TRAIT_GHOST_CRITTER "ghost_critter" /// This mob is *currently* being flashed by someone with CAN_BYPASS_INNATE_FLASH_RESISTANCE returning TRUE. Used to make IPCs not immune to rev and bb conversions. #define TRAIT_CONVERSION_FLASHED "conversion_flashed" +/// For when a mob has been consumed by a zombie +#define TRAIT_ZOMBIE_CONSUMED "zombie_consumed" // /datum/mind + /mob/living /// Prevents the user from casting spells using sign language. Works on both /datum/mind and /mob/living. @@ -83,7 +85,6 @@ #define TRAIT_HIDDEN_CLOWN "clown_disbelief" #define TRAIT_HIDDEN_IMAGE "generic-hidden-image" #define TRAIT_JAILBIRD "jailbird" -#define TRAIT_KLEPTOMANIAC "kleptomaniac" #define TRAIT_LOUD_ASS "loud_ass" #define TRAIT_MINING_CALLOUTS "miner_callouts" #define TRAIT_PARANOIA "paranoia" diff --git a/code/__DEFINES/traits/monkestation/sources.dm b/code/__DEFINES/traits/monkestation/sources.dm index 057086421db2..8bd486c45502 100644 --- a/code/__DEFINES/traits/monkestation/sources.dm +++ b/code/__DEFINES/traits/monkestation/sources.dm @@ -32,3 +32,5 @@ #define FRENZY_TRAIT "frenzy_trait" /// Source trait for slashers. #define TRAIT_SLASHER "slasher_trait" +/// Source trait for zombies +#define ZOMBIE_TRAIT "zombie_trait" diff --git a/code/__DEFINES/~monkestation/atom_hud.dm b/code/__DEFINES/~monkestation/atom_hud.dm index b6b498fecdd4..c650af394cfc 100644 --- a/code/__DEFINES/~monkestation/atom_hud.dm +++ b/code/__DEFINES/~monkestation/atom_hud.dm @@ -1,2 +1,3 @@ #define SECHUD_SECURITY_ASSISTANT "hudsecass" #define SECHUD_BLUESHIELD "hudblueshield" +#define SECHUD_BARBER "hudbarber" diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_item.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_item.dm index b913dd94bfe1..99615d4ef0fd 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_item.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_item.dm @@ -18,3 +18,6 @@ #define COMSIG_CHECK_TURF_CLOCKWORK "check_turf_clockwork" #define COMSIG_ITEM_DAMAGE_MULTIPLIER "damage_multi_item" + +///Sent by a tumor when its removed +#define COMSIG_ZOMBIE_TUMOR_REMOVED "zombie_tumor_removed" diff --git a/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm index a31bed15e891..e0745d27fd0b 100644 --- a/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/~monkestation/dcs/signals/signals_mob/signals_mob_main.dm @@ -47,3 +47,6 @@ /// Initiates a nightmare snuff check (eats dim lights on everything within 2 tiles) with the given args. (turf/start_turf) #define COMSIG_NIGHTMARE_SNUFF_CHECK "nightmare_snuff_check" + +/// From base of /datum/species/zombie/infectious/proc/set_consumed_flesh(): (new_amount, old_amount) +#define COMSIG_ZOMBIE_FLESH_ADJUSTED "zombie_flesh_adjusted" diff --git a/code/__DEFINES/~monkestation/jobs.dm b/code/__DEFINES/~monkestation/jobs.dm index c7862b04e7c8..1ae92eb6c322 100644 --- a/code/__DEFINES/~monkestation/jobs.dm +++ b/code/__DEFINES/~monkestation/jobs.dm @@ -5,3 +5,5 @@ #define JOB_NANOTRASEN_REPRESENTATIVE "Nanotrasen Representative" /// Whether this job is enabled/disabled by the spooktober config #define JOB_SPOOKTOBER (1<<16) + +#define JOB_LATEJOIN_BARBER "Barber" diff --git a/code/__HELPERS/_auxtools_api.dm b/code/__HELPERS/_auxtools_api.dm index 0117ded4c519..a907be8ecf8f 100644 --- a/code/__HELPERS/_auxtools_api.dm +++ b/code/__HELPERS/_auxtools_api.dm @@ -1,38 +1,3 @@ -#define AUXTOOLS_FULL_INIT 2 -#define AUXTOOLS_PARTIAL_INIT 1 - -GLOBAL_LIST_EMPTY(auxtools_initialized) -GLOBAL_PROTECT(auxtools_initialized) - -#define AUXTOOLS_CHECK(LIB)\ - if (!CONFIG_GET(flag/auxtools_enabled)) {\ - CRASH("Auxtools is not enabled in config!");\ - }\ - if (GLOB.auxtools_initialized[LIB] != AUXTOOLS_FULL_INIT) {\ - if (fexists(LIB)) {\ - var/string = call_ext(LIB,"auxtools_init")();\ - if(findtext(string, "SUCCESS")) {\ - GLOB.auxtools_initialized[LIB] = AUXTOOLS_FULL_INIT;\ - } else {\ - CRASH(string);\ - }\ - } else {\ - CRASH("No file named [LIB] found!")\ - }\ - }\ - -#define AUXTOOLS_SHUTDOWN(LIB)\ - if (GLOB.auxtools_initialized[LIB] == AUXTOOLS_FULL_INIT && fexists(LIB)){\ - call_ext(LIB,"auxtools_shutdown")();\ - GLOB.auxtools_initialized[LIB] = AUXTOOLS_PARTIAL_INIT;\ - }\ - -#define AUXTOOLS_FULL_SHUTDOWN(LIB)\ - if (GLOB.auxtools_initialized[LIB] && fexists(LIB)){\ - call_ext(LIB,"auxtools_full_shutdown")();\ - GLOB.auxtools_initialized[LIB] = FALSE;\ - } - /proc/auxtools_stack_trace(msg) CRASH(msg) diff --git a/code/__HELPERS/_dreamluau.dm b/code/__HELPERS/_dreamluau.dm new file mode 100644 index 000000000000..d8bb784c217a --- /dev/null +++ b/code/__HELPERS/_dreamluau.dm @@ -0,0 +1,301 @@ +/* This comment bypasses grep checks */ /var/__dreamluau + +/* This comment also bypasses grep checks */ /var/__dreamluau_exists + +#define DREAMLUAU_EXISTS (__dreamluau_exists ||= fexists(DREAMLUAU)) + +#define DREAMLUAU (world.system_type == MS_WINDOWS ? "dreamluau.dll" : (__dreamluau ||= __detect_auxtools("dreamluau"))) + +#define DREAMLUAU_CALL(func) (!DREAMLUAU_EXISTS) ? null : call_ext(DREAMLUAU, "byond:" + #func) + +/** + * All of the following functions will return a string if the underlying rust code returns an error or a wrapped panic. + * The return values specified for each function are what they will return if successful. + */ + +/** + * As of 515.1631, byondapi does not provide direct access to `usr`. + * Use this function to pass `usr` into the dreamluau binary so that luau scripts can retrieve it. + * + * @return null on success + */ +#define DREAMLUAU_SET_USR DREAMLUAU_CALL(set_usr)(usr) + + +/** + * Sets the execution limit, in milliseconds. + * + * @param limit the new execution limit + * + * @return null on success + */ +#define DREAMLUAU_SET_EXECUTION_LIMIT_MILLIS(limit) DREAMLUAU_CALL(set_execution_limit_millis)((limit)) + +/** + * Sets the execution limit, in seconds. + * + * @param limit the new execution limit + * + * @return null on success + */ +#define DREAMLUAU_SET_EXECUTION_LIMIT_SECS(limit) DREAMLUAU_CALL(set_execution_limit_secs)((limit)) + +/** + * Clears the execution limit, allowing scripts to run as long as they need to. + * + * WARNING: This allows infinite loops to block Dream Daemon indefinitely, with no safety checks. + * Do not use this if you have no reason for scripts to run arbitrarily long. + * + * @return null on success + */ +#define DREAMLUAU_CLEAR_EXECUTION_LIMIT DREAMLUAU_CALL(clear_execution_limit) + +//Wrapper setters/clearers + +/** + * Set the wrapper for instancing new datums with `dm.new`. + * Clears it if the argument is null. + * If unset, the object will be instantiated using the default `new` instruction. + * + * The wrapper must be a proc with the signature `(type as path, list/arguments)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_NEW_WRAPPER(wrapper) DREAMLUAU_CALL(set_new_wrapper)((wrapper)) + +/** + * Set the wrapper for reading the vars of an object. + * Clears it if the argument is null. + * If unset, the var will be read directly, without any safety checks. + * + * The wrapper must be a proc with the signature `(target, var)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_VAR_GET_WRAPPER(wrapper) DREAMLUAU_CALL(set_var_get_wrapper)((wrapper)) + +/** + * Set the wrapper for writing the vars of an object. + * Clears it if the argument is null. + * If unset, the var will be modified directly, without any safety checks. + * + * The wrapper must be a proc with the signature `(target, var, value)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_VAR_SET_WRAPPER(wrapper) DREAMLUAU_CALL(set_var_set_wrapper)((wrapper)) + +/** + * Set the wrapper for calling a proc on an object. + * Clears it if the argument is null. + * If unset, the proc will be called directly, without any safety checks. + * + * The wrapper must be a proc with the signature `(target, procname as text, list/arguments)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_OBJECT_CALL_WRAPPER(wrapper) DREAMLUAU_CALL(set_object_call_wrapper)((wrapper)) + +/** + * Set the wrapper for calling a global proc. + * Clears it if the argument is null. + * If unset, the proc will be called directly, without any safety checks. + * + * The wrapper must be a proc with the signature `(procname as text, list/arguments)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_GLOBAL_CALL_WRAPPER(wrapper) DREAMLUAU_CALL(set_global_call_wrapper)((wrapper)) + +/** + * Set the wrapper for printing with the `print` function. + * Clears it if the argument is null. + * If unset, `print` will raise an error. + * + * The wrapper must be a proc with the signature `(list/arguments)`. + * + * @param wrapper the path to the proc to use as the new wrapper + * + * @return null on success + */ +#define DREAMLUAU_SET_PRINT_WRAPPER(wrapper) DREAMLUAU_CALL(set_print_wrapper)((wrapper)) + + + +/** + * Create a new luau state. + * + * @return a handle to the created state. + */ +#define DREAMLUAU_NEW_STATE DREAMLUAU_CALL(new_state) + +/** + * Some of the following functions return values that cannot be cleanly converted from luau to DM. + * To account for this, these functions also return a list of variant specifiers, equivalent to + * an array of objects of the type described beloe: + * ``` + * type Variants = { + * key?: "error"|Array + * value?: "error"|Array + * } + * ``` + */ + +/** + * The following 4 functions execute luau code and return + * an associative list containing information about the result. + * This list has the following params. + * + * - "status": either "finished", "sleep", "yield", or "error" + * - "return_values": if "status" is "finished" or "yield", contains a list of the return values + * - "variants": a list of variant specifiers for the "return_values" param + * - "message": if "status" is "error", contains the error message + * - "name": the name of the executed code, according to the `what` field of `debug.getinfo` + */ + +/** + * Load and execute a luau script. + * + * @param state the handle to the state + * @param code the source code of the script to run + * @param name an optional name to give to the script, for debugging purposes + * + * @return an associative list containing result information as specified above + */ +#define DREAMLUAU_LOAD DREAMLUAU_CALL(load) + +/** + * Awaken the thread at the front of the specified state's sleeping thread queue. + * + * @param state the handle to the state + * + * @return an associative list containing result information as specified above + */ +#define DREAMLUAU_AWAKEN(state) DREAMLUAU_CALL(awaken)((state)) + +/** + * Resume one of the state's yielded threads. + * + * @param state the handle to the state + * @param index the index of the thread in the state's yielded threads list + * @param ...arguments arguments that will be returned by the `coroutine.yield` that yielded the thread + * + * @return an associative list containing result information as specified above + */ +#define DREAMLUAU_RESUME DREAMLUAU_CALL(resume) + +/** + * Call a function accessible from the global table. + * + * @param state the handle to the state + * @param function a list of nested indices from the global table to the specified function + * @param ...arguments arguments to pass to the function + * + * @return an associative list containing result information as specified above + */ +#define DREAMLUAU_CALL_FUNCTION DREAMLUAU_CALL(call_function) + +// State information collection functions + +/** + * Obtain a copy of the state's global table, converted to DM. + * + * @param state the handle to the state + * + * @return an associative list with the follwing entries: + * - "values": The actual values of the global table + * - "variants": Variant specifiers for "values" + */ +#define DREAMLUAU_GET_GLOBALS(state) DREAMLUAU_CALL(get_globals)((state)) + +/** + * List the names of all sleeping or yielded threads for the state. + * + * @param state the handle to the state + * + * @return an associative list with the following entries: + * - "sleeps": A list of sleeping threads + * - "yields": A list of yielded threads + */ +#define DREAMLUAU_LIST_THREADS(state) DREAMLUAU_CALL(list_threads)((state)) + +// Cleanup functions + +/** + * Run garbage collection on the state. + * + * This may be necessary to prevent hanging references, as some + * hard references may persist in unreachable luau objects that + * would be collected after a garbage collection cycle or two. + * + * @param state the handle to the state + * + * @return null on success + */ +#define DREAMLUAU_COLLECT_GARBAGE(state) DREAMLUAU_CALL(collect_garbage)((state)) + +/** + * Remove a sleeping thread from the sleep queue, without executing it. + * + * @param state the handle to the state + * @param thread the index in the sleep queue to the target thread + * + * @return null on success + */ +#define DREAMLUAU_KILL_SLEEPING_THREAD(state, thread) DREAMLUAU_CALL(kill_sleeping_thread)((state), (thread)) + +/** + * Remove a yielded thread from the yield table, without executing it. + * + * @param state the handle to the state + * @param thread the index in the yield table to the target thread + * + * @return null on success + */ +#define DREAMLUAU_KILL_YIELDED_THREAD(state, thread) DREAMLUAU_CALL(kill_yielded_thread)((state), (thread)) + +/** + * Delete a state. The state's handle will be freed for any new states created afterwards. + * + * @param state the handle to the state + * + * @return null on success + */ +#define DREAMLUAU_KILL_STATE(state) DREAMLUAU_CALL(kill_state)((state)) + +/** + * Retrieve lua traceback info, containing every lua stack frame between the lua entrypoint and the re-entry to dm code. + * + * @param level the level of lua execution to get the traceback for, + * with 1 being the lua code that executed the dm code that called this function, + * 2 being the lua code that executed the dm code that executed the lua code + * that executed the dm code that called this function, etc. + * + * @return the callstack of the specified lua level if valid, null if invalid + */ +#define DREAMLUAU_GET_TRACEBACK(index) DREAMLUAU_CALL(get_traceback)((index)) + +/** + * Luau userdata corresponding to a ref-counted DM type counts as a hard reference for BYOND's garbage collector. + * If you need to delete a DM object, and you cannot be certain that there are no references to it in any luau state, + * call this function before deleting that object to disassociate it from any userdata in any luau state. + * + * Hard deleting an object without clearing userdata corresponding to it leaves the userdata to become associated with + * the next DM object to receive the old object's reference ID, which may be undesirable behavior. + * + * @param object the object to disassociate from userdata. + * + * @return null on success + */ +#define DREAMLUAU_CLEAR_REF_USERDATA(object) DREAMLUAU_CALL(clear_ref_userdata)((object)) + diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 16c6c5ae2364..5eb92dd15cf3 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -989,53 +989,57 @@ else return element -/// Returns a copy of the list where any element that is a datum or the world is converted into a ref -/proc/refify_list(list/target_list, list/visited, path_accumulator = "list") +/** + * Intermediate step for preparing lists to be passed into the lua editor tgui. + * Resolves weakrefs, converts some values without a standard textual representation to text, + * and can handle self-referential lists and potential duplicate output keys. + */ +/proc/prepare_lua_editor_list(list/target_list, list/visited) if(!visited) visited = list() var/list/ret = list() - visited[target_list] = path_accumulator + visited[target_list] = ret + var/list/duplicate_keys = list() for(var/i in 1 to target_list.len) var/key = target_list[i] var/new_key = key if(isweakref(key)) var/datum/weakref/ref = key - var/resolved = ref.resolve() - if(resolved) - new_key = "[resolved] [REF(resolved)]" - else - new_key = "null weakref [REF(key)]" - else if(isdatum(key)) - new_key = "[key] [REF(key)]" + new_key = ref.resolve() || "null weakref" else if(key == world) - new_key = "world [REF(world)]" + new_key = world.name + else if(ref(key) == "\[0xe000001\]") + new_key = "global" else if(islist(key)) - if(visited.Find(key)) + if(visited[key]) new_key = visited[key] else - new_key = refify_list(key, visited, path_accumulator + "\[[i]\]") + new_key = prepare_lua_editor_list(key, visited) var/value - if(istext(key) || islist(key) || ispath(key) || isdatum(key) || key == world) + if(!isnull(key) && !isnum(key)) value = target_list[key] if(isweakref(value)) var/datum/weakref/ref = value - var/resolved = ref.resolve() - if(resolved) - value = "[resolved] [REF(resolved)]" - else - value = "null weakref [REF(key)]" - else if(isdatum(value)) - value = "[value] [REF(value)]" - else if(value == world) - value = "world [REF(world)]" + value = ref.resolve() || "null weakref" + if(value == world) + value = "world" + else if(ref(value) == "\[0xe000001\]") + value = "global" else if(islist(value)) - if(visited.Find(value)) + if(visited[value]) value = visited[value] else - value = refify_list(value, visited, path_accumulator + "\[[key]\]") - var/list/to_add = list(new_key) - if(value) - to_add[new_key] = value + value = prepare_lua_editor_list(value, visited) + var/list/to_add = list() + if(!isnull(value)) + var/final_key = new_key + while(duplicate_keys[final_key]) + duplicate_keys[new_key]++ + final_key = "[new_key] ([duplicate_keys[new_key]])" + duplicate_keys[final_key] = 1 + to_add[final_key] = value + else + to_add += list(new_key) ret += to_add if(i < target_list.len) CHECK_TICK @@ -1044,29 +1048,31 @@ /** * Converts a list into a list of assoc lists of the form ("key" = key, "value" = value) * so that list keys that are themselves lists can be fully json-encoded + * and that unique objects with the same string representation do not + * produce duplicate keys that are clobbered by the standard JavaScript JSON.parse function */ -/proc/kvpify_list(list/target_list, depth = INFINITY, list/visited, path_accumulator = "list") +/proc/kvpify_list(list/target_list, depth = INFINITY, list/visited) if(!visited) visited = list() var/list/ret = list() - visited[target_list] = path_accumulator + visited[target_list] = ret for(var/i in 1 to target_list.len) var/key = target_list[i] var/new_key = key if(islist(key) && depth) - if(visited.Find(key)) + if(visited[key]) new_key = visited[key] else - new_key = kvpify_list(key, depth-1, visited, path_accumulator + "\[[i]\]") + new_key = kvpify_list(key, depth-1, visited) var/value - if(istext(key) || islist(key) || ispath(key) || isdatum(key) || key == world) + if(!isnull(key) && !isnum(key)) value = target_list[key] if(islist(value) && depth) - if(visited.Find(value)) + if(visited[value]) value = visited[value] else - value = kvpify_list(value, depth-1, visited, path_accumulator + "\[[key]\]") - if(value) + value = kvpify_list(value, depth-1, visited) + if(!isnull(value)) ret += list(list("key" = new_key, "value" = value)) else ret += list(list("key" = i, "value" = new_key)) @@ -1076,12 +1082,12 @@ /// Compares 2 lists, returns TRUE if they are the same /proc/deep_compare_list(list/list_1, list/list_2) - if(!islist(list_1) || !islist(list_2)) - return FALSE - if(list_1 == list_2) return TRUE + if(!islist(list_1) || !islist(list_2)) + return FALSE + if(list_1.len != list_2.len) return FALSE @@ -1104,11 +1110,11 @@ return TRUE /// Returns a copy of the list where any element that is a datum is converted into a weakref -/proc/weakrefify_list(list/target_list, list/visited, path_accumulator = "list") +/proc/weakrefify_list(list/target_list, list/visited) if(!visited) visited = list() var/list/ret = list() - visited[target_list] = path_accumulator + visited[target_list] = ret for(var/i in 1 to target_list.len) var/key = target_list[i] var/new_key = key @@ -1118,62 +1124,19 @@ if(visited.Find(key)) new_key = visited[key] else - new_key = weakrefify_list(key, visited, path_accumulator + "\[[i]\]") + new_key = weakrefify_list(key, visited) var/value - if(istext(key) || islist(key) || ispath(key) || isdatum(key) || key == world) + if(!isnull(key) && !isnum(key)) value = target_list[key] if(isdatum(value)) value = WEAKREF(value) else if(islist(value)) - if(visited.Find(value)) + if(visited[value]) value = visited[value] else - value = weakrefify_list(value, visited, path_accumulator + "\[[key]\]") - var/list/to_add = list(new_key) - if(value) - to_add[new_key] = value - ret += to_add - if(i < target_list.len) - CHECK_TICK - return ret - -/// Returns a copy of a list where text values (except assoc-keys and string representations of lua-only values) are -/// wrapped in quotes and existing quote marks are escaped, -/// and nulls are replaced with the string "null" -/proc/encode_text_and_nulls(list/target_list, list/visited) - var/static/regex/lua_reference_regex - if(!lua_reference_regex) - lua_reference_regex = regex(@"^((function)|(table)|(thread)|(userdata)): 0x[0-9a-fA-F]+$") - if(!visited) - visited = list() - var/list/ret = list() - visited[target_list] = TRUE - for(var/i in 1 to target_list.len) - var/key = target_list[i] - var/new_key = key - if(istext(key) && !target_list[key] && !lua_reference_regex.Find(key)) - new_key = "\"[replacetext(key, "\"", "\\\"")]\"" - else if(islist(key)) - var/found_index = visited.Find(key) - if(found_index) - new_key = visited[found_index] - else - new_key = encode_text_and_nulls(key, visited) - else if(isnull(key)) - new_key = "null" - var/value - if(istext(key) || islist(key) || ispath(key) || isdatum(key) || key == world) - value = target_list[key] - if(istext(value) && !lua_reference_regex.Find(value)) - value = "\"[replacetext(value, "\"", "\\\"")]\"" - else if(islist(value)) - var/found_index = visited.Find(value) - if(found_index) - value = visited[found_index] - else - value = encode_text_and_nulls(value, visited) + value = weakrefify_list(value, visited) var/list/to_add = list(new_key) - if(value) + if(!isnull(value)) to_add[new_key] = value ret += to_add if(i < target_list.len) @@ -1200,15 +1163,154 @@ return locate(coords["x"], coords["y"], coords["z"]) return locate(coords[1], coords[2], coords[3]) -//monkestation edit start -//Scales a range (i.e 1,100) and picks an item from the list based on your passed value -//i.e in a list with length 4, a 25 in the 1-100 range will give you the 2nd item -//This assumes your ranges start with 1, I am not good at math and can't do linear scaling -/proc/scale_range_pick(min,max,value,list/L) - if(!length(L)) - return null - var/index = 1 + (value * (length(L) - 1)) / (max - min) - if(length(L) < index) - index = length(L) - return L[index] -//monkestation edit end +/** + * Given a list and a list of its variant hints, appends variants that aren't explicitly required by dreamluau, + * but are required by the lua editor tgui. + */ +/proc/add_lua_editor_variants(list/values, list/variants, list/visited, path = "") + if(!islist(visited)) + visited = list() + visited[values] = "\[\]" + if(!islist(values) || !islist(variants)) + return + if(values.len != variants.len) + CRASH("values and variants must be the same length") + for(var/i in 1 to variants.len) + var/pair = variants[i] + var/pair_modified = FALSE + if(isnull(pair)) + pair = list("key", "value") + var/key = values[i] + if(islist(key)) + if(visited[key]) + pair["key"] = list("cycle", visited[key]) + else + var/list/key_variants = pair["key"] + var/new_path = path + "\[[i], \"key\"\]," + visited[key] = new_path + add_lua_editor_variants(key, key_variants, visited, new_path) + visited -= key + pair["key"] = list("list", key_variants) + pair_modified = TRUE + else if(isdatum(key) || key == world || ref(key) == "\[0xe000001\]") + pair["key"] = list("ref", ref(key)) + pair_modified = TRUE + var/value + if(!isnull(key) && !isnum(key)) + value = values[key] + if(islist(value)) + if(visited[value]) + pair["value"] = list("cycle", visited[value]) + else + var/list/value_variants = pair["value"] + var/new_path = path + "\[[i], \"value\"\]," + visited[value] = new_path + add_lua_editor_variants(value, value_variants, visited, new_path) + visited -= value + pair["value"] = list("list", value_variants) + pair_modified = TRUE + else if(isdatum(value) || value == world || ref(value) == "\[0xe000001\]") + pair["value"] = list("ref", ref(value)) + pair_modified = TRUE + if(pair_modified && pair != variants[i]) + variants[i] = pair + if(i < variants.len) + CHECK_TICK + +/proc/add_lua_return_value_variants(list/values, list/variants) + if(!islist(values) || !islist(variants)) + return + if(values.len != variants.len) + CRASH("values and variants must be the same length") + for(var/i in 1 to values.len) + var/value = values[i] + if(islist(value)) + add_lua_editor_variants(value, variants[i]) + else if(isdatum(value) || value == world || ref(value) == "\[0xe000001\]") + variants[i] = list("ref", ref(value)) + +/proc/deep_copy_without_cycles(list/values, list/visited) + if(!islist(visited)) + visited = list() + if(!islist(values)) + return values + var/list/ret = list() + var/cycle_count = 0 + visited[values] = TRUE + for(var/i in 1 to values.len) + var/key = values[i] + var/out_key = key + if(islist(key)) + if(visited[key]) + do + out_key = "\[cyclical reference[cycle_count ? " (i)" : ""]\]" + cycle_count++ + while(values.Find(out_key)) + else + visited[key] = TRUE + out_key = deep_copy_without_cycles(key, visited) + visited -= key + var/value + if(!isnull(key) && !isnum(key)) + value = values[key] + var/out_value = value + if(islist(value)) + if(visited[value]) + out_value = "\[cyclical reference\]" + else + visited[value] = TRUE + out_value = deep_copy_without_cycles(value, visited) + visited -= value + var/list/to_add = list(out_key) + if(!isnull(out_value)) + to_add[out_key] = out_value + ret += to_add + if(i < values.len) + CHECK_TICK + return ret + +/** + * Given a list and a list of its variant hints, removes any list key/values that are represent lua values that could not be directly converted to DM. + */ +/proc/remove_non_dm_variants(list/return_values, list/variants, list/visited) + if(!islist(visited)) + visited = list() + if(!islist(return_values) || !islist(variants) || visited[return_values]) + return + visited[return_values] = TRUE + if(return_values.len != variants.len) + CRASH("return_values and variants must be the same length") + for(var/i in 1 to variants.len) + var/pair = variants[i] + if(!islist(variants)) + continue + var/key = return_values[i] + if(pair["key"]) + if(!islist(pair["key"])) + return_values[i] = null + continue + remove_non_dm_variants(key, pair["key"], visited) + if(pair["value"]) + if(!islist(pair["value"])) + return_values[key] = null + continue + remove_non_dm_variants(return_values[key], pair["value"], visited) + +/proc/compare_lua_logs(list/log_1, list/log_2) + if(log_1 == log_2) + return TRUE + for(var/field in list("status", "name", "message", "chunk")) + if(log_1[field] != log_2[field]) + return FALSE + switch(log_1["status"]) + if("finished", "yield") + return deep_compare_list( + recursive_list_resolve(log_1["return_values"]), + recursive_list_resolve(log_2["return_values"]) + ) && deep_compare_list(log_1["variants"], log_2["variants"]) + if("runtime") + return log_1["file"] == log_2["file"]\ + && log_1["line"] == log_2["line"]\ + && deep_compare_list(log_1["stack"], log_2["stack"]) + else + return TRUE diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index b9241abe78a7..5762d3d7d1ca 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -40,7 +40,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_antennas_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) //Monkestation Addition - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey) init_sprite_accessory_subtypes(/datum/sprite_accessory/anime_head, GLOB.anime_top_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/anime_middle, GLOB.anime_middle_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/anime_bottom, GLOB.anime_bottom_list) //Monkestation Addition diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 19feb2cb2c0e..f878f37d9235 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -69,6 +69,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) if(!length(GLOB.horns_list)) init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, GLOB.horns_list) + if(!length(GLOB.tails_list_monkey)) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey) if(!length(GLOB.ears_list)) init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.horns_list) if(!length(GLOB.frills_list)) @@ -108,8 +110,6 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antennas, GLOB.ipc_antennas_list) if(!length(GLOB.ipc_chassis_list)) init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_chassis, GLOB.ipc_chassis_list) - if(!length(GLOB.tails_list_monkey)) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey) if(!length(GLOB.anime_top_list)) init_sprite_accessory_subtypes(/datum/sprite_accessory/anime_head, GLOB.anime_top_list) if(!length(GLOB.anime_middle_list)) @@ -163,7 +163,7 @@ "ipc_screen" = pick(GLOB.ipc_screens_list), //Monkestation Addition "ipc_antenna" = pick(GLOB.ipc_antennas_list), //Monkestation Addition "ipc_chassis" = pick(GLOB.ipc_chassis_list), //Monkestation Addition - "tail_monkey" = "Chimp", //Monkestation Addition + "tail_monkey" = "Monkey", //Monkestation change: Default to monkey tail. "pod_hair" = pick(GLOB.pod_hair_list), "anime_top" = pick(GLOB.anime_top_list), //Monkestation Addition "anime_middle" = pick(GLOB.anime_middle_list), //Monkestation Addition diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index d2d05ccb8177..3be4855a5aa1 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -369,8 +369,8 @@ GLOBAL_LIST_INIT(round_end_images, world.file2list("data/image_urls.txt")) // MO /datum/controller/subsystem/ticker/proc/build_roundend_report() var/list/parts = list() - //might want to make this a full section - parts += "
[("Storyteller: [SSgamemode.storyteller ? SSgamemode.storyteller.name : "N/A"]")]
" //monkestation edit + //might want to make this a full section, monkestation edit + parts += "
[("Storyteller: [SSgamemode.current_storyteller ? SSgamemode.current_storyteller.name : "N/A"]")]
" //AI laws parts += law_report() diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 08b69b5e3cd5..3b9100aa68f0 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -1193,3 +1193,10 @@ GLOBAL_LIST_INIT(binary, list("0","1")) text2num(semver_regex.group[2]), text2num(semver_regex.group[3]), ) + +/// Returns TRUE if the input_text starts with any of the beginnings +/proc/starts_with_any(input_text, list/beginnings) + for(var/beginning in beginnings) + if(!!findtext(input_text, beginning, 1, LAZYLEN(beginning)+1)) + return TRUE + return FALSE diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 014d8400dba9..a8e30c317474 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(caps_list) GLOBAL_LIST_EMPTY(pod_hair_list) GLOBAL_LIST_EMPTY(ethereal_horns_list) //Monkestation Addition GLOBAL_LIST_EMPTY(ethereal_tail_list) //Monkestation Addition -GLOBAL_LIST_EMPTY(tails_list_monkey) //Monkestation Addition +GLOBAL_LIST_EMPTY(tails_list_monkey) GLOBAL_LIST_EMPTY(anime_top_list) //Monkestation Addition GLOBAL_LIST_EMPTY(anime_middle_list) //Monkestation Addition GLOBAL_LIST_EMPTY(anime_bottom_list) //Monkestation Addition @@ -66,7 +66,6 @@ GLOBAL_LIST_INIT(color_list_ethereal, list( "Cyan Blue" = "#00ffff", "Dark Blue" = "#6666ff", "Dark Fuschia" = "#C70064", //Monkestation Edit: #CC0066 TO #C70064 - "Dark Green" = "#37835b", "Dark Red" = "#9c3030", "Dull Yellow" = "#fbdf56", diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 5bcbe9c52839..851e0fb69845 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -290,7 +290,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_JAILBIRD" = TRAIT_JAILBIRD, "TRAIT_JOLLY" = TRAIT_JOLLY, "TRAIT_KISS_OF_DEATH" = TRAIT_KISS_OF_DEATH, - "TRAIT_KLEPTOMANIAC" = TRAIT_KLEPTOMANIAC, "TRAIT_KNOCKEDOUT" = TRAIT_KNOCKEDOUT, "TRAIT_KNOW_ENGI_WIRES" = TRAIT_KNOW_ENGI_WIRES, "TRAIT_KNOW_ROBO_WIRES" = TRAIT_KNOW_ROBO_WIRES, @@ -514,6 +513,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_IMMUNE" = TRAIT_XENO_IMMUNE, "TRAIT_XRAY_VISION" = TRAIT_XRAY_VISION, "TRAIT_COLD_BLOODED" = TRAIT_COLD_BLOODED, + "TRAIT_ZOMBIE_CONSUMED" = TRAIT_ZOMBIE_CONSUMED, /* "TRAIT_ADAMANTINE_EXTRACT_ARMOR" = TRAIT_ADAMANTINE_EXTRACT_ARMOR, */ /* "TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED, */ /* "TRAIT_ANOSMIA" = TRAIT_ANOSMIA, */ diff --git a/code/_globalvars/~monkestation/lists/flavor_misc.dm b/code/_globalvars/~monkestation/lists/flavor_misc.dm index e21ea95bc5b2..7752c312a5b9 100644 --- a/code/_globalvars/~monkestation/lists/flavor_misc.dm +++ b/code/_globalvars/~monkestation/lists/flavor_misc.dm @@ -4,5 +4,5 @@ GLOBAL_LIST_INIT(body_heights, list( "Short" = HUMAN_HEIGHT_SHORT, "Normal" = HUMAN_HEIGHT_MEDIUM, "Tall" = HUMAN_HEIGHT_TALL, - "Tallest" = HUMAN_HEIGHT_TALLEST + "Tallest" = HUMAN_HEIGHT_TALLEST, )) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 1b77a8555554..eba4984d5adf 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -114,7 +114,7 @@ SUBSYSTEM_DEF(blackbox) if (!length(sqlrowlist)) return - SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, delayed = TRUE, special_columns = special_columns) + SSdbcore.MassInsert(format_table_name("feedback"), sqlrowlist, ignore_errors = TRUE, special_columns = special_columns) /datum/controller/subsystem/blackbox/proc/Seal() if(sealed) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index b16a6903b482..6ff0edc066a6 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -1,3 +1,4 @@ +#define SHUTDOWN_QUERY_TIMELIMIT (1 MINUTES) SUBSYSTEM_DEF(dbcore) name = "Database" flags = SS_TICKER @@ -6,12 +7,17 @@ SUBSYSTEM_DEF(dbcore) init_order = INIT_ORDER_DBCORE priority = FIRE_PRIORITY_DATABASE - var/failed_connection_timeout = 0 - var/schema_mismatch = 0 var/db_minor = 0 var/db_major = 0 + /// Number of failed connection attempts this try. Resets after the timeout or successful connection var/failed_connections = 0 + /// Max number of consecutive failures before a timeout (here and not a define so it can be vv'ed mid round if needed) + var/max_connection_failures = 5 + /// world.time that connection attempts can resume + var/failed_connection_timeout = 0 + /// Total number of times connections have had to be timed out. + var/failed_connection_timeout_count = 0 var/last_error @@ -34,6 +40,9 @@ SUBSYSTEM_DEF(dbcore) /// Queries pending execution, mapped to complete arguments var/list/datum/db_query/queries_standby = list() + /// We are in the process of shutting down and should not allow more DB connections + var/shutting_down = FALSE + var/connection // Arbitrary handle returned from rust_g. @@ -170,17 +179,39 @@ SUBSYSTEM_DEF(dbcore) connection = SSdbcore.connection /datum/controller/subsystem/dbcore/Shutdown() + shutting_down = TRUE + var/msg = "Clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]" + to_chat(world, span_boldannounce(msg)) + log_world(msg) //This is as close as we can get to the true round end before Disconnect() without changing where it's called, defeating the reason this is a subsystem + var/endtime = REALTIMEOFDAY + SHUTDOWN_QUERY_TIMELIMIT if(SSdbcore.Connect()) + //Take over control of all active queries + var/queries_to_check = queries_active.Copy() + queries_active.Cut() + + //Start all waiting queries for(var/datum/db_query/query in queries_standby) run_query(query) - + queries_to_check += query + queries_standby -= query + + //wait for them all to finish + for(var/datum/db_query/query in queries_to_check) + UNTIL(query.process() || REALTIMEOFDAY > endtime) + + //log shutdown to the db var/datum/db_query/query_round_shutdown = SSdbcore.NewQuery( "UPDATE [format_table_name("round")] SET shutdown_datetime = Now(), end_state = :end_state WHERE id = :round_id", - list("end_state" = SSticker.end_state, "round_id" = GLOB.round_id) + list("end_state" = SSticker.end_state, "round_id" = GLOB.round_id), + TRUE ) - query_round_shutdown.Execute() + query_round_shutdown.Execute(FALSE) qdel(query_round_shutdown) + + msg = "Done clearing DB queries standby:[length(queries_standby)] active: [length(queries_active)] all: [length(all_queries)]" + to_chat(world, span_boldannounce(msg)) + log_world(msg) if(IsConnected()) Disconnect() stop_db_daemon() @@ -216,12 +247,16 @@ SUBSYSTEM_DEF(dbcore) /datum/controller/subsystem/dbcore/proc/Connect() if(IsConnected()) return TRUE + + if(connection) + Disconnect() //clear the current connection handle so isconnected() calls stop invoking rustg + connection = null //make sure its cleared even if runtimes happened - if(failed_connection_timeout <= world.time) //it's been more than 5 seconds since we failed to connect, reset the counter + if(failed_connection_timeout <= world.time) //it's been long enough since we failed to connect, reset the counter failed_connections = 0 + failed_connection_timeout = 0 - if(failed_connections > 5) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for 5 seconds. - failed_connection_timeout = world.time + 50 + if(failed_connection_timeout > 0) return FALSE if(!CONFIG_GET(flag/sql_enabled)) @@ -257,6 +292,11 @@ SUBSYSTEM_DEF(dbcore) last_error = result["data"] log_sql("Connect() failed | [last_error]") ++failed_connections + //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect for a time. + if(failed_connections > max_connection_failures) + failed_connection_timeout_count++ + //basic exponential backoff algorithm + failed_connection_timeout = world.time + ((2 ** failed_connection_timeout_count) SECONDS) /datum/controller/subsystem/dbcore/proc/CheckSchemaVersion() if(CONFIG_GET(flag/sql_enabled)) @@ -333,7 +373,11 @@ SUBSYSTEM_DEF(dbcore) /datum/controller/subsystem/dbcore/proc/ReportError(error) last_error = error -/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, arguments) +/datum/controller/subsystem/dbcore/proc/NewQuery(sql_query, arguments, allow_during_shutdown=FALSE) + //If the subsystem is shutting down, disallow new queries + if(!allow_during_shutdown && shutting_down) + CRASH("Attempting to create a new db query during the world shutdown") + if(IsAdminAdvancedProcCall()) log_admin_private("ERROR: Advanced admin proc call led to sql query: [sql_query]. Query has been blocked") message_admins("ERROR: Advanced admin proc call led to sql query. Query has been blocked") @@ -381,11 +425,8 @@ The duplicate_key arg can be true to automatically generate this part of the que or set to a string that is appended to the end of the query Ignore_errors instructes mysql to continue inserting rows if some of them have errors. the erroneous row(s) aren't inserted and there isn't really any way to know why or why errored -Delayed insert mode was removed in mysql 7 and only works with MyISAM type tables, - It was included because it is still supported in mariadb. - It does not work with duplicate_key and the mysql server ignores it in those cases */ -/datum/controller/subsystem/dbcore/proc/MassInsert(table, list/rows, duplicate_key = FALSE, ignore_errors = FALSE, delayed = FALSE, warn = FALSE, async = TRUE, special_columns = null) +/datum/controller/subsystem/dbcore/proc/MassInsert(table, list/rows, duplicate_key = FALSE, ignore_errors = FALSE, warn = FALSE, async = TRUE, special_columns = null) if (!table || !rows || !istype(rows)) return @@ -402,8 +443,6 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table // Prepare SQL query full of placeholders var/list/query_parts = list("INSERT") - if (delayed) - query_parts += " DELAYED" if (ignore_errors) query_parts += " IGNORE" query_parts += " INTO " @@ -460,11 +499,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table ASSERT(fexists(daemon), "Configured db_daemon doesn't exist") var/list/result = world.shelleo("echo \"Starting ezdb daemon, do not close this window\" && [daemon]") - var/error_code = result[1] - if (!error_code) + var/result_code = result[1] + if (!result_code || result_code == 1) return - stack_trace("Failed to start DB daemon: [error_code]\n[result[3]]") + stack_trace("Failed to start DB daemon: [result_code]\n[result[3]]") /datum/controller/subsystem/dbcore/proc/stop_db_daemon() set waitfor = FALSE @@ -590,12 +629,12 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table /datum/db_query/process(seconds_per_tick) if(status >= DB_QUERY_FINISHED) - return + return TRUE // we are done processing after all status = DB_QUERY_STARTED var/job_result = rustg_sql_check_query(job_id) if(job_result == RUSTG_JOB_NO_RESULTS_YET) - return + return FALSE //no results yet store_data(json_decode(job_result)) return TRUE @@ -637,3 +676,4 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table /datum/db_query/proc/Close() rows = null item = null +#undef SHUTDOWN_QUERY_TIMELIMIT diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 53181e24e844..c41cd405df31 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -19,7 +19,7 @@ SUBSYSTEM_DEF(events) continue var/datum/round_event_control/event = new event_type if(!event.valid_for_map()) - qdel(event) + qdel(event) //highly iffy on this as it does cause issues for admins sometimes continue control += event //add it to the list of all events (controls) reschedule() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index c371f7847b23..c60c32edb743 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -360,7 +360,7 @@ SUBSYSTEM_DEF(garbage) /// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. /proc/qdel(datum/to_delete, force = FALSE) if(!istype(to_delete)) - //DREAMLUAU_CLEAR_REF_USERDATA(to_delete) + DREAMLUAU_CLEAR_REF_USERDATA(to_delete) del(to_delete) return diff --git a/code/controllers/subsystem/lua.dm b/code/controllers/subsystem/lua.dm index 37d7dd63d3c2..99df8cf33549 100644 --- a/code/controllers/subsystem/lua.dm +++ b/code/controllers/subsystem/lua.dm @@ -2,7 +2,6 @@ SUBSYSTEM_DEF(lua) name = "Lua Scripting" runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT wait = 0.1 SECONDS - flags = SS_OK_TO_FAIL_INIT /// A list of all lua states var/list/datum/lua_state/states = list() @@ -18,29 +17,19 @@ SUBSYSTEM_DEF(lua) var/list/current_run = list() var/list/current_states_run = list() - /// Protects return values from getting GCed before getting converted to lua values - /// Gets cleared every tick. - var/list/gc_guard = list() + var/list/needs_gc_cycle = list() /datum/controller/subsystem/lua/Initialize() - if(!CONFIG_GET(flag/auxtools_enabled)) - warning("SSlua requires auxtools to be enabled to run.") - return SS_INIT_NO_NEED - - try - // Initialize the auxtools library - AUXTOOLS_CHECK(AUXLUA) - - // Set the wrappers for setting vars and calling procs - __lua_set_set_var_wrapper("/proc/wrap_lua_set_var") - __lua_set_datum_proc_call_wrapper("/proc/wrap_lua_datum_proc_call") - __lua_set_global_proc_call_wrapper("/proc/wrap_lua_global_proc_call") - __lua_set_print_wrapper("/proc/wrap_lua_print") - return SS_INIT_SUCCESS - catch(var/exception/e) - // Something went wrong, best not allow the subsystem to run - warning("Error initializing SSlua: [e.name]") - return SS_INIT_FAILURE + DREAMLUAU_SET_EXECUTION_LIMIT_SECS(5) + // Set wrappers to ensure that lua scripts are subject to the same safety restrictions as other admin tooling + DREAMLUAU_SET_NEW_WRAPPER("/proc/_new") + DREAMLUAU_SET_VAR_GET_WRAPPER("/proc/wrap_lua_get_var") + DREAMLUAU_SET_VAR_SET_WRAPPER("/proc/wrap_lua_set_var") + DREAMLUAU_SET_OBJECT_CALL_WRAPPER("/proc/wrap_lua_datum_proc_call") + DREAMLUAU_SET_GLOBAL_CALL_WRAPPER("/proc/wrap_lua_global_proc_call") + // Set the print wrapper, as otherwise, the print function is meaningless + DREAMLUAU_SET_PRINT_WRAPPER("/proc/wrap_lua_print") + return SS_INIT_SUCCESS /datum/controller/subsystem/lua/OnConfigLoad() // Read the paths from the config file @@ -50,9 +39,6 @@ SUBSYSTEM_DEF(lua) lua_path += path world.SetConfig("env", "LUAU_PATH", jointext(lua_path, ";")) -/datum/controller/subsystem/lua/Shutdown() - AUXTOOLS_FULL_SHUTDOWN(AUXLUA) - /datum/controller/subsystem/lua/proc/queue_resume(datum/lua_state/state, index, arguments) if(!initialized) return @@ -62,36 +48,33 @@ SUBSYSTEM_DEF(lua) arguments = list() else if(!islist(arguments)) arguments = list(arguments) + else + var/list/args_list = arguments + arguments = args_list.Copy() resumes += list(list("state" = state, "index" = index, "arguments" = arguments)) -/datum/controller/subsystem/lua/proc/kill_task(datum/lua_state/state, list/task_info) +/datum/controller/subsystem/lua/proc/kill_task(datum/lua_state/state, is_sleep, index) if(!istype(state)) return - if(!islist(task_info)) - return - if(!(istext(task_info["name"]) && istext(task_info["status"]) && isnum(task_info["index"]))) - return - switch(task_info["status"]) - if("sleep") - var/task_index = task_info["index"] - var/state_index = 1 - - // Get the nth sleep in the sleep list corresponding to the target state - for(var/i in 1 to length(sleeps)) - var/datum/lua_state/sleeping_state = sleeps[i] - if(sleeping_state == state) - if(state_index == task_index) - sleeps.Cut(i, i+1) - break - state_index++ - if("yield") - // Remove the resumt from the resumt list - for(var/i in 1 to length(resumes)) - var/resume = resumes[i] - if(resume["state"] == state && resume["index"] == task_info["index"]) - resumes.Cut(i, i+1) + if(is_sleep) + var/state_index = 1 + + // Get the nth sleep in the sleep list corresponding to the target state + for(var/i in 1 to length(sleeps)) + var/datum/lua_state/sleeping_state = sleeps[i] + if(sleeping_state == state) + if(state_index == index) + sleeps.Cut(i, i+1) break - state.kill_task(task_info) + state_index++ + else + // Remove the resumt from the resumt list + for(var/i in 1 to length(resumes)) + var/resume = resumes[i] + if(resume["state"] == state && resume["index"] == index) + resumes.Cut(i, i+1) + break + state.kill_task(is_sleep, index) /datum/controller/subsystem/lua/fire(resumed) // Each fire of SSlua awakens every sleeping task in the order they slept, @@ -102,7 +85,6 @@ SUBSYSTEM_DEF(lua) sleeps.Cut() resumes.Cut() - gc_guard.Cut() var/list/current_sleeps = current_run["sleeps"] var/list/affected_states = list() while(length(current_sleeps)) @@ -145,6 +127,32 @@ SUBSYSTEM_DEF(lua) if(MC_TICK_CHECK) break + while(length(needs_gc_cycle)) + var/datum/lua_state/state = needs_gc_cycle[needs_gc_cycle.len] + needs_gc_cycle.len-- + state.collect_garbage() + // Update every lua editor TGUI open for each state that had a task awakened or resumed for(var/datum/lua_state/state in affected_states) INVOKE_ASYNC(state, TYPE_PROC_REF(/datum/lua_state, update_editors)) + +/datum/controller/subsystem/lua/proc/log_involved_runtime(exception/runtime, list/desclines, list/lua_stacks) + var/list/json_data = list("status" = "runtime", "file" = runtime.file, "line" = runtime.line, "message" = runtime.name, "stack" = list()) + var/level = 1 + for(var/line in desclines) + line = copytext(line, 3) + if(starts_with_any(line, list( + "/datum/lua_state (/datum/lua_state): load script", + "/datum/lua_state (/datum/lua_state): call function", + "/datum/lua_state (/datum/lua_state): awaken", + "/datum/lua_state (/datum/lua_state): resume" + ))) + json_data["stack"] += lua_stacks[level] + level++ + json_data["stack"] += line + for(var/datum/weakref/state_ref as anything in GLOB.lua_state_stack) + var/datum/lua_state/state = state_ref.resolve() + if(!state) + continue + state.log_result(json_data) + return diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 22cbf7824c3d..d5aabfaefef2 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -26,7 +26,7 @@ SUBSYSTEM_DEF(statpanels) global_data = list( "Map: [SSmapping.config?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, - "Storyteller: [!SSgamemode.secret_storyteller && SSgamemode.storyteller ? SSgamemode.storyteller.name : "Secret"]", //monkestation addition + "Storyteller: [!SSgamemode.secret_storyteller && SSgamemode.current_storyteller ? SSgamemode.current_storyteller.name : "Secret"]", //monkestation addition "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]", "Round Time: [ROUND_TIME()]", diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 9d87403d3f7e..7b8afe4ac44d 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -334,8 +334,8 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/PostSetup() set waitfor = FALSE - SSgamemode.storyteller.process(STORYTELLER_WAIT_TIME * 0.1) // we want this asap - SSgamemode.storyteller.round_started = TRUE + SSgamemode.current_storyteller.process(STORYTELLER_WAIT_TIME * 0.1) // we want this asap + SSgamemode.current_storyteller.round_started = TRUE mode.post_setup() GLOB.start_state = new /datum/station_state() GLOB.start_state.count() diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index fc7e7a02a7d5..5571118e9990 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -161,8 +161,10 @@ have ways of interacting with a specific mob and control it. var/obj/item/clothing/suit/costume/monkeysuit/S var/obj/item/clothing/mask/gas/monkeymask/M var/list/equipped = user.get_equipped_items(FALSE) - if(issimian(user)) - ADD_TRAIT(user, TRAIT_MONKEYFRIEND, SPECIES_TRAIT) + if(iscarbon(user)) + var/mob/living/carbon/carbon_user = user + if(TRAIT_MONKEYFRIEND in carbon_user?.dna?.species.inherent_traits) + ADD_TRAIT(user, TRAIT_MONKEYFRIEND, SPECIES_TRAIT) if(((M in equipped) && (S in equipped))) ADD_TRAIT(user, TRAIT_MONKEYFRIEND, CLOTHING_TRAIT) diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 2b48a85be395..af73954080f7 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -111,7 +111,7 @@ else calling_arguments = args if(datum_flags & DF_VAR_EDITED) - if(usr != GLOB.AdminProcCallHandler && !usr?.client?.ckey) //This happens when a timer or the MC invokes a callback + if(usr != GLOB.AdminProcCallHandler && !(usr && usr?.client?.ckey)) //This happens when a timer or the MC invokes a callback return HandleUserlessProcCall(usr, object, delegate, calling_arguments) return WrapAdminProcCall(object, delegate, calling_arguments) if (object == GLOBAL_PROC) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 3fe52bfa8d4f..766ee555a166 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -181,7 +181,7 @@ return TRUE -/datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R) +/datum/component/personal_crafting/proc/construct_item(atom/a, datum/crafting_recipe/R, time_override = null) var/list/contents = get_surroundings(a,R.blacklist) var/send_feedback = 1 if(check_contents(a, R, contents)) @@ -191,8 +191,8 @@ if(istype(content, R.result)) return ", object already present." //If we're a mob we'll try a do_after; non mobs will instead instantly construct the item - if(ismob(a) && !do_after(a, R.time, target = a)) - return "." + if(ismob(a) && !do_after(a, time_override ? time_override : R.time, target = a)) + return ", interrupted." contents = get_surroundings(a,R.blacklist) if(!check_contents(a, R, contents)) return ", missing component." diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index a1726ca00b4e..b5d89fdd7a9d 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -92,6 +92,7 @@ Behavior that's still missing from this component that original food items had t RegisterSignal(parent, COMSIG_FOOD_INGREDIENT_ADDED, PROC_REF(edible_ingredient_added)) RegisterSignal(parent, COMSIG_OOZE_EAT_ATOM, PROC_REF(on_ooze_eat)) RegisterSignal(parent, COMSIG_TRY_EAT_TRAIT, PROC_REF(try_eat_trait)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(show_radial_recipes)) //Monkestation edit: CHEWIN COOKING if(isturf(parent)) RegisterSignal(parent, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) @@ -558,6 +559,11 @@ Behavior that's still missing from this component that original food items had t consumer.applied_food_buffs ++ else if(food_buffs in consumer.status_effects) eater.apply_status_effect(food_buffs) + var/datum/status_effect/food/effect = locate(food_buffs) in consumer.status_effects + if(effect) + var/obj/item/food = parent + if(food.food_quality != 1) //if we are not the default value + effect.apply_quality(food.food_quality) to_chat(feeder, span_warning("There is nothing left of [parent], oh no!")) if(isturf(parent)) diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 68b894b1e6a9..8e02f9c19181 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -314,6 +314,16 @@ filter_data[name] = copied_parameters update_filters() +///A version of add_filter that takes a list of filters to add rather than being individual, to limit calls to update_filters(). +/datum/proc/add_filters(list/list/filters) + LAZYINITLIST(filter_data) + for(var/list/individual_filter as anything in filters) + var/list/params = individual_filter["params"] + var/list/copied_parameters = params.Copy() + copied_parameters["priority"] = individual_filter["priority"] + filter_data[individual_filter["name"]] = copied_parameters + update_filters() + /// Reapplies all the filters. /datum/proc/update_filters() ASSERT(isatom(src) || isimage(src)) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index e6c7a51a3e39..faffa66a0b99 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -650,9 +650,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(icon_update) dna.species.handle_body(src) // We want 'update_body_parts(update_limb_data = TRUE)' to be called only if mutcolor_update is TRUE, so no 'update_body()' here. - update_body_parts() //We can call this because it doesnt refresh limb data, and it handles hair and such. - if(mutcolor_update) - update_body_parts(update_limb_data = TRUE) + update_body_parts(update_limb_data = mutcolor_update) //We can call this because it doesnt refresh limb data, and it handles hair and such. if(mutations_overlay_update) update_mutations_overlay() diff --git a/code/datums/greyscale/config_types/greyscale_configs.dm b/code/datums/greyscale/config_types/greyscale_configs.dm index 037030fece55..fd57570b1b6b 100644 --- a/code/datums/greyscale/config_types/greyscale_configs.dm +++ b/code/datums/greyscale/config_types/greyscale_configs.dm @@ -1046,67 +1046,6 @@ icon_file = 'icons/mob/clothing/head/costume.dmi' json_config = 'code/datums/greyscale/json_configs/party_hat.json' -/datum/greyscale_config/simian - name = "simian Clothing" - icon_file = 'monkestation/icons/mob/gags/clothing/simian_fallbacks.dmi' - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/under.json' - -/datum/greyscale_config/simian/under - name = "simian Under" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/under.json' - -/datum/greyscale_config/simian/under_skirt - name = "simian Skirt" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/under_skirt.json' - -/datum/greyscale_config/simian/shoes - name = "simian Shoes" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/shoes.json' - -/datum/greyscale_config/simian/gloves - name = "simian Gloves" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/gloves.json' - -/datum/greyscale_config/simian/glasses - name = "simian Glasses" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/glasses.json' - -/datum/greyscale_config/simian/coat - name = "simian Coat" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/coat.json' - -/datum/greyscale_config/simian/armor - name = "simian Armor" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/armor.json' - -/datum/greyscale_config/simian/backpack - name = "simian Backpack" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/backpack.json' - -/datum/greyscale_config/simian/spacesuit - name = "simian Spacesuit" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/spacesuit.json' - -/datum/greyscale_config/simian/cloak - name = "simian Cloak" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/cloak.json' - -/datum/greyscale_config/simian/tie - name = "simian Tie" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/tie.json' - -/datum/greyscale_config/simian/scarf - name = "simian Scarf" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/scarf.json' - -/datum/greyscale_config/simian/modcontrol - name = "simian Modsuit" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/modcontrol.json' - -/datum/greyscale_config/simian/hardsuit - name = "simian Hardsuit" - json_config = 'code/datums/greyscale/json_configs/simian_fallbacks/hardsuit.json' - /datum/greyscale_config/lizard name = "lizard Clothing" icon_file = 'monkestation/icons/mob/gags/clothing/lizard_fallbacks.dmi' diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/armor.json b/code/datums/greyscale/json_configs/simian_fallbacks/armor.json deleted file mode 100644 index 1c3a4fa510a6..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/armor.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "armor", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/backpack.json b/code/datums/greyscale/json_configs/simian_fallbacks/backpack.json deleted file mode 100644 index 5297e1991de3..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/backpack.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "backpack", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/cloak.json b/code/datums/greyscale/json_configs/simian_fallbacks/cloak.json deleted file mode 100644 index eca4ce58b99d..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/cloak.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "cloak0", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "cloak1", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/coat.json b/code/datums/greyscale/json_configs/simian_fallbacks/coat.json deleted file mode 100644 index 3894f89c1533..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/coat.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "coat", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/glasses.json b/code/datums/greyscale/json_configs/simian_fallbacks/glasses.json deleted file mode 100644 index 42ffcabca5ca..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/glasses.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "glasses0", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "glasses1", - "blend_mode": "overlay", - "color_ids": [ 2 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/gloves.json b/code/datums/greyscale/json_configs/simian_fallbacks/gloves.json deleted file mode 100644 index b122076b2c83..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/gloves.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "gloves", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/hardsuit.json b/code/datums/greyscale/json_configs/simian_fallbacks/hardsuit.json deleted file mode 100644 index 5d436cef4c91..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/hardsuit.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "hardsuit0", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "hardsuit1", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "hardsuit2", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/modcontrol.json b/code/datums/greyscale/json_configs/simian_fallbacks/modcontrol.json deleted file mode 100644 index 34d155eb00e0..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/modcontrol.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "mod-control", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/scarf.json b/code/datums/greyscale/json_configs/simian_fallbacks/scarf.json deleted file mode 100644 index d8ab8ed78899..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/scarf.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "scarf", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/shoes.json b/code/datums/greyscale/json_configs/simian_fallbacks/shoes.json deleted file mode 100644 index ea9dec28fc94..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/shoes.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "shoes", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/spacesuit.json b/code/datums/greyscale/json_configs/simian_fallbacks/spacesuit.json deleted file mode 100644 index d69504a46528..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/spacesuit.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "spacesuit", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/tie.json b/code/datums/greyscale/json_configs/simian_fallbacks/tie.json deleted file mode 100644 index 7ca3e6ba8423..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/tie.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "tie", - "blend_mode": "overlay", - "color_ids": [ 1 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/under.json b/code/datums/greyscale/json_configs/simian_fallbacks/under.json deleted file mode 100644 index b0fb85d4e9fb..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/under.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "under0", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "under1", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "under2", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/greyscale/json_configs/simian_fallbacks/under_skirt.json b/code/datums/greyscale/json_configs/simian_fallbacks/under_skirt.json deleted file mode 100644 index e840e2f014b1..000000000000 --- a/code/datums/greyscale/json_configs/simian_fallbacks/under_skirt.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "": [ - { - "type": "icon_state", - "icon_state": "under_skirt0", - "blend_mode": "overlay", - "color_ids": [ 1 ] - }, - { - "type": "icon_state", - "icon_state": "under_skirt1", - "blend_mode": "overlay", - "color_ids": [ 2 ] - }, - { - "type": "icon_state", - "icon_state": "under_skirt2", - "blend_mode": "overlay", - "color_ids": [ 3 ] - } - ] -} diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 1b2c137c6b29..c2d97cb828d4 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -376,24 +376,24 @@ quality = MINOR_NEGATIVE difficulty = 12 conflicts = list(/datum/mutation/human/dwarfism) - locked = TRUE /datum/mutation/human/gigantism/on_acquiring(mob/living/carbon/human/owner) if(..()) return ADD_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) +/* handled in init_signals.dm owner.update_transform(1.25) owner.visible_message(span_danger("[owner] suddenly grows!"), span_notice("Everything around you seems to shrink..")) +*/ /datum/mutation/human/gigantism/on_losing(mob/living/carbon/human/owner) if(..()) return - //We're leaving the size traits permanent until someone wants to separate the mutation from customization aspects - //REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) - //handled in init_signals.dm - //REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) + REMOVE_TRAIT(owner, TRAIT_GIANT, GENETIC_MUTATION) +/* handled in init_signals.dm owner.update_transform(0.8) owner.visible_message(span_danger("[owner] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) +*/ /datum/mutation/human/spastic name = "Spastic" diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 08aa46dd2833..5a176bd81cf8 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -207,29 +207,34 @@ trait_to_give = STATION_TRAIT_CYBERNETIC_REVOLUTION /// List of all job types with the cybernetics they should receive. var/static/list/job_to_cybernetic = list( - /datum/job/assistant = /obj/item/organ/internal/heart/cybernetic, //real cardiac + /datum/job/assistant = /obj/item/organ/internal/cyberimp/leg/table_glider, /obj/item/organ/internal/cyberimp/leg/table_glider/l,// monkestation edit: The greytide begins... /datum/job/atmospheric_technician = /obj/item/organ/internal/cyberimp/arm/item_set/atmospherics, // monkestation edit: cybernetics overhaul (useful job stuff) /datum/job/bartender = /obj/item/organ/internal/liver/cybernetic/tier3, /datum/job/bitrunner = /obj/item/organ/internal/eyes/robotic/thermals, /datum/job/blueshield = /obj/item/organ/internal/cyberimp/arm/ammo_counter, // monkestation edit: cybernetics for recently added job + /datum/job/brig_physician = /obj/item/organ/internal/cyberimp/arm/item_set/surgery, // monkestation edit: Same as med docs. /datum/job/botanist = /obj/item/organ/internal/cyberimp/arm/item_set/botany, // monkestation edit: cybernetics overhaul (useful job stuff) + /datum/job/candysalesman = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, // monkestation edit: /datum/job/captain = /obj/item/organ/internal/heart/cybernetic/tier3, - /datum/job/cargo_technician = /obj/item/organ/internal/stomach/cybernetic/tier2, + /datum/job/cargo_technician = /obj/item/organ/internal/cyberimp/leg/sprinter, /obj/item/organ/internal/cyberimp/leg/sprinter/l, //monkestation edit: For all the running they do /datum/job/chaplain = /obj/item/organ/internal/cyberimp/brain/anti_drop, /datum/job/chemist = /obj/item/organ/internal/liver/cybernetic/tier3, /datum/job/chief_engineer = /obj/item/organ/internal/cyberimp/chest/thrusters, /datum/job/chief_medical_officer = /obj/item/organ/internal/cyberimp/brain/linked_surgery/perfect/nt, // monkestation edit: cybernetics overhaul (couldn't think of anything else that was good for cmo) /datum/job/clown = /obj/item/organ/internal/cyberimp/chest/knockout, // monkestation edit: cybernetics overhaul (honk!!! it's the clown mech fist shrunken down after all) - /datum/job/cook = /obj/item/organ/internal/cyberimp/chest/nutriment/plus, + /datum/job/cook = /obj/item/organ/internal/cyberimp/arm/item_set/cook, // monkestatoin edit: Give the toolarm some use, plus they should be cooking evenways! /datum/job/curator = /obj/item/organ/internal/eyes/robotic/glow, /datum/job/detective = /obj/item/organ/internal/lungs/cybernetic/tier3, + /datum/job/godzilla = /obj/item/organ/internal/cyberimp/brain/anti_stun, //monkestation edit: Hard to keep gozilla down. /datum/job/doctor = /obj/item/organ/internal/cyberimp/arm/item_set/surgery, /datum/job/geneticist = /obj/item/organ/internal/fly, //we don't care about implants, we have cancer. - /datum/job/head_of_personnel = /obj/item/organ/internal/eyes/robotic, + /datum/job/gorilla = /obj/item/organ/internal/cyberimp/arm/muscle, // monkestation edit: monke strong + /datum/job/head_of_personnel = /obj/item/organ/internal/cyberimp/eyes/hud/security, // monkestation edit: /datum/job/head_of_security = /obj/item/organ/internal/cyberimp/arm/item_set/combat, // monkestation edit: cybernetics overhaul (no more validhunt eyes, instead you get a shoddy stunprod in your arm) /datum/job/janitor = /obj/item/organ/internal/cyberimp/arm/item_set/janitor, // monkestation edit: cybernetics overhaul (useful job stuff) /datum/job/lawyer = /obj/item/organ/internal/heart/cybernetic/tier2, /datum/job/mime = /obj/item/organ/internal/tongue/robot, //... + /datum/job/nanotrasen_representative = /obj/item/organ/internal/cyberimp/leg/shove_resist, /obj/item/organ/internal/cyberimp/leg/shove_resist/l, // monkestation edit: NT kneels to noone. /datum/job/paramedic = /obj/item/organ/internal/cyberimp/arm/item_set/paramedic, // monkestation edit: cybernetics overhaul (on-site healing / assistance) /datum/job/prisoner = /obj/item/organ/internal/eyes/robotic/shield, /datum/job/psychologist = /obj/item/organ/internal/ears/cybernetic/upgraded, @@ -237,12 +242,14 @@ /datum/job/research_director = /obj/item/organ/internal/cyberimp/bci, /datum/job/roboticist = /obj/item/organ/internal/cyberimp/arm/item_set/connector, // monkestation edit: cybernetics overhaul (useful job stuff) /datum/job/scientist = /obj/item/organ/internal/ears/cybernetic, - /datum/job/security_assistant = /obj/item/organ/internal/cyberimp/leg/accelerator, // monkestation edit: cybernetics for recently added job + /datum/job/security_assistant = /obj/item/organ/internal/cyberimp/leg/accelerator, /obj/item/organ/internal/cyberimp/leg/accelerator/l, // monkestation edit: cybernetics for recently added job /datum/job/security_officer = /obj/item/organ/internal/cyberimp/arm/item_set/flash, /datum/job/shaft_miner = /obj/item/organ/internal/cyberimp/arm/item_set/mining_drill/diamond, // monkestation edit: cybernetics overhaul (useful job stuff) + /datum/job/signal_technician = /obj/item/organ/internal/cyberimp/arm/heater, // monkestation edit: Tcomms is cold /datum/job/station_engineer = /obj/item/organ/internal/cyberimp/arm/item_set/toolset, /datum/job/virologist = /obj/item/organ/internal/lungs/cybernetic/tier2, /datum/job/warden = /obj/item/organ/internal/cyberimp/eyes/hud/security, + /datum/job/yellowclown = /obj/item/organ/internal/cyberimp/chest/knockout, // monkestation edit: double trouble ) /datum/station_trait/cybernetic_revolution/New() diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index aef77f3c0aa5..a92823293182 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -489,7 +489,7 @@ if(QDELETED(human_mob)) return if(prob(1))//low chance of the alternative reality returning to monkey - var/obj/item/organ/external/tail/simian/monkey_tail = new () + var/obj/item/organ/external/tail/monkey/monkey_tail = new() monkey_tail.Insert(human_mob, drop_if_replaced = FALSE) var/datum/species/human_species = human_mob.dna?.species if(human_species) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d95c5ad012af..d37792b962cd 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -334,6 +334,12 @@ if(smoothing_flags & SMOOTH_QUEUED) SSicon_smooth.remove_from_queues(src) + // These lists cease existing when src does, so we need to clear any lua refs to them that exist. + DREAMLUAU_CLEAR_REF_USERDATA(contents) + DREAMLUAU_CLEAR_REF_USERDATA(filters) + DREAMLUAU_CLEAR_REF_USERDATA(overlays) + DREAMLUAU_CLEAR_REF_USERDATA(underlays) + if(material_stats) QDEL_NULL(material_stats) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index de83c8ae9741..552827a98acf 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -217,6 +217,10 @@ LAZYNULL(client_mobs_in_contents) + // These lists cease existing when src does, so we need to clear any lua refs to them that exist. + DREAMLUAU_CLEAR_REF_USERDATA(vis_contents) + DREAMLUAU_CLEAR_REF_USERDATA(vis_locs) + . = ..() for(var/movable_content in contents) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index f5fc0a516da8..c95880219a1b 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -334,7 +334,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(ruleset.weight <= 0 || ruleset.cost <= 0) continue min_threat = min(ruleset.cost, min_threat) - var/greenshift = SSgamemode.storyteller.disable_distribution //|| (threat_level < min_threat && shown_threat < min_threat) //if both shown and real threat are below any ruleset, its extended time //monkestation edit: Makes it so greenshift is based on the storyteller + var/greenshift = SSgamemode.current_storyteller.disable_distribution //|| (threat_level < min_threat && shown_threat < min_threat) //if both shown and real threat are below any ruleset, its extended time //monkestation edit: Makes it so greenshift is based on the storyteller generate_station_goals(greenshift) . += generate_station_goal_report() diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 0818418aea07..2af62942d83b 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -200,11 +200,18 @@ playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return + // monkestation start: prevent lowering alert level from delta var/new_sec_level = SSsecurity_level.text_level_to_number(params["newSecurityLevel"]) + var/current_sec_level = SSsecurity_level.get_current_level_as_number() + if (current_sec_level > SEC_LEVEL_RED) + to_chat(usr, span_warning("Alert cannot be manually lowered from the current security level!")) + playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) + return if (new_sec_level != SEC_LEVEL_GREEN && new_sec_level != SEC_LEVEL_BLUE) return - if (SSsecurity_level.get_current_level_as_number() == new_sec_level) + if (current_sec_level == new_sec_level) return + // monkestation end SSsecurity_level.set_level(new_sec_level) diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 5ddc9179c543..df4fb99502f8 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -138,7 +138,8 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_JANITOR = 68, JOB_LAWYER = 69, JOB_PSYCHOLOGIST = 71, - // 200-239: Centcom + JOB_LATEJOIN_BARBER = 72, //monkestation edit: barber + // 200-239: Centcom JOB_CENTCOM_ADMIRAL = 200, JOB_CENTCOM = 201, JOB_CENTCOM_OFFICIAL = 210, diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 0d8f4e26bb9d..1277cbee7ba6 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -423,7 +423,7 @@ GLOBAL_LIST_EMPTY(bloody_footprints_cache) else if(species == SPECIES_MONKEY) . += "[icon2html('icons/mob/species/human/human.dmi', user, "monkey")] Some monkey paws." else if(species == SPECIES_SIMIAN) - . += "[icon2html('monkestation/icons/mob/species/simian/bodyparts.dmi', user, "simian_l_leg")] Some simian paws." + . += "[icon2html('monkestation/icons/mob/species/monkey/bodyparts.dmi', user, "monkey_l_leg")] Some simian paws." else if(species == SPECIES_LIZARD) . += "[icon2html('icons/mob/species/lizard/bodyparts.dmi', user, "digitigrade_l_leg")] Some lizard claws." else if(species == SPECIES_HUMAN) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cd2ee2766e41..daecdd230583 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -689,7 +689,7 @@ if(user && iscarbon(user)) SEND_SIGNAL(user, COMSIG_CARBON_ITEM_DROPPED, src) if(!silent) - playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) + playsound(src, drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE, mixer_channel = drop_mixer_channel) // monkestation edit: sound mixer user?.update_equipment_speed_mods() /// called just as an item is picked up (loc is not yet changed) @@ -755,9 +755,9 @@ item_flags |= IN_INVENTORY if(!initial) if(equip_sound && (slot_flags & slot)) - playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE) + playsound(src, equip_sound, EQUIP_SOUND_VOLUME, TRUE, ignore_walls = FALSE, mixer_channel = equip_mixer_channel) // monkestation: sound mixer else if(slot & ITEM_SLOT_HANDS) - playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE) + playsound(src, pickup_sound, PICKUP_SOUND_VOLUME, ignore_walls = FALSE, mixer_channel = pickup_mixer_channel) // monkestation: sound mixer user.update_equipment_speed_mods() /// Gives one of our item actions to a mob, when equipped to a certain slot @@ -862,7 +862,7 @@ playsound(hit_atom, 'sound/weapons/throwtap.ogg', 1, volume, -1) else - playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE) + playsound(src, drop_sound, YEET_SOUND_VOLUME, ignore_walls = FALSE, mixer_channel = drop_mixer_channel) // monkestation edit: sound mixer return hit_atom.hitby(src, 0, itempush, throwingdatum=throwingdatum) /obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm index 0113ff4d393b..05cce7242047 100644 --- a/code/game/objects/items/devices/scanners/health_analyzer.dm +++ b/code/game/objects/items/devices/scanners/health_analyzer.dm @@ -169,6 +169,11 @@ render_list += "Subject cannot be healed by any known methods.\n" // monkestation end + // monkestation edit: heavy bleeder challenge + if(HAS_TRAIT(target, TRAIT_HEAVY_BLEEDER)) + render_list += "Subject will suffer highly abnormal hemorrhaging from laceration or surgical incension.\n" + // monkestation end + if(target.stamina.loss) if(advanced) render_list += "Fatigue level: [target.stamina.loss]%.\n" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 4fa379a9796d..35f0a61be401 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -183,6 +183,28 @@ balloon_alert(user, "not enough paper!") return + // MONKESTATION EDIT START + else if(istype(target, /obj/structure/fermentation_keg)) + var/obj/structure/fermentation_keg/keg = target + if(!keg.ready_to_bottle) + balloon_alert(user, "can't wrap without anything in it!") + return + if(!keg.delivery_icon) //no delivery icon means unwrappable keg. As of 10/14/2024, these do not exist. + balloon_alert(user, "can't wrap!") + return + if(use(3)) + var/obj/item/delivery/big/parcel = new(get_turf(keg.loc)) + parcel.base_icon_state = keg.delivery_icon + parcel.update_icon() + parcel.drag_slowdown = keg.drag_slowdown + keg.forceMove(parcel) + parcel.add_fingerprint(user) + keg.add_fingerprint(user) + else + balloon_alert(user, "not enough paper!") + return + // MONKESTATION EDIT END + else balloon_alert(user, "can't wrap!") return diff --git a/code/game/world.dm b/code/game/world.dm index 5c4a8962b6d6..cc5204b6b6a5 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -350,7 +350,6 @@ GLOBAL_VAR(tracy_log) ..() /world/proc/auxcleanup() - AUXTOOLS_FULL_SHUTDOWN(AUXLUA) var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") if (debug_server) call_ext(debug_server, "auxtools_shutdown")() @@ -475,6 +474,7 @@ GLOBAL_VAR(tracy_log) /world/proc/on_tickrate_change() SStimer?.reset_buckets() + DREAMLUAU_SET_EXECUTION_LIMIT_MILLIS(tick_lag * 100) /world/proc/init_byond_tracy() var/library diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 419733503d9a..b80e433ff9c3 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -231,10 +231,10 @@ if(isliving(M)) if(iscarbon(M)) //Carbon stuff - if(ismonkey(M)) - M_job = "Monkey" - else if(ishuman(M)) + if(ishuman(M) && M.job) M_job = M.job + else if(ismonkey(M)) + M_job = "Monkey" else if(isalien(M)) //aliens if(islarva(M)) M_job = "Alien larva" diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm index 6e7352446c34..c0d0bc4784fd 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm @@ -51,6 +51,9 @@ /proc/_get_step(Ref, Dir) return get_step(Ref, Dir) +/proc/_hascall(object, procname) + return hascall(object, procname) + /proc/_hearers(Depth = world.view, Center = usr) return hearers(Depth, Center) diff --git a/code/modules/admin/verbs/lua/README.md b/code/modules/admin/verbs/lua/README.md index 707184d4d772..9b9bfbe05f93 100644 --- a/code/modules/admin/verbs/lua/README.md +++ b/code/modules/admin/verbs/lua/README.md @@ -1,150 +1,225 @@ -# Auxlua +# Objects ---- +Datums, lists, typepaths, static appearances, and some other objects are represented in Luau as userdata. Certain operations can be performed on these types of objects. -## Datums +## Common metamethods -DM datums are treated as lua userdata, and can be stored in fields. Due to fundamental limitations in lua, userdata is inherently truthy. Since datum userdata can correspond to a deleted datum, which would evaluate to `null` in DM, the function [`datum:is_null()`](#datumisnull) is provided to offer a truthiness test consistent with DM. +The following metamethods are defined for all objects. -Keep in mind that BYOND can't see that a datum is referenced in a lua field, and will garbage collect it if it is not referenced anywhere in DM. +### \_\_tostring(): string -### datum:get_var(var) +Returns the string representation of the object. This uses BYOND's internal string conversion function. -Equivalent to DM's `datum.var` +### \_\_eq(other: any): boolean -### datum:set_var(var, value) +Compare the equality of two objects. While passing the same object into luau twice will return two references to the same userdata, some DM projects may override the equality operator using an `__operator==` proc definition. -Equivalent to DM's `datum.var = value` +## Datum-like Objects -### datum:call_proc(procName, ...) +Datum-like objects include datums themselves, clients (if they have not been redefined to be children of `/datum`), static appearances, and the world. -Equivalent to DM's `datum.procName(...)` +### \_\_index(index: string): any -### datum:is_null() +Access the member specified by `index`. -This function is used to evaluate the truthiness of a DM var. The lua statement `if datum:is_null() then` is equivalent to the DM statement `if(datum)`. +If `index` is a valid var for the object, the index operation will return that var's value. +If the var getting wrapper proc is set, the operation will instead call that proc with the arguments `(object, index)`. -### datum.vars +For objects other than static appearances, if `index` is a valid proc for the object, the operation will return a wrapper for that proc that can be invoked using call syntax (e.g. `object:proc(...arguments)`). If the object proc calling wrapper is set, calling the returned function will instead call the wrapper proc with the arguments `(object, proc, {...arguments})`. Note that vars will be shadowed by procs with the same name. To work around this, use the `dm.get_var` function. -Returns a userdatum that allows you to access and modifiy the vars of a DM datum by index. `datum.vars.foo` is equivalent to `datum:get_var("foo")`, while `datum.vars.foo = bar` is equivalent to `datum:set_var("foo", bar)` +### \_\_newindex(index: string, value: any): () ---- +Set the var specified by `index` to `value`, if that var exists on the object. + +If the var setting wrapper proc is set, the operation will instead call that proc with the arguments `(object, index, value)`. ## Lists -In order to allow lists to be modified in-place across the DM-to-lua language barrier, lists are treated as userdata. Whenever running code that expects a DM value, auxlua will attempt to convert tables into lists. +Lists are syntactically similar to tables, with one crucial difference. +Unlike tables, numeric indices must be non-zero integers within the bounds of the list. + +### \_\_index(index: any): any + +Read the list at `index`. This works both for numeric indices and assoc keys. +Vars lists cannot be directly read this way if the var getting wrapper proc is set. + +### \_\_newindex(index: any, value: any): any + +Write `value` to the list at `index`. This works both for writing numeric indices and assoc keys. +Vars lists cannot be directly written this way if the var setting wrapper proc is set. + +### \_\_len(): integer + +Returns the length of the list, similarly to the `length` builtin in DM. + +### Iteration + +Lists support Luau's generalized iteration. Iteration this way returns pairs of numeric indices and list values. +For example, the statement `for _, v in L do` is logically equivalent to the DM statement `for(var/v in L)`. + +# Global Fields and Modules + +In addition to the full extent of Luau's standard library modules, some extra functions and modules have been added. + +## Global-Level Fields + +### sleep(): () + +Yields the active thread, without worrying about passing data into or out of the state. + +Threads yielded this way are placed at the end of a queue. Call the `awaken` hook function from DM to execute the thread at the front of the queue. + +### loadstring(code: string): function + +Luau does not inherently include the `loadstring` function common to a number of other versions of lua. This is an effective reimplementation of `loadstring`. + +### print(...any): () + +Calls the print wrapper with the passed in arguments. +Raises an error if no print wrapper is set, as that means there is nothing to print with. + +### \_state_id: integer + +The handle to the underlying luau state in the dreamluau binary. + +## \_exec + +The `_exec` module includes volatile fields related to the current execution context. + +### \_next_yield_index: integer + +When yielding a thread with `coroutine.yield`, it will be inserted into an internal table at the first open integer index. +This field corresponds to that first open integer index. + +### \_limit: integer? + +If set, the execution limit, rounded to the nearest millisecond. + +### \_time: integer + +The length of successive time luau code has been executed, including recursive calls to DM and back into luau, rounded to the nearest millisecond. + +## dm -List references are subject to the same limitations as datum userdata, but you are less likely to encounter these limitations for regular lists. +The `dm` module includes fields and functions for basic interaction with DM. -Some lists (`vars`, `contents`, `overlays`, `underlays`, `vis_contents`, and `vis_locs`) are inherently attached to datums, and as such, their corresponding userdata contains a weak reference to the containing datum. Use [`list:is_null`](#listisnull) to validate these types of lists. +### world: userdata -### list.len +A static reference to the DM `world`. -Equivalent to DM's `list.len` +### global_vars: userdata -### list:get(index) +A static reference that functions like the DM keyword `global`. This can be indexed to read/write global vars. -Equivalent to DM's `list[index]` +### global_procs: table -### list:set(index, value) +A table that can be indexed by string for functions that wrap global procs. -Equivalent to DM's `list[index] = value` +Due to BYOND limitations, attempting to index an invalid proc returns a function logically equivalent to a no-op. -### list:add(value) +### get_var(object: userdata, var: string): function -Equivalent to DM's `list.Add(value)` +Reads the var `var` on `object`. This function can be used to get vars that are shadowed by procs declared with the same name. -### list:remove(value) +### new(path: string, ...any): userdata -Equivalent to DM's `list.Remove(value)` +Creates an instance of the object specified by `path`, with `...` as its arguments. +If the "new" wrapper is set, that proc will be called instead, with the arguments `(path, {...})`. -### list:to_table() +### is_valid_ref(ref: any): boolean -Converts a DM list into a lua table. +Returns true if the value passed in corresponds to a valid reference-counted DM object. -### list:of_type(type_path) +### usr: userdata? -Will extract only values of type `type_path`. +Corresponds to the DM var `usr`. -### list:is_null() +## list -A similar truthiness test to [`datum:is_null()`](#datumisnull). This function only has the possibility of returning `false` for lists that are inherently attached to a datum (`vars`, `contents`, `overlays`, `underlays`, `vis_contents`, and `vis_locs`). +The `list` module contains wrappers for the builtin list procs, along with several other utility functions for working with lists. -### list.entries +### add(list: userdata, ...any): () -Returns a userdatum that allows you to access and modifiy the entries of the list by index. `list.entries.foo` is equivalent to `list:get("foo")`, while `list.entries.foo = bar` is equivalent to `list:set("foo", bar)` +Logically equivalent to the DM statement `list.Add(...)`. ---- +### copy(list: userdata, start?: integer, end?: integer): userdata -## The dm table +Logically equivalent to the DM statement `list.Copy(start, end)`. -The `dm` table consists of the basic hooks into the DM language. +### cut(list: userdata, start?: integer, end?: integer): userdata -### dm.state_id +Logically equivalent to the DM statement `list.Cut(start, end)`. -The address of the lua state in memory. This is a copy of the internal value used by auxlua to locate the lua state in a global hash map. `state_id` is a registry value that is indirectly obtained using the `dm` table's `__index` metamethod. +### find(list: userdata, item: any, start?: integer, end?: integer): integer -### dm.global_proc(proc, ...) -Calls the global proc `/proc/[proc]` with `...` as its arguments. +Logically equivalent to the DM statement `list.Find(item, start, end)`. -### dm.world -A reference to DM's `world`, in the form of datum userdata. This reference is always valid, since `world` always exists. +### insert(list: userdata, index: integer, ...any): integer -Due to limitations inherent in the wrapper functions used on tgstation, `world:set_var` and `world:call_proc` will raise an error. +Logically equivalent to the DM statement `list.Insert(item, ...)`. -### dm.global_vars -A reference to DM's `global`, in the form of datum userdata. Subject to the same limitations as `dm.world` +### join(list: userdata, glue: string, start?: integer, end?: integer): string -### dm.usr -A weak reference to DM's `usr`. As a rule of thumb, this is a reference to the mob of the client who triggered the chain of procs leading to the execution of Lua code. The following is a list of what `usr` is for the most common ways of executing Lua code: -- For resumes and awakens, which are generally executed by the MC, `usr` is (most likely) null. -- `SS13.wait` queues a resume, which gets executed by the MC. Therefore, `usr` is null after `SS13.wait` finishes. -- For chunk loads, `usr` is generally the current mob of the admin that loaded that chunk. -- For function calls done from the Lua editor, `usr` is the current mob of the admin calling the function. -- `SS13.register_signal` creates a `/datum/callback` that gets executed by the `SEND_SIGNAL` macro for the corresponding signal. As such, `usr` is the mob that triggered the chain of procs leading to the invocation of `SEND_SIGNAL`. +Logically equivalent to the statement `list.Join(glue, start, end)`. ---- +### remove(list: userdata, ...any): integer -## Execution Limit +Logically equivalent to the DM statement `list.Remove(...)`. -In order to prevent freezing the server with infinite loops, auxlua enforces an execution limit, defaulting to 100ms. When a single lua state has been executing for longer than this limit, it will eventually stop and produce an error. +### remove_all(list: userdata, ...any): integer -To avoid exceeding the execution limit, call `sleep()` or `coroutine.yield()` before the execution limit is reached. +Logically equivalent to the DM statement `list.RemoveAll(...)`. -### over_exec_usage(fraction = 0.95) +### splice(list: userdata, start?: integer, end?: integer, ...any): () -This function returns whether the current run of the Lua VM has executed for longer than the specified fraction of the execution limit. You can use this function to branch to a call to `sleep()` or `coroutine.yield()` to maximize the amount of work done in a single run of the Lua VM. If nil, `fraction` will default to 0.95, otherwise, it will be clamped to the range \[0, 1\]. +Logically equivalent to the DM statement `list.Splice(start, end, ...)`. ---- +### swap(list: userdata, index_1: integer, index_2: integer): () -## Task management -The Lua Scripting subsystem manages the execution of tasks for each Lua state. A single fire of the subsystem behaves as follows: -- All tasks that slept since the last fire are resumed in the order they slept. -- For each queued resume, the corresponding task is resumed. +Logically equivalent to the DM statement `list.Swap(index_1, index_2)`. -### sleep() -Yields the current thread, scheduling it to be resumed during the next fire of SSlua. Use this function to prevent your Lua code from exceeding its allowed execution duration. Under the hood, `sleep` performs the following: +### to_table(list: userdata, deep?: boolean): table -- Sets the [`sleep_flag`](#sleep_flag) -- Calls `coroutine.yield()` -- Clears the sleep flag when determining whether the task slept or yielded -- Ignores the return values of `coroutine.yield()` once resumed +Creates a table that is a copy of `list`. If `deep` is true, `to_table` will be called on any lists inside that list. ---- +### from_table(table: table): userdata -## The SS13 package +Creates a list that is a copy of `table`. This is not strictly necessary, as tables are automatically converted to lists when passed back into DM, using the same internal logic as `from_table`. + +### filter(list: userdata, path: string): userdata + +Returns a copy of `list`, containing only elements that are objects descended from `path`. + +## pointer + +The `pointer` module contains utility functions for interacting with pointers. +Keep in mind that passing DM pointers into luau and manipulating them in this way can bypass wrapper procs. + +### read(pointer: userdata): any + +Gets the underlying data the pointer references. + +### write(pointer: userdata, value: any): () + +Writes `value` to the underlying data the pointer references. + +### unwrap(possible_pointer: any): any + +If `possible_pointer` is a pointer, reads it. Otherwise, it is returned as-is. + +# The SS13 package The `SS13` package contains various helper functions that use code specific to tgstation. -### SS13.state +## SS13.state A reference to the state datum (`/datum/lua_state`) handling this Lua state. -### SS13.get_runner_ckey() +## SS13.get_runner_ckey() The ckey of the user who ran the lua script in the current context. Can be unreliable if accessed after sleeping. -### SS13.get_runner_client() +## SS13.get_runner_client() Returns the client of the user who ran the lua script in the current context. Can be unreliable if accessed after sleeping. -### SS13.global_proc +## SS13.global_proc A wrapper for the magic string used to tell `WrapAdminProcCall` to call a global proc. For instance, `/datum/callback` must be instantiated with `SS13.global_proc` as its first argument to specify that it will be invoking a global proc. The following example declares a callback which will execute the global proc `to_chat`: @@ -152,25 +227,18 @@ The following example declares a callback which will execute the global proc `to local callback = SS13.new("/datum/callback", SS13.global_proc, "to_chat", dm.world, "Hello World") ``` -### SS13.istype(thing, type) +## SS13.istype(thing, type) Equivalent to the DM statement `istype(thing, text2path(type))`. -### SS13.new(type, ...) -Instantiates a datum of type `type` with `...` as the arguments passed to `/proc/_new` -The following example spawns a singularity at the caller's current turf: -```lua -SS13.new("/obj/singularity", dm.global_proc("_get_step", dm.usr, 0)) -``` - -### SS13.new_untracked(type, ...) -Works exactly like SS13.new but it does not store the value to the lua state's `references` list variable. This means that the variable could end up deleted if nothing holds a reference to it. +## SS13.new(type, ...) +An alias for `dm.new` -### SS13.is_valid(datum) +## SS13.is_valid(datum) Can be used to determine if the datum passed is not nil, not undefined and not qdel'd all in one. A helper function that allows you to check the validity from only one function. Example usage: ```lua local datum = SS13.new("/datum") -dm.global_proc("qdel", datum) +dm.global_procs.qdel(datum) print(SS13.is_valid(datum)) -- false local null = nil @@ -180,13 +248,13 @@ local datum = SS13.new("/datum") print(SS13.is_valid(datum)) -- true ``` -### SS13.type(string) -Converts a string into a type. Equivalent to doing `dm.global_proc("_text2path", "/path/to/type")` +## SS13.type(string) +Converts a string into a typepath. Equivalent to doing `dm.global_proc("_text2path", "/path/to/type")` -### SS13.qdel(datum) +## SS13.qdel(datum) Deletes a datum. You shouldn't try to reference it after calling this function. Equivalent to doing `dm.global_proc("qdel", datum)` -### SS13.await(thing_to_call, proc_to_call, ...) +## SS13.await(thing_to_call, proc_to_call, ...) Calls `proc_to_call` on `thing_to_call`, with `...` as its arguments, and sleeps until that proc returns. Returns two return values - the first is the return value of the proc, and the second is the message of any runtime exception thrown by the called proc. The following example calls and awaits the return of `poll_ghost_candidates`: @@ -194,59 +262,59 @@ The following example calls and awaits the return of `poll_ghost_candidates`: local ghosts, runtime = SS13.await(SS13.global_proc, "poll_ghost_candidates", "Would you like to be considered for something?") ``` -### SS13.wait(time, timer) +## SS13.wait(time, timer) Waits for a number of **seconds** specified with the `time` argument. You can optionally specify a timer subsystem using the `timer` argument. Internally, this function creates a timer that will resume the current task after `time` seconds, then yields the current task by calling `coroutine.yield` with no arguments and ignores the return values. If the task is prematurely resumed, the timer will be safely deleted. -### SS13.register_signal(datum, signal, func, make_easy_clear_function) +## SS13.register_signal(datum, signal, func) Registers the Lua function `func` as a handler for `signal` on `datum`. Like with signal handlers written in DM, Lua signal handlers should not sleep (either by calling `sleep` or `coroutine.yield`). -If `make_easy_clear_function` is truthy, a member function taking no arguments will be created in the `SS13` table to easily unregister the signal handler. - -This function returns the `/datum/callback` created to call `func` from DM. +This function returns whether the signal registration was successful. The following example defines a function which will register a signal that makes `target` make a honking sound any time it moves: ```lua function honk(target) SS13.register_signal(target, "movable_moved", function(source) - dm.global_proc("playsound", target, "sound/items/bikehorn.ogg", 100, true) + dm.global_procs.playsound(target, "sound/items/bikehorn.ogg", 100, true) end) end ``` -### SS13.unregister_signal(datum, signal, callback) -Unregister a signal previously registered using `SS13.register_signal`. `callback` should be a `datum/callback` previously returned by `SS13.register_signal`. If `callback` is not specified, **ALL** signal handlers registered on `datum` for `signal` will be unregistered. +NOTE: if `func` is an anonymous function declared inside the call to `SS13.register_signal`, it cannot be referenced in order to unregister that signal with `SS13.unregister_signal` -### SS13.set_timeout(time, func) +## SS13.unregister_signal(datum, signal, func) +Unregister a signal previously registered using `SS13.register_signal`. `func` must be a function for which a handler for the specified signal has already been registered. If `func` is `nil`, all handlers for that signal will be unregistered. + +## SS13.set_timeout(time, func) Creates a timer which will execute `func` after `time` **seconds**. `func` should not expect to be passed any arguments, as it will not be passed any. Unlike `SS13.wait`, `SS13.set_timeout` does not yield or sleep the current task, making it suitable for use in signal handlers for `SS13.register_signal` The following example will output a message to chat after 5 seconds: ```lua SS13.set_timeout(5, function() - dm.global_proc("to_chat", dm.world, "Hello World!") + dm.global_procs.to_chat(dm.world, "Hello World!") end) ``` -### SS13.start_loop(time, amount, func) +## SS13.start_loop(time, amount, func) Creates a timer which will execute `func` after `time` **seconds**. `func` should not expect to be passed any arguments, as it will not be passed any. Works exactly the same as `SS13.set_timeout` except it will loop the timer `amount` times. If `amount` is set to -1, it will loop indefinitely. Returns a number value, which represents the timer's id. Can be stopped with `SS13.end_loop` Returns a number, the timer id, which is needed to stop indefinite timers. The following example will output a message to chat every 5 seconds, repeating 10 times: ```lua SS13.start_loop(5, 10, function() - dm.global_proc("to_chat", dm.world, "Hello World!") + dm.global_procs.to_chat(dm.world, "Hello World!") end) ``` The following example will output a message to chat every 5 seconds, until `SS13.end_loop(timerid)` is called: ```lua local timerid = SS13.start_loop(5, -1, function() - dm.global_proc("to_chat", dm.world, "Hello World!") + dm.global_proc.to_chat(dm.world, "Hello World!") end) ``` -### SS13.end_loop(id) +## SS13.end_loop(id) Prematurely ends a loop that hasn't ended yet, created with `SS13.start_loop`. Silently fails if there is no started loop with the specified id. The following example will output a message to chat every 5 seconds and delete it after it has repeated 20 times: ```lua @@ -254,7 +322,7 @@ local repeated_amount = 0 -- timerid won't be in the looping function's scope if declared before the function is declared. local timerid timerid = SS13.start_loop(5, -1, function() - dm.global_proc("to_chat", dm.world, "Hello World!") + dm.global_procs.to_chat(dm.world, "Hello World!") repeated_amount += 1 if repeated_amount >= 20 then SS13.end_loop(timerid) @@ -262,35 +330,6 @@ timerid = SS13.start_loop(5, -1, function() end) ``` -### SS13.stop_all_loops() +## SS13.stop_all_loops() Stops all current running loops that haven't ended yet. Useful in case you accidentally left a indefinite loop running without storing the id anywhere. - -### SS13.stop_tracking(datum) -Stops tracking a datum that was created via `SS13.new` so that it can be garbage collected and deleted without having to qdel. Should be used for things like callbacks and other such datums where the reference to the variable is no longer needed. - ---- - -## Internal globals - -Auxlua defines several registry values for each state. Note that there is no way to access registry values from lua code. - -### sleep_flag - -This flag is used to designate that a yielding task should be put in the sleep queue instead of the yield table. Once auxlua determines that a task should sleep, `sleep_flag` is cleared. - -### sleep_queue - -A sequence of threads, each corresponding to a task that has slept. When calling `/proc/__lua_awaken`, auxlua will dequeue the first thread from the sequence and resume it. - -### yield_table - -A table of threads, each corresponding to a coroutine that has yielded. When calling `/proc/__lua_resume`, auxlua will look for a thread at the index specified in the `index` argument, and resume it with the arguments specified in the `arguments` argument. - -### task_info - -A table of key-value-pairs, where the keys are threads, and the values are tables consisting of the following fields: - -- name: A string containing the name of the task -- status: A string, either "sleep" or "yield" -- index: The task's index in `sleep_queue` or `yield_table` diff --git a/code/modules/admin/verbs/lua/_hooks.dm b/code/modules/admin/verbs/lua/_hooks.dm deleted file mode 100644 index a092947e06ec..000000000000 --- a/code/modules/admin/verbs/lua/_hooks.dm +++ /dev/null @@ -1,239 +0,0 @@ -/datum - var/__auxtools_weakref_id //used by auxtools for weak references - -/** - * Sets a global proc to call in place of just outright setting a datum's var to a given value - * - * The proc will be called with the arguments (datum/datum_to_modify, var_name, value) - * - * required wrapper text the name of the proc to use as the wrapper - */ -/proc/__lua_set_set_var_wrapper(wrapper) - CRASH("auxlua not loaded") - -/** - * Sets a global proc to call in place of just outright calling a given proc on a datum - * - * The proc will be called with the arguments (datum/thing_to_call, proc_to_call, list/arguments) - * - * required wrapper text the name of the proc to use as the wrapper - */ -/proc/__lua_set_datum_proc_call_wrapper(wrapper) - CRASH("auxlua not loaded") - -/** - * Sets a global proc to call in place of just outright calling a given global proc - * - * The proc will be called with the arguments (proc_to_call, list/arguments) - * - * required wrapper text the name of the proc to use as the wrapper - */ -/proc/__lua_set_global_proc_call_wrapper(wrapper) - CRASH("auxlua not loaded") - -/** - * Sets a global proc as a wrapper for lua's print function - * - * The proc will be called with the arguments (state_id, list/arguments) - * - * required wrapper text the name of the proc to use as the wrapper - */ -/proc/__lua_set_print_wrapper(wrapper) - CRASH("auxlua not loaded") - -/** - * Sets the maximum amount of time a lua chunk or function can execute without sleeping or yielding. - * Chunks/functions that exceed this duration will produce an error. - * - * required limit number the execution limit, in milliseconds - */ -/proc/__lua_set_execution_limit(limit) - CRASH("auxlua not loaded") - -/** - * Creates a new lua state. - * - * return text a pointer to the created state. - */ -/proc/__lua_new_state() - CRASH("auxlua not loaded") - -/** - * Loads a chunk of lua source code and executes it - * - * required state text a pointer to the state - * in which to execute the code - * required script text the lua source code to execute - * optional name text a name to give to the chunk - * - * return list|text a list of lua return information - * or an error message if the state was corrupted - * - * Lua return information is formatted as followed: - * - ["status"]: How the chunk or function stopped code execution - * - "sleeping": The chunk or function called dm.sleep, - * placing it in the sleep queue. Items in the sleep - * queue can be resumed using /proc/__lua_awaken - * - "yielded": The chunk or function called coroutine.yield, - * placing it in the yield table. Items in the yield - * table can can be resumed by passing their index - * to /proc/__lua_resume - * - "finished": The chunk or function finished - * - "errored": The chunk or function produced an error - * - "bad return": The chunk or function yielded or finished, - * but its return value could not be converted to DM values - * - ["param"]: Depends on status. - * - "sleeping": null - * - "yielded" or "finished": The return/yield value(s) - * - "errored" or "bad return": The error message - * - ["yield_index"]: The index in the yield table where the - * chunk or function is located, for calls to __lua_resume - * - ["name"]: The name of the chunk or function, for logging - */ -/proc/__lua_load(state, script, name) - CRASH("auxlua not loaded") - -/** - * Calls a lua function - * - * required state text a pointer to the state - * in which to call the function - * required function text the name of the function to call - * optional arguments list arguments to pass to the function - * - * return list|text a list of lua return information - * or an error message if the state was corrupted - * - * Lua return information is formatted as followed: - * - ["status"]: How the chunk or function stopped code execution - * - "sleeping": The chunk or function called dm.sleep, - * placing it in the sleep queue. Items in the sleep - * queue can be resumed using /proc/__lua_awaken - * - "yielded": The chunk or function called coroutine.yield, - * placing it in the yield table. Items in the yield - * table can can be resumed by passing their index - * to /proc/__lua_resume - * - "finished": The chunk or function finished - * - "errored": The chunk or function produced an error - * - "bad return": The chunk or function yielded or finished, - * but its return value could not be converted to DM values - * - ["param"]: Depends on status. - * - "sleeping": null - * - "yielded" or "finished": The return/yield value(s) - * - "errored" or "bad return": The error message - * - ["yield_index"]: The index in the yield table where the - * chunk or function is located, for calls to __lua_resume - * - ["name"]: The name of the chunk or function, for logging - */ -/proc/__lua_call(state, function, arguments) - CRASH("auxlua not loaded") - -/** - * Dequeues the task at the front of the sleep queue and resumes it - * - * required state text a pointer to the state in which - * to resume a task - * - * return list|text|null a list of lua return information, - * an error message if the state is corrupted, - * or null if the sleep queue is empty - * - * Lua return information is formatted as followed: - * - ["status"]: How the chunk or function stopped code execution - * - "sleeping": The chunk or function called dm.sleep, - * placing it in the sleep queue. Items in the sleep - * queue can be resumed using /proc/__lua_awaken - * - "yielded": The chunk or function called coroutine.yield, - * placing it in the yield table. Items in the yield - * table can can be resumed by passing their index - * to /proc/__lua_resume - * - "finished": The chunk or function finished - * - "errored": The chunk or function produced an error - * - "bad return": The chunk or function yielded or finished, - * but its return value could not be converted to DM values - * - ["param"]: Depends on status. - * - "sleeping": null - * - "yielded" or "finished": The return/yield value(s) - * - "errored" or "bad return": The error message - * - ["yield_index"]: The index in the yield table where the - * chunk or function is located, for calls to __lua_resume - * - ["name"]: The name of the chunk or function, for logging - */ -/proc/__lua_awaken(state) - CRASH("auxlua not loaded") - -/** - * Removes the task at the specified index from the yield table - * and resumes it - * - * required state text a pointer to the state in which to - * resume a task - * required index number the index in the yield table of the - * task to resume - * optional arguments list the arguments to resume the task with - * - * return list|text|null a list of lua return information, - * an error message if the state is corrupted, - * or null if there is no task at the specified index - * - * Lua return information is formatted as followed: - * - ["status"]: How the chunk or function stopped code execution - * - "sleeping": The chunk or function called dm.sleep, - * placing it in the sleep queue. Items in the sleep - * queue can be resumed using /proc/__lua_awaken - * - "yielded": The chunk or function called coroutine.yield, - * placing it in the yield table. Items in the yield - * table can can be resumed by passing their index - * to /proc/__lua_resume - * - "finished": The chunk or function finished - * - "errored": The chunk or function produced an error - * - "bad return": The chunk or function yielded or finished, - * but its return value could not be converted to DM values - * - ["param"]: Depends on status. - * - "sleeping": null - * - "yielded" or "finished": The return/yield value(s) - * - "errored" or "bad return": The error message - * - ["yield_index"]: The index in the yield table where the - * chunk or function is located, for calls to __lua_resume - * - ["name"]: The name of the chunk or function, for logging - */ -/proc/__lua_resume(state, index, arguments) - CRASH("auxlua not loaded") - -/** - * Get the variables within a state's environment. - * Values not convertible to DM values are substituted - * for their types as text - * - * required state text a pointer to the state - * to get the variables from - * - * return list the variables of the state's environment - */ -/proc/__lua_get_globals(state) - CRASH("auxlua not loaded") - -/** - * Get a list of all tasks currently in progress within a state - * - * required state text a pointer to the state - * to get the tasks from - * - * return list a list of the state's tasks, formatted as follows: - * - name: The name of the task - * - status: Whether the task is sleeping or yielding - * - index: The index of the task in the sleep queue - * or yield table, whichever is applicable - */ -/proc/__lua_get_tasks(state) - CRASH("auxlua not loaded") - -/** - * Kills a task in progress - * - * required state text a pointer to the state - * in which to kill a task - * required info list the task info - */ -/proc/__lua_kill_task(state, info) - CRASH("auxlua not loaded") diff --git a/code/modules/admin/verbs/lua/_wrappers.dm b/code/modules/admin/verbs/lua/_wrappers.dm index 8e05453d29d5..d516f064f847 100644 --- a/code/modules/admin/verbs/lua/_wrappers.dm +++ b/code/modules/admin/verbs/lua/_wrappers.dm @@ -1,3 +1,12 @@ +/proc/wrap_lua_get_var(datum/thing, var_name) + SHOULD_NOT_SLEEP(TRUE) + if(thing == world) + return world.vars[var_name] + if(ref(thing) == "\[0xe000001\]") //This weird fucking thing is like global.vars, but it's not a list and vars is not a valid index for it and I really don't fucking know. + return global.vars[var_name] + if(thing.can_vv_get(var_name)) + return thing.vars[var_name] + /proc/wrap_lua_set_var(datum/thing_to_set, var_name, value) SHOULD_NOT_SLEEP(TRUE) thing_to_set.vv_edit_var(var_name, value) @@ -11,8 +20,6 @@ ret = WrapAdminProcCall(thing_to_call, proc_name, arguments) else ret = HandleUserlessProcCall("lua", thing_to_call, proc_name, arguments) - if(isdatum(ret)) - SSlua.gc_guard += ret return ret /proc/wrap_lua_global_proc_call(proc_name, list/arguments) @@ -24,8 +31,6 @@ ret = WrapAdminProcCall(GLOBAL_PROC, proc_name, arguments) else ret = HandleUserlessProcCall("lua", GLOBAL_PROC, proc_name, arguments) - if(isdatum(ret)) - SSlua.gc_guard += ret return ret /proc/wrap_lua_print(state_id, list/arguments) @@ -38,6 +43,6 @@ if(!target_state) return var/print_message = jointext(arguments, "\t") - var/result = list("status" = "print", "param" = print_message) + var/result = list("status" = "print", "message" = print_message) INVOKE_ASYNC(target_state, TYPE_PROC_REF(/datum/lua_state, log_result), result, TRUE) log_lua("[target_state]: [print_message]") diff --git a/code/modules/admin/verbs/lua/helpers.dm b/code/modules/admin/verbs/lua/helpers.dm index 66b7c835e9ab..c3072f15e74c 100644 --- a/code/modules/admin/verbs/lua/helpers.dm +++ b/code/modules/admin/verbs/lua/helpers.dm @@ -3,27 +3,27 @@ #define PROMISE_REJECTED 2 /** - * Auxtools hooks act as "set waitfor = 0" procs. This means that whenever - * a proc directly called from auxtools sleeps, the hook returns with whatever + * Byondapi hooks act as "set waitfor = 0" procs. This means that whenever + * a proc directly called from an external library sleeps, the hook returns with whatever * the called proc had as its return value at the moment it slept. This may not * be desired behavior, so this datum exists to wrap these procs. * * Some procs that don't sleep could take longer than the execution limit would * allow for. We can wrap these in a promise as well. */ -/datum/auxtools_promise +/datum/promise var/datum/callback/callback var/return_value var/runtime_message var/status = PROMISE_PENDING -/datum/auxtools_promise/New(...) +/datum/promise/New(...) + if(!usr) + usr = GLOB.lua_usr callback = CALLBACK(arglist(args)) - perform() + INVOKE_ASYNC(src, PROC_REF(perform)) -/datum/auxtools_promise/proc/perform() - set waitfor = 0 - sleep() //In case we have to call a super-expensive non-sleeping proc (like getFlatIcon) +/datum/promise/proc/perform() try return_value = callback.Invoke() status = PROMISE_RESOLVED diff --git a/code/modules/admin/verbs/lua/lua_editor.dm b/code/modules/admin/verbs/lua/lua_editor.dm index b39050ed3c1d..1ff55b3fffb7 100644 --- a/code/modules/admin/verbs/lua/lua_editor.dm +++ b/code/modules/admin/verbs/lua/lua_editor.dm @@ -16,6 +16,12 @@ /// If set, we will force the editor to look at this chunk var/force_view_chunk + /// If set, we will force the script input to be this + var/force_input + + /// If set, the latest code execution performed from the editor raised an error, and this is the message from that error + var/last_error + /datum/lua_editor/New(state, _quick_log_index) . = ..() if(state) @@ -37,37 +43,52 @@ /datum/lua_editor/ui_state(mob/user) return GLOB.debug_state -/datum/lua_editor/ui_static_data(mob/user) - var/list/data = list() - data["documentation"] = file2text('code/modules/admin/verbs/lua/README.md') - data["auxtools_enabled"] = CONFIG_GET(flag/auxtools_enabled) - data["ss_lua_init"] = SSlua.initialized - return data - /datum/lua_editor/ui_data(mob/user) var/list/data = list() - if(!CONFIG_GET(flag/auxtools_enabled) || !SSlua.initialized) + data["ss_lua_init"] = SSlua.initialized + if(!SSlua.initialized) return data data["noStateYet"] = !current_state data["showGlobalTable"] = show_global_table if(current_state) if(current_state.log) - data["stateLog"] = kvpify_list(refify_list(current_state.log.Copy((page*50)+1, min((page+1)*50+1, current_state.log.len+1)))) + var/list/logs = current_state.log.Copy((page*50)+1, min((page+1)*50+1, current_state.log.len+1)) + for(var/i in 1 to logs.len) + var/list/log = logs[i] + log = log.Copy() + if(log["return_values"]) + log["return_values"] = kvpify_list(prepare_lua_editor_list(deep_copy_without_cycles(log["return_values"]))) + logs[i] = log + data["stateLog"] = logs data["page"] = page data["pageCount"] = CEILING(current_state.log.len/50, 1) data["tasks"] = current_state.get_tasks() if(show_global_table) current_state.get_globals() - data["globals"] = kvpify_list(refify_list(current_state.globals)) - data["states"] = SSlua.states - data["callArguments"] = kvpify_list(refify_list(arguments)) + var/list/values = current_state.globals["values"] + values = deep_copy_without_cycles(values) + values = prepare_lua_editor_list(values) + values = kvpify_list(values) + var/list/variants = current_state.globals["variants"] + data["globals"] = list("values" = values, "variants" = variants) + if(last_error) + data["lastError"] = last_error + last_error = null + data["supressRuntimes"] = current_state.supress_runtimes + data["states"] = list() + for(var/datum/lua_state/state as anything in SSlua.states) + data["states"] += state.display_name + data["callArguments"] = kvpify_list(prepare_lua_editor_list(deep_copy_without_cycles(arguments))) if(force_modal) data["forceModal"] = force_modal force_modal = null if(force_view_chunk) data["forceViewChunk"] = force_view_chunk force_view_chunk = null + if(force_input) + data["force_input"] = force_input + force_input = null return data /datum/lua_editor/proc/traverse_list(list/path, list/root, traversal_depth_offset = 0) @@ -99,14 +120,24 @@ else return root -/datum/lua_editor/ui_act(action, list/params) +/datum/lua_editor/proc/run_code(code) + var/ckey = usr.ckey + current_state.ckey_last_runner = ckey + var/result = current_state.load_script(code) + var/index_with_result = current_state.log_result(result) + if(result["status"] == "error") + last_error = result["message"] + message_admins("[key_name(usr)] executed [length(code)] bytes of lua code. [ADMIN_LUAVIEW_CHUNK(current_state, index_with_result)]") + +/datum/lua_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - if(!check_rights_for(usr.client, R_ADMIN)) + var/mob/user = ui.user + if(!check_rights_for(user.client, R_DEBUG)) return if(action == "runCodeFile") - params["code"] = file2text(input(usr, "Input File") as null|file) + params["code"] = file2text(input(user, "Input File") as null|file) if(isnull(params["code"])) return action = "runCode" @@ -116,6 +147,8 @@ if(!length(state_name)) return TRUE var/datum/lua_state/new_state = new(state_name) + if(QDELETED(new_state)) + return SSlua.states += new_state LAZYREMOVEASSOC(SSlua.editors, text_ref(current_state), src) current_state = new_state @@ -130,11 +163,14 @@ page = 0 return TRUE if("runCode") - var/code = params["code"] - current_state.ckey_last_runner = usr.ckey - var/result = current_state.load_script(code) - var/index_with_result = current_state.log_result(result) - message_admins("[key_name(usr)] executed [length(code)] bytes of lua code. [ADMIN_LUAVIEW_CHUNK(current_state, index_with_result)]") + run_code(params["code"]) + return TRUE + if("runFile") + var/code_file = input(user, "Select a script to run.", "Lua") as file|null + if(!code_file) + return TRUE + var/code = file2text(code_file) + run_code(code) return TRUE if("moveArgUp") var/list/path = params["path"] @@ -158,9 +194,9 @@ var/list/path = params["path"] var/list/target_list = traverse_list(path, arguments) if(target_list != arguments) - usr?.client?.mod_list_add(target_list, null, "a lua editor", "arguments") + user?.client?.mod_list_add(target_list, null, "a lua editor", "arguments") else - var/list/vv_val = usr?.client?.vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) + var/list/vv_val = user?.client?.vv_get_value(restricted_classes = list(VV_RESTORE_DEFAULT)) var/class = vv_val["class"] if(!class) return @@ -168,53 +204,58 @@ return TRUE if("callFunction") var/list/recursive_indices = params["indices"] - var/list/current_list = kvpify_list(current_state.globals) + var/list/current_list = kvpify_list(current_state.globals["values"]) + var/list/current_variants = current_state.globals["variants"] var/function = list() while(LAZYLEN(recursive_indices)) var/index = popleft(recursive_indices) var/list/element = current_list[index] var/key = element["key"] var/value = element["value"] - if(!(istext(key) || isnum(key))) - to_chat(usr, span_warning("invalid key \[[key]] for function call (expected text or num)")) + var/list/variant_pair = current_variants[index] + var/key_variant = variant_pair["key"] + if(key_variant == "function" || key_variant == "thread" || key_variant == "userdata" || key_variant == "error_as_value") + to_chat(user, span_warning("invalid table key \[[key]] for function call (expected text, num, path, list, or ref, got [key_variant])")) return function += key if(islist(value)) current_list = value + current_variants = variant_pair["value"] else - var/regex/function_regex = regex("^function: 0x\[0-9a-fA-F]+$") - if(function_regex.Find(value)) - break - to_chat(usr, span_warning("invalid path element \[[value]] for function call (expected list or text matching [function_regex])")) - return + if(variant_pair["value"] != "function") + to_chat(user, span_warning("invalid value \[[value]] for function call (expected list or function)")) + return var/result = current_state.call_function(arglist(list(function) + arguments)) current_state.log_result(result) + if(result["status"] == "error") + last_error = result["message"] arguments.Cut() - return TRUE + return if("resumeTask") var/task_index = params["index"] SSlua.queue_resume(current_state, task_index, arguments) arguments.Cut() return TRUE if("killTask") - var/task_info = params["info"] - SSlua.kill_task(current_state, task_info) + var/is_sleep = params["is_sleep"] + var/index = params["index"] + SSlua.kill_task(current_state, is_sleep, index) return TRUE if("vvReturnValue") var/log_entry_index = params["entryIndex"] var/list/log_entry = current_state.log[log_entry_index] - var/thing_to_debug = traverse_list(params["tableIndices"], log_entry["param"]) + var/thing_to_debug = traverse_list(params["indices"], log_entry["return_values"]) if(isweakref(thing_to_debug)) var/datum/weakref/ref = thing_to_debug thing_to_debug = ref.resolve() - INVOKE_ASYNC(usr.client, TYPE_PROC_REF(/client, debug_variables), thing_to_debug) + INVOKE_ASYNC(user.client, TYPE_PROC_REF(/client, debug_variables), thing_to_debug) return FALSE if("vvGlobal") - var/thing_to_debug = traverse_list(params["indices"], current_state.globals) + var/thing_to_debug = traverse_list(params["indices"], current_state.globals["values"]) if(isweakref(thing_to_debug)) var/datum/weakref/ref = thing_to_debug thing_to_debug = ref.resolve() - INVOKE_ASYNC(usr.client, TYPE_PROC_REF(/client, debug_variables), thing_to_debug) + INVOKE_ASYNC(user.client, TYPE_PROC_REF(/client, debug_variables), thing_to_debug) return FALSE if("clearArgs") arguments.Cut() @@ -222,12 +263,18 @@ if("toggleShowGlobalTable") show_global_table = !show_global_table return TRUE + if("toggleSupressRuntimes") + current_state.supress_runtimes = !current_state.supress_runtimes + return TRUE if("nextPage") page = min(page+1, CEILING(current_state.log.len/50, 1)-1) return TRUE if("previousPage") page = max(page-1, 0) return TRUE + if("nukeLog") + current_state.log.Cut() + return TRUE /datum/lua_editor/ui_close(mob/user) . = ..() @@ -235,8 +282,9 @@ /client/proc/open_lua_editor() set name = "Open Lua Editor" + set desc = "Its codin' time." set category = "Debug" - if(!check_rights_for(src, R_ADMIN)) + if(!check_rights_for(src, R_DEBUG)) return - var/datum/lua_editor/editor = new() - editor.ui_interact(usr) + var/datum/lua_editor/editor = new + editor.ui_interact(mob) diff --git a/code/modules/admin/verbs/lua/lua_state.dm b/code/modules/admin/verbs/lua/lua_state.dm index bf2bcbd5a900..30bc21c83b2b 100644 --- a/code/modules/admin/verbs/lua/lua_state.dm +++ b/code/modules/admin/verbs/lua/lua_state.dm @@ -1,15 +1,15 @@ #define MAX_LOG_REPEAT_LOOKBACK 5 -GLOBAL_VAR_INIT(IsLuaCall, FALSE) -GLOBAL_PROTECT(IsLuaCall) - GLOBAL_DATUM(lua_usr, /mob) GLOBAL_PROTECT(lua_usr) +GLOBAL_LIST_EMPTY_TYPED(lua_state_stack, /datum/weakref) +GLOBAL_PROTECT(lua_state_stack) + /datum/lua_state - var/name + var/display_name - /// The internal ID of the lua state stored in auxlua's global map + /// The internal ID of the lua state stored in dreamluau's state list var/internal_id /// A log of every return, yield, and error for each chunk execution and function call @@ -18,15 +18,15 @@ GLOBAL_PROTECT(lua_usr) /// A list of all the variables in the state's environment var/list/globals = list() - /// A list in which to store datums and lists instantiated in lua, ensuring that they don't get garbage collected - var/list/references = list() - /// Ckey of the last user who ran a script on this lua state. var/ckey_last_runner = "" /// Whether the timer.lua script has been included into this lua context state. var/timer_enabled = FALSE + /// Whether to supress logging BYOND runtimes for this state. + var/supress_runtimes = FALSE + /// Callbacks that need to be ran on next tick var/list/functions_to_execute = list() @@ -39,55 +39,70 @@ GLOBAL_PROTECT(lua_usr) if(SSlua.initialized != TRUE) qdel(src) return - name = _name - internal_id = __lua_new_state() + display_name = _name + internal_id = DREAMLUAU_NEW_STATE() + if(isnull(internal_id)) + stack_trace("dreamluau is not loaded") + qdel(src) + else if(!isnum(internal_id)) + stack_trace(internal_id) + qdel(src) /datum/lua_state/proc/check_if_slept(result) - if(result["status"] == "sleeping") + if(result["status"] == "sleep") SSlua.sleeps += src /datum/lua_state/proc/log_result(result, verbose = TRUE) if(!islist(result)) return - if(!verbose && result["status"] != "errored" && result["status"] != "bad return" \ - && !(result["name"] == "input" && (result["status"] == "finished" || length(result["param"])))) + var/status = result["status"] + if(!verbose && status != "error" && status != "panic" && status != "runtime" && !(result["name"] == "input" && (status == "finished" || length(result["return_values"])))) + return + if(status == "runtime" && supress_runtimes) return var/append_to_log = TRUE var/index_of_log if(log.len) for(var/index in log.len to max(log.len - MAX_LOG_REPEAT_LOOKBACK, 1) step -1) var/list/entry = log[index] - if(entry["status"] == result["status"] \ - && entry["chunk"] == result["chunk"] \ - && entry["name"] == result["name"] \ - && ((entry["param"] == result["param"]) || deep_compare_list(entry["param"], result["param"]))) - if(!entry["repeats"]) - entry["repeats"] = 0 - index_of_log = index - entry["repeats"]++ - append_to_log = FALSE - break + if(!compare_lua_logs(entry, result)) + continue + if(!entry["repeats"]) + entry["repeats"] = 0 + index_of_log = index + entry["repeats"]++ + append_to_log = FALSE + break if(append_to_log) - if(islist(result["param"])) - result["param"] = weakrefify_list(encode_text_and_nulls(result["param"])) + if(islist(result["return_values"])) + add_lua_return_value_variants(result["return_values"], result["variants"]) + result["return_values"] = weakrefify_list(result["return_values"]) log += list(result) index_of_log = log.len INVOKE_ASYNC(src, TYPE_PROC_REF(/datum/lua_state, update_editors)) return index_of_log +/datum/lua_state/proc/parse_error(message, name) + if(copytext(message, 1, 7) == "PANIC:") + return list("status" = "panic", "message" = copytext(message, 7), "name" = name) + else + return list("status" = "error", "message" = message, "name" = name) + /datum/lua_state/proc/load_script(script) - GLOB.IsLuaCall = TRUE var/tmp_usr = GLOB.lua_usr GLOB.lua_usr = usr - var/result = __lua_load(internal_id, script) - GLOB.IsLuaCall = FALSE + DREAMLUAU_SET_USR + GLOB.lua_state_stack += WEAKREF(src) + var/result = DREAMLUAU_LOAD(internal_id, script, "input") + SSlua.needs_gc_cycle |= src + pop(GLOB.lua_state_stack) GLOB.lua_usr = tmp_usr // Internal errors unrelated to the code being executed are returned as text rather than lists if(isnull(result)) - result = list("status" = "errored", "param" = "__lua_load returned null (it may have runtimed - check the runtime logs)", "name" = "input") + result = list("status" = "error", "message" = "load returned null (it may have runtimed - check the runtime logs)", "name" = "input") if(istext(result)) - result = list("status" = "errored", "param" = result, "name" = "input") + result = parse_error(result, "input") result["chunk"] = script check_if_slept(result) @@ -109,67 +124,106 @@ GLOBAL_PROTECT(lua_usr) if(islist(function)) var/list/new_function_path = list() for(var/path_element in function) - new_function_path += path_element + if(isweakref(path_element)) + var/datum/weakref/weak_ref = path_element + var/resolved = weak_ref.hard_resolve() + if(!resolved) + return list("status" = "error", "message" = "Weakref in function path ([weak_ref] [text_ref(weak_ref)]) resolved to null.", "name" = jointext(function, ".")) + new_function_path += resolved + else + new_function_path += path_element function = new_function_path + else + function = list(function) var/tmp_usr = GLOB.lua_usr GLOB.lua_usr = usr - GLOB.IsLuaCall = TRUE - var/result = __lua_call(internal_id, function, call_args) - GLOB.IsLuaCall = FALSE + DREAMLUAU_SET_USR + GLOB.lua_state_stack += WEAKREF(src) + var/result = DREAMLUAU_CALL_FUNCTION(internal_id, function, call_args) + SSlua.needs_gc_cycle |= src + pop(GLOB.lua_state_stack) GLOB.lua_usr = tmp_usr if(isnull(result)) - result = list("status" = "errored", "param" = "__lua_call returned null (it may have runtimed - check the runtime logs)", "name" = islist(function) ? jointext(function, ".") : function) + result = list("status" = "error", "message" = "call_function returned null (it may have runtimed - check the runtime logs)", "name" = jointext(function, ".")) if(istext(result)) - result = list("status" = "errored", "param" = result, "name" = islist(function) ? jointext(function, ".") : function) + result = parse_error(result, jointext(function, ".")) check_if_slept(result) return result /datum/lua_state/proc/call_function_return_first(function, ...) + SHOULD_NOT_SLEEP(TRUE) // This function is meant to be used for signal handlers. var/list/result = call_function(arglist(args)) - log_result(result, verbose = FALSE) + INVOKE_ASYNC(src, PROC_REF(log_result), deep_copy_list(result), /*verbose = */FALSE) if(length(result)) - if(islist(result["param"]) && length(result["param"])) - return result["param"][1] + if(islist(result["return_values"]) && length(result["return_values"])) + var/return_value = result["return_values"][1] + var/variant = (islist(result["variants"]) && length(result["variants"])) && result["variants"][1] + if(islist(return_value) && islist(variant)) + remove_non_dm_variants(return_value, variant) + return return_value /datum/lua_state/proc/awaken() - GLOB.IsLuaCall = TRUE - var/result = __lua_awaken(internal_id) - GLOB.IsLuaCall = FALSE + DREAMLUAU_SET_USR + GLOB.lua_state_stack += WEAKREF(src) + var/result = DREAMLUAU_AWAKEN(internal_id) + SSlua.needs_gc_cycle |= src + pop(GLOB.lua_state_stack) if(isnull(result)) - result = list("status" = "errored", "param" = "__lua_awaken returned null (it may have runtimed - check the runtime logs)", "name" = "An attempted awaken") + result = list("status" = "error", "message" = "awaken returned null (it may have runtimed - check the runtime logs)", "name" = "An attempted awaken") if(istext(result)) - result = list("status" = "errored", "param" = result, "name" = "An attempted awaken") + result = parse_error(result, "An attempted awaken") check_if_slept(result) return result /// Prefer calling SSlua.queue_resume over directly calling this /datum/lua_state/proc/resume(index, ...) var/call_args = length(args) > 1 ? args.Copy(2) : list() - var/msg = "[key_name(usr)] resumed a lua coroutine with arguments: [english_list(call_args)]" - log_lua(msg) - GLOB.IsLuaCall = TRUE - var/result = __lua_resume(internal_id, index, call_args) - GLOB.IsLuaCall = FALSE + DREAMLUAU_SET_USR + GLOB.lua_state_stack += WEAKREF(src) + var/result = DREAMLUAU_RESUME(internal_id, index, call_args) + SSlua.needs_gc_cycle |= src + pop(GLOB.lua_state_stack) if(isnull(result)) - result = list("status" = "errored", "param" = "__lua_resume returned null (it may have runtimed - check the runtime logs)", "name" = "An attempted resume") + result = list("status" = "error", "param" = "resume returned null (it may have runtimed - check the runtime logs)", "name" = "An attempted resume") if(istext(result)) - result = list("status" = "errored", "param" = result, "name" = "An attempted resume") + result = parse_error(result, "An attempted resumt") check_if_slept(result) return result /datum/lua_state/proc/get_globals() - globals = weakrefify_list(encode_text_and_nulls(__lua_get_globals(internal_id))) + var/result = DREAMLUAU_GET_GLOBALS(internal_id) + if(isnull(result)) + CRASH("get_globals returned null") + if(istext(result)) + CRASH(result) + var/list/new_globals = result + var/list/values = new_globals["values"] + var/list/variants = new_globals["variants"] + add_lua_editor_variants(values, variants) + globals = list("values" = weakrefify_list(values), "variants" = variants) /datum/lua_state/proc/get_tasks() - return __lua_get_tasks(internal_id) + var/result = DREAMLUAU_LIST_THREADS(internal_id) + if(isnull(result)) + CRASH("list_threads returned null") + if(istext(result)) + CRASH(result) + return result -/datum/lua_state/proc/kill_task(task_info) - __lua_kill_task(internal_id, task_info) +/datum/lua_state/proc/kill_task(is_sleep, index) + var/result = is_sleep ? DREAMLUAU_KILL_SLEEPING_THREAD(internal_id, index) : DREAMLUAU_KILL_YIELDED_THREAD(internal_id, index) + SSlua.needs_gc_cycle |= src + return result + +/datum/lua_state/proc/collect_garbage() + var/result = DREAMLUAU_COLLECT_GARBAGE(internal_id) + if(!isnull(result)) + CRASH(result) /datum/lua_state/proc/update_editors() var/list/editor_list = LAZYACCESS(SSlua.editors, text_ref(src)) @@ -177,18 +231,4 @@ GLOBAL_PROTECT(lua_usr) for(var/datum/lua_editor/editor as anything in editor_list) SStgui.update_uis(editor) -/// Called by lua scripts when they add an atom to var/list/references so that it gets cleared up on delete. -/datum/lua_state/proc/clear_on_delete(datum/to_clear) - RegisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) - -/// Called by lua scripts when an atom they've added should soft delete and this state should stop tracking it. -/// Needs to unregister all signals. -/datum/lua_state/proc/let_soft_delete(datum/to_clear) - UnregisterSignal(to_clear, COMSIG_QDELETING, PROC_REF(on_delete)) - references -= to_clear - -/datum/lua_state/proc/on_delete(datum/to_clear) - SIGNAL_HANDLER - references -= to_clear - #undef MAX_LOG_REPEAT_LOOKBACK diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 954d2ede66b7..12d22bb25d72 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -133,7 +133,7 @@ return to_chat(user, span_notice("You activate [src] and wait for confirmation.")) - var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as a reinforcement [special_role_name]?", check_jobban = ROLE_OPERATIVE, role = ROLE_OPERATIVE, poll_time = 15 SECONDS, ignore_category = POLL_IGNORE_SYNDICATE, alert_pic = src, role_name_text = special_role_name, amount_to_pick = 1) + var/mob/chosen_one = SSpolling.poll_ghost_candidates("Do you want to play as a reinforcement [special_role_name]?", check_jobban = ROLE_OPERATIVE, role = ROLE_OPERATIVE_MIDROUND, poll_time = 15 SECONDS, ignore_category = POLL_IGNORE_SYNDICATE, alert_pic = src, role_name_text = special_role_name, amount_to_pick = 1) if(chosen_one) if(QDELETED(src) || !check_usability(user)) return diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index b8eb5849076e..b3392810bf0e 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -215,19 +215,23 @@ RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - // Roughly 1/5th of the station will rise up as lunatics to the heretic - for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) - // How many lunatics we have - var/amount_of_lunatics = 0 - // Where the crewmate is, used to check their z-level + var/amount_of_lunatics = 0 + var/list/lunatic_candidates = list() + for(var/mob/living/carbon/human/crewmate as anything in shuffle(GLOB.human_list)) + if(QDELETED(crewmate) || isnull(crewmate.client) || isnull(crewmate.mind) || crewmate.stat != CONSCIOUS) + continue var/turf/crewmate_turf = get_turf(crewmate) var/crewmate_z = crewmate_turf?.z - if(isnull(crewmate.mind)) - continue - if(crewmate.stat != CONSCIOUS) - continue if(!is_station_level(crewmate_z)) continue + lunatic_candidates += crewmate + + // Roughly 1/5th of the station will rise up as lunatics to the heretic. + // We use either the (locked) manifest for the maximum, or the amount of candidates, whichever is larger. + // If there's more eligible humans than crew, more power to them I guess. + var/max_lunatics = ceil(max(length(GLOB.manifest.locked), length(lunatic_candidates)) * 0.2) + + for(var/mob/living/carbon/human/crewmate as anything in lunatic_candidates) // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp if(IS_HERETIC_OR_MONSTER(crewmate)) to_chat(crewmate, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) @@ -236,12 +240,12 @@ if(HAS_TRAIT(crewmate, TRAIT_MINDSHIELD) || crewmate.can_block_magic(MAGIC_RESISTANCE) || HAS_MIND_TRAIT(crewmate, TRAIT_UNCONVERTABLE)) // monkestation edit: TRAIT_UNCONVERTABLE to_chat(crewmate, span_boldwarning("You feel shielded from something." )) continue - if(amount_of_lunatics > length(GLOB.human_list) * 0.2) - to_chat(crewmate, span_boldwarning("You feel uneasy, as if for a brief moment something was gazing at you." )) + if(amount_of_lunatics > max_lunatics) + to_chat(crewmate, span_boldwarning("You feel uneasy, as if for a brief moment something was gazing at you.")) continue var/datum/antagonist/lunatic/lunatic = crewmate.mind.add_antag_datum(/datum/antagonist/lunatic) lunatic.set_master(user.mind, user) - var/obj/item/clothing/neck/heretic_focus/moon_amulette/amulet = new(crewmate_turf) + var/obj/item/clothing/neck/heretic_focus/moon_amulette/amulet = new(crewmate.drop_location()) var/static/list/slots = list( "neck" = ITEM_SLOT_NECK, "hands" = ITEM_SLOT_HANDS, @@ -251,7 +255,7 @@ ) crewmate.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) crewmate.emote("laugh") - amount_of_lunatics += 1 + amount_of_lunatics++ /datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader diff --git a/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm index c4f33543878c..f289ed952dcc 100644 --- a/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm +++ b/code/modules/antagonists/wizard/grand_ritual/finales/clown.dm @@ -35,9 +35,8 @@ var/datum/action/cooldown/spell/pointed/untie_shoes/newer_spell = new(victim) newer_spell.Grant(victim) continue - if (!ismonkey(victim)) // Monkeys cannot yet wear clothes - dress_as_magic_clown(victim) - ADD_TRAIT(victim, TRAIT_CLUMSY, MAGIC_TRAIT) //monkestation edit: HONK HONK! + dress_as_magic_clown(victim) + ADD_TRAIT(victim, TRAIT_CLUMSY, MAGIC_TRAIT) //monkestation edit: HONK HONK! if (prob(15)) create_vendetta(victim.mind, invoker.mind) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index e51cfa4e94e6..d436e4361949 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -86,21 +86,6 @@ . = ..() disconnect_from_area(area_to_unregister) -///adds a gas or list of gases to our filter_types. used so that the scrubber can check if its supposed to be processing after each change -/obj/machinery/atmospherics/components/unary/vent_scrubber/proc/add_filters(filter_or_filters) - if(!islist(filter_or_filters)) - filter_or_filters = list(filter_or_filters) - - for(var/gas_to_filter in filter_or_filters) - var/translated_gas = istext(gas_to_filter) ? gas_id2path(gas_to_filter) : gas_to_filter - - if(ispath(translated_gas, /datum/gas)) - filter_types |= translated_gas - continue - - atmos_conditions_changed() - return TRUE - ///remove a gas or list of gases from our filter_types.used so that the scrubber can check if its supposed to be processing after each change /obj/machinery/atmospherics/components/unary/vent_scrubber/proc/remove_filters(filter_or_filters) if(!islist(filter_or_filters)) diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 06a207899e43..5852bd73f934 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -66,7 +66,6 @@ /datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value) target.facial_hairstyle = value - target.update_body_parts() /datum/preference/choiced/facial_hairstyle/compile_constant_data() var/list/data = ..() @@ -83,7 +82,6 @@ /datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value) target.facial_hair_color = value - target.update_body_parts() /datum/preference/choiced/facial_hair_gradient category = PREFERENCE_CATEGORY_FEATURES @@ -132,7 +130,6 @@ /datum/preference/choiced/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value) LAZYSETLEN(target.grad_style, GRADIENTS_LEN) target.grad_style[GRADIENT_FACIAL_HAIR_KEY] = value - target.update_body_parts() /datum/preference/choiced/facial_hair_gradient/create_default_value() return "None" @@ -146,7 +143,6 @@ /datum/preference/color/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value) LAZYSETLEN(target.grad_color, GRADIENTS_LEN) target.grad_color[GRADIENT_FACIAL_HAIR_KEY] = value - target.update_body_parts() /datum/preference/color/facial_hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) @@ -241,7 +237,6 @@ /datum/preference/choiced/hair_gradient/apply_to_human(mob/living/carbon/human/target, value) LAZYSETLEN(target.grad_style, GRADIENTS_LEN) target.grad_style[GRADIENT_HAIR_KEY] = value - target.update_body_parts() /datum/preference/choiced/hair_gradient/create_default_value() return "None" @@ -255,7 +250,6 @@ /datum/preference/color/hair_gradient/apply_to_human(mob/living/carbon/human/target, value) LAZYSETLEN(target.grad_color, GRADIENTS_LEN) target.grad_color[GRADIENT_HAIR_KEY] = value - target.update_body_parts() /datum/preference/color/hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index 9069bb1fdbfd..a67a23339e2d 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -70,6 +70,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Frills" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/frills /datum/preference/choiced/lizard_frills/init_possible_values() return generate_lizard_side_shots(GLOB.frills_list, "frills") @@ -83,6 +84,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Horns" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/horns /datum/preference/choiced/lizard_horns/init_possible_values() return generate_lizard_side_shots(GLOB.horns_list, "horns") @@ -113,6 +115,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Snout" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/snout /datum/preference/choiced/lizard_snout/init_possible_values() return generate_lizard_side_shots(GLOB.snouts_list, "snout", include_snout = FALSE) diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm index 87823a12d375..cb62261b08b7 100644 --- a/code/modules/client/preferences/species_features/moth.dm +++ b/code/modules/client/preferences/species_features/moth.dm @@ -4,6 +4,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Antennae" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/antennae /datum/preference/choiced/moth_antennae/init_possible_values() var/list/values = list() @@ -88,6 +89,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Moth wings" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/wings/moth /datum/preference/choiced/moth_wings/init_possible_values() return possible_values_for_sprite_accessory_list_for_body_part( diff --git a/code/modules/client/preferences/species_features/pod.dm b/code/modules/client/preferences/species_features/pod.dm index f2534ac71059..e543fb3b5948 100644 --- a/code/modules/client/preferences/species_features/pod.dm +++ b/code/modules/client/preferences/species_features/pod.dm @@ -4,6 +4,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Hairstyle" should_generate_icons = TRUE + relevant_external_organ = /obj/item/organ/external/pod_hair /datum/preference/choiced/pod_hair/init_possible_values() var/list/values = list() diff --git a/code/modules/clothing/under/suits.dm b/code/modules/clothing/under/suits.dm index 730cb4a50f61..c8078d0fd1dc 100644 --- a/code/modules/clothing/under/suits.dm +++ b/code/modules/clothing/under/suits.dm @@ -30,7 +30,7 @@ desc = "It's a very smart uniform with a special pocket for tip." icon_state = "waiter" inhand_icon_state = "waiter" - supports_variations_flags = CLOTHING_MONKEY_VARIATION|CLOTHING_DIGITIGRADE_VARIATION + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/under/suit/blacktwopiece name = "black two piece suit" diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm index 84254ef615b7..3ca75809c5ec 100644 --- a/code/modules/error_handler/error_handler.dm +++ b/code/modules/error_handler/error_handler.dm @@ -104,6 +104,12 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) // The proceeding mess will almost definitely break if error messages are ever changed var/list/splitlines = splittext(E.desc, "\n") var/list/desclines = list() + var/list/state_stack = GLOB.lua_state_stack + var/is_lua_call = length(state_stack) + var/list/lua_stacks = list() + if(is_lua_call) + for(var/level in 1 to state_stack.len) + lua_stacks += list(splittext(DREAMLUAU_GET_TRACEBACK(level), "\n")) if(LAZYLEN(splitlines) > ERROR_USEFUL_LEN) // If there aren't at least three lines, there's no info for(var/line in splitlines) if(LAZYLEN(line) < 3 || findtext(line, "source file:") || findtext(line, "usr.loc:")) @@ -120,6 +126,8 @@ GLOBAL_VAR_INIT(total_runtimes_skipped, 0) desclines += line if(usrinfo) //If this info isn't null, it hasn't been added yet desclines.Add(usrinfo) + if(is_lua_call) + SSlua.log_involved_runtime(E, desclines, lua_stacks) if(silencing) desclines += " (This error will now be silenced for [DisplayTimeText(configured_error_silence_time)])" if(GLOB.error_cache) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 274665a4a93c..57a7cd430330 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -98,9 +98,11 @@ /datum/round_event_control/proc/can_spawn_event(players_amt, allow_magic = FALSE, fake_check = FALSE) SHOULD_CALL_PARENT(TRUE) // monkestation start: event groups and storyteller stuff + if(SSgamemode.current_storyteller?.disable_distribution || SSgamemode.halted_storyteller) + return FALSE if(event_group && !GLOB.event_groups[event_group].can_run()) return FALSE - if(roundstart && ((SSticker.round_start_time && (world.time - SSticker.round_start_time) >= 2 MINUTES) || (SSgamemode.ran_roundstart && !fake_check))) + if(roundstart && (!SSgamemode.can_run_roundstart || (SSgamemode.ran_roundstart && !fake_check && !SSgamemode.current_storyteller?.ignores_roundstart))) return FALSE // monkestation end if(occurrences >= max_occurrences) @@ -123,9 +125,8 @@ return FALSE if(!check_enemies()) return FALSE - if(allowed_storytellers && ((islist(allowed_storytellers) && !is_type_in_list(SSgamemode.storyteller, allowed_storytellers)) || SSgamemode.storyteller.type != allowed_storytellers)) - return FALSE - if(SSgamemode.storyteller.disable_distribution || SSgamemode.halted_storyteller) + if(allowed_storytellers && SSgamemode.current_storyteller && ((islist(allowed_storytellers) && \ + !is_type_in_list(SSgamemode.current_storyteller, allowed_storytellers)) || SSgamemode.current_storyteller.type != allowed_storytellers)) return FALSE // monkestation end @@ -149,12 +150,13 @@ message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name]. (CANCEL)") if(!roundstart) sleep(RANDOM_EVENT_ADMIN_INTERVENTION_TIME) - var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) - if(!can_spawn_event(players_amt, fake_check = TRUE) && !forced) - message_admins("Second pre-condition check for [name] failed, skipping...") - return EVENT_INTERRUPTED - if(!can_spawn_event(players_amt, fake_check = TRUE) && forced) - message_admins("Second pre-condition check for [name] failed, but event forced, running event regardless this may have issues...") + + if(!can_spawn_event(get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE), fake_check = TRUE) && !forced) + if(!forced) + message_admins("Second pre-condition check for [name] failed, skipping...") + return EVENT_INTERRUPTED + else if(forced) + message_admins("Second pre-condition check for [name] failed, but event forced, running event regardless this may have issues...") if(!triggering) return EVENT_CANCELLED //admin cancelled @@ -346,7 +348,7 @@ Runs the event if("schedule") message_admins("[key_name_admin(usr)] scheduled event [src.name].") log_admin_private("[key_name(usr)] scheduled [src.name].") - SSgamemode.storyteller.buy_event(src, src.track) + SSgamemode.current_storyteller.buy_event(src, src.track) if("force_next") if(length(src.admin_setup)) for(var/datum/event_admin_setup/admin_setup_datum in src.admin_setup) diff --git a/code/modules/events/wizard/rpgtitles.dm b/code/modules/events/wizard/rpgtitles.dm index 37eae2459f62..9bb69a90f2cf 100644 --- a/code/modules/events/wizard/rpgtitles.dm +++ b/code/modules/events/wizard/rpgtitles.dm @@ -43,7 +43,7 @@ GLOBAL_DATUM(rpgtitle_controller, /datum/rpgtitle_controller) //we must prepare for the mother of all strings new_crewmember.maptext_height = max(new_crewmember.maptext_height, 32) new_crewmember.maptext_width = max(new_crewmember.maptext_width, 112) - new_crewmember.maptext_x = -24 - new_crewmember.base_pixel_x + new_crewmember.maptext_x = -38 - new_crewmember.base_pixel_x new_crewmember.maptext_y = -32 //list of lists involving strings related to a biotype flag, their position in the list equal to the position they were defined as bitflags. diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 875de6a3a7b1..00ccc0a79397 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -943,7 +943,7 @@ else our_plant.embedding = EMBED_HARMLESS our_plant.updateEmbedding() - our_plant.throwforce = qp_sigmoid(1000, 100, our_seed.potency) + our_plant.throwforce = qp_sigmoid(1000, 50, our_seed.potency) /** * This trait automatically heats up the plant's chemical contents when harvested. diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 7db9fd4f7990..8fa5c7b0ad0e 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -545,7 +545,6 @@ var/gender = player_client.prefs.read_preference(/datum/preference/choiced/gender) real_name = species.random_name(gender, TRUE) dna.update_dna_identity() - dna.species.after_equip_job(job, src, FALSE, player_client.prefs) /mob/living/silicon/ai/apply_prefs_job(client/player_client, datum/job/job) if(GLOB.current_anonymous_theme) diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index e0fc2a15b426..25ffbab8dd85 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -51,7 +51,6 @@ access_list += ACCESS_MINISAT return access_list - /obj/effect/mapping_helpers/airlock/access/any/command/gateway/get_access() var/list/access_list = ..() access_list += ACCESS_GATEWAY @@ -278,13 +277,6 @@ access_list += list(ACCESS_SECURITY, ACCESS_MAINT_TUNNELS) return access_list -/// MONKESTATION EDIT BEGIN -/obj/effect/mapping_helpers/airlock/access/any/security/brig_physician/get_access() - var/list/access_list = ..() - access_list += ACCESS_BRIG_PHYSICIAN - return access_list -/// MONKESTATION EDIT END - // -------------------- Service access helpers /obj/effect/mapping_helpers/airlock/access/any/service icon_state = "access_helper_serv" @@ -746,12 +738,7 @@ access_list += ACCESS_HOS return access_list -/// MONKESTATION EDIT BEGIN -/obj/effect/mapping_helpers/airlock/access/all/security/brig_physician/get_access() - var/list/access_list = ..() - access_list += ACCESS_BRIG_PHYSICIAN - return access_list -/// MONKESTATION EDIT END + // -------------------- Service access helpers /obj/effect/mapping_helpers/airlock/access/all/service icon_state = "access_helper_serv" diff --git a/code/modules/mob/dead/new_player/sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories.dm index 1426e4648449..3c24f9001c0a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories.dm @@ -1789,8 +1789,17 @@ MONKESTATION EDIT palette_key = MUTANT_COLOR /datum/sprite_accessory/tails/monkey + +//Non-Modular change - Removes monkey tails, adds Simian tails instead. +/datum/sprite_accessory/tails/monkey/default name = "Monkey" - icon_state = "monkey" + icon = 'monkestation/icons/mob/species/monkey/monkey_tail.dmi' //Original: 'icons/mob/species/monkey/monkey_tail.dmi' + icon_state = "default" + color_src = MUTANT_COLOR //Original: FALSE + +/datum/sprite_accessory/tails/monkey/none + name = "None" + icon_state = "none" color_src = FALSE /datum/sprite_accessory/pod_hair diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index 38422a58979b..9559ce3f08fe 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -298,7 +298,7 @@ if(!LAZYLEN(part_overlays)) continue - damage_overlay ||= mutable_appearance(layer = -DAMAGE_LAYER) + damage_overlay = mutable_appearance(layer = -DAMAGE_LAYER, appearance_flags = KEEP_TOGETHER) damage_overlay.overlays += part_overlays if(isnull(damage_overlay)) @@ -452,7 +452,7 @@ var/old_key = icon_render_keys?[limb.body_zone] //Checks the mob's icon render key list for the bodypart icon_render_keys[limb.body_zone] = (limb.is_husked) ? limb.generate_husk_key().Join() : limb.generate_icon_key().Join() //Generates a key for the current bodypart - if(icon_render_keys[limb.body_zone] != old_key || get_top_offset() != last_top_offset) //If the keys match, that means the limb doesn't need to be redrawn + if(icon_render_keys[limb.body_zone] != old_key) //If the keys match, that means the limb doesn't need to be redrawn needs_update += limb var/list/missing_bodyparts = get_missing_limbs() @@ -469,15 +469,10 @@ for(var/obj/item/bodypart/limb as anything in bodyparts) if(limb in needs_update) var/bodypart_icon = limb.get_limb_icon() - if(!istype(limb, /obj/item/bodypart/leg)) - var/top_offset = get_top_offset() - for(var/image/image as anything in bodypart_icon) - image.pixel_y += top_offset new_limbs += bodypart_icon limb_icon_cache[icon_render_keys[limb.body_zone]] = bodypart_icon //Caches the icon with the bodypart key, as it is new else new_limbs += limb_icon_cache[icon_render_keys[limb.body_zone]] //Pulls existing sprites from the cache - last_top_offset = get_top_offset() remove_overlay(BODYPARTS_LAYER) @@ -491,19 +486,6 @@ apply_overlay(BODYPARTS_LAYER) -/// This looks at the chest and legs of the mob and decides how much our chest, arms, and head should be adjusted. This is useful for limbs that are larger or smaller than the scope of normal human height while keeping the feet anchored to the bottom of the tile -/mob/living/carbon/proc/get_top_offset() - var/from_chest - var/from_leg - for(var/obj/item/bodypart/leg/leg_checked in bodyparts) - if(leg_checked.top_offset > from_leg || isnull(from_leg)) // We find the tallest leg available - from_leg = leg_checked.top_offset - if(isnull(from_leg)) - from_leg = 0 // If we have no legs, we set this to zero to avoid any math issues that might stem from it being NULL - for(var/obj/item/bodypart/chest/chest_checked in bodyparts) // Take the height from the chest - from_chest = chest_checked.top_offset - return (from_chest + from_leg) // The total hight of the chest and legs together - ///////////////////////// // Limb Icon Cache 2.0 // ///////////////////////// diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 6d4d19f8acbb..eb5906326625 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -238,7 +238,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/maxhealthmod = 1 ///Path to BODYTYPE_CUSTOM species worn icons. An assoc list of ITEM_SLOT_X => /icon var/list/custom_worn_icons = list() - ///Override of the eyes icon file, used for Vox and maybe more in the future - The future is now, with Teshari using it too + ///Override of the eyes icon file, used for Monkeys. var/eyes_icon ///our color palette var/datum/color_palette/color_palette @@ -522,6 +522,7 @@ GLOBAL_LIST_EMPTY(features_by_species) C.bodytemp_cold_damage_limit = src.bodytemp_cold_damage_limit C.temperature_normalization_speed = src.temperature_normalization_speed C.temperature_homeostasis_speed = src.temperature_homeostasis_speed + C.butcher_results = knife_butcher_results?.Copy() C.physiology?.cold_mod *= coldmod C.physiology?.heat_mod *= heatmod @@ -621,12 +622,9 @@ GLOBAL_LIST_EMPTY(features_by_species) */ /datum/species/proc/handle_body(mob/living/carbon/human/species_human) species_human.remove_overlay(BODY_LAYER) - species_human.remove_overlay(FACE_LAYER) - var/height_offset = species_human.get_top_offset() // From high changed by varying limb height if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN)) return handle_mutant_bodyparts(species_human) var/list/standing = list() - var/list/standing_face = list() if(!HAS_TRAIT(species_human, TRAIT_HUSK)) var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) @@ -635,9 +633,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/organ/internal/eyes/eye_organ = species_human.get_organ_slot(ORGAN_SLOT_EYES) if(eye_organ) eye_organ.refresh(call_update = FALSE) - for(var/mutable_appearance/eye_overlay in eye_organ.generate_body_overlay(species_human)) - eye_overlay.pixel_y += height_offset - standing += eye_overlay + standing += eye_organ.generate_body_overlay(species_human) // organic body markings if(HAS_TRAIT(species_human, TRAIT_HAS_MARKINGS)) @@ -651,22 +647,18 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!HAS_TRAIT(species_human, TRAIT_HUSK)) if(noggin && (IS_ORGANIC_LIMB(noggin))) var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head", -BODY_LAYER) - markings_head_overlay.pixel_y += height_offset standing += markings_head_overlay if(chest && (IS_ORGANIC_LIMB(chest))) var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest", -BODY_LAYER) - markings_chest_overlay.pixel_y += height_offset standing += markings_chest_overlay if(right_arm && (IS_ORGANIC_LIMB(right_arm))) var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm", -BODY_LAYER) - markings_r_arm_overlay.pixel_y += height_offset standing += markings_r_arm_overlay if(left_arm && (IS_ORGANIC_LIMB(left_arm))) var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm", -BODY_LAYER) - markings_l_arm_overlay.pixel_y += height_offset standing += markings_l_arm_overlay if(right_leg && (IS_ORGANIC_LIMB(right_leg))) @@ -689,7 +681,6 @@ GLOBAL_LIST_EMPTY(features_by_species) underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) if(!underwear.use_static) underwear_overlay.color = species_human.underwear_color - underwear_overlay.pixel_y += height_offset standing += underwear_overlay if(species_human.undershirt) @@ -700,7 +691,6 @@ GLOBAL_LIST_EMPTY(features_by_species) working_shirt = wear_female_version(undershirt.icon_state, undershirt.icon, BODY_LAYER) else working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, -BODY_LAYER) - working_shirt.pixel_y += height_offset standing += working_shirt if(species_human.socks && species_human.num_legs >= 2 && !(src.bodytype & BODYTYPE_DIGITIGRADE)) @@ -714,17 +704,13 @@ GLOBAL_LIST_EMPTY(features_by_species) socks_overlay = mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) if(!socks.use_static) socks_overlay.color = species_human.socks_color - socks_overlay.pixel_y += height_offset standing += socks_overlay //MONKESTATION EDITS END if(standing.len) species_human.overlays_standing[BODY_LAYER] = standing - if(standing_face.len) - species_human.overlays_standing[FACE_LAYER] = standing_face species_human.apply_overlay(BODY_LAYER) - species_human.apply_overlay(FACE_LAYER) handle_mutant_bodyparts(species_human) /** @@ -784,7 +770,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!accessory || accessory.icon_state == "none") continue - var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) + var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer, appearance_flags = KEEP_TOGETHER) if(accessory.gender_specific) accessory_overlay.icon_state = "[g]_[bodypart]_[accessory.icon_state]_[layertext]" @@ -879,13 +865,17 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Proc that will randomize all the external organs (i.e. horns, frills, tails etc.) of a species' associated mob /datum/species/proc/randomize_external_organs(mob/living/carbon/human/human_mob) + var/static/list/organs_to_randomize = list() for(var/obj/item/organ/external/organ_path as anything in external_organs) - var/obj/item/organ/external/randomized_organ = human_mob.get_organ_by_type(organ_path) - if(randomized_organ) - var/datum/bodypart_overlay/mutant/overlay = randomized_organ.bodypart_overlay - var/new_look = pick(overlay.get_global_feature_list()) - human_mob.dna.features["[overlay.feature_key]"] = new_look - mutant_bodyparts["[overlay.feature_key]"] = new_look + var/overlay_path = initial(organ_path.bodypart_overlay) + var/datum/bodypart_overlay/mutant/sample_overlay = organs_to_randomize[overlay_path] + if(isnull(sample_overlay)) + sample_overlay = new overlay_path() + organs_to_randomize[overlay_path] = sample_overlay + + var/new_look = pick(sample_overlay.get_global_feature_list()) + human_mob.dna.features["[sample_overlay.feature_key]"] = new_look + mutant_bodyparts["[sample_overlay.feature_key]"] = new_look ///Proc that randomizes all the appearance elements (external organs, markings, hair etc.) of a species' associated mob. Function set by child procs /datum/species/proc/randomize_features(mob/living/carbon/human/human_mob) @@ -980,12 +970,6 @@ GLOBAL_LIST_EMPTY(features_by_species) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_ICLOTHING) - var/obj/item/bodypart/chest = H.get_bodypart(BODY_ZONE_CHEST) - if(chest && (chest.bodytype & BODYTYPE_MONKEY)) - if(!(I.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) - if(!disable_warning) - to_chat(H, span_warning("[I] doesn't fit your [chest.name]!")) - return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) if(ITEM_SLOT_ID) var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) @@ -1062,10 +1046,6 @@ GLOBAL_LIST_EMPTY(features_by_species) H.visible_message(span_notice("[H] start putting on [I]..."), span_notice("You start putting on [I]...")) return do_after(H, I.equip_delay_self, target = H) - -/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/human_host, client/preference_source = null) - human_host.update_mutant_bodyparts() - /// Equips the necessary species-relevant gear before putting on the rest of the uniform. /datum/species/proc/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) return diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index dbf438919b50..226ed70caaa6 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -22,6 +22,19 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) harvest_organs() return ..() +// To speed up the preference menu, we apply 1 filter to the entire mob +/mob/living/carbon/human/dummy/regenerate_icons() + . = ..() + apply_height_filters(src, only_apply_in_prefs = TRUE) + +/mob/living/carbon/human/dummy/apply_height_filters(image/appearance, only_apply_in_prefs = FALSE) + if(only_apply_in_prefs) + return ..() + +// Not necessary with above +/mob/living/carbon/human/dummy/apply_height_offsets(image/appearance, upper_torso) + return + ///Let's extract our dummies organs and limbs for storage, to reduce the cache missed that spamming a dummy cause /mob/living/carbon/human/dummy/proc/harvest_organs() for(var/slot in list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_APPENDIX, \ @@ -82,17 +95,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/log_mob_tag(text) return - -/mob/living/carbon/human/dummy/apply_height_filters(image/appearance, only_apply_in_prefs = FALSE) - if(QDELETED(src)) - return - if(only_apply_in_prefs) - return ..() - -// Not necessary with above -/mob/living/carbon/human/dummy/apply_height_offsets(image/appearance, upper_torso) - return - /proc/create_consistent_human_dna(mob/living/carbon/human/target) target.dna.initialize_dna(/datum/blood_type/crew/human/o_plus, skip_index = TRUE) target.dna.features["body_markings"] = "None" @@ -106,8 +108,9 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["spines"] = "None" target.dna.features["tail_cat"] = "None" target.dna.features["tail_lizard"] = "Smooth" - target.dna.features["tail_monkey"] = "Chimp" //Monkestation Addition + target.dna.features["tail_monkey"] = "Monkey" target.dna.features["pod_hair"] = "Ivy" + target.dna.features["fur"] = COLOR_MONKEY_BROWN //Monkestation Addition target.dna.features["ethereal_horns"] = "None" //Monkestation Addition target.dna.features["ethereal_tail"] = "None" //Monkestation Addition target.dna.features["ipc_screen"] = "BSOD" //Monkestation Addition diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 423d1b817c38..2545c3591066 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -729,6 +729,10 @@ /mob/living/carbon/human/vv_edit_var(var_name, var_value) if(var_name == NAMEOF(src, mob_height)) + var/static/list/monkey_heights = list( + MONKEY_HEIGHT_DWARF, + MONKEY_HEIGHT_MEDIUM, + ) var/static/list/heights = list( HUMAN_HEIGHT_SHORTEST, HUMAN_HEIGHT_SHORT, @@ -736,7 +740,10 @@ HUMAN_HEIGHT_TALL, HUMAN_HEIGHT_TALLEST ) - if(!(var_value in heights)) + if(ismonkey(src)) + if(!(var_value in monkey_heights)) + return + else if(!(var_value in heights)) return . = set_mob_height(var_value) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index df3f8a716b7e..9bb8f9404999 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -263,13 +263,13 @@ /mob/living/carbon/human/proc/set_mob_height(new_height) if(mob_height == new_height) return FALSE - if(new_height == HUMAN_HEIGHT_DWARF) - CRASH("Don't set height to dwarf height directly, use dwarf trait") + if(new_height == HUMAN_HEIGHT_DWARF || new_height == MONKEY_HEIGHT_DWARF) + CRASH("Don't set height to dwarf height directly, use dwarf trait instead.") + if(new_height == MONKEY_HEIGHT_MEDIUM) + CRASH("Don't set height to monkey height directly, use monkified gene/species instead.") mob_height = new_height regenerate_icons() - if(isdummy(src)) - apply_height_filters(src, TRUE) return TRUE /** @@ -281,6 +281,12 @@ */ /mob/living/carbon/human/proc/get_mob_height() if(HAS_TRAIT(src, TRAIT_DWARF)) - return HUMAN_HEIGHT_DWARF + if(ismonkey(src)) + return MONKEY_HEIGHT_DWARF + else + return HUMAN_HEIGHT_DWARF + + else if(ismonkey(src)) + return MONKEY_HEIGHT_MEDIUM return mob_height diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index c3ee8c1eda32..99f14a6a96ea 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -102,18 +102,13 @@ There are several things that need to be remembered: var/icon_file var/woman //BEGIN SPECIES HANDLING - if((dna?.species.bodytype & BODYTYPE_MONKEY) && (uniform.supports_variations_flags & CLOTHING_MONKEY_VARIATION)) - icon_file = MONKEY_UNIFORM_FILE - else if((dna?.species.bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) + if((dna?.species.bodytype & BODYTYPE_DIGITIGRADE) && (uniform.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) icon_file = uniform.worn_icon_digitigrade || DIGITIGRADE_UNIFORM_FILE if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(uniform)))) //if the digitigrade icon doesn't exist var/species_icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, uniform) if(species_icon_file) icon_file = species_icon_file //Female sprites have lower priority than digitigrade sprites - else if(dna.species.bodytype & BODYTYPE_CUSTOM) - icon_file = dna.species.generate_custom_worn_icon(LOADOUT_ITEM_UNIFORM, w_uniform) - else if(dna.species.visual_gender & dna.species.sexes && (dna.species.bodytype & BODYTYPE_HUMANOID) && physique == FEMALE && !(uniform.female_sprite_flags & NO_FEMALE_UNIFORM)) //Agggggggghhhhh woman = TRUE @@ -801,9 +796,6 @@ generate/load female uniform sprites matching all previously decided variables .[2] = offsets["y"] else .[2] = worn_y_offset - if(ishuman(loc) && slot_flags != ITEM_SLOT_FEET) /// we adjust the human body for high given by body parts, execpt shoes, because they are always on the bottom - var/mob/living/carbon/human/human_holder = loc - .[2] += human_holder.get_top_offset() //Can't think of a better way to do this, sadly /mob/proc/get_item_offsets_for_index(i) @@ -835,7 +827,7 @@ generate/load female uniform sprites matching all previously decided variables if(!dna?.species) return - var/obj/item/bodypart/HD = get_bodypart("head") + var/obj/item/bodypart/HD = get_bodypart(BODY_ZONE_HEAD) if(!istype(HD)) return @@ -850,7 +842,7 @@ generate/load female uniform sprites matching all previously decided variables if(HD && !(HAS_TRAIT(src, TRAIT_HUSK))) // lipstick if(lip_style && (LIPS in dna.species.species_traits)) - var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -FACE_LAYER) + var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) lip_overlay.color = lip_color if(OFFSET_FACE in dna.species.offset_features) lip_overlay.pixel_x += dna.species.offset_features[OFFSET_FACE][1] @@ -863,7 +855,7 @@ generate/load female uniform sprites matching all previously decided variables if(parent_eyes) add_overlay(parent_eyes.generate_body_overlay(src)) else - var/mutable_appearance/missing_eyes = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -FACE_LAYER) + var/mutable_appearance/missing_eyes = mutable_appearance('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER) if(OFFSET_FACE in dna.species.offset_features) missing_eyes.pixel_x += dna.species.offset_features[OFFSET_FACE][1] missing_eyes.pixel_y += dna.species.offset_features[OFFSET_FACE][2] @@ -921,7 +913,7 @@ generate/load female uniform sprites matching all previously decided variables /** * Applies a filter to an appearance according to mob height */ -/mob/living/carbon/human/proc/apply_height_filters(image/appearance) +/mob/living/carbon/human/proc/apply_height_filters(image/appearance, only_apply_in_prefs = FALSE) var/static/icon/cut_torso_mask = icon('icons/effects/cut.dmi', "Cut1") var/static/icon/cut_legs_mask = icon('icons/effects/cut.dmi', "Cut2") var/static/icon/lenghten_torso_mask = icon('icons/effects/cut.dmi', "Cut3") @@ -934,23 +926,97 @@ generate/load female uniform sprites matching all previously decided variables "Lenghten_Torso", "Gnome_Cut_Torso", "Gnome_Cut_Legs", + "Monkey_Torso", + "Monkey_Legs", + "Monkey_Gnome_Cut_Torso", + "Monkey_Gnome_Cut_Legs", )) switch(get_mob_height()) // Don't set this one directly, use TRAIT_DWARF + if(MONKEY_HEIGHT_DWARF) + appearance.add_filters(list( + list( + "name" = "Monkey_Gnome_Cut_Torso", + "priority" = 1, + "params" = displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 3), + ), + list( + "name" = "Monkey_Gnome_Cut_Legs", + "priority" = 1, + "params" = displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 4), + ), + )) + if(MONKEY_HEIGHT_MEDIUM) + appearance.add_filters(list( + list( + "name" = "Monkey_Torso", + "priority" = 1, + "params" = displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 2), + ), + list( + "name" = "Monkey_Legs", + "priority" = 1, + "params" = displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 4), + ), + )) + // Don't set this one directly, use TRAIT_DWARF if(HUMAN_HEIGHT_DWARF) - appearance.add_filter("Gnome_Cut_Torso", 1, displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 2)) - appearance.add_filter("Gnome_Cut_Legs", 1, displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 3)) + appearance.add_filters(list( + list( + "name" = "Gnome_Cut_Torso", + "priority" = 1, + "params" = displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 2), + ), + list( + "name" = "Gnome_Cut_Legs", + "priority" = 1, + "params" = displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 3), + ), + )) if(HUMAN_HEIGHT_SHORTEST) - appearance.add_filter("Cut_Torso", 1, displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 1)) - appearance.add_filter("Cut_Legs", 1, displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 1)) + appearance.add_filters(list( + list( + "name" = "Cut_Torso", + "priority" = 1, + "params" = displacement_map_filter(cut_torso_mask, x = 0, y = 0, size = 1), + ), + list( + "name" = "Cut_Legs", + "priority" = 1, + "params" = displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 1), + ), + )) if(HUMAN_HEIGHT_SHORT) appearance.add_filter("Cut_Legs", 1, displacement_map_filter(cut_legs_mask, x = 0, y = 0, size = 1)) if(HUMAN_HEIGHT_TALL) appearance.add_filter("Lenghten_Legs", 1, displacement_map_filter(lenghten_legs_mask, x = 0, y = 0, size = 1)) + if(HUMAN_HEIGHT_TALLER) + appearance.add_filters(list( + list( + "name" = "Lenghten_Torso", + "priority" = 1, + "params" = displacement_map_filter(lenghten_torso_mask, x = 0, y = 0, size = 1), + ), + list( + "name" = "Lenghten_Legs", + "priority" = 1, + "params" = displacement_map_filter(lenghten_legs_mask, x = 0, y = 0, size = 1), + ), + )) if(HUMAN_HEIGHT_TALLEST) - appearance.add_filter("Lenghten_Torso", 1, displacement_map_filter(lenghten_torso_mask, x = 0, y = 0, size = 1)) - appearance.add_filter("Lenghten_Legs", 1, displacement_map_filter(lenghten_legs_mask, x = 0, y = 0, size = 1)) + appearance.add_filters(list( + list( + "name" = "Lenghten_Torso", + "priority" = 1, + "params" = displacement_map_filter(lenghten_torso_mask, x = 0, y = 0, size = 1), + ), + list( + "name" = "Lenghten_Legs", + "priority" = 1, + "params" = displacement_map_filter(lenghten_legs_mask, x = 0, y = 0, size = 2), + ), + )) // Kinda gross but because many humans overlays do not use KEEP_TOGETHER we need to manually propogate the filter // Otherwise overlays, such as worn overlays on icons, won't have the filter "applied", and the effect kinda breaks diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm index 50a9748c778d..6fa430037329 100644 --- a/code/modules/mob/living/carbon/human/init_signals.dm +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -19,9 +19,12 @@ // We need to regenerate everything for height regenerate_icons() - if(isdummy(src)) - apply_height_filters(src, TRUE) - // No more passtable for you, bub +/* //Non-Modular change - Remove passtable from dwarves. + if(HAS_TRAIT(src, TRAIT_DWARF)) + passtable_on(src, TRAIT_DWARF) + else + passtable_off(src, TRAIT_DWARF) +*/ /mob/living/carbon/human/proc/on_gain_giant_trait(datum/source) SIGNAL_HANDLER @@ -31,6 +34,8 @@ /mob/living/carbon/human/proc/on_lose_giant_trait(datum/source) SIGNAL_HANDLER - //We're leaving the size traits permanent until someone wants to separate the mutation from customization aspects - //src.update_transform(0.8) - //src.visible_message(span_danger("[src] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) + + if(HAS_TRAIT(src, TRAIT_GIANT)) //They have the trait through another source, cancel out. + return + src.update_transform(0.8) + src.visible_message(span_danger("[src] suddenly shrinks!"), span_notice("Everything around you seems to grow..")) diff --git a/code/modules/mob/living/carbon/human/species_types/abominations.dm b/code/modules/mob/living/carbon/human/species_types/abominations.dm deleted file mode 100644 index a308f5c962e8..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/abominations.dm +++ /dev/null @@ -1,43 +0,0 @@ -/// These won't appear normally in games, they are meant to for debuging the adjustment of limbs based on the height of a humans bodyparts. -/datum/species/human/tallboy - name = "\improper Tall Boy" - id = SPECIES_TALLBOY - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, - BODY_ZONE_HEAD = /obj/item/bodypart/head, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/tallboy, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/tallboy, - BODY_ZONE_CHEST = /obj/item/bodypart/chest, - ) - -/datum/species/monkey/human_legged - id = SPECIES_MONKEY_HUMAN_LEGGED - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey, - BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/monkey, - ) - -/datum/species/monkey/monkey_freak - id = SPECIES_MONKEY_FREAK - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right, - BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/monkey, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/monkey, - BODY_ZONE_CHEST = /obj/item/bodypart/chest, - ) - -/mob/living/carbon/human/species/monkey/humand_legged - race = /datum/species/monkey/human_legged - -/mob/living/carbon/human/species/monkey/monkey_freak - race = /datum/species/monkey/monkey_freak - -/mob/living/carbon/human/species/tallboy - race = /datum/species/human/tallboy diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9140e6d16d87..310ab1749b11 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -69,7 +69,6 @@ return randname - /datum/species/lizard/randomize_features(mob/living/carbon/human/human_mob) human_mob.dna.features["body_markings"] = pick(GLOB.body_markings_list) randomize_external_organs(human_mob) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 4cf01b8a4d79..06a09aadf3d9 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -5,7 +5,7 @@ id = SPECIES_MONKEY bodytype = BODYTYPE_ORGANIC | BODYTYPE_MONKEY external_organs = list( - /obj/item/organ/external/tail/simian = "Chimp" + /obj/item/organ/external/tail/monkey = "Monkey", ) mutanttongue = /obj/item/organ/internal/tongue/monkey mutantbrain = /obj/item/organ/internal/brain/primate @@ -20,6 +20,9 @@ TRAIT_GUN_NATURAL, TRAIT_VENTCRAWLER_NUDE, TRAIT_WEAK_SOUL, + //Non-Modular change: Gives Monkeys fur colors. + TRAIT_MUTANT_COLORS, + TRAIT_FUR_COLORS, ) no_equip_flags = ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_SUITSTORE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT @@ -41,26 +44,38 @@ payday_modifier = 1.5 ai_controlled_species = TRUE + // NON-MODULAR CHANGES BELOW + //Makes hats appear 1 pixel above so the eyes are still visible, and brings belt items down 1 pixel so they fit on the chest. + offset_features = list( + OFFSET_HEAD = list(0,1), + OFFSET_BELT = list(0,-1), + ) + //Default eyes have the side portrait icons on the wrong side, this fixes that. + eyes_icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + ///Whether or not this monkey gets the innate effects of running over tables and the gene activated, used to exclude subtypes from getting it. + ///The reason we block the gene's activation is so you can't "deconvert" from being a monkey subtype. + var/give_monkey_species_effects = TRUE /datum/species/monkey/random_name(gender,unique,lastname) var/randname = "monkey ([rand(1,999)])" - return randname -/datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species) +/datum/species/monkey/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) . = ..() - H.pass_flags |= PASSTABLE - H.butcher_results = knife_butcher_results - H.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) - H.dna.activate_mutation(/datum/mutation/human/race) - + if(give_monkey_species_effects) + passtable_on(human_who_gained_species, SPECIES_TRAIT) + human_who_gained_species.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) + human_who_gained_species.dna.activate_mutation(/datum/mutation/human/race) -/datum/species/monkey/on_species_loss(mob/living/carbon/C) +/datum/species/monkey/on_species_loss(mob/living/carbon/human/C) . = ..() - C.pass_flags = initial(C.pass_flags) - C.butcher_results = null - C.dna.remove_mutation(/datum/mutation/human/race) + if(give_monkey_species_effects) + passtable_off(C, SPECIES_TRAIT) + C.dna.remove_mutation(/datum/mutation/human/race) + +/datum/species/monkey/randomize_features(mob/living/carbon/human/human_mob) + randomize_external_organs(human_mob) /datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target, modifiers) // If our hands are not blocked, dont try to bite them @@ -71,10 +86,9 @@ return TRUE return ..() - // this shouldn't even be possible, but I'm sure the check was here for a reason - if(!iscarbon(target)) - stack_trace("HEY LISTEN! We are performing a species spec_unarmed attack with a non-carbon user. How did you fuck this up?") - return TRUE + // calls parent if it's not attacking a mob, used for places like opening inventory while in crit. + if(!isliving(target)) + return ..() var/mob/living/carbon/victim = target if(user.is_muzzled()) return TRUE // cannot bite them if we're muzzled @@ -122,7 +136,8 @@ return TRUE /datum/species/monkey/check_roundstart_eligible() - if(check_holidays(MONKEYDAY)) + // Check ID specifically so all subtypes aren't eligible on Monkey day. + if(check_holidays(MONKEYDAY) && id == SPECIES_MONKEY) return TRUE return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 26b7f81597ec..9b0fe7b38226 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -120,11 +120,23 @@ /datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() - C.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie) + C.AddComponent(/datum/component/mutant_hands, mutant_hand_path = hand_path) //monkestation edit: replaces the original mutant_hand_path with hand_path +//monkestation edit start + for(var/datum/action/granted_action as anything in granted_action_types) + granted_action = new granted_action + granted_action.Grant(C) + granted_actions += granted_action +//monkestation edit end /datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() qdel(C.GetComponent(/datum/component/mutant_hands)) +//monkestation edit start + for(var/datum/action/removed_action in granted_actions) + granted_actions -= removed_action + removed_action.Remove(C) + qdel(removed_action) +//monkestation edit end /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index e5f43d825981..bc6d946ca869 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -54,6 +54,8 @@ // Start of a breath chain, calls [carbon/proc/breathe()] /mob/living/carbon/handle_breathing(seconds_per_tick, times_fired) if(HAS_TRAIT(src, TRAIT_NOBREATH)) + setOxyLoss(0) //idk how because spec life should cover this + losebreath = 0 return var/next_breath = 4 diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index e6f71314e762..68bc4710d0cb 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -811,6 +811,11 @@ /obj/item/extinguisher/mini, /obj/item/hand_labeler/borg, /obj/item/razor, + // Monkestation edit start: Barbering + /obj/item/scissors, + /obj/item/hairbrush/comb, + /obj/item/dyespray, + // Monestation edit end /obj/item/rsf, /obj/item/instrument/guitar, /obj/item/instrument/piano_synth/robot, diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 37360e77d7a4..a518870258e1 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -33,10 +33,10 @@ invisibility = 0 set_species(/datum/species/monkey) name = "monkey" + regenerate_icons() set_name() SEND_SIGNAL(src, COMSIG_HUMAN_MONKEYIZE) uncuff() - regenerate_icons() return src ////////////////////////// Humanize ////////////////////////////// diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 711ec369f9ce..9560738ecafd 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -303,6 +303,9 @@ starting_programs = list( /datum/computer_file/program/filemanager, /datum/computer_file/program/robotact, + /datum/computer_file/program/borg_monitor, + /datum/computer_file/program/atmosscan, + /datum/computer_file/program/crew_manifest, ) /obj/item/modular_computer/pda/silicon/Initialize(mapload) diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index c4509b917c70..f1d08dddcd5b 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -16,7 +16,7 @@ /obj/item/ammo_box/magazine/internal/cylinder/proc/rotate() var/b = stored_ammo[1] stored_ammo.Cut(1,2) - stored_ammo.Insert(0, b) + stored_ammo.Add(b) /obj/item/ammo_box/magazine/internal/cylinder/proc/spin() for(var/i in 1 to rand(0, max_ammo*2)) diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index 2c5cd137facc..8ea414e8d8b6 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -9,7 +9,7 @@ name = "condiment bottle" desc = "Just your average condiment bottle." icon = 'icons/obj/food/containers.dmi' - icon_state = "bottle" + icon_state = "generic_condiment" // monkestation edit: ew should just be a generic bottle. inhand_icon_state = "beer" //Generic held-item sprite until unique ones are made. lefthand_file = 'icons/mob/inhands/items/drinks_lefthand.dmi' righthand_file = 'icons/mob/inhands/items/drinks_righthand.dmi' @@ -66,7 +66,7 @@ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) return TRUE -/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user , proximity) +/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user, proximity, params) . = ..() if(!proximity) return @@ -95,6 +95,18 @@ var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) to_chat(user, span_notice("You transfer [trans] units of the condiment to [target].")) + var/datum/reagent/main_reagent = reagents.get_master_reagent_id() + var/condiment_overlay = initial(main_reagent.condiment_overlay) + var/overlay_colored = initial(main_reagent.overlay_colored) + if(condiment_overlay && istype (target, /obj/item/food)) + var/list/params_list = params2list(params) + var/image/I = image('monkestation/code/modules/brewin_and_chewin/icons/condiment_overlays.dmi', target, condiment_overlay) + I.pixel_x = clamp(text2num(params_list["icon-x"]) - world.icon_size/2 - pixel_x,-world.icon_size/2,world.icon_size/2) + I.pixel_y = clamp(text2num(params_list["icon-y"]) - world.icon_size/2 - pixel_y,-world.icon_size/2,world.icon_size/2) + if (overlay_colored) + I.color = mix_color_from_reagents(reagents.reagent_list) + target.overlays += I + /obj/item/reagent_containers/condiment/enzyme name = "universal enzyme" desc = "Used in cooking various dishes." @@ -445,7 +457,7 @@ /obj/item/reagent_containers/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly. return -/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity) +/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity, params) if(!proximity) return . |= AFTERATTACK_PROCESSED_ITEM @@ -461,6 +473,17 @@ return else to_chat(user, span_notice("You tear open [src] above [target] and the condiments drip onto it.")) + var/datum/reagent/main_reagent = reagents.get_master_reagent_id() + var/condiment_overlay = initial(main_reagent.condiment_overlay) + var/overlay_colored = initial(main_reagent.overlay_colored) + if(condiment_overlay && istype (target, /obj/item/food)) + var/list/params_list = params2list(params) + var/image/I = image('monkestation/code/modules/brewin_and_chewin/icons/condiment_overlays.dmi', target, condiment_overlay) + I.pixel_x = clamp(text2num(params_list["icon-x"]) - world.icon_size/2 - pixel_x,-world.icon_size/2,world.icon_size/2) + I.pixel_y = clamp(text2num(params_list["icon-y"]) - world.icon_size/2 - pixel_y,-world.icon_size/2,world.icon_size/2) + if (overlay_colored) + I.color = mix_color_from_reagents(reagents.reagent_list) + target.overlays += I src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) qdel(src) return diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 916e8bf0467b..ef1b850f3a52 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -122,7 +122,7 @@ id = "monkeytail" build_type = LIMBGROWER reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) - build_path = /obj/item/organ/external/tail/simian + build_path = /obj/item/organ/external/tail/monkey category = list(RND_CATEGORY_LIMBS_OTHER, RND_CATEGORY_INITIAL) /datum/design/cat_tail diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 423a7232a98e..abf150085817 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -39,6 +39,7 @@ "coffee_cartridge", "coffeemaker", "coffeepot", + "comb", //monkestation edit "condenser", "conveyor_belt", "conveyor_switch", @@ -48,6 +49,7 @@ "desttagger", "doppler_array", "drinking_glass", + "dyespray", //monkestation edit "earmuffs", "electropack", "experi_scanner", @@ -59,7 +61,9 @@ "fluid_ducts", "foam_dart", "fork", + "fur_dyer", //monkestation edit "gas_filter", + "hairbrush", //monkestation edit "handcuffs_s", "handlabel", "health_sensor", @@ -101,6 +105,7 @@ "rglass", "roll", "rollerbed", + "scissors", //monkestation edit "sec_38", "sec_beanbag_slug", "sec_dart", @@ -1421,6 +1426,7 @@ "ci-reviver", "ci-surgery", "ci-toolset", + "ci-sprinter", //monkestation edit: ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index c93bd1bfa152..9e0a9e31bd6a 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -60,6 +60,20 @@ else QDEL_NULL(my_port) +/obj/machinery/computer/camera_advanced/shuttle_docker/vv_edit_var(vname, vval) + . = ..() + if(vname in list(NAMEOF(src, view_range), NAMEOF(src, x_offset), NAMEOF(src, y_offset), NAMEOF(src, see_hidden))) + refresh_eye() + +/// Destroys the eyeobj of this console, safely refreshing it if the console is currently being used. +/obj/machinery/computer/camera_advanced/shuttle_docker/proc/refresh_eye() + var/mob/living/user = current_user + if(user) + remove_eye_control(user) + QDEL_NULL(eyeobj) + if(user) + attack_hand(user) + /// "Initializes" any default port ids we have, done so add_jumpable_port can be a proper setter /obj/machinery/computer/camera_advanced/shuttle_docker/proc/set_init_ports() var/list/init_ports = jump_to_ports.Copy() diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 8a283eb66f03..91cf1def26f4 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -178,8 +178,6 @@ var/unarmed_damage_high = 1 ///Damage at which attacks from this bodypart will stun var/unarmed_stun_threshold = 2 - /// How many pixels this bodypart will offset the top half of the mob, used for abnormally sized torsos and legs - var/top_offset = 0 /// Traits that are given to the holder of the part. If you want an effect that changes this, don't add directly to this. Use the add_bodypart_trait() proc var/list/bodypart_traits = list() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 211c3f0369d5..82acff89d84c 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -215,7 +215,7 @@ // lipstick if(lip_style && (head_flags & HEAD_LIPS)) - var/image/lips_overlay = image('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -FACE_LAYER, SOUTH) + var/image/lips_overlay = image('icons/mob/species/human/human_face.dmi', "lips_[lip_style]", -BODY_LAYER, SOUTH) lips_overlay.color = lip_color . += lips_overlay @@ -244,8 +244,9 @@ // eyes // This is a bit of copy/paste code from eyes.dm:generate_body_overlay if(eyes?.eye_icon_state && (head_flags & HEAD_EYESPRITES)) - var/image/eye_left = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_l", -FACE_LAYER, SOUTH) - var/image/eye_right = image('icons/mob/species/human/human_face.dmi', "[eyes.eye_icon_state]_r", -FACE_LAYER, SOUTH) + var/eye_icon = owner?.dna?.species.eyes_icon || 'icons/mob/species/human/human_face.dmi' //Non-Modular change - Gives modular eye icons for certain species. + var/image/eye_left = image(eye_icon, "[eyes.eye_icon_state]_l", -BODY_LAYER, SOUTH) + var/image/eye_right = image(eye_icon, "[eyes.eye_icon_state]_r", -BODY_LAYER, SOUTH) if(head_flags & HEAD_EYECOLOR) if(eyes.eye_color_left) eye_left.color = eyes.eye_color_left @@ -340,6 +341,7 @@ /obj/item/bodypart/head/GetVoice() return "The head of [real_name]" +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/head/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' @@ -352,6 +354,7 @@ dmg_overlay_type = SPECIES_MONKEY is_dimorphic = FALSE head_flags = HEAD_LIPS|HEAD_DEBRAIN +*/ /obj/item/bodypart/head/alien icon = 'icons/mob/species/alien/bodyparts.dmi' diff --git a/code/modules/surgery/bodyparts/head_hair_and_lips.dm b/code/modules/surgery/bodyparts/head_hair_and_lips.dm index 1e3f2078ca46..670462bdac8c 100644 --- a/code/modules/surgery/bodyparts/head_hair_and_lips.dm +++ b/code/modules/surgery/bodyparts/head_hair_and_lips.dm @@ -8,16 +8,6 @@ var/mob/living/carbon/human/human_head_owner = owner var/datum/species/owner_species = human_head_owner.dna.species - var/offset = 0 - if(!istype(owner, /mob/living/carbon/human/dummy)) - switch(human_head_owner.get_mob_height()) - if(HUMAN_HEIGHT_DWARF) - offset = -2 - if(HUMAN_HEIGHT_SHORTEST) - offset = -1 - if(HUMAN_HEIGHT_SHORT) - offset = 0 - //HIDDEN CHECKS START hair_hidden = FALSE facial_hair_hidden = FALSE @@ -85,7 +75,6 @@ //Overlay facial_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER) facial_overlay.alpha = facial_hair_alpha - facial_overlay.pixel_y = offset //Gradients facial_hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_FACIAL_HAIR_KEY) if(facial_hair_gradient_style) @@ -100,7 +89,6 @@ //Overlay hair_overlay = mutable_appearance(sprite_accessory.icon, sprite_accessory.icon_state, -HAIR_LAYER) hair_overlay.alpha = hair_alpha - //hair_overlay.pixel_y = offset //Gradients hair_gradient_style = LAZYACCESS(human_head_owner.grad_style, GRADIENT_HAIR_KEY) if(hair_gradient_style) diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 2b9d1bd5c96e..5897211627f2 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -188,19 +188,3 @@ . = "#fff4e6" if("orange") . = "#ffc905" - - ///simian tones - if("ffffff") - . = "#ffffff" - if("ffb089") - . = "#ffb089" - if("aeafb3") - . = "#aeafb3" - if("bfd0ca") - . = "#bfd0ca" - if("ce7d54") - . = "#ce7d54" - if("c47373") - . = "#c47373" - if("f4e2d5") - . = "#f4e2d5" diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index bfcbb0b7062a..8be15308a23e 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -35,12 +35,12 @@ cavity_item = null return ..() +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/chest/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' husk_type = "monkey" - top_offset = -5 icon_state = "default_monkey_chest" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE @@ -49,6 +49,7 @@ bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC acceptable_bodytype = BODYTYPE_MONKEY dmg_overlay_type = SPECIES_MONKEY +*/ /obj/item/bodypart/chest/alien icon = 'icons/mob/species/alien/bodyparts.dmi' @@ -74,6 +75,7 @@ bodytype = BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_ORGANIC acceptable_bodytype = BODYTYPE_LARVA_PLACEHOLDER +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/arm/left/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' @@ -90,6 +92,7 @@ unarmed_damage_low = 2 /// monkey punches must be really weak, considering they bite people instead and their bites are weak as hell. unarmed_damage_high = 2 unarmed_stun_threshold = 3 +*/ /obj/item/bodypart/arm/left/alien icon = 'icons/mob/species/alien/bodyparts.dmi' @@ -104,7 +107,7 @@ max_damage = 100 should_draw_greyscale = FALSE - +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/arm/right/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' @@ -121,6 +124,7 @@ unarmed_damage_low = 2 unarmed_damage_high = 2 unarmed_stun_threshold = 3 +*/ /obj/item/bodypart/arm/right/alien icon = 'icons/mob/species/alien/bodyparts.dmi' @@ -230,12 +234,12 @@ else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/leg/left/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' husk_type = "monkey" - top_offset = -3 icon_state = "default_monkey_l_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE @@ -247,6 +251,7 @@ unarmed_damage_high = 3 unarmed_stun_threshold = 4 footprint_sprite = FOOTPRINT_SPRITE_PAWS +*/ /obj/item/bodypart/leg/left/alien icon = 'icons/mob/species/alien/bodyparts.dmi' @@ -325,12 +330,12 @@ else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) +/* //Non-Modular change: Removes Monkey bodyparts, moved to monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm /obj/item/bodypart/leg/right/monkey icon = 'icons/mob/species/monkey/bodyparts.dmi' icon_static = 'icons/mob/species/monkey/bodyparts.dmi' icon_husk = 'icons/mob/species/monkey/bodyparts.dmi' husk_type = "monkey" - top_offset = -3 icon_state = "default_monkey_r_leg" limb_id = SPECIES_MONKEY should_draw_greyscale = FALSE @@ -342,6 +347,7 @@ unarmed_damage_high = 3 unarmed_stun_threshold = 4 footprint_sprite = FOOTPRINT_SPRITE_PAWS +*/ /obj/item/bodypart/leg/right/alien icon = 'icons/mob/species/alien/bodyparts.dmi' @@ -355,15 +361,3 @@ can_be_disabled = FALSE max_damage = 100 should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/right/tallboy - limb_id = SPECIES_TALLBOY - top_offset = 23 - unarmed_damage_low = 40 - unarmed_damage_low = 40 - -/obj/item/bodypart/leg/left/tallboy - limb_id = SPECIES_TALLBOY - top_offset = 23 - unarmed_damage_low = 40 - unarmed_damage_low = 40 diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 187c2f90d82a..b6b10b0447c5 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -81,10 +81,10 @@ var/wagging = FALSE /datum/bodypart_overlay/mutant/tail/get_base_icon_state() - return (wagging ? "wagging_" : "") + sprite_datum.icon_state //add the wagging tag if we be wagging + return "[wagging ? "wagging_" : ""][sprite_datum.icon_state]" //add the wagging tag if we be wagging /datum/bodypart_overlay/mutant/tail/get_global_feature_list() - return GLOB.tails_list + return GLOB.tails_list_human /datum/bodypart_overlay/mutant/tail/can_draw_on_bodypart(mob/living/carbon/human/human) if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) @@ -108,13 +108,19 @@ return GLOB.tails_list_human /obj/item/organ/external/tail/monkey + name = "monkey tail" + preference = "feature_monkey_tail" bodypart_overlay = /datum/bodypart_overlay/mutant/tail/monkey + dna_block = null + ///Monkey tail bodypart overlay /datum/bodypart_overlay/mutant/tail/monkey - color_source = NONE feature_key = "tail_monkey" +/datum/bodypart_overlay/mutant/tail/monkey/get_global_feature_list() + return GLOB.tails_list_monkey + /obj/item/organ/external/tail/lizard name = "lizard tail" desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 016e76320210..589f3d0051da 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -146,10 +146,10 @@ if(!istype(parent) || parent.get_organ_by_type(/obj/item/organ/internal/eyes) != src) CRASH("Generating a body overlay for [src] targeting an invalid parent '[parent]'.") - var/eye_icon = parent.dna?.species.eyes_icon || 'icons/mob/species/human/human_face.dmi' + var/eye_icon = parent.dna?.species.eyes_icon || 'icons/mob/species/human/human_face.dmi' //Non-Modular change - Gives modular eye icons for certain species. - var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -FACE_LAYER) - var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -FACE_LAYER) + var/mutable_appearance/eye_left = mutable_appearance(eye_icon, "[eye_icon_state]_l", -BODY_LAYER) + var/mutable_appearance/eye_right = mutable_appearance(eye_icon, "[eye_icon_state]_r", -BODY_LAYER) var/list/overlays = list(eye_left, eye_right) var/obj/item/bodypart/head/my_head = parent.get_bodypart(BODY_ZONE_HEAD) @@ -688,7 +688,6 @@ flash_protect = FLASH_PROTECTION_SENSITIVE overlay_ignore_lighting = TRUE - /obj/item/organ/internal/eyes/lizard name = "lizard eyes" desc = "These eyes seem to glow." diff --git a/code/modules/unit_tests/limbsanity.dm b/code/modules/unit_tests/limbsanity.dm index a92d481f556a..6efec37ab76d 100644 --- a/code/modules/unit_tests/limbsanity.dm +++ b/code/modules/unit_tests/limbsanity.dm @@ -10,29 +10,3 @@ TEST_FAIL("[path] does not have a valid icon for female variants") else if(!icon_exists(UNLINT(part::should_draw_greyscale ? part::icon_greyscale : part::icon_static), "[part::limb_id]_[part::body_zone]")) TEST_FAIL("[path] does not have a valid icon") - -/// Tests the height adjustment system which dynamically changes how much the chest, head, and arms of a carbon are adjusted upwards or downwards based on the length of their legs and chest. -/datum/unit_test/limb_height_adjustment - -/datum/unit_test/limb_height_adjustment/Run() - var/mob/living/carbon/human/john_doe = allocate(/mob/living/carbon/human/consistent) - var/mob/living/carbon/human/species/monkey/monkey = allocate(/mob/living/carbon/human/species/monkey) - var/mob/living/carbon/human/tallboy = allocate(/mob/living/carbon/human/consistent) - - tallboy.set_species(/datum/species/human/tallboy) - TEST_ASSERT_EQUAL(john_doe.get_top_offset(), 0, "John Doe found to have a top offset other than zero.") - TEST_ASSERT_EQUAL(monkey.get_top_offset(), -8, "Monkey found to have a top offset other than -8.") - TEST_ASSERT_EQUAL(tallboy.get_top_offset(), 23, "Tallboy human varient found to have a top offset other than 23.") - - - var/obj/item/bodypart/leg/left/monkey/left_monky_leg = allocate(/obj/item/bodypart/leg/left/monkey) - var/obj/item/bodypart/leg/right/monkey/right_monky_leg = allocate(/obj/item/bodypart/leg/right/monkey) - - left_monky_leg.replace_limb(john_doe, TRUE) - - TEST_ASSERT_EQUAL(john_doe.get_top_offset(), 0, "John Doe has a top offset other than 0 with one human leg and one monkey leg.") - - right_monky_leg.replace_limb(john_doe, TRUE) - - TEST_ASSERT_EQUAL(john_doe.get_top_offset(), -3, "John Doe has a top offset other than -3 with two monkey legs.") - diff --git a/code/modules/unit_tests/screenshot_humanoids.dm b/code/modules/unit_tests/screenshot_humanoids.dm index cab447f9ea3f..42fe040cbe98 100644 --- a/code/modules/unit_tests/screenshot_humanoids.dm +++ b/code/modules/unit_tests/screenshot_humanoids.dm @@ -25,6 +25,14 @@ test_screenshot("[/datum/species/moth]", get_flat_icon_for_all_directions(moth)) //MONKESTATION ADDITION START + var/mob/living/carbon/human/tundramoth = allocate(/mob/living/carbon/human/dummy/consistent) + tundramoth.dna.features["moth_antennae"] = "Tundra" + tundramoth.dna.features["moth_markings"] = "Tundra" + tundramoth.dna.features["moth_wings"] = "Tundra" + tundramoth.set_species(/datum/species/moth/tundra) + tundramoth.equipOutfit(/datum/outfit/job/doctor, visualsOnly = TRUE) + test_screenshot("[/datum/species/moth/tundra]", get_flat_icon_for_all_directions(tundramoth)) + var/mob/living/carbon/human/apid = allocate(/mob/living/carbon/human/dummy/consistent) apid.dna.features["apid_antenna"] = "Horns" apid.dna.features["apid_wings"] = "Normal" // Just in case someone ever adds more @@ -34,7 +42,7 @@ //MONKESTATION ADDITION END // The rest of the species - for (var/datum/species/species_type as anything in subtypesof(/datum/species) - /datum/species/moth - /datum/species/lizard - /datum/species/apid) + for (var/datum/species/species_type as anything in subtypesof(/datum/species) - typesof(/datum/species/moth) - /datum/species/lizard - /datum/species/apid) test_screenshot("[species_type]", get_flat_icon_for_all_directions(make_dummy(species_type, /datum/outfit/job/assistant/consistent))) /datum/unit_test/screenshot_humanoids/proc/make_dummy(species, job_outfit) diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_tallboy.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_tallboy.png deleted file mode 100644 index 262353dc0a95..000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_tallboy.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png index 727cfe107cf2..0c168ccb8d63 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_human_legged.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_human_legged.png deleted file mode 100644 index 31a708af7192..000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_human_legged.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_monkey_freak.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_monkey_freak.png deleted file mode 100644 index 48bd755a6d01..000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_monkey_freak.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_simian.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_simian.png new file mode 100644 index 000000000000..732f52a59db9 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_monkey_simian.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth_tundra.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth_tundra.png new file mode 100644 index 000000000000..5a1d9adac6b4 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_moth_tundra.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png deleted file mode 100644 index 8d1cdfd9c396..000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_simian.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_bloater.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_bloater.png new file mode 100644 index 000000000000..315426c418c2 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_bloater.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_runner.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_runner.png new file mode 100644 index 000000000000..0e35d0ae6a57 Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_runner.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_spitter.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_spitter.png new file mode 100644 index 000000000000..a74b9528a23e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_spitter.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_tank.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_tank.png new file mode 100644 index 000000000000..d037b53f245e Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_zombie_infectious_tank.png differ diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index f933f14854a7..a7ae8b89b3db 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -16,11 +16,14 @@ if(!proximity_flag) return else if(isliving(target)) + var/mob/living/living_target = target + if(!highly_infecious && living_target.stat != DEAD) + return if(ishuman(target)) try_to_zombie_infect(target, user, user.zone_selected) - else + /*else monkestation temp removal . |= AFTERATTACK_PROCESSED_ITEM - check_feast(target, user) + check_feast(target, user)*/ /proc/try_to_zombie_infect(mob/living/carbon/human/target, mob/living/user, def_zone = BODY_ZONE_CHEST) CHECK_DNA_AND_SPECIES(target) @@ -84,3 +87,10 @@ user.updatehealth() user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" user.set_nutrition(min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL)) +//monkestation edit start + if(iszombie(user)) + var/mob/living/carbon/carbon_user = user + var/datum/species/zombie/infectious/zombie_datum = carbon_user.dna.species + zombie_datum.consumed_flesh += hp_gained +//monkestation edit end + diff --git a/config/auxtools.txt b/config/auxtools.txt deleted file mode 100644 index 369480c0b867..000000000000 --- a/config/auxtools.txt +++ /dev/null @@ -1,6 +0,0 @@ -## -## Master config flag for enabling/disabling auxtools. -## Currently, this will disable Lua scripting. -## - -#AUXTOOLS_ENABLED diff --git a/config/game_options.txt b/config/game_options.txt index 6d24745d76f5..d25048ef41ac 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -349,6 +349,7 @@ ROUNDSTART_RACES human ROUNDSTART_RACES lizard #ROUNDSTART_RACES fly ROUNDSTART_RACES moth +ROUNDSTART_RACES tundra_moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow ROUNDSTART_RACES oozeling diff --git a/dependencies.sh b/dependencies.sh index e6ad5bf85cad..1c6130c6cd1d 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -21,8 +21,8 @@ export SPACEMAN_DMM_VERSION=suite-1.8 # Python version for mapmerge and other tools export PYTHON_VERSION=3.9.0 -#auxlua repo -export AUXLUA_REPO=tgstation/auxlua +#dreamluau repo +export DREAMLUAU_REPO="tgstation/dreamluau" -#auxlua git tag -export AUXLUA_VERSION=1.4.4 +#dreamluau git tag +export DREAMLUAU_VERSION=0.1.3 diff --git a/dreamluau.dll b/dreamluau.dll new file mode 100644 index 000000000000..0ca6b363df9f Binary files /dev/null and b/dreamluau.dll differ diff --git a/html/changelogs/AutoChangeLog-pr-4076.yml b/html/changelogs/AutoChangeLog-pr-4076.yml new file mode 100644 index 000000000000..5e6829c97b1d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4076.yml @@ -0,0 +1,4 @@ +author: "Wisemonster" +delete-after: True +changes: + - balance: "The gulag is now more secure using more lava tiles" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4089.yml b/html/changelogs/AutoChangeLog-pr-4089.yml new file mode 100644 index 000000000000..f8aa5eaa20aa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4089.yml @@ -0,0 +1,7 @@ +author: "Wisemonster" +delete-after: True +changes: + - balance: "Blueshift's security modsuits now require armory access for their room" + - balance: "Blueshift's security locker room now requires brig access to enter" + - balance: "Blueshifts's gulag teleporter room now requires brig access to enter" + - bugfix: "The security escape pod on blueshift uses general security access instead of external access" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4092.yml b/html/changelogs/AutoChangeLog-pr-4092.yml new file mode 100644 index 000000000000..2ff6b4ca7405 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4092.yml @@ -0,0 +1,8 @@ +author: "Wisemonster" +delete-after: True +changes: + - balance: "Theseus now has security modsuits in security" + - balance: "The room containing security modsuits on Theseus now requires armory access to enter" + - balance: "Theseus' security techfab has been moved to the security office proper" + - balance: "The security locker room on theseus now requires brig access" + - balance: "The Theseus brig cells now require brig access to use" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-4093.yml b/html/changelogs/AutoChangeLog-pr-4093.yml new file mode 100644 index 000000000000..e9c3679c4929 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4093.yml @@ -0,0 +1,4 @@ +author: "Wisemonster" +delete-after: True +changes: + - balance: "Moved the security modsuits on voidraptor into the armory, moved the secway and riot suit to the previous modsuit location and onto a nearby rack, respectively" \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index c9da7a171611..64a946c911c0 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -580,3 +580,19 @@ was supposed to (indicated by its own code) - bugfix: Heart Worms now no longer instantly kills you if you have CE_STABLEHEART or for some reason are immune to heart attacks WITH stableheart. +2024-10-30: + Absolucy: + - bugfix: Fixed a hard delete related to wumpas. + - sound: The sound from picking up / dropping a wumpa now respects the "squeak" + mixer channel, as stepping on it and such already does. + - bugfix: You can no longer lower the alert from delta/epsilon from a comms console + (it wouldn't actually do anything to whatever was CAUSING said alert anyways) + Gboster-0: + - rscadd: Signal technicians now have wintercoats + - qol: The signal technician's traffic console no longer saves your code on ENTER, + letting you comfortably make new-lines with enter instead + Gw0sty: + - bugfix: Makes Nuclear reinforcements call upon Midround nukie preferences rather + than round start. + MomoBerri: + - bugfix: fixed quartermasters doors. diff --git a/html/changelogs/archive/2024-11.yml b/html/changelogs/archive/2024-11.yml new file mode 100644 index 000000000000..4e70425954d9 --- /dev/null +++ b/html/changelogs/archive/2024-11.yml @@ -0,0 +1,79 @@ +2024-11-01: + DexeeXI: + - bugfix: 'Kilo: asteroid magnet resized, now working once more without (for now) + showing SHIT IS FUCK.' + - rscadd: Blueshield and NT Rep specific permissions. + - rscdel: Removed Centcom perms from Blueshield and NT Rep (this is admin only, + dont give this to players) + - bugfix: 'All Maps except Box: NT Rep and Blueshield doors now accessible by BS + and Rep.' + - bugfix: 'Icebox: Teleporter doors tweaked to allow Blueshield and NT Rep to go + through to the weirdly placed office.' + - bugfix: 'All Maps except Box: NT Rep closets and lockers replaced with standardized + NT Rep Locker, with perms. Some maps will have medals that were included from + previous authors.' + - rscadd: NT Rep now has a singular spawn point on all maps, except Box. This singular + point is in a comfy chair in the office. + JohnFulpWillard: + - rscadd: Monkeys can now wear any outfit rather than just the waiter outfit. + - rscadd: Simians now use the same height filter system as Monkeys to wear outfits + instead of having their own icon for each individual piece of clothing. + - rscadd: Monkeys now use the same prefs as Simians, having Fur and eye colors. + By default monkeys are all brown, and simians can choose to be brown as well. + - rscadd: Simians and monkeys are now at the bottom of the tile they are on, rather + than the middle. + - rscdel: Big legged species and monkey abominations. + - bugfix: Gigantism no longer doubles your size twice. + KnigTheThrasher: + - bugfix: Fixed security maintenance on kilostation + Meowosers: + - rscadd: Finished Fermentation Kegs can now be wrapped into parcels + RafRoq: + - balance: Prickly Adhesion damage halved + ThePooba: + - bugfix: window sill grills now break instantly instead of becoming glitchy messes + - bugfix: windowsills can now be built on once again. + - bugfix: Eland can now be reloaded and wont drop its spent caseless ammunition + dwasint: + - bugfix: some species not healing oxyloss when giving the NOBREATH trait + - rscadd: right clicking food items will bring up a radial wheel of foods you can + craft, this allows bulk crafting. + - balance: Hand crafted foods (using the new system) increases the quality of food + buffs. + lemonycake: + - rscadd: add the alt title "Princess" to captain +2024-11-02: + Gw0sty: + - rscadd: Added a new 'Late Join' Category and role, the 'Barber'. + - rscadd: Added scissors, hairbrush, combs, dye sprays, and fur dyers from the code + into service lathe roundstart! + - rscadd: Gave service cyborgs new tools of scissors, hairbrush, and dye sprays. + - rscadd: Added barber lockers and vendings to all stations. + - code_imp: Changed the voidraptor forge area type from a barber area to a forge + area. + - qol: Health analyzers now alert if the subject has taken the heavy bleeder trait. + - rscadd: Added more cybernetics into the cybernetic revolution station trait. + - rscadd: Added new leg cybernetic for research "Vacuole ligament system" + Shoddd: + - rscadd: Tundra moths, a new species of moth + - rscadd: 3 New wings, 2 new antennae, and 1 new marking for moths +2024-11-03: + Absolucy: + - bugfix: Fixed a door in the Blueshift aux base requiring construction access instead + of aux base access. + - bugfix: Moon heretic ascension now properly turns 20% of the crew into lunatics, + rather than ALL ELIGIBLE CREW. + - admin: Changed the Lua scripting backend from auxlua to dreamluau. Lua scripts + will need to be adjusted accordingly. + - bugfix: Fixed some code related to artifacts. + - bugfix: Clown artifact faults should now actually work. + Absolucy, LT3: + - bugfix: Fixed alignment of RPG titles. + Gboster-0: + - bugfix: the signal technician's winter hood no longer flickers in the dark + Gw0sty: + - rscadd: 'Added three programs to cyborg PDAs: SiliConnect, AtmoZphere, and Crew + Manifest' + Wisemonster: + - bugfix: The security airlocks leading to perma from inner security on voidraptor + now use perma access diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index c9aa15345388..8c99a80fa1fe 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/icons/mob/huds/hud.dmi b/icons/mob/huds/hud.dmi index 80331ddc1845..ffefc65073f0 100644 Binary files a/icons/mob/huds/hud.dmi and b/icons/mob/huds/hud.dmi differ diff --git a/icons/mob/species/human/human_face.dmi b/icons/mob/species/human/human_face.dmi index a65ab1a0e4ee..e44a43bead7e 100644 Binary files a/icons/mob/species/human/human_face.dmi and b/icons/mob/species/human/human_face.dmi differ diff --git a/icons/mob/species/monkey/bodyparts.dmi b/icons/mob/species/monkey/bodyparts.dmi index 689ef5e63d7e..9e95cbd0c72f 100644 Binary files a/icons/mob/species/monkey/bodyparts.dmi and b/icons/mob/species/monkey/bodyparts.dmi differ diff --git a/icons/mob/species/monkey/monkey_tail.dmi b/icons/mob/species/monkey/monkey_tail.dmi index 2a06af25b797..ffebf714f9aa 100644 Binary files a/icons/mob/species/monkey/monkey_tail.dmi and b/icons/mob/species/monkey/monkey_tail.dmi differ diff --git a/icons/mob/species/monkey/uniform.dmi b/icons/mob/species/monkey/uniform.dmi deleted file mode 100644 index 21d70e5694f2..000000000000 Binary files a/icons/mob/species/monkey/uniform.dmi and /dev/null differ diff --git a/icons/mob/species/moth/bodyparts.dmi b/icons/mob/species/moth/bodyparts.dmi index 6324ad386e4c..eede92e58b62 100644 Binary files a/icons/mob/species/moth/bodyparts.dmi and b/icons/mob/species/moth/bodyparts.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index a4a87613070c..a1e432761f6f 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index aea93b956fc3..e4ac800e6bb3 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi index 1fc5c954bb51..9fc4da69c2ba 100644 Binary files a/icons/obj/food/piecake.dmi and b/icons/obj/food/piecake.dmi differ diff --git a/icons/obj/medical/organs/organs.dmi b/icons/obj/medical/organs/organs.dmi index e0373b74ea58..18bc15e0c2d7 100644 Binary files a/icons/obj/medical/organs/organs.dmi and b/icons/obj/medical/organs/organs.dmi differ diff --git a/icons/obj/pda.dmi b/icons/obj/pda.dmi index a26fb0f7d58b..04c9377c730b 100644 Binary files a/icons/obj/pda.dmi and b/icons/obj/pda.dmi differ diff --git a/icons/obj/storage/wrapping.dmi b/icons/obj/storage/wrapping.dmi index 23725f2a0c6d..7c95ab090138 100644 Binary files a/icons/obj/storage/wrapping.dmi and b/icons/obj/storage/wrapping.dmi differ diff --git a/lua/SS13_base.lua b/lua/SS13_base.lua index ea04c8c6503d..23f464bf328a 100644 --- a/lua/SS13_base.lua +++ b/lua/SS13_base.lua @@ -5,59 +5,38 @@ local SS13 = {} __SS13_signal_handlers = __SS13_signal_handlers or {} -SS13.SSlua = dm.global_vars.vars.SSlua +SS13.SSlua = dm.global_vars.SSlua SS13.global_proc = "some_magic_bullshit" SS13.state = state.state function SS13.get_runner_ckey() - return SS13.state:get_var("ckey_last_runner") + return SS13.state.ckey_last_runner end function SS13.get_runner_client() - return dm.global_vars:get_var("GLOB"):get_var("directory"):get(SS13.get_runner_ckey()) + return dm.global_vars.GLOB.directory[SS13.get_runner_ckey()] end -function SS13.istype(thing, type) - return dm.global_proc("_istype", thing, dm.global_proc("_text2path", type)) == 1 -end - -function SS13.start_tracking(datum) - local references = SS13.state.vars.references - references:add(datum) - SS13.state:call_proc("clear_on_delete", datum) -end +SS13.type = dm.global_procs._text2path -function SS13.new(type, ...) - local datum = SS13.new_untracked(type, ...) - if datum then - SS13.start_tracking(datum) - return datum - end +function SS13.istype(thing, type) + return dm.global_procs._istype(thing, SS13.type(type)) == 1 end -function SS13.type(string_type) - return dm.global_proc("_text2path", string_type) -end +SS13.new = dm.new function SS13.qdel(datum) if SS13.is_valid(datum) then - dm.global_proc("qdel", datum) + dm.global_procs.qdel(datum) return true end return false end -function SS13.new_untracked(type, ...) - return dm.global_proc("_new", type, { ... }) -end - function SS13.is_valid(datum) - if datum and not datum:is_null() and not datum:get_var("gc_destroyed") then - return true - end - return false + return dm.is_valid_ref(datum) and not datum.gc_destroyed end function SS13.await(thing_to_call, proc_to_call, ...) @@ -67,123 +46,110 @@ function SS13.await(thing_to_call, proc_to_call, ...) if thing_to_call == SS13.global_proc then proc_to_call = "/proc/" .. proc_to_call end - local promise = SS13.new("/datum/auxtools_promise", thing_to_call, proc_to_call, ...) - local promise_vars = promise.vars - while promise_vars.status == 0 do + local promise = SS13.new("/datum/promise", thing_to_call, proc_to_call, ...) + while promise.status == 0 do sleep() end - local return_value, runtime_message = promise_vars.return_value, promise_vars.runtime_message - SS13.stop_tracking(promise) - return return_value, runtime_message + return promise.return_value, promise.runtime_message end -function SS13.register_signal(datum, signal, func) - if not SS13.istype(datum, "/datum") then - return +local function signal_handler(data, ...) + local output = 0 + for func, _ in data.functions do + local result = func(...) + if type(result) == "number" then + output = bit32.bor(output, math.floor(result)) + end end - if not SS13.is_valid(datum) then - error("Tried to register a signal on a deleted datum!", 2) - return + return output +end + +local function create_qdeleting_callback(datum) + local callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") + callback:RegisterSignal(datum, "parent_qdeleting", "Invoke") + local path = { + "__SS13_signal_handlers", + dm.global_procs.WEAKREF(datum), + "parent_qdeleting", + "handler", + } + callback.arguments = { path } + local handler_data = { callback = callback, functions = {} } + handler_data.handler = function(source, ...) + local result = signal_handler(handler_data, source, ...) + for signal, signal_data in __SS13_signal_handlers[source] do + signal_data.callback:UnregisterSignal(source, signal) + end + __SS13_signal_handlers[source] = nil + return result end - local datumWeakRef = dm.global_proc("WEAKREF", datum) - if not __SS13_signal_handlers[datumWeakRef] then - __SS13_signal_handlers[datumWeakRef] = {} + __SS13_signal_handlers[datum]["parent_qdeleting"] = handler_data +end + +function SS13.register_signal(datum, signal, func) + if not type(func) == "function" then + return end - if signal == "_cleanup" then + if not SS13.istype(datum, "/datum") then return end - if not __SS13_signal_handlers[datumWeakRef][signal] then - __SS13_signal_handlers[datumWeakRef][signal] = {} + if not SS13.is_valid(datum) then + error("Tried to register a signal on a deleted datum", 2) end - local callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") - local callbackWeakRef = dm.global_proc("WEAKREF", callback) - callback:call_proc("RegisterSignal", datum, signal, "Invoke") - local path = { "__SS13_signal_handlers", datumWeakRef, signal, callbackWeakRef, "func" } - callback.vars.arguments = { path } - -- Turfs don't remove their signals on deletion. - if not __SS13_signal_handlers[datumWeakRef]._cleanup and not SS13.istype(datum, "/turf") then - local cleanupCallback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") - local cleanupPath = { "__SS13_signal_handlers", datumWeakRef, "_cleanup"} - cleanupCallback.vars.arguments = { cleanupPath } - cleanupCallback:call_proc("RegisterSignal", datum, "parent_qdeleting", "Invoke") - __SS13_signal_handlers[datumWeakRef]._cleanup = function(datum) - SS13.start_tracking(datumWeakRef) - timer.set_timeout(0, function() - SS13.signal_handler_cleanup(datumWeakRef) - SS13.stop_tracking(cleanupCallback) - SS13.stop_tracking(datumWeakRef) - end) + if not __SS13_signal_handlers[datum] then + __SS13_signal_handlers[datum] = {} + -- Turfs don't remove their signals on deletion. + if not SS13.istype(datum, "/turf") then + create_qdeleting_callback(datum) end end - __SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef] = { func = func, callback = callback } - return callback -end - -function SS13.stop_tracking(datum) - SS13.state:call_proc("let_soft_delete", datum) -end - -function SS13.unregister_signal(datum, signal, callback) - local function clear_handler(handler_info) - if not handler_info then - return - end - if not handler_info.callback then - return - end - local handler_callback = handler_info.callback - local callbackWeakRef = dm.global_proc("WEAKREF", handler_callback) - if not SS13.istype(datum, "/datum/weakref") then - handler_callback:call_proc("UnregisterSignal", datum, signal) - else - local actualDatum = datum:call_proc("hard_resolve") - if SS13.is_valid(actualDatum) then - handler_callback:call_proc("UnregisterSignal", actualDatum, signal) - end + local handler_data = __SS13_signal_handlers[datum][signal] + if not handler_data then + handler_data = { callback = nil, functions = {} } + local callback = SS13.new("/datum/callback", SS13.state, "call_function_return_first") + callback:RegisterSignal(datum, signal, "Invoke") + local path = { + "__SS13_signal_handlers", + dm.global_procs.WEAKREF(datum), + signal, + "handler", + } + callback.arguments = { path } + handler_data.callback = callback + handler_data.handler = function(...) + return signal_handler(handler_data, ...) end - SS13.stop_tracking(handler_callback) + __SS13_signal_handlers[datum][signal] = handler_data end + handler_data.functions[func] = true + return true +end - local datumWeakRef = datum - if not SS13.istype(datum, "/datum/weakref") then - datumWeakRef = dm.global_proc("WEAKREF", datum) - end - if not __SS13_signal_handlers[datumWeakRef] then +function SS13.unregister_signal(datum, signal, func) + if not (func == nil or type(func) == "function") then return end - - if signal == "_cleanup" then + if not __SS13_signal_handlers[datum] then return end - - if not __SS13_signal_handlers[datumWeakRef][signal] then + local handler_data = __SS13_signal_handlers[datum][signal] + if not handler_data then return end - - if not callback then - for handler_key, handler_info in __SS13_signal_handlers[datumWeakRef][signal] do - clear_handler(handler_info) + if func == nil then + if signal == "parent_qdeleting" then + handler_data.functions = {} + else + handler_data.callback:UnregisterSignal(datum, signal) + __SS13_signal_handlers[datum][signal] = nil end - __SS13_signal_handlers[datumWeakRef][signal] = nil else - if not SS13.istype(callback, "/datum/callback") then - return + handler_data.functions[func] = nil + if not (#handler_data.functions or (signal == "parent_qdeleting")) then + handler_data.callback:UnregisterSignal(datum, signal) + __SS13_signal_handlers[datum][signal] = nil end - local callbackWeakRef = dm.global_proc("WEAKREF", callback) - clear_handler(__SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef]) - __SS13_signal_handlers[datumWeakRef][signal][callbackWeakRef] = nil - end -end - -function SS13.signal_handler_cleanup(datumWeakRef) - if not __SS13_signal_handlers[datumWeakRef] then - return - end - - for signal, _ in __SS13_signal_handlers[datumWeakRef] do - SS13.unregister_signal(datumWeakRef, signal) end - __SS13_signal_handlers[datumWeakRef] = nil end return SS13 diff --git a/lua/handler_group.lua b/lua/handler_group.lua index 0246d33c7448..050551b85296 100644 --- a/lua/handler_group.lua +++ b/lua/handler_group.lua @@ -1,29 +1,29 @@ -local SS13 = require('SS13') +local SS13 = require("SS13") local HandlerGroup = {} HandlerGroup.__index = HandlerGroup function HandlerGroup.new() return setmetatable({ - registered = {} + registered = {}, }, HandlerGroup) end -- Registers a signal on a datum for this handler group instance. function HandlerGroup:register_signal(datum, signal, func) - local callback = SS13.register_signal(datum, signal, func) - if not callback then + local registered_successfully = SS13.register_signal(datum, signal, func) + if not registered_successfully then return end - table.insert(self.registered, { datum = dm.global_proc("WEAKREF", datum), signal = signal, callback = callback }) + table.insert(self.registered, { datum = datum, signal = signal, func = func }) end -- Clears all the signals that have been registered on this HandlerGroup function HandlerGroup:clear() for _, data in self.registered do - if not data.callback or not data.datum then + if not data.func or not SS13.is_valid(data.datum) then continue end - SS13.unregister_signal(data.datum, data.signal, data.callback) + SS13.unregister_signal(data.datum, data.signal, data.func) end table.clear(self.registered) end @@ -45,5 +45,4 @@ function HandlerGroup.register_once(datum, signal, func) return callback end - return HandlerGroup diff --git a/lua/state.lua b/lua/state.lua index 080ee9f7eb32..cba24d643561 100644 --- a/lua/state.lua +++ b/lua/state.lua @@ -1,7 +1,7 @@ -local SSlua = dm.global_vars:get_var("SSlua") +local SSlua = dm.global_vars.SSlua -for _, state in SSlua:get_var("states") do - if state:get_var("internal_id") == dm.state_id then +for _, state in SSlua.states do + if state.internal_id == _state_id then return { state = state } end end diff --git a/lua/timer.lua b/lua/timer.lua index 8619bbb54a29..e79cc8cdca54 100644 --- a/lua/timer.lua +++ b/lua/timer.lua @@ -2,19 +2,19 @@ local state = require("state") local Timer = {} -local SSlua = dm.global_vars:get_var("SSlua") +local SSlua = dm.global_vars.SSlua __Timer_timers = __Timer_timers or {} __Timer_callbacks = __Timer_callbacks or {} function __add_internal_timer(func, time, loop) local timer = { loop = loop, - executeTime = time + dm.world:get_var("time") + executeTime = time + dm.world.time, } __Timer_callbacks[tostring(func)] = function() timer.executing = false if loop and timer.terminate ~= true then - timer.executeTime = dm.world:get_var("time") + time + timer.executeTime = dm.world.time + time else __stop_internal_timer(tostring(func)) end @@ -37,22 +37,21 @@ function __stop_internal_timer(func) end __Timer_timer_processing = __Timer_timer_processing or false -state.state:set_var("timer_enabled", 1) +state.state.timer_enabled = 1 __Timer_timer_process = function(seconds_per_tick) if __Timer_timer_processing then return 0 end __Timer_timer_processing = true - local time = dm.world:get_var("time") for func, timeData in __Timer_timers do if timeData.executing == true then continue end - if over_exec_usage(0.85) then + if _exec.time / (dm.world.tick_lag * 100) > 0.85 then sleep() end - if time >= timeData.executeTime then - state.state:get_var("functions_to_execute"):add(func) + if dm.world.time >= timeData.executeTime then + list.add(state.state.functions_to_execute, func) timeData.executing = true end end @@ -61,9 +60,9 @@ __Timer_timer_process = function(seconds_per_tick) end function Timer.wait(time) - local next_yield_index = __next_yield_index + local yieldIndex = _exec.next_yield_index __add_internal_timer(function() - SSlua:call_proc("queue_resume", state.state, next_yield_index) + SSlua:queue_resume(state.state, yieldIndex) end, time * 10, false) coroutine.yield() end diff --git a/monkestation/code/__HELPERS/_lists.dm b/monkestation/code/__HELPERS/_lists.dm index 1b997b61f862..9ffbeb78d13e 100644 --- a/monkestation/code/__HELPERS/_lists.dm +++ b/monkestation/code/__HELPERS/_lists.dm @@ -12,3 +12,14 @@ for(var/datum/thingy as anything in things) if(is_type_in_typecache(thingy, typecache)) return TRUE + +/** Scales a range (i.e 1, 100) and picks an item from the list based on your passed value + * i.e in a list with length 4, a 25 in the 1-100 range will give you the 2nd item + * This assumes your ranges start with 1, I am not good at math and can't do linear scaling + */ +/proc/scale_range_pick(min, max, value, list/pick_from) + var/len = length(pick_from) + if(!len) + return null + var/index = min(1 + (value * (len - 1)) / (max - min), len) + return pick_from[index] diff --git a/monkestation/code/datums/id_trim/jobs.dm b/monkestation/code/datums/id_trim/jobs.dm index d9ef7b302f02..9cd32100f22a 100644 --- a/monkestation/code/datums/id_trim/jobs.dm +++ b/monkestation/code/datums/id_trim/jobs.dm @@ -27,3 +27,21 @@ ACCESS_HOS, ) job = /datum/job/brig_physician + +/datum/id_trim/job/barber + assignment = "Barber" + trim_state = "trim_barber" + department_color = COLOR_SERVICE_LIME + subdepartment_color = COLOR_SERVICE_LIME + sechud_icon_state = SECHUD_BARBER + minimal_access = list( + ACCESS_SERVICE, + ACCESS_THEATRE, + ) + extra_access = list() + template_access = list( + ACCESS_CAPTAIN, + ACCESS_CHANGE_IDS, + ACCESS_HOP, + ) + job = /datum/job/barber diff --git a/monkestation/code/datums/quirks/negative_quirks.dm b/monkestation/code/datums/quirks/negative_quirks.dm index aa4eeb29a9a7..e98ec72c24be 100644 --- a/monkestation/code/datums/quirks/negative_quirks.dm +++ b/monkestation/code/datums/quirks/negative_quirks.dm @@ -128,7 +128,6 @@ /datum/quirk/kleptomaniac name = "Kleptomaniac" desc = "The station's just full of free stuff! Nobody would notice if you just... took it, right?" - mob_trait = TRAIT_KLEPTOMANIAC value = -2 icon = FA_ICON_BAG_SHOPPING diff --git a/monkestation/code/datums/status_effects/food_buffs.dm b/monkestation/code/datums/status_effects/food_buffs.dm index 45f79a5edf3f..44ae8e55d659 100644 --- a/monkestation/code/datums/status_effects/food_buffs.dm +++ b/monkestation/code/datums/status_effects/food_buffs.dm @@ -2,7 +2,10 @@ duration = 10 MINUTES status_type = STATUS_EFFECT_REPLACE show_duration = TRUE - var/quality_modifier = 1 + + +/datum/status_effect/food/proc/apply_quality(quality) + return /datum/status_effect/food/on_apply() if(HAS_TRAIT(owner, TRAIT_GOURMAND)) @@ -19,6 +22,9 @@ alert_type = /atom/movable/screen/alert/status_effect/food/stamina_increase_t1 var/stam_increase = 10 +/datum/status_effect/food/stamina_increase/apply_quality(quality) + stam_increase = stam_increase * (1 + (quality / 50)) + /atom/movable/screen/alert/status_effect/food/stamina_increase_t1 name = "Tiny Stamina Increase" desc = "Increases your stamina by a tiny amount" @@ -87,6 +93,9 @@ var/range = RANGE var/duration_loss = DURATION_LOSS +/datum/status_effect/food/fire_burps/apply_quality(quality) + range = range + round((quality / 40)) + /atom/movable/screen/alert/status_effect/food/fire_burps name = "Firey Burps" desc = "Lets you burp out a line of fire" @@ -191,6 +200,9 @@ alert_type = /atom/movable/screen/alert/status_effect/food/health_increase_t1 var/health_increase = 10 +/datum/status_effect/food/health_increase/apply_quality(quality) + health_increase = health_increase * (1 + (quality / 50)) + /atom/movable/screen/alert/status_effect/food/health_increase_t1 name = "Small Health Increase" desc = "You feel slightly heartier" @@ -258,6 +270,9 @@ alert_type = /atom/movable/screen/alert/status_effect/food/stam_regen_t1 var/regen_increase = 0.5 +/datum/status_effect/food/stam_regen/apply_quality(quality) + regen_increase = regen_increase * (1 + (quality / 20)) + /atom/movable/screen/alert/status_effect/food/stam_regen_t1 name = "Small Stamina Regeneration Increase" desc = "You feel slightly more energetic" diff --git a/monkestation/code/game/objects/items.dm b/monkestation/code/game/objects/items.dm index 3203d5df3dea..165b8c3fcfb0 100644 --- a/monkestation/code/game/objects/items.dm +++ b/monkestation/code/game/objects/items.dm @@ -1,3 +1,11 @@ +/obj/item + /// If specified, the pickup sound will use this mixer channel. + var/pickup_mixer_channel = CHANNEL_SOUND_EFFECTS + /// If specified, the drop sound will use this mixer channel. + var/drop_mixer_channel = CHANNEL_SOUND_EFFECTS + /// If specified, the equip sound will use this mixer channel. + var/equip_mixer_channel = CHANNEL_SOUND_EFFECTS + /obj/item/proc/adjust_weight_class(amt, min_weight = WEIGHT_CLASS_TINY, max_weight = WEIGHT_CLASS_GIGANTIC) if(!amt || !isnum(amt)) stack_trace("Attempted to adjust weight class by an invalid value ([amt])") diff --git a/monkestation/code/game/objects/items/effects/amogus.dm b/monkestation/code/game/objects/items/effects/amogus.dm index 06ded844bc40..9359f9170ff4 100644 --- a/monkestation/code/game/objects/items/effects/amogus.dm +++ b/monkestation/code/game/objects/items/effects/amogus.dm @@ -3,7 +3,7 @@ icon_state = "nugget" /obj/item/effect_granter/amogus/grant_effect(mob/living/carbon/granter) - if(issimian(granter)) + if(ismonkey(granter)) to_chat(granter, span_notice("Sorry but simians are to small to be turned into amogus you have not been charged.")) return FALSE if(isgoblin(granter)) diff --git a/monkestation/code/game/objects/items/translation_hat.dm b/monkestation/code/game/objects/items/translation_hat.dm new file mode 100644 index 000000000000..c29ce4dd3524 --- /dev/null +++ b/monkestation/code/game/objects/items/translation_hat.dm @@ -0,0 +1,58 @@ +/obj/item/clothing/mask/translator + name = "MonkeTech AutoTranslator" + desc = "A small device that will translate speech." + icon = 'monkestation/icons/obj/clothing/masks.dmi' + icon_state = "translator" + worn_icon = 'monkestation/icons/mob/clothing/mask.dmi' + worn_icon_state = "translator" + slot_flags = ITEM_SLOT_MASK | ITEM_SLOT_NECK + modifies_speech = TRUE + var/current_language = /datum/language/common + +/obj/item/clothing/mask/translator/proc/generate_language_names(mob/user) + var/static/list/language_name_list + if(!language_name_list) + language_name_list = list() + for(var/language in user.mind.language_holder.understood_languages) + if(language in user.mind.language_holder.blocked_languages) + continue + var/atom/A = language + language_name_list[initial(A.name)] = A + return language_name_list + +/obj/item/clothing/mask/translator/attack_self(mob/user) + . = ..() + if(ishuman(user)) + var/list/display_names = generate_language_names(user) + if(!display_names.len > 1) + return + var/choice = input(user,"Please select a language","Select a language:") as null|anything in sort_list(display_names) + if(!choice) + return + current_language = display_names[choice] + +/obj/item/clothing/mask/translator/equipped(mob/M, slot) + . = ..() + if ((slot == ITEM_SLOT_MASK || slot == ITEM_SLOT_NECK) && modifies_speech) + RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/mask/translator/handle_speech(datum/source, list/speech_args) + . = ..() + if(!(clothing_flags * (VOICEBOX_DISABLED))) + if(obj_flags & EMAGGED) + speech_args[SPEECH_LANGUAGE] = pick(GLOB.all_languages) + else + speech_args[SPEECH_LANGUAGE] = current_language + +/obj/item/clothing/mask/translator/examine(mob/user) + . = ..() + . += span_notice("Click while in hand to select output language.") + +/obj/item/clothing/mask/translator/emag_act() + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + icon_state = "translator_emag" + playsound(src, "sparks", 100, 1) diff --git a/monkestation/code/modules/NTSL/code/readme.md b/monkestation/code/modules/NTSL/code/readme.md index 8d22e49c8716..f72a717d3835 100644 --- a/monkestation/code/modules/NTSL/code/readme.md +++ b/monkestation/code/modules/NTSL/code/readme.md @@ -28,10 +28,17 @@ for example, adding in their job after their name - monkestation\code\modules\jobs\job_types\signal_technician.dm - monkestation\code\modules\clothing\under\jobs\engineering.dm +- monkestation\code\modules\clothing\suits\coats.dm - monkestation\code\modules\clothing\spacesuits\plasmamen.dm - monkestation\icons\obj\clothing\uniforms.dmi - monkestation\icons\mob\clothing\uniform.dmi + +- monkestation\icons\obj\clothing\suits.dmi +- monkestation\icons\mob\clothing\suit.dmi +- monkestation\icons\obj\clothing\hats.dmi +- monkestation\icons\mob\clothing\head.dmi + - monkestation\icons\obj\clothing\plasmaman.dmi - monkestation\icons\mob\clothing\plasmaman.dmi - monkestation\icons\obj\clothing\plasmaman_head.dmi diff --git a/monkestation/code/modules/NTrep/NTrep.dm b/monkestation/code/modules/NTrep/NTrep.dm index c7861efe3974..bbf3f5c8e4c4 100644 --- a/monkestation/code/modules/NTrep/NTrep.dm +++ b/monkestation/code/modules/NTrep/NTrep.dm @@ -102,8 +102,7 @@ ACCESS_COMMAND, ACCESS_MAINT_TUNNELS, ACCESS_WEAPONS, - ACCESS_CENT_GENERAL, - ACCESS_CENT_LIVING, + ACCESS_NT_REPRESENTATVE, ) extra_access = list( ACCESS_BAR, diff --git a/monkestation/code/modules/NTrep/NTrep_locker.dm b/monkestation/code/modules/NTrep/NTrep_locker.dm index c6eef48a86a7..187ec3b2d40b 100644 --- a/monkestation/code/modules/NTrep/NTrep_locker.dm +++ b/monkestation/code/modules/NTrep/NTrep_locker.dm @@ -1,6 +1,6 @@ /obj/structure/closet/secure_closet/nanotrasen_representative name = "Nanotrasen representative's locker" - req_access = list(ACCESS_CENT_GENERAL) + req_access = list(ACCESS_NT_REPRESENTATVE) icon_state = "cc" icon = 'monkestation/code/modules/blueshift/icons/obj/closet.dmi' diff --git a/monkestation/code/modules/aesthetics/objects/window_sill.dm b/monkestation/code/modules/aesthetics/objects/window_sill.dm index 657e83faa042..b65abfe192a6 100644 --- a/monkestation/code/modules/aesthetics/objects/window_sill.dm +++ b/monkestation/code/modules/aesthetics/objects/window_sill.dm @@ -53,8 +53,8 @@ /obj/structure/window_sill/attackby(obj/item/attacking_item, mob/user, params) . = ..() - if(!. || !isstack(attacking_item)) - return + if(!isstack(attacking_item)) + return FALSE var/obj/item/stack/stack_item = attacking_item if(istype(attacking_item, /obj/item/stack/sheet/glass)) if(stack_item.amount < 2) diff --git a/monkestation/code/modules/aesthetics/objects/windows.dm b/monkestation/code/modules/aesthetics/objects/windows.dm index d5f0962a68c6..8f4a8148e424 100644 --- a/monkestation/code/modules/aesthetics/objects/windows.dm +++ b/monkestation/code/modules/aesthetics/objects/windows.dm @@ -55,6 +55,10 @@ smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_GRILLE +/obj/structure/grille/window_sill/atom_break() + . = ..() + Destroy() + /obj/structure/grille/update_overlays(updates=ALL) . = ..() if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) diff --git a/monkestation/code/modules/antagonists/zombies/items.dm b/monkestation/code/modules/antagonists/zombies/items.dm new file mode 100644 index 000000000000..ef024f61fcb0 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/items.dm @@ -0,0 +1,9 @@ +/obj/item/mutant_hand/zombie + ///can we infect living people or not + var/highly_infecious = TRUE + +/obj/item/mutant_hand/zombie/low_infection + highly_infecious = FALSE + +/obj/item/mutant_hand/zombie/low_infection/weak + force = 17 diff --git a/monkestation/code/modules/antagonists/zombies/zombie_meteor_storm.dm b/monkestation/code/modules/antagonists/zombies/zombie_meteor_storm.dm new file mode 100644 index 000000000000..829ade47f8f1 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_meteor_storm.dm @@ -0,0 +1,109 @@ +//this is its own event type due to having a bunch of unique logic +/datum/round_event_control/zombie_meteor_wave + name = "Meteor Wave: Zombies" + typepath = /datum/round_event/zombie_meteor_wave + weight = 0 + max_occurrences = 0 + category = EVENT_CATEGORY_SPACE + description = "Spawn a wave of meteors containing zombies." + admin_setup = list(/datum/event_admin_setup/input_number/zombie_meteor_count) + +/datum/round_event/zombie_meteor_wave + start_when = 1 + end_when = 3 + var/meteor_count = 3 + +/datum/round_event/zombie_meteor_wave/start() + . = ..() + generate_meteors(meteor_count) + +/datum/round_event/zombie_meteor_wave/proc/generate_meteors(count = 1) + if(!count) + return + + var/list/candidates = SSpolling.poll_ghost_candidates("Would you like to be considered for a zombie meteor?", poll_time = 30 SECONDS) + if(!length(candidates)) + return + + for(var/i in 1 to count) + var/mob/dead/selected = pick_n_take(candidates) + var/datum/mind/player_mind = new(selected.key) + player_mind.active = TRUE + + var/turf/picked_start + if (SSmapping.is_planetary()) + var/list/possible_start = list() + for(var/obj/effect/landmark/carpspawn/spawn_point in GLOB.landmarks_list) + possible_start += get_turf(spawn_point) + picked_start = pick(possible_start) + else + var/start_z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) + var/start_side = pick(GLOB.cardinals) + picked_start = spaceDebrisStartLoc(start_side, start_z) + + if (!picked_start) + stack_trace("No valid spawn location for zombie meteor") + + var/mob/living/carbon/human/new_mob = new + var/obj/effect/meteor/meaty/zombie/zombie_meteor = new(picked_start, get_random_station_turf()) + new_mob.set_species(/datum/species/zombie/infectious) + new_mob.forceMove(zombie_meteor) + player_mind.transfer_to(new_mob, TRUE) + SEND_SOUND(new_mob, 'sound/magic/mutate.ogg') + message_admins("[ADMIN_LOOKUPFLW(new_mob)] has been made into a zombie by an event.") + new_mob.log_message("was spawned as a zombie by an event.", LOG_GAME) + if(!length(candidates)) + break + +/datum/event_admin_setup/input_number/zombie_meteor_count + input_text = "How many meteors would you like?" + default_value = 3 + +/datum/event_admin_setup/input_number/zombie_meteor_count/apply_to_event(datum/round_event/zombie_meteor_wave/event) + event.meteor_count = chosen_value + +/obj/effect/meteor/meaty/zombie + name = "rotting meaty meteor" + desc = "A loosely packed knit of flesh and skin, pulsating with unlife." + color = "#5EFF00" + heavy = FALSE + hits = 1 //Instantly splatters apart when it hits anything. + hitpwr = EXPLODE_LIGHT + threat = 100 + signature = "rotting lifesign" //In the extremely unlikely one-in-a-million chance that one of these gets reported by the stray meteor event + ///Where we want our zombie to, by whatever means, end up at. + var/atom/landing_target + +/obj/effect/meteor/meaty/zombie/Initialize(mapload, turf/target) + . = ..() + landing_target = target + +/obj/effect/meteor/meaty/zombie/meteor_effect() + ..() + for(var/atom/movable/child in contents) + child.forceMove(get_turf(src)) + +/obj/effect/meteor/meaty/zombie/ram_turf() + return //So we don't instantly smash into our occupant upon unloading them. + +/obj/effect/meteor/meaty/zombie/shield_defense(obj/machinery/satellite/meteor_shield/defender) + landing_target = defender + return TRUE + +//If the meteor misses the station and deletes itself, we make absolutely sure the changeling reaches the station. +/obj/effect/meteor/meaty/zombie/handle_stopping() + if(!landing_target) + //If our destination turf is gone for some reason, we chuck them at the observer_start landmark (usually at the center of the station) as a last resort. + landing_target = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list + + for(var/atom/movable/zombie in contents) + zombie.forceMove(get_turf(src)) + zombie.throw_at(landing_target, 2, 2) + zombie.visible_message(span_warning("[zombie] is launched out from inside of the [name]"), \ + span_warning("Sensing that something is terribly wrong, we forcibly eject ourselves from the [name]!")) + playsound(zombie, 'sound/effects/splat.ogg', 50, pressure_affected = FALSE) + + return ..() + +/obj/effect/meteor/meaty/zombie/check_examine_award(mob/user) //We don't want this to be a free achievement that comes with the role. + return diff --git a/monkestation/code/modules/antagonists/zombies/zombie_types/base_zombie.dm b/monkestation/code/modules/antagonists/zombies/zombie_types/base_zombie.dm new file mode 100644 index 000000000000..b277ddfd28e1 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_types/base_zombie.dm @@ -0,0 +1,194 @@ +#define FLESH_REQUIRED_TO_EVOLVE 200 + +// I would like to convert these to their own datum type but I have like 2 hours so this is what we are getting. +/datum/species/zombie/infectious + /// The path of mutant hands to give this zombie. + var/obj/item/mutant_hand/zombie/hand_path = /obj/item/mutant_hand/zombie + + /// The list of action types to give on gain. + var/list/granted_action_types = list( + /datum/action/cooldown/zombie/feast, + /datum/action/cooldown/zombie/evolve, + ) + + /// The list of action instances we have actually granted. + var/list/granted_actions = list() + + /// File that bodypart_overlay_icon_states pulls from. + var/list/bodypart_overlay_icon = 'monkestation/icons/mob/species/zombie/special_zombie_overlays.dmi' + + /// Associative list of bodypart overlays by body zone. + var/list/bodypart_overlay_icon_states = list() + + /// How much flesh we've consumed. Used for evolving. + var/consumed_flesh = 0 + +/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + for(var/zone as anything in bodypart_overlay_icon_states) + var/obj/item/bodypart/bodypart = C.get_bodypart(zone) + if(!bodypart) + continue + + var/overlay_state = bodypart_overlay_icon_states[zone] + var/datum/bodypart_overlay/simple/overlay = new + overlay.icon = bodypart_overlay_icon + overlay.icon_state = overlay_state + overlay.layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + + bodypart.add_bodypart_overlay(overlay) + +/datum/species/zombie/infectious/proc/set_consumed_flesh(mob/living/carbon/user, amount) + var/old_amount = consumed_flesh + consumed_flesh = max(0, amount) + + if(old_amount == consumed_flesh) + return + + SEND_SIGNAL(user, COMSIG_ZOMBIE_FLESH_ADJUSTED, consumed_flesh, old_amount) + +/datum/species/zombie/infectious/proc/adjust_consumed_flesh(mob/living/carbon/user, amount) + set_consumed_flesh(consumed_flesh + amount) + +/datum/action/cooldown/zombie + name = "Zombie Action" + desc = "You should not be seeing this." + background_icon = 'monkestation/icons/mob/actions/actions_zombie.dmi' + button_icon = 'monkestation/icons/mob/actions/actions_zombie.dmi' + background_icon_state = "bg_zombie" + check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + +/datum/action/cooldown/zombie/IsAvailable(feedback) + if(!iszombie(owner)) + CRASH("A non-zombie tried to use a zombie action, it seems the game has taken too much LSD today. (report this shit)") + return ..() + +/datum/action/cooldown/zombie/PreActivate(atom/target) + // Parent calls Activate(), so if parent returns TRUE, + // it means the activation happened successfuly by this point + . = ..() + if(!.) + return FALSE + // Xeno actions like "evolve" may result in our action (or our alien) being deleted + // In that case, we can just exit now as a "success" + if(QDELETED(src) || QDELETED(owner)) + return TRUE + + +/datum/action/cooldown/zombie/proc/update_button() + SIGNAL_HANDLER + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/datum/action/cooldown/zombie/feast + name = "Feast" + desc = "Consume the flesh of the fallen ones." + button_icon_state = "feast" + ranged_mousepointer = 'monkestation/icons/effects/mouse_pointers/feast.dmi' + click_to_activate = TRUE + cooldown_time = 5 SECONDS + +/datum/action/cooldown/zombie/feast/Activate(mob/living/target) + if(target == owner) // Don't eat yourself, dumbass. + return TRUE + + if(!istype(target)) + return TRUE + + if(!owner.Adjacent(target)) + owner.balloon_alert(owner, "get closer!") + return TRUE + + if(target.stat != DEAD) + owner.balloon_alert(owner, "[target.p_they()] [target.p_are()] alive!") + return TRUE + + if(HAS_TRAIT(target, TRAIT_ZOMBIE_CONSUMED)) + owner.balloon_alert(owner, "already consumed!") + return TRUE + + for(var/i in 1 to 4) + if(!do_after(owner, 0.5 SECONDS, target, timed_action_flags = IGNORE_HELD_ITEM | IGNORE_SLOWDOWNS)) + owner.balloon_alert(owner, "interrupted!") + return TRUE + playsound(owner, 'sound/items/eatfood.ogg', vol = 80, vary = TRUE) // Om nom nom, good flesh. + + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + carbon_target.apply_damage(25, BRUTE, pick(carbon_target.bodyparts), forced = TRUE, wound_bonus = 10, sharpness = SHARP_EDGED, attack_direction = get_dir(owner, target)) + else + playsound(target, 'sound/effects/wounds/blood2.ogg', vol = 50, vary = TRUE) + target.adjustBruteLoss(25) + + ADD_TRAIT(target, TRAIT_ZOMBIE_CONSUMED, ZOMBIE_TRAIT) + + var/mob/living/carbon/user = owner + + var/healing = target.maxHealth // Bigger kills give more health, most simple mobs will be worth far less than a carbon. + var/needs_update = FALSE // Optimization, if nothing changes then don't update our owner's health. + needs_update += user.adjustBruteLoss(-healing, updating_health = FALSE) + needs_update += user.adjustFireLoss(-healing, updating_health = FALSE) + needs_update += user.adjustToxLoss(-healing, updating_health = FALSE) + needs_update += user.adjustOxyLoss(-healing, updating_health = FALSE) + + if(needs_update) + user.updatehealth() + + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -healing) + user.set_nutrition(min(user.nutrition + healing, NUTRITION_LEVEL_FULL)) // Doesn't use adjust_nutrition since that would make the zombies fat. + + var/datum/species/zombie/infectious/zombie_datum = user.dna.species + zombie_datum.consumed_flesh += healing + + ..() + + return TRUE + +/// Evolve into a special zombie, needs at least FLESH_REQUIRED_TO_EVOLVE consumed flesh. +/datum/action/cooldown/zombie/evolve + name = "Evolve" + desc = "Mutate into something even more grotesque and powerful. You must consume the flesh of the dead beforehand." + button_icon_state = "evolve" + +/datum/action/cooldown/zombie/evolve/Grant(mob/granted_to) + . = ..() + RegisterSignal(granted_to, COMSIG_ZOMBIE_FLESH_ADJUSTED, PROC_REF(update_button)) + +/datum/action/cooldown/zombie/evolve/Remove(mob/removed_from) + . = ..() + UnregisterSignal(removed_from, COMSIG_ZOMBIE_FLESH_ADJUSTED) + +/datum/action/cooldown/zombie/evolve/IsAvailable(feedback) + if(!..()) + return FALSE + + var/mob/living/carbon/user = owner + var/datum/species/zombie/infectious/zombie_datum = user.dna.species + + if(zombie_datum.consumed_flesh < FLESH_REQUIRED_TO_EVOLVE) + if(feedback) + user.balloon_alert(user, "needs [ceil(FLESH_REQUIRED_TO_EVOLVE - zombie_datum.consumed_flesh)] more flesh!") + return FALSE + + return TRUE + +/datum/action/cooldown/zombie/evolve/Activate(atom/target) + . = ..() + + var/mob/living/carbon/user = owner + + var/datum/species/picked = show_radial_menu(user, user, subtypesof(/datum/species/zombie/infectious)) + + if(!picked) + return + + user.set_species(picked) + + user.visible_message( + message = span_danger("[user]'s flesh shifts, tears and changes, giving way to something even more dangerous!"), + self_message = span_alien("Your flesh shifts, tears and changes as you transform into a [lowertext(initial(picked.name))]!"), + blind_message = span_hear("You hear a grotesque cacophony of flesh shifting and tearing!"), + ) + + playsound(user, 'sound/effects/blobattack.ogg', vol = 80, vary = TRUE) + +#undef FLESH_REQUIRED_TO_EVOLVE diff --git a/monkestation/code/modules/antagonists/zombies/zombie_types/bloater.dm b/monkestation/code/modules/antagonists/zombies/zombie_types/bloater.dm new file mode 100644 index 000000000000..3cb3bf81ca14 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_types/bloater.dm @@ -0,0 +1,118 @@ +//UNIMPLEMENTED +//explodes on death, blinding(and damaging?) nearby non zombies +/datum/species/zombie/infectious/bloater + name = "Bloater Zombie" + id = SPECIES_ZOMBIE_INFECTIOUS_BLOATER + bodypart_overlay_icon_states = list(BODY_ZONE_CHEST = "bloater-chest", BODY_ZONE_R_ARM = "generic-right-hand", BODY_ZONE_L_ARM = "generic-left-hand") + granted_action_types = list( + /datum/action/cooldown/zombie/melt_wall, + /datum/action/cooldown/zombie/explode, + ) + +/datum/species/zombie/infectious/bloater/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + RegisterSignal(C, COMSIG_LIVING_DEATH, PROC_REF(on_death)) + +/datum/species/zombie/infectious/bloater/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) + . = ..() + UnregisterSignal(C, COMSIG_LIVING_DEATH) + +/datum/species/zombie/infectious/bloater/proc/on_death(mob/living/carbon/user, gibbed) + SIGNAL_HANDLER + + if(gibbed || QDELETED(user)) // Congratulations, you've defused the bomb. + return + + user.visible_message( + message = span_danger("[user] bursts apart into a violent shower of infectious gibs!"), + self_message = span_userdanger("You burst apart!"), + blind_message = span_hear("You hear squelching and tearing as your eardrums are assaulted by noise!"), + ) + + var/infects = 0 + + for(var/mob/living/target in oview(4, user)) //need to make this not go through glass + to_chat(target, span_userdanger("Some of the gibs flew onto you!")) + + var/datum/client_colour/colour = target.add_client_colour(/datum/client_colour/bloodlust) + QDEL_IN(colour, 1.1 SECONDS) + + var/dist = max(1, get_dist(user, target)) + + target.adjustBruteLoss(50 / dist) + target.adjustFireLoss(50 / dist) + + target.throw_at(get_edge_target_turf(user, get_dir(user, target)), range = 4 / dist, speed = 2, spin = FALSE) + + if(!iscarbon(target) || !prob(80 / max(1, dist))) // A minimum of a 20% chance to infect. + continue + + var/mob/living/carbon/infectee = target + var/obj/item/organ/internal/zombie_infection/infection + infection = infectee.get_organ_slot(ORGAN_SLOT_ZOMBIE) + if(!infection) + infection = new() + infection.Insert(infectee) + + infects++ + + if(infects > 0) + to_chat(user, span_alien("In your final moments, you managed to infect [infects] [infects == 1 ? "person" : "people"].")) + + user.gib(no_brain = TRUE, no_organs = TRUE, no_bodyparts = TRUE, safe_gib = FALSE) + +/datum/action/cooldown/zombie/melt_wall + name = "Stomach Acid" + desc = "Drench an object in stomach acid, destroying it over time." + button_icon_state = "zombie_vomit" + background_icon_state = "bg_zombie" + cooldown_time = 30 SECONDS + click_to_activate = TRUE + +/datum/action/cooldown/zombie/melt_wall/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("You prepare to vomit. Click a target to puke on it!")) + on_who.update_icons() + +/datum/action/cooldown/zombie/melt_wall/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("You empty your mouth.")) + on_who.update_icons() + +/datum/action/cooldown/zombie/melt_wall/PreActivate(atom/target) + if(get_dist(owner, target) > 1) + return FALSE + if(ismob(target)) //If it could corrode mobs, it would one-shot them. + owner.balloon_alert(owner, "doesn't work on mobs!") + return FALSE + + return ..() + +/datum/action/cooldown/zombie/melt_wall/Activate(atom/target) + if(!target.acid_act(200, 1000)) + to_chat(owner, span_notice("You cannot dissolve this object.")) + return FALSE + + owner.visible_message( + span_alert("[owner] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!"), + span_notice("You vomit globs of acid over [target]. It begins to sizzle and melt."), + ) + return TRUE + +/datum/action/cooldown/zombie/explode + name = "Explode" + button_icon_state = "explode" + desc = "Trigger the explosive cocktail residing in your body, causing a devastating explosion that infects nearby targets. Triggers automatically on death." + check_flags = NONE + +/datum/action/cooldown/zombie/explode/Activate(atom/target) + . = ..() + var/mob/living/user = owner + user.death() // lol diff --git a/monkestation/code/modules/antagonists/zombies/zombie_types/runner.dm b/monkestation/code/modules/antagonists/zombies/zombie_types/runner.dm new file mode 100644 index 000000000000..5425eb24f6a2 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_types/runner.dm @@ -0,0 +1,23 @@ +//NEEDS TO BE MADE FAST +/datum/species/zombie/infectious/runner + name = "Runner Zombie" + id = SPECIES_ZOMBIE_INFECTIOUS_RUNNER + maxhealthmod = 0.7 + armor = 0 + hand_path = /obj/item/mutant_hand/zombie/low_infection/weak + granted_action_types = list() + bodypart_overlay_icon_states = list(BODY_ZONE_CHEST = "runner-chest", BODY_ZONE_HEAD = "runner-head") + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/zombie, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/zombie, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/zombie, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/zombie/runner, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie/runner, + ) + +/obj/item/bodypart/leg/left/zombie/runner + speed_modifier = -0.2 + +/obj/item/bodypart/leg/right/zombie/runner + speed_modifier = -0.2 diff --git a/monkestation/code/modules/antagonists/zombies/zombie_types/spitter.dm b/monkestation/code/modules/antagonists/zombies/zombie_types/spitter.dm new file mode 100644 index 000000000000..b1f4adca7bc2 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_types/spitter.dm @@ -0,0 +1,81 @@ +//UNIMPLEMENTED +//spits weak knockdown projectiles +/datum/species/zombie/infectious/spitter + name = "Spitter Zombie" + id = SPECIES_ZOMBIE_INFECTIOUS_SPITTER + bodypart_overlay_icon_states = list(BODY_ZONE_CHEST = "spitter-chest", BODY_ZONE_HEAD = "spitter_head", BODY_ZONE_R_ARM = "spitter-right-hand", BODY_ZONE_L_ARM = "spitter-left-hand") + granted_action_types = list( + /datum/action/cooldown/zombie/spit, + ) + + +//Just stole aliens stuff, needs some rewording +/datum/action/cooldown/zombie/spit + name = "Spit" + desc = "Spit at someone, causing them to fall down and get burnt." + background_icon_state = "bg_zombie" + button_icon_state = "spit_off" + cooldown_time = 8 SECONDS + click_to_activate = TRUE + +/datum/action/cooldown/zombie/spit/IsAvailable(feedback = FALSE) + if(owner.is_muzzled()) + return FALSE + + if(!isturf(owner.loc)) + return FALSE + return ..() + +/datum/action/cooldown/zombie/spit/set_click_ability(mob/on_who) + . = ..() + if(!.) + return + + to_chat(on_who, span_notice("You prepare to spit. Left-click to fire at a target!")) + + button_icon_state = "spit_on" + build_all_button_icons() + on_who.update_icons() + +/datum/action/cooldown/zombie/spit/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!.) + return + + if(refund_cooldown) + to_chat(on_who, span_notice("You empty your mouth.")) + + button_icon_state = "spit_off" + build_all_button_icons() + on_who.update_icons() + +// We do this in InterceptClickOn() instead of Activate() +// because we use the click parameters for aiming the projectile +// (or something like that) +/datum/action/cooldown/zombie/spit/InterceptClickOn(mob/living/user, params, atom/target) + . = ..() + if(!.) + unset_click_ability(user, refund_cooldown = FALSE) + return FALSE + + var/modifiers = params2list(params) + user.visible_message( + span_danger("[user] spits!"), + span_alert("You spit."), + ) + var/obj/projectile/neurotoxin/zombie/spit = new(user.loc) + spit.preparePixelProjectile(target, user, modifiers) + spit.firer = user + spit.fire() + user.newtonian_move(get_dir(target, user)) + return TRUE + +// Has to return TRUE, otherwise is skipped. +/datum/action/cooldown/zombie/spit/Activate(atom/target) + return TRUE + +/obj/projectile/neurotoxin/zombie + name = "spit" + icon_state = "glob_projectile" + damage = 20 + damage_type = BURN diff --git a/monkestation/code/modules/antagonists/zombies/zombie_types/tank.dm b/monkestation/code/modules/antagonists/zombies/zombie_types/tank.dm new file mode 100644 index 000000000000..d271059f67d4 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombie_types/tank.dm @@ -0,0 +1,23 @@ +/datum/species/zombie/infectious/tank + name = "Tank Zombie" + id = SPECIES_ZOMBIE_INFECTIOUS_TANK + armor = 40 + maxhealthmod = 1.5 + heal_rate = 1 // Slightly higher regeneration rate. + hand_path = /obj/item/mutant_hand/zombie/low_infection + granted_action_types = list() + bodypart_overlay_icon_states = list(BODY_ZONE_CHEST = "tank-chest", BODY_ZONE_HEAD = "tank_head", BODY_ZONE_R_ARM = "generic-right-hand", BODY_ZONE_L_ARM = "generic-left-hand") + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/zombie, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/zombie, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/zombie, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/zombie/tank, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie/tank, + ) + +/obj/item/bodypart/leg/left/zombie/tank + speed_modifier = 1.2 + +/obj/item/bodypart/leg/right/zombie/tank + speed_modifier = 1.2 diff --git a/monkestation/code/modules/antagonists/zombies/zombification_component.dm b/monkestation/code/modules/antagonists/zombies/zombification_component.dm new file mode 100644 index 000000000000..a6ad9b247c23 --- /dev/null +++ b/monkestation/code/modules/antagonists/zombies/zombification_component.dm @@ -0,0 +1,40 @@ +/datum/component/zombified + var/obj/item/organ/internal/zombie_infection/tumor + +///The component given to zombified mobs +/datum/component/zombified/Initialize(obj/item/organ/internal/zombie_infection/_tumor) + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + + tumor = _tumor + +/datum/component/zombified/RegisterWithParent() + +/datum/component/zombified/UnregisterFromParent() + + +/datum/component/zombified/proc/signalproc(datum/source) + SIGNAL_HANDLER + send_to_playing_players("[source] signaled [src]!") + +/* +/datum/component/zombified/InheritComponent(datum/component/zombified/old, i_am_original, list/arguments) + myvar = old.myvar + + if(i_am_original) + send_to_playing_players("No parent should have to bury their child") +*/ + +/* +/datum/component/zombified/PreTransfer() + send_to_playing_players("Goodbye [parent], I'm getting adopted") + +/datum/component/zombified/PostTransfer() + send_to_playing_players("Hello my new parent, [parent]! It's nice to meet you!") +*/ + +/* +/datum/component/zombified/CheckDupeComponent(datum/zombified/new, myargone, myargtwo) + if(myargone == myvar) + return TRUE +*/ diff --git a/monkestation/code/modules/art_sci_overrides/faults/clowning.dm b/monkestation/code/modules/art_sci_overrides/faults/clowning.dm index 891e99e825ab..2e0cfb6c9323 100644 --- a/monkestation/code/modules/art_sci_overrides/faults/clowning.dm +++ b/monkestation/code/modules/art_sci_overrides/faults/clowning.dm @@ -1,7 +1,11 @@ /datum/artifact_fault/clown name = "Funny Fault" trigger_chance = 5 - inspect_warning = list("Smells faintly of bananas","Looks Funny.","Hates mimes.") + inspect_warning = list( + "Smells faintly of bananas", + "Looks funny.", + "Hates mimes.", + ) visible_message = "summons a portal to the HONK DIMENSION!" discovered_credits = -500 research_value = 250 @@ -14,6 +18,5 @@ if(!center_turf) CRASH("[src] had attempted to trigger, but failed to find the center turf!") - var/obj/structure/spawner/clown/hehe = new(src) - - addtimer(CALLBACK(hehe,PROC_REF(Destroy)),3 MINUTE) + var/obj/structure/spawner/clown/hehe = new(center_turf) + QDEL_IN(hehe, 3 MINUTES) diff --git a/monkestation/code/modules/art_sci_overrides/faults/just_death.dm b/monkestation/code/modules/art_sci_overrides/faults/just_death.dm index c2585b17aef3..d3d5f24c80ce 100644 --- a/monkestation/code/modules/art_sci_overrides/faults/just_death.dm +++ b/monkestation/code/modules/art_sci_overrides/faults/just_death.dm @@ -2,9 +2,11 @@ name = "Instant Death Fault" trigger_chance = 50 //God forbid this actually rolls on a touch artifact,like it did during my testing. visible_message = "blows someone up with mind." - inspect_warning = list(span_danger("The grim reapers scythe seems to be reflected in its surface!"), - span_danger("An Aura of death surrounds this object!"), - span_danger("I'd bet 50/50 someone dies if this turns on!")) + inspect_warning = list( + span_danger("The grim reapers scythe seems to be reflected in its surface!"), + span_danger("An aura of death surrounds this object!"), + span_danger("I'd bet 50/50 someone dies if this turns on!") + ) research_value = 10000 //Wow, this would make a fucking amazing weapon diff --git a/monkestation/code/modules/art_sci_overrides/faults/monkey_mode.dm b/monkestation/code/modules/art_sci_overrides/faults/monkey_mode.dm index 753de53424a5..6fd1c80c4279 100644 --- a/monkestation/code/modules/art_sci_overrides/faults/monkey_mode.dm +++ b/monkestation/code/modules/art_sci_overrides/faults/monkey_mode.dm @@ -8,27 +8,22 @@ weight = ARTIFACT_VERYUNCOMMON /datum/artifact_fault/monkey_mode/on_trigger() - var/monkey = rand(1,4) + var/monkeys_to_spawn = rand(1,4) var/center_turf = get_turf(our_artifact.parent) var/list/turf/valid_turfs = list() if(!center_turf) CRASH("[src] had attempted to trigger, but failed to find the center turf!") - for(var/turf/boi in range(rand(3,6),center_turf)) - if(boi.density) + for(var/turf/boi in range(rand(3, 6), center_turf)) + if(boi.is_blocked_turf(source_atom = our_artifact.parent)) continue valid_turfs += boi - for(var/i in 1 to monkey) - var/turf/spawnon = pick(valid_turfs) - valid_turfs -= spawnon - var/pain = roll(1,100) - var/mob/living/M //For monkey - switch(pain) + for(var/i in 1 to min(monkeys_to_spawn, length(valid_turfs))) + var/turf/spawnon = pick_n_take(valid_turfs) + switch(rand(1, 100)) if(1 to 75) - M = new /mob/living/carbon/human/species/monkey/angry(spawnon) + new /mob/living/carbon/human/species/monkey/angry(spawnon) if(75 to 95) - M = new /mob/living/basic/gorilla(spawnon) + new /mob/living/basic/gorilla(spawnon) if(95 to 100) - M = new /mob/living/basic/gorilla/lesser(spawnon)//OH GOD ITS TINY - if(M) //Just in case. - M.forceMove(spawnon) + new /mob/living/basic/gorilla/lesser(spawnon)//OH GOD ITS TINY diff --git a/monkestation/code/modules/art_sci_overrides/faults/whispers.dm b/monkestation/code/modules/art_sci_overrides/faults/whispers.dm index 727c88a3f55c..ecc1366e538b 100644 --- a/monkestation/code/modules/art_sci_overrides/faults/whispers.dm +++ b/monkestation/code/modules/art_sci_overrides/faults/whispers.dm @@ -1,5 +1,5 @@ /datum/artifact_fault/whisper - name = "Wispering Fault" + name = "Whispering Fault" trigger_chance = 75 var/list/whispers = list("Help me!","I've seen your sins","Egg.") diff --git a/monkestation/code/modules/blueshield/closet.dm b/monkestation/code/modules/blueshield/closet.dm index 7dde3112058d..f80a8e9b8961 100644 --- a/monkestation/code/modules/blueshield/closet.dm +++ b/monkestation/code/modules/blueshield/closet.dm @@ -24,7 +24,7 @@ name = "blueshield's locker" icon_state = "bs" icon = 'monkestation/code/modules/blueshift/icons/obj/closet.dmi' - req_access = list(ACCESS_CENT_GENERAL) + req_access = list(ACCESS_BLUESHIELD) /obj/structure/closet/secure_closet/blueshield/New() ..() diff --git a/monkestation/code/modules/blueshield/trim.dm b/monkestation/code/modules/blueshield/trim.dm index c1f35f30a688..53d908c90fa7 100644 --- a/monkestation/code/modules/blueshield/trim.dm +++ b/monkestation/code/modules/blueshield/trim.dm @@ -14,7 +14,7 @@ ACCESS_SECURITY, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_BRIG_ENTRANCE, - ACCESS_CENT_GENERAL, + ACCESS_BLUESHIELD, ACCESS_COMMAND, ACCESS_CONSTRUCTION, ACCESS_ENGINEERING, diff --git a/monkestation/code/modules/blueshift/components/soulcatcher_base.dm b/monkestation/code/modules/blueshift/components/soulcatcher_base.dm index 4a10e7832efa..2085a93a840d 100644 --- a/monkestation/code/modules/blueshift/components/soulcatcher_base.dm +++ b/monkestation/code/modules/blueshift/components/soulcatcher_base.dm @@ -77,7 +77,8 @@ GLOBAL_LIST_EMPTY(soulcatchers) * * target_name - The name that we want to assign to the created room. * * target_desc - The description that we want to assign to the created room. */ -/datum/component/soulcatcher/proc/create_room(target_name = "Default Room", target_desc = "An orange platform suspended in space orbited by reflective cubes of various sizes. There really isn't much here at the moment.") +/datum/component/soulcatcher/proc/create_room(target_name = "Default Room", \ + target_desc = "An orange platform suspended in space orbited by reflective cubes of various sizes. There really isn't much here at the moment.") var/datum/soulcatcher_room/created_room = new(src) created_room.name = target_name created_room.room_description = target_desc @@ -155,13 +156,14 @@ GLOBAL_LIST_EMPTY(soulcatchers) /// Checks the total number of souls present and compares it with `max_souls` returns `TRUE` if there is room (or no limit), otherwise returns `FALSE` /datum/component/soulcatcher/proc/check_for_vacancy() - if(!max_souls) + return FALSE + /*if(!max_souls) return TRUE if(length(get_current_souls()) >= max_souls) return FALSE - return TRUE + return TRUE*/ /// Attempts to remove the soulcatcher from the attached object /datum/component/soulcatcher/proc/remove_self() diff --git a/monkestation/code/modules/blueshift/elements/caseless.dm b/monkestation/code/modules/blueshift/elements/caseless.dm index 587a32f2b304..e6b2c7a6c8c3 100644 --- a/monkestation/code/modules/blueshift/elements/caseless.dm +++ b/monkestation/code/modules/blueshift/elements/caseless.dm @@ -34,4 +34,8 @@ var/obj/item/gun/shot_from = fired_from if(shot_from.chambered == shell) shot_from.chambered = null //Nuke it. Nuke it now. + if(istype(shot_from, /obj/item/gun/ballistic/revolver/sol)) + var/obj/item/ammo_box/magazine/internal/cylinder/c35sol/cylinder1 = shot_from.contents[2] + cylinder1.stored_ammo[1] = null + return QDEL_NULL(shell) diff --git a/monkestation/code/modules/blueshift/elements/gun_launches_little_guy.dm b/monkestation/code/modules/blueshift/elements/gun_launches_little_guy.dm index 8174d3ce26b4..322ea68902a1 100644 --- a/monkestation/code/modules/blueshift/elements/gun_launches_little_guy.dm +++ b/monkestation/code/modules/blueshift/elements/gun_launches_little_guy.dm @@ -34,7 +34,7 @@ /datum/element/gun_launches_little_guys/proc/throw_it_back(obj/item/gun/weapon, mob/living/carbon/user, atom/target, params, zone_override) SIGNAL_HANDLER - if(!issimian(user) && !HAS_TRAIT(user, TRAIT_DWARF) && !(user.dna.features["body_size"] <= 0.9)) + if(!ismonkey(user) && !HAS_TRAIT(user, TRAIT_DWARF) && !(user.dna.features["body_size"] <= 0.9)) return var/fling_direction = REVERSE_DIR(user.dir) diff --git a/monkestation/code/modules/blueshift/items/ammo.dm b/monkestation/code/modules/blueshift/items/ammo.dm index d06142daabe2..54b8b019fe2f 100644 --- a/monkestation/code/modules/blueshift/items/ammo.dm +++ b/monkestation/code/modules/blueshift/items/ammo.dm @@ -266,28 +266,24 @@ // .35 Sol Short // Pistol caliber caseless round used almost exclusively by SolFed weapons +//CASELESS VAR IS ADDED SO THAT REVOLVER CHAMBERS KNOW WHAT TO DO WITH IT /obj/item/ammo_casing/c35sol name = ".35 Sol Short lethal bullet casing" desc = "A SolFed standard caseless lethal pistol round." - icon = 'monkestation/code/modules/blueshift/icons/obj/company_and_or_faction_based/carwo_defense_systems/ammo.dmi' icon_state = "35sol" - caliber = CALIBER_SOL35SHORT projectile_type = /obj/projectile/bullet/c35sol - /obj/item/ammo_casing/c35sol/Initialize(mapload) . = ..() - AddElement(/datum/element/caseless) /obj/projectile/bullet/c35sol name = ".35 Sol Short bullet" damage = 15 - wound_bonus = -5 // Normal bullets are 20 bare_wound_bonus = 5 embed_falloff_tile = -4 @@ -296,14 +292,10 @@ /obj/item/ammo_box/c35sol name = "ammo box (.35 Sol Short lethal)" desc = "A box of .35 Sol Short pistol rounds, holds twenty-four rounds." - icon = 'monkestation/code/modules/blueshift/icons/obj/company_and_or_faction_based/carwo_defense_systems/ammo.dmi' icon_state = "35box" - multiple_sprites = AMMO_BOX_FULL_EMPTY - w_class = WEIGHT_CLASS_NORMAL - caliber = CALIBER_SOL35SHORT ammo_type = /obj/item/ammo_casing/c35sol max_ammo = 24 @@ -314,9 +306,7 @@ /obj/item/ammo_casing/c35sol/incapacitator name = ".35 Sol Short incapacitator bullet casing" desc = "A SolFed standard caseless less-lethal pistol round. Exhausts targets on hit, has a tendency to bounce off walls at shallow angles." - icon_state = "35sol_disabler" - projectile_type = /obj/projectile/bullet/c35sol/incapacitator harmful = FALSE @@ -325,10 +315,8 @@ name = ".35 Sol Short incapacitator bullet" damage = 5 stamina = 30 - wound_bonus = -40 bare_wound_bonus = -20 - weak_against_armour = TRUE // The stats of the ricochet are a nerfed version of detective revolver rubber ammo @@ -339,7 +327,6 @@ ricochet_incidence_leeway = 50 ricochet_chance = 130 ricochet_decay_damage = 0.8 - shrapnel_type = null sharpness = NONE embedding = null @@ -348,9 +335,7 @@ /obj/item/ammo_box/c35sol/incapacitator name = "ammo box (.35 Sol Short incapacitator)" desc = "A box of .35 Sol Short pistol rounds, holds twenty-four rounds. The blue stripe indicates this should hold less-lethal ammunition." - icon_state = "35box_disabler" - ammo_type = /obj/item/ammo_casing/c35sol/incapacitator @@ -359,10 +344,8 @@ /obj/item/ammo_casing/c35sol/ripper name = ".35 Sol Short ripper bullet casing" desc = "A SolFed standard caseless ripper pistol round. Causes slashing wounds on targets, but is weak to armor." - icon_state = "35sol_shrapnel" projectile_type = /obj/projectile/bullet/c35sol/ripper - custom_materials = AMMO_MATS_RIPPER advanced_print_req = TRUE @@ -370,14 +353,10 @@ /obj/projectile/bullet/c35sol/ripper name = ".35 Sol ripper bullet" damage = 12 - weak_against_armour = TRUE - sharpness = SHARP_EDGED - wound_bonus = 20 bare_wound_bonus = 20 - embedding = list( embed_chance = 75, fall_chance = 3, @@ -395,9 +374,7 @@ /obj/item/ammo_box/c35sol/ripper name = "ammo box (.35 Sol Short ripper)" desc = "A box of .35 Sol Short pistol rounds, holds twenty-four rounds. The purple stripe indicates this should hold hollowpoint-like ammunition." - icon_state = "35box_shrapnel" - ammo_type = /obj/item/ammo_casing/c35sol/ripper // .40 Sol Long @@ -406,24 +383,20 @@ /obj/item/ammo_casing/c40sol name = ".40 Sol Long lethal bullet casing" desc = "A SolFed standard caseless lethal rifle round." - icon = 'monkestation/code/modules/blueshift/icons/obj/company_and_or_faction_based/carwo_defense_systems/ammo.dmi' icon_state = "40sol" - caliber = CALIBER_SOL40LONG projectile_type = /obj/projectile/bullet/c40sol /obj/item/ammo_casing/c40sol/Initialize(mapload) . = ..() - AddElement(/datum/element/caseless) /obj/projectile/bullet/c40sol name = ".40 Sol Long bullet" damage = 20 - wound_bonus = 10 bare_wound_bonus = 20 diff --git a/monkestation/code/modules/blueshift/items/barber.dm b/monkestation/code/modules/blueshift/items/barber.dm index 293f0dd70a58..c30a3d4d928a 100644 --- a/monkestation/code/modules/blueshift/items/barber.dm +++ b/monkestation/code/modules/blueshift/items/barber.dm @@ -311,6 +311,7 @@ /obj/item/lipstick/quantum = 1, /obj/item/razor = 1, /obj/item/storage/box/perfume = 1, + /obj/item/secateurs = 1, //monkestation edit: plant ) refill_canister = /obj/item/vending_refill/barbervend default_price = PAYCHECK_CREW diff --git a/monkestation/code/modules/blueshift/items/company_guns.dm b/monkestation/code/modules/blueshift/items/company_guns.dm index 98dc570b10ce..f99c598cfaaf 100644 --- a/monkestation/code/modules/blueshift/items/company_guns.dm +++ b/monkestation/code/modules/blueshift/items/company_guns.dm @@ -462,16 +462,11 @@ /obj/item/gun/ballistic/revolver/sol name = "\improper Eland Revolver" desc = "A small revolver with a comically short barrel and cylinder space for eight .35 Sol Short rounds." - icon = 'monkestation/code/modules/blueshift/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' icon_state = "eland" - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/c35sol - suppressor_x_offset = 3 - w_class = WEIGHT_CLASS_SMALL - can_suppress = TRUE /obj/item/gun/ballistic/revolver/sol/give_manufacturer_examine() @@ -504,19 +499,13 @@ /obj/item/gun/ballistic/revolver/takbok name = "\improper Takbok Revolver" desc = "A hefty revolver with an equally large cylinder capable of holding five .585 Trappiste rounds." - icon = 'monkestation/code/modules/blueshift/icons/obj/company_and_or_faction_based/trappiste_fabriek/guns32x.dmi' icon_state = "takbok" - fire_sound = 'monkestation/code/modules/blueshift/sounds/revolver_heavy.ogg' suppressed_sound = 'monkestation/code/modules/blueshift/sounds/suppressed_heavy.ogg' - accepted_magazine_type = /obj/item/ammo_box/magazine/internal/cylinder/c585trappiste - suppressor_x_offset = 5 - can_suppress = TRUE - fire_delay = 1 SECONDS recoil = 3 wield_recoil = 1 diff --git a/monkestation/code/modules/blueshift/items/handheld_soulcatcher.dm b/monkestation/code/modules/blueshift/items/handheld_soulcatcher.dm index 518ab620408f..198f954f6867 100644 --- a/monkestation/code/modules/blueshift/items/handheld_soulcatcher.dm +++ b/monkestation/code/modules/blueshift/items/handheld_soulcatcher.dm @@ -2,7 +2,11 @@ /obj/item/handheld_soulcatcher name = "\improper Evoker-type RSD" - desc = "The Evoker-Type Resonance Simulation Device is a sort of 'Soulcatcher' instrument that's been designated for handheld usage. These RSDs were designed with the Medical field in mind, a tool meant to offer comfort to the temporarily-departed while their bodies are being repaired, healed, or produced. The Evoker is essentially a very specialized handheld NIF, still using the same nanomachinery for the software and hardware. This careful instrument is able to host a virtual space for a great number of Engrams for an essentially indefinite amount of time in an unlimited variety of simulations, even able to transfer them to and from a NIF. However, it's best Medical practice to not lollygag." + desc = "The Evoker-Type Resonance Simulation Device is a sort of 'Soulcatcher' instrument that's been designated for handheld usage. \ + These RSDs were designed with the Medical field in mind, a tool meant to offer comfort to the temporarily-departed while their bodies are being repaired, \ + healed, or produced. The Evoker is essentially a very specialized handheld NIF, still using the same nanomachinery for the software and hardware. \ + This careful instrument is able to host a virtual space for a great number of Engrams for an essentially indefinite amount of time in an \ + unlimited variety of simulations, even able to transfer them to and from a NIF. However, it's best Medical practice to not lollygag." icon = 'monkestation/code/modules/blueshift/icons/obj/devices.dmi' icon_state = "soulcatcher-device" inhand_icon_state = "electronic" @@ -24,7 +28,7 @@ /obj/item/handheld_soulcatcher/attack_self(mob/user, modifiers) linked_soulcatcher.ui_interact(user) -/obj/item/handheld_soulcatcher/New(loc, ...) +/obj/item/handheld_soulcatcher/Initialize(mapload) . = ..() linked_soulcatcher = AddComponent(/datum/component/soulcatcher) linked_soulcatcher.name = name diff --git a/monkestation/code/modules/brewin_and_chewin/brewing/fermintation_keg.dm b/monkestation/code/modules/brewin_and_chewin/brewing/fermintation_keg.dm index ba4f66a5f3da..0f95b71205b6 100644 --- a/monkestation/code/modules/brewin_and_chewin/brewing/fermintation_keg.dm +++ b/monkestation/code/modules/brewin_and_chewin/brewing/fermintation_keg.dm @@ -28,6 +28,9 @@ GLOBAL_LIST_EMPTY(custom_fermentation_recipes) ///our made item which we clear once its no longer ready to bottle var/made_item + ///icon used for wrapping the keg. set to NULL for any intentionally unwrappable subtypes. + var/delivery_icon = "deliverykeg" + /obj/structure/fermentation_keg/Initialize() diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/crafting_component_additions.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/crafting_component_additions.dm new file mode 100644 index 000000000000..cb6ce37fc979 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/crafting_component_additions.dm @@ -0,0 +1,31 @@ + +/datum/component/personal_crafting/proc/craft_until_cant(datum/crafting_recipe/recipe_to_use, mob/chef, turf/craft_location, craft_time) + if(!craft_time) + craft_time = recipe_to_use.time + while(TRUE) + // attempt_craft_loop sleeps, so this won't freeze the server while we craft + if(!attempt_craft_loop(recipe_to_use, chef, craft_location, craft_time)) + break + craft_time = max(5, craft_time * 0.75) // speed up the more you craft in a batch + +/// Attempts a crafting loop. Returns true if it succeeds, false otherwise +/datum/component/personal_crafting/proc/attempt_craft_loop(datum/crafting_recipe/recipe_to_use, mob/chef, turf/craft_location, craft_time) + var/list/surroundings = get_surroundings(chef) + if(!check_contents(chef, recipe_to_use, surroundings)) + chef.balloon_alert_to_viewers("failed to craft, missing ingredients!") + return FALSE + + var/atom/movable/result = construct_item(chef, recipe_to_use, craft_time) + if(istext(result)) + chef.balloon_alert_to_viewers("failed to craft[result]") + return FALSE + //We made an item and didn't get a fail message + result.forceMove(craft_location) + result.pixel_x = rand(-10, 10) + result.pixel_y = rand(-10, 10) + if(isitem(result)) + var/obj/item/item_result = result + item_result.do_drop_animation(chef) + chef.investigate_log("[key_name(chef)] crafted [recipe_to_use]", INVESTIGATE_CRAFTING) + recipe_to_use.on_craft_completion(chef, result) + return TRUE diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/edible_component_additions.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/edible_component_additions.dm new file mode 100644 index 000000000000..ace344530a29 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/edible_component_additions.dm @@ -0,0 +1,39 @@ +/datum/component/edible/proc/check_menu(mob/user) + if(!istype(user)) + return FALSE + if(user.incapacitated() || !user.Adjacent(parent)) + return FALSE + return TRUE + +/datum/component/edible/proc/show_radial_recipes(atom/parent_atom, mob/user) + SIGNAL_HANDLER + if(!ishuman(user)) + return + var/mob/living/carbon/human/chef = user + var/datum/component/personal_crafting/crafting_menu = user.GetComponent(/datum/component/personal_crafting) // we turned crafting into a component so now I have to do this shit to avoid copypaste + if(!crafting_menu) + CRASH("This really needs to be looked into this is not suppose to happen like ever. A human tried to show radial recipes without a crafting component") + var/list/available_recipes = list() + var/list/surroundings = crafting_menu.get_surroundings(chef) + var/list/recipes_radial = list() + var/list/recipes_craft = list() + for(var/recipe in GLOB.cooking_recipes) + var/datum/crafting_recipe/potential_recipe = recipe + if(parent.type in potential_recipe.reqs) // dont show recipes that don't involve this item + if(crafting_menu.check_contents(chef, potential_recipe, surroundings)) // don't show recipes we can't actually make + available_recipes.Add(potential_recipe) + for(var/available_recipe in available_recipes) + var/datum/crafting_recipe/available_recipe_datum = available_recipe + var/atom/craftable_atom = available_recipe_datum.result + recipes_radial.Add(list(initial(craftable_atom.name) = image(icon = initial(craftable_atom.icon), icon_state = initial(craftable_atom.icon_state)))) + recipes_craft.Add(list(initial(craftable_atom.name) = available_recipe_datum)) + INVOKE_ASYNC(src, PROC_REF(hate_signals_holy_shit), recipes_radial, recipes_craft, chef, crafting_menu) + return COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN + +/datum/component/edible/proc/hate_signals_holy_shit(list/recipes_radial, list/recipes_craft, mob/chef, datum/component/personal_crafting/crafting_menu) + var/recipe_chosen = show_radial_menu(chef, chef, recipes_radial, custom_check = CALLBACK(src, PROC_REF(check_menu), chef), require_near = TRUE, tooltips = TRUE) + if(!recipe_chosen) + return + var/datum/crafting_recipe/chosen_recipe = recipes_craft[recipe_chosen] + chef.balloon_alert_to_viewers("crafting [chosen_recipe.name]") + crafting_menu.craft_until_cant(chosen_recipe, chef, get_turf(parent)) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/fried_rice.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/fried_rice.dm deleted file mode 100644 index f21996d94c5e..000000000000 --- a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/fried_rice.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/chewin_cooking/recipe/hurricane_rice - cooking_container = PAN - food_category = CAT_STOVETOP - product_type = /obj/item/food/salad/hurricane_rice - recipe_guide = "Add boiled rice to pan, crack an egg, add vegetables, cook for 15 seconds on high, add soysauce, cook for 5 seconds on high." - step_builder = list( - list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), - list(CHEWIN_ADD_ITEM, /obj/item/food/egg, qmod=0.5), - list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/chili, qmod=0.5), - - list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/onion_slice, qmod=0.5), - list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/pineappleslice, qmod=0.5), - - list(CHEWIN_USE_STOVE, J_HI, 15 SECONDS , finish_text = "You can smell almost finished fried rice, just needs some seasoning!"), - list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/soysauce, 3, base=3), - list(CHEWIN_USE_STOVE, J_HI, 5 SECONDS , finish_text = "You can smell fried rice!"), - ) - -/datum/chewin_cooking/recipe/ikareis - cooking_container = PAN - food_category = CAT_STOVETOP - product_type = /obj/item/food/salad/ikareis - recipe_guide = "Add boiled rice to pan, some squid ink, add vegetables and sausage, cook for 20 seconds on high." - step_builder = list( - list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), - list(CHEWIN_ADD_ITEM, /obj/item/food/canned/squid_ink, qmod=0.5), - list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/bell_pepper, qmod=0.5), - list(CHEWIN_ADD_ITEM, /obj/item/food/sausage, qmod=0.5), - - list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/onion_slice, qmod=0.5), - list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/pineappleslice, qmod=0.5, prod_desc = "Extra sweet!"), - list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/grown/chili, qmod=0.5, prod_desc = "Extra spicy!"), - - list(CHEWIN_USE_STOVE, J_HI, 20 SECONDS , finish_text = "You can smell ikareis!"), - ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/french_fries.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/generic/french_fries.dm similarity index 100% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/french_fries.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/generic/french_fries.dm diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/oven_bread.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/generic/oven_bread.dm similarity index 100% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/oven_bread.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/generic/oven_bread.dm diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/black_eggs.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/black_eggs.dm similarity index 100% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/black_eggs.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/black_eggs.dm diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/fried_blood_sausage.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/fried_blood_sausage.dm similarity index 100% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/fried_blood_sausage.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/fried_blood_sausage.dm diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard_dumplings.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/lizard_dumplings.dm similarity index 100% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard_dumplings.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/lizard/lizard_dumplings.dm diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/epok_epok.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/epok_epok.dm new file mode 100644 index 000000000000..747b49083d49 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/epok_epok.dm @@ -0,0 +1,13 @@ +/datum/chewin_cooking/recipe/ti_hoeh_koe + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/epok_epok + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/doughslice, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/meat/cutlet/chicken, qmod=0.5), + list(CHEWIN_USE_STOVE, J_MED, 10 SECONDS, finish_text="The chicken starts to cook."), + list(CHEWIN_ADD_ITEM, /obj/item/food/grown/potato/wedges, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledegg, qmod=0.5), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/curry_powder, 3, base=3), + list(CHEWIN_USE_STOVE, J_LO, 10 SECONDS), + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/fried_rice.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/fried_rice.dm new file mode 100644 index 000000000000..b72240bbaf1d --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/fried_rice.dm @@ -0,0 +1,100 @@ +/datum/chewin_cooking/recipe/hurricane_rice + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/hurricane_rice + recipe_guide = "Add boiled rice to pan, crack an egg, add vegetables, cook for 15 seconds on high, add soysauce, cook for 5 seconds on high." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/egg, qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/chili, qmod=0.5), + + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/onion_slice, qmod=0.5), + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/pineappleslice, qmod=0.5), + + list(CHEWIN_USE_STOVE, J_HI, 15 SECONDS , finish_text = "You can smell almost finished fried rice, just needs some seasoning!"), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/soysauce, 3, base=3), + list(CHEWIN_USE_STOVE, J_HI, 5 SECONDS , finish_text = "You can smell fried rice!"), + ) + +/datum/chewin_cooking/recipe/ikareis + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/ikareis + recipe_guide = "Add boiled rice to pan, some squid ink, add vegetables and sausage, cook for 20 seconds on high." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/canned/squid_ink, qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/bell_pepper, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/sausage, qmod=0.5), + + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/onion_slice, qmod=0.5), + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/pineappleslice, qmod=0.5, prod_desc = "Extra sweet!"), + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/grown/chili, qmod=0.5, prod_desc = "Extra spicy!"), + + list(CHEWIN_USE_STOVE, J_HI, 20 SECONDS , finish_text = "You can smell ikareis!"), + ) + +/datum/chewin_cooking/recipe/ketchup_fried_rice + name = "Ketchup Fried Rice" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/ketchup_fried_rice + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice), + list(CHEWIN_ADD_ITEM, /obj/item/food/onion_slice), + list(CHEWIN_ADD_ITEM, /obj/item/food/sausage/american), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/carrot), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/peas), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/ketchup, 5), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/worcestershire, 2), + list(CHEWIN_USE_STOVE, J_MED, 20 SECONDS) // Cook on medium for 20 seconds + ) + + +/datum/chewin_cooking/recipe/mediterranean_fried_rice + name = "Mediterranean Fried Rice" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/mediterranean_fried_rice + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice), + list(CHEWIN_ADD_ITEM, /obj/item/food/onion_slice), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/herbs), + list(CHEWIN_ADD_ITEM, /obj/item/food/cheese/firm_cheese_slice), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/olive), + list(CHEWIN_ADD_ITEM, /obj/item/food/meatball), + list(CHEWIN_USE_STOVE, J_MED, 20 SECONDS) // Cook on medium for 20 seconds + ) + + +/datum/chewin_cooking/recipe/egg_fried_rice + name = "Egg Fried Rice" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/egg_fried_rice + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice), + list(CHEWIN_ADD_ITEM, /obj/item/food/egg), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/soysauce, 3), + list(CHEWIN_USE_STOVE, J_MED, 20 SECONDS) // Cook on medium for 20 seconds + ) + + +/datum/chewin_cooking/recipe/bibimbap + name = "Bibimbap" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/bibimbap + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/cucumber), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/mushroom/chanterelle), + list(CHEWIN_ADD_ITEM, /obj/item/food/meat/cutlet), + list(CHEWIN_ADD_ITEM, /obj/item/food/kimchi), + list(CHEWIN_ADD_ITEM, /obj/item/food/egg), + list(CHEWIN_USE_STOVE, J_MED, 20 SECONDS) // Cook on medium for 20 seconds + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/katsu_curry.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/katsu_curry.dm similarity index 69% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/katsu_curry.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/katsu_curry.dm index 3f69d1af3f4a..f06b634153da 100644 --- a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/katsu_curry.dm +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/katsu_curry.dm @@ -59,3 +59,29 @@ list(CHEWIN_USE_STOVE, J_LO, 1 MINUTES), ) + +/datum/chewin_cooking/recipe/yakisoba_katsu + name = "Yakisoba Curry" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/yakisoba_katsu + recipe_guide = "Melt some butter in a pan, add some noodles, vegetables, worcestershire and katsu." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/butter, qmod=0.5), + list(CHEWIN_USE_STOVE, J_LO, 10 SECONDS, finish_text = "The butter melts in the bowl!"), + + list(CHEWIN_ADD_ITEM, /obj/item/food/spaghetti/boilednoodles, qmod=0.5), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/worcestershire, 5, base=3), + + list(CHEWIN_ADD_ITEM, /obj/item/food/katsu_fillet, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/onion_slice, qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/carrot , qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/cabbage , qmod=0.5), + + CHEWIN_BEGIN_EXCLUSIVE_OPTIONS, + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/chili, qmod=0.2, reagent_skip=TRUE, prod_desc = "Extra spicy!", food_buff = /datum/status_effect/food/sweaty), + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/pineapple, qmod=0.2, reagent_skip=TRUE, prod_desc = "Mild and Sweet."), + CHEWIN_END_EXCLUSIVE_OPTIONS, + + list(CHEWIN_USE_STOVE, J_LO, 20 SECONDS), + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/kimchi.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/kimchi.dm similarity index 97% rename from monkestation/code/modules/brewin_and_chewin/chewing/recipes/kimchi.dm rename to monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/kimchi.dm index fbe196f189c1..d090ae296f2d 100644 --- a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/kimchi.dm +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/kimchi.dm @@ -1,5 +1,6 @@ /datum/chewin_cooking/recipe/kimchi cooking_container = BOWL + food_category = CAT_STOVETOP product_type = /obj/item/food/kimchi recipe_guide = "Mix Cabbage, Chili, and Salt in a bowl." step_builder = list( @@ -10,6 +11,7 @@ /datum/chewin_cooking/recipe/kimchi_inferno cooking_container = BOWL + food_category = CAT_STOVETOP product_type = /obj/item/food/inferno_kimchi recipe_guide = "Mix Cabbage, Ghost Chili, and Salt in a bowl." step_builder = list( @@ -20,6 +22,7 @@ /datum/chewin_cooking/recipe/garlic_kimchi cooking_container = BOWL + food_category = CAT_STOVETOP product_type = /obj/item/food/garlic_kimchi recipe_guide = "Mix Cabbage, Garlic, Chili, and Salt in a bowl." step_builder = list( diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/noodles.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/noodles.dm new file mode 100644 index 000000000000..f696e430c344 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/noodles.dm @@ -0,0 +1,85 @@ +/datum/chewin_cooking/recipe/bulgogi_noodles + name = "Bulgogi Noodles" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/bulgogi_noodles + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/butter, base=10, reagent_skip=TRUE), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS, finish_text = "The butter melts in the pan!"), + CHEWIN_END_OPTION_CHAIN, + + list(CHEWIN_ADD_ITEM, /obj/item/food/spaghetti/boilednoodles), + list(CHEWIN_ADD_ITEM, /obj/item/food/meat/cutlet), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/apple), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/garlic), + list(CHEWIN_ADD_ITEM, /obj/item/food/onion_slice), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/nutriment/soup/teriyaki, 4), + list(CHEWIN_USE_STOVE, J_MED, 20 SECONDS) // Cook on medium for 20 seconds + ) + +/datum/chewin_cooking/recipe/martian_fried_noodles + name = "Martian Fried Noodles" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/martian_fried_noodles + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/butter, base=10, reagent_skip=TRUE), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS, finish_text = "The butter melts in the pan!"), + CHEWIN_END_OPTION_CHAIN, + + list(CHEWIN_ADD_ITEM, /obj/item/food/spaghetti/boilednoodles), + list(CHEWIN_ADD_ITEM, /obj/item/food/meat/cutlet), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/peanut), + list(CHEWIN_ADD_ITEM, /obj/item/food/onion_slice), + + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/soysauce, 3), + list(CHEWIN_USE_STOVE, J_MED, 10 SECONDS), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/red_bay, 3), + + list(CHEWIN_USE_STOVE, J_LO, 10 SECONDS) + ) + + +/datum/chewin_cooking/recipe/simple_fried_noodles + name = "Fried Noodles" + cooking_container = PAN + food_category = CAT_STOVETOP + product_type = /obj/item/food/salad/simple_fried_noodles + recipe_guide = "Cook ingredients in a pan." + step_builder = list( + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/butter, base=10, reagent_skip=TRUE), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS, finish_text = "The butter melts in the pan!"), + CHEWIN_END_OPTION_CHAIN, + + list(CHEWIN_ADD_ITEM, /obj/item/food/spaghetti/boilednoodles), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/soysauce, 3), + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/egg, prod_desc = "With a hint of egg!"), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS), + CHEWIN_END_OPTION_CHAIN, + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/onion_slice, prod_desc = "With some onion."), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 5 SECONDS), + CHEWIN_END_OPTION_CHAIN, + + list(CHEWIN_ADD_REAGENT_OPTIONAL, /datum/reagent/consumable/salt, 2, prod_desc = "A dash of salt was added."), + list(CHEWIN_ADD_REAGENT_OPTIONAL, /datum/reagent/consumable/sugar, 4, prod_desc = "A bit of sweetness was added."), + + + CHEWIN_BEGIN_EXCLUSIVE_OPTIONS, + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/chili, qmod=0.2, reagent_skip=TRUE, prod_desc = "Extra spicy!", food_buff = /datum/status_effect/food/sweaty), + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/pineapple, qmod=0.2, reagent_skip=TRUE, prod_desc = "Mild and Sweet."), + CHEWIN_END_EXCLUSIVE_OPTIONS, + + list(CHEWIN_USE_STOVE, J_MED, 10 SECONDS), + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/sambal.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/sambal.dm new file mode 100644 index 000000000000..8028bd25bcd8 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/sambal.dm @@ -0,0 +1,12 @@ +/datum/chewin_cooking/recipe/sambal + name = "Sambal" + cooking_container = BOWL + product_type = /obj/item/food/sambal + recipe_guide = "Mix all ingredients in a bowl." + step_builder = list( + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/chili), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/garlic), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/onion), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/sugar, 3), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/limejuice, 3) + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/setagaya_curry.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/setagaya_curry.dm new file mode 100644 index 000000000000..593c316a24f7 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/setagaya_curry.dm @@ -0,0 +1,39 @@ +/datum/chewin_cooking/recipe/setagaya_curry + name = "Setagaya curry" + cooking_container = BOWL + product_type = /obj/item/food/salad/setagaya_curry + recipe_guide = "Melt some butter in a bowl, add some rice, vegetables, curry powder and cook." + step_builder = list( + + CHEWIN_BEGIN_OPTION_CHAIN, + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/butter, base=10, reagent_skip=TRUE), + list(CHEWIN_USE_STOVE_OPTIONAL, J_LO, 10 SECONDS, finish_text = "The butter melts in the bowl!"), + CHEWIN_END_OPTION_CHAIN, + + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/potato, qmod=0.5), + list(CHEWIN_USE_STOVE, J_LO, 5 SECONDS, finish_text = "The potatoes soften."), + + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/carrot, qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/onion, qmod=0.5), + list(CHEWIN_USE_STOVE, J_LO, 5 SECONDS, finish_text = "The vegetables soften."), + + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/apple, qmod=0.5), + list(CHEWIN_ADD_REAGENT_CHOICE, list(/datum/reagent/consumable/honey = 3, /datum/reagent/consumable/sugar = 1), 3, base=4), + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/ketchup, 3, base=3), + + list(CHEWIN_ADD_ITEM_OPTIONAL, /obj/item/food/chocolatebar, qmod=2), + list(CHEWIN_ADD_REAGENT_OPTIONAL, /datum/reagent/consumable/coffee, 3, base=3), + list(CHEWIN_ADD_REAGENT_OPTIONAL, /datum/reagent/consumable/ethanol/wine, 3, base=3), + + list(CHEWIN_ADD_REAGENT, /datum/reagent/consumable/curry_powder, 3, base=3), + + + CHEWIN_BEGIN_EXCLUSIVE_OPTIONS, + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/chili, qmod=0.2, reagent_skip=TRUE, prod_desc = "Extra spicy!", food_buff = /datum/status_effect/food/sweaty), + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/pineapple, qmod=0.2, reagent_skip=TRUE, prod_desc = "Mild and Sweet."), + CHEWIN_END_EXCLUSIVE_OPTIONS, + + list(CHEWIN_ADD_ITEM, /obj/item/food/meat/slab, qmod=0.5), + list(CHEWIN_USE_STOVE, J_LO, 10 SECONDS), + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/surimi.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/surimi.dm new file mode 100644 index 000000000000..6271eab85dd1 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/surimi.dm @@ -0,0 +1,23 @@ +/datum/chewin_cooking/recipe/surimi + cooking_container = CUTTING_BOARD + product_type = /obj/item/food/surimi + recipe_guide = "Put raw fish onto a cutting board and slice." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_USE_TOOL, TOOL_KNIFE, 5) + ) + +/datum/chewin_cooking/recipe/surimi_bulk + name = "Surimi (5 Servings)" + cooking_container = CUTTING_BOARD + product_type = /obj/item/food/surimi + recipe_guide = "Put raw fish onto a cutting board and slice." + product_count = 5 + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/fishmeat, qmod=0.5), + list(CHEWIN_USE_TOOL, TOOL_KNIFE, 5) + ) diff --git a/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/ti_hoeh_hoe.dm b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/ti_hoeh_hoe.dm new file mode 100644 index 000000000000..7d06ebf43b69 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/chewing/recipes/martian/ti_hoeh_hoe.dm @@ -0,0 +1,17 @@ +/datum/chewin_cooking/recipe/ti_hoeh_koe + cooking_container = BOWL + product_type = /obj/item/food/kebab/ti_hoeh_koe + recipe_guide = "Mix Rice, salted peanuts, herbs and optionally blood in a bowl." + step_builder = list( + list(CHEWIN_ADD_ITEM, /obj/item/food/boiledrice, qmod=0.5), + + CHEWIN_BEGIN_EXCLUSIVE_OPTIONS, + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/chili, qmod=0.2, reagent_skip=TRUE, prod_desc = "Extra spicy!", food_buff = /datum/status_effect/food/sweaty), + list(CHEWIN_ADD_PRODUCE_OPTIONAL, /obj/item/food/grown/pineapple, qmod=0.2, reagent_skip=TRUE, prod_desc = "Mild and Sweet."), + CHEWIN_END_EXCLUSIVE_OPTIONS, + + list(CHEWIN_ADD_REAGENT_OPTIONAL, /datum/reagent/blood, 5, base=3), + + list(CHEWIN_ADD_PRODUCE, /obj/item/food/grown/herbs, qmod=0.5), + list(CHEWIN_ADD_ITEM, /obj/item/food/peanuts/salted, qmod=0.5), + ) diff --git a/monkestation/code/modules/brewin_and_chewin/condiment_reagents.dm b/monkestation/code/modules/brewin_and_chewin/condiment_reagents.dm new file mode 100644 index 000000000000..41c238162187 --- /dev/null +++ b/monkestation/code/modules/brewin_and_chewin/condiment_reagents.dm @@ -0,0 +1,53 @@ +/datum/reagent + var/condiment_overlay = null + var/overlay_colored = FALSE + +/datum/reagent/consumable/flour + condiment_overlay = "flour" + +/datum/reagent/consumable/mayonnaise + condiment_overlay = "mayo" + +/datum/reagent/consumable/salt + condiment_overlay = "salt" + +/datum/reagent/consumable/blackpepper + condiment_overlay = "pepper" + +/datum/reagent/consumable/soysauce + condiment_overlay = "soysauce" + +/datum/reagent/consumable/ketchup + condiment_overlay = "ketchup" + +/datum/reagent/consumable/capsaicin + condiment_overlay = "hotsauce" + +/datum/reagent/consumable/bbqsauce + condiment_overlay = "caramel" + +/datum/reagent/consumable/caramel + condiment_overlay = "caramel" + +/datum/reagent/consumable/whipped_cream + condiment_overlay = "cream" + +/datum/reagent/consumable/sprinkles + condiment_overlay = "sprinkles" + +/datum/reagent/consumable/sugar + condiment_overlay = "sugar" + +/datum/reagent/consumable/vinegar + condiment_overlay = "vinegar" + +/datum/reagent/consumable/honey + condiment_overlay = "honey" + overlay_colored = TRUE + +/datum/reagent/blood + condiment_overlay = "honey" + overlay_colored = TRUE + +/datum/reagent/consumable/gravy + condiment_overlay = "gravy" diff --git a/monkestation/code/modules/brewin_and_chewin/icons/condiment_overlays.dmi b/monkestation/code/modules/brewin_and_chewin/icons/condiment_overlays.dmi new file mode 100644 index 000000000000..5aa85a476d8c Binary files /dev/null and b/monkestation/code/modules/brewin_and_chewin/icons/condiment_overlays.dmi differ diff --git a/monkestation/code/modules/can_spessmen_feel_pain/pain/_base.dm b/monkestation/code/modules/can_spessmen_feel_pain/pain/_base.dm index 43f917a3340d..3f6d2d8cb8bd 100644 --- a/monkestation/code/modules/can_spessmen_feel_pain/pain/_base.dm +++ b/monkestation/code/modules/can_spessmen_feel_pain/pain/_base.dm @@ -558,14 +558,14 @@ shock_mod *= 2 // stacks with above var/curr_pain = get_total_pain() if(curr_pain < PAIN_LIMB_MAX * 0.5) - parent.adjust_pain_shock(-3 * seconds_per_tick) // staying out of pain for a while gives you a small resiliency to shock (~1 minute) + parent.adjust_pain_shock(-24 * seconds_per_tick) // staying out of pain for a while gives you a small resiliency to shock (~1 minute) else if(curr_pain < PAIN_LIMB_MAX) - parent.adjust_pain_shock(-1 * seconds_per_tick) + parent.adjust_pain_shock(-6 * seconds_per_tick) else if(curr_pain < PAIN_LIMB_MAX * 2) - if(shock_buildup <= 30) + if(shock_buildup <= 120) parent.adjust_pain_shock(0.5 * shock_mod * seconds_per_tick) else if(curr_pain < PAIN_LIMB_MAX * 4) - if(shock_buildup <= 65) + if(shock_buildup <= 195) parent.adjust_pain_shock(1 * shock_mod * seconds_per_tick) if(SPT_PROB(2, seconds_per_tick)) do_pain_message(span_userdanger(pick("It hurts."))) @@ -574,7 +574,7 @@ if(SPT_PROB(2, seconds_per_tick)) do_pain_message(span_userdanger(pick("Stop the pain!", "It hurts!"))) - switch(shock_buildup) + switch(shock_buildup * 0.25) if(10 to 60) parent.adjust_bodytemperature(-5 * seconds_per_tick, min_temp = parent.bodytemp_cold_damage_limit + 5) if(60 to 120) @@ -592,7 +592,7 @@ parent.pain_emote("shiver", 3 SECONDS) parent.adjust_bodytemperature(-20 * seconds_per_tick, min_temp = parent.bodytemp_cold_damage_limit - 20) - if((shock_buildup >= 20 || curr_pain >= PAIN_LIMB_MAX) && !just_cant_feel_anything) + if((shock_buildup >= 60 || curr_pain >= PAIN_LIMB_MAX) && !just_cant_feel_anything) if(SPT_PROB(min(curr_pain / 5, 24), seconds_per_tick)) parent.adjust_jitter_up_to(5 SECONDS * pain_modifier, 30 SECONDS) if(SPT_PROB(min(curr_pain / 10, 12), seconds_per_tick)) @@ -600,22 +600,22 @@ if(SPT_PROB(min(curr_pain / 20, 6), seconds_per_tick)) // pain applies its own stutter parent.adjust_stutter_up_to(5 SECONDS * pain_modifier, 30 SECONDS) - if(shock_buildup >= 40 && parent.stat != HARD_CRIT) + if(shock_buildup >= 120 && parent.stat != HARD_CRIT) if(SPT_PROB(shock_buildup / 60, seconds_per_tick)) //parent.vomit(VOMIT_CATEGORY_KNOCKDOWN, lost_nutrition = 7.5) parent.Knockdown(rand(3 SECONDS, 6 SECONDS)) - if(shock_buildup >= 60 || curr_pain >= PAIN_CHEST_MAX) + if(shock_buildup >= 180 || curr_pain >= PAIN_CHEST_MAX) if(SPT_PROB(shock_buildup / 20, seconds_per_tick) && !parent.IsParalyzed() && parent.Paralyze(rand(2 SECONDS, 8 SECONDS))) parent.visible_message( span_warning("[parent]'s body falls limp!"), span_warning("Your body [just_cant_feel_anything ? "goes" : "falls"] limp!"), ) - if(SPT_PROB(shock_buildup / 20, seconds_per_tick)) + if(SPT_PROB(shock_buildup / 60, seconds_per_tick)) parent.adjust_confusion_up_to(8 SECONDS * pain_modifier, 24 SECONDS) - if((shock_buildup >= 120 || curr_pain >= PAIN_CHEST_MAX * 2) && SPT_PROB(shock_buildup / 40, seconds_per_tick) && parent.stat != HARD_CRIT) + if((shock_buildup >= 360 || curr_pain >= PAIN_CHEST_MAX * 2) && SPT_PROB(shock_buildup / 120, seconds_per_tick) && parent.stat != HARD_CRIT) if(!parent.IsUnconscious() && parent.Unconscious(rand(4 SECONDS, 16 SECONDS))) parent.visible_message( span_warning("[parent] falls unconscious!"), @@ -624,12 +624,12 @@ ) // This is death - if(shock_buildup >= 120 && !parent.undergoing_cardiac_arrest()) + if(shock_buildup >= 360 && !parent.undergoing_cardiac_arrest()) var/heart_attack_prob = 0 if(parent.health <= parent.maxHealth * -1) heart_attack_prob += abs(parent.health + parent.maxHealth) * 0.1 - if(shock_buildup >= 180) - heart_attack_prob += (shock_buildup * 0.1) + if(shock_buildup >= 540) + heart_attack_prob += (shock_buildup * 0.1 * 0.25) if(SPT_PROB(min(20, heart_attack_prob), seconds_per_tick)) if(!COOLDOWN_FINISHED(src, time_since_last_heart_attack_counter)) parent.losebreath += 1 @@ -658,7 +658,7 @@ heart_attack_counter = 0 // This is where "soft crit" is now - if(shock_buildup >= 90) + if(shock_buildup >= 270) if(!HAS_TRAIT_FROM(parent, TRAIT_LABOURED_BREATHING, PAINSHOCK)) ADD_TRAIT(parent, TRAIT_LABOURED_BREATHING, PAINSHOCK) set_pain_modifier(PAINSHOCK, 1.2) @@ -672,7 +672,7 @@ parent.remove_traits(list(TRAIT_LABOURED_BREATHING), PAINSHOCK) // This is "pain crit", it's where stamcrit has moved and is also applied by extreme shock - if(curr_pain >= PAIN_LIMB_MAX * 3 || shock_buildup >= 150) + if(curr_pain >= PAIN_LIMB_MAX * 3 || shock_buildup >= 450) parent.adjust_jitter_up_to(5 SECONDS * pain_modifier, 60 SECONDS) if(!HAS_TRAIT_FROM(parent, TRAIT_LABOURED_BREATHING, PAINCRIT)) var/is_standing = parent.body_position == STANDING_UP diff --git a/monkestation/code/modules/client/preferences/alt_jobs/titles.dm b/monkestation/code/modules/client/preferences/alt_jobs/titles.dm index 8cbc34b90559..f55ee412442d 100644 --- a/monkestation/code/modules/client/preferences/alt_jobs/titles.dm +++ b/monkestation/code/modules/client/preferences/alt_jobs/titles.dm @@ -86,6 +86,7 @@ "Commanding Officer", "Site Manager", "Criminally Underpaid Babysitter", + "Princess", ) /datum/job/cargo_technician diff --git a/monkestation/code/modules/client/preferences/body.dm b/monkestation/code/modules/client/preferences/body.dm index cc58626e7b5c..fa46983e55c7 100644 --- a/monkestation/code/modules/client/preferences/body.dm +++ b/monkestation/code/modules/client/preferences/body.dm @@ -2,6 +2,7 @@ savefile_key = "body_height" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + priority = PREFERENCE_PRIORITY_BODY_TYPE //done after species /datum/preference/choiced/body_height/init_possible_values() return assoc_to_keys(GLOB.body_heights) diff --git a/monkestation/code/modules/client/preferences/species_features/monkey.dm b/monkestation/code/modules/client/preferences/species_features/monkey.dm new file mode 100644 index 000000000000..38722a410c4d --- /dev/null +++ b/monkestation/code/modules/client/preferences/species_features/monkey.dm @@ -0,0 +1,44 @@ +/datum/preference/color/fur_color + category = PREFERENCE_CATEGORY_SECONDARY_FEATURES + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "fur" + relevant_inherent_trait = TRAIT_FUR_COLORS + +/datum/preference/color/fur_color/create_default_value() + return COLOR_MONKEY_BROWN + +/datum/preference/choiced/monkey_tail + main_feature_name = "Monkey Tail" + savefile_key = "feature_monkey_tail" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + relevant_external_organ = /obj/item/organ/external/tail/monkey + should_generate_icons = TRUE + +/datum/preference/choiced/monkey_tail/init_possible_values() + var/list/values = list() + + var/icon/monkey_chest = icon('monkestation/icons/mob/species/monkey/bodyparts.dmi', "monkey_chest") + + for (var/tail_name in GLOB.tails_list_monkey) + var/datum/sprite_accessory/tails/monkey/tail = GLOB.tails_list_monkey[tail_name] + if(tail.locked) + continue + + var/icon/final_icon = icon(monkey_chest) + if(tail.icon_state != "none") + var/icon/tail_icon = icon(tail.icon, "m_tail_monkey_[tail.icon_state]_FRONT", NORTH) + final_icon.Blend(tail_icon, ICON_OVERLAY) + final_icon.Crop(8, 8, 30, 30) + final_icon.Scale(32, 32) + values[tail.name] = final_icon + + return values + +/datum/preference/choiced/monkey_tail/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["tail_monkey"] = value + +/datum/preference/choiced/monkey_tail/create_default_value() + var/datum/sprite_accessory/tails/monkey/tail = /datum/sprite_accessory/tails/monkey/default + return initial(tail.name) + diff --git a/monkestation/code/modules/client/preferences/species_features/simians.dm b/monkestation/code/modules/client/preferences/species_features/simians.dm deleted file mode 100644 index 39f63cf97aec..000000000000 --- a/monkestation/code/modules/client/preferences/species_features/simians.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/preference/color/fur_color - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "fur" - relevant_inherent_trait = TRAIT_FUR_COLORS - -/datum/preference/choiced/simian_tail - savefile_key = "feature_tail_monkey" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_FEATURES - main_feature_name = "Simian Tail" - should_generate_icons = TRUE - -/datum/preference/choiced/simian_tail/init_possible_values() - var/list/values = list() - - var/icon/simian_chest = icon('monkestation/icons/mob/species/simian/bodyparts.dmi', "simian_chest") - - for (var/tail_name in GLOB.tails_list_monkey) - var/datum/sprite_accessory/tail = GLOB.tails_list_monkey[tail_name] - if(tail.locked) - continue - - var/icon/final_icon = new(simian_chest) - final_icon.Blend(icon(tail.icon, "m_tail_[tail.icon_state]_FRONT"), ICON_OVERLAY) - final_icon.Crop(10, 8, 22, 23) - final_icon.Scale(26, 32) - final_icon.Crop(-2, 1, 29, 32) - - values[tail.name] = final_icon - - return values - -/datum/preference/choiced/simian_tail/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features["tail_monkey"] = value diff --git a/monkestation/code/modules/clothing/suits/coats.dm b/monkestation/code/modules/clothing/suits/coats.dm index b5101c8e9d85..9c8179dd9033 100644 --- a/monkestation/code/modules/clothing/suits/coats.dm +++ b/monkestation/code/modules/clothing/suits/coats.dm @@ -48,6 +48,20 @@ worn_icon = 'monkestation/icons/mob/clothing/head.dmi' icon_state = "winterhood_narsie" +/obj/item/clothing/suit/hooded/wintercoat/engineering/signal_tech + name = "engineering winter coat" + desc = "A surprisingly heavy yellow winter coat with reflective green stripes. It has a small antennae for its zipper tab, and the inside layer is covered with a radiation-resistant silver-nylon blend. Because heat insulation is clearly not a priority." + icon = 'monkestation/icons/obj/clothing/suits.dmi' + worn_icon = 'monkestation/icons/mob/clothing/suit.dmi' + icon_state = "coat_signal_tech" + hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/signal_tech + +/obj/item/clothing/head/hooded/winterhood/engineering/signal_tech + desc = "A yellow winter coat hood. Definitely not enough to keep you warm near the telecommunications servers." + icon = 'monkestation/icons/obj/clothing/hats.dmi' + worn_icon = 'monkestation/icons/mob/clothing/head.dmi' + icon_state = "winterhood_signal_tech" + // End Of Winter Coat Varients // Costumes diff --git a/monkestation/code/modules/clothing/under/jobs/engineering.dm b/monkestation/code/modules/clothing/under/jobs/engineering.dm index cd557499961d..62e85a4a886e 100644 --- a/monkestation/code/modules/clothing/under/jobs/engineering.dm +++ b/monkestation/code/modules/clothing/under/jobs/engineering.dm @@ -1,6 +1,6 @@ /obj/item/clothing/under/rank/engineering/signal_tech name = "signal technician's jumpsuit" - desc = "It's an orange high visibility jumpsuit with green strips worn by signal technicians. Made from fire resistant materials." + desc = "It's an orange high visibility jumpsuit with green stripes worn by signal technicians. Made from fire resistant materials." icon = 'monkestation/icons/obj/clothing/uniforms.dmi' worn_icon = 'monkestation/icons/mob/clothing/uniform.dmi' icon_state = "signal_tech" diff --git a/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm b/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm index 267fb48e5aab..14a713961bd0 100644 --- a/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm +++ b/monkestation/code/modules/cybernetics/augments/leg_augments/traits.dm @@ -4,6 +4,9 @@ encode_info = AUGMENT_NT_LOWLEVEL double_legged = TRUE +/obj/item/organ/internal/cyberimp/leg/table_glider/l + zone = BODY_ZONE_L_LEG + /obj/item/organ/internal/cyberimp/leg/table_glider/update_implants() if(!check_compatibility()) REMOVE_TRAIT(owner,TRAIT_FAST_CLIMBER,type) @@ -42,6 +45,9 @@ REMOVE_TRAIT(owner,TRAIT_SHOVE_RESIST,type) return ..() +/obj/item/organ/internal/cyberimp/leg/shove_resist/l + zone = BODY_ZONE_L_LEG + /obj/item/organ/internal/cyberimp/leg/accelerator name = "P.R.Y.Z.H.O.K. accelerator system" desc = "Russian implant that allows you to tackle people. You need to implant this in both of your legs to make it work." @@ -57,3 +63,35 @@ if(tackler) qdel(tackler) return ..() + +/obj/item/organ/internal/cyberimp/leg/accelerator/l + zone = BODY_ZONE_L_LEG + +/obj/item/organ/internal/cyberimp/leg/sprinter + name = "Vacuole ligament system" + desc = "Mechicanical servos in ones leg that increases their natural stride. Popular amongst parkour enthusiasts. You need to implant this in both of your legs to make it work." + encode_info = AUGMENT_NT_LOWLEVEL + double_legged = TRUE + +/obj/item/organ/internal/cyberimp/leg/sprinter/update_implants() + if(!check_compatibility()) + REMOVE_TRAIT(owner,TRAIT_FREERUNNING,type) + REMOVE_TRAIT(owner,TRAIT_LIGHT_STEP,type) + return + ADD_TRAIT(owner,TRAIT_FREERUNNING,type) + ADD_TRAIT(owner,TRAIT_LIGHT_STEP,type) + +/obj/item/organ/internal/cyberimp/leg/sprinter/on_full_insert(mob/living/carbon/M, special, drop_if_replaced) + . = ..() + if(!check_compatibility()) + return + ADD_TRAIT(owner,TRAIT_FREERUNNING,type) + ADD_TRAIT(owner,TRAIT_LIGHT_STEP,type) + +/obj/item/organ/internal/cyberimp/leg/sprinter/Remove(mob/living/carbon/M, special) + REMOVE_TRAIT(owner,TRAIT_FREERUNNING,type) + REMOVE_TRAIT(owner,TRAIT_LIGHT_STEP,type) + return ..() + +/obj/item/organ/internal/cyberimp/leg/sprinter/l + zone = BODY_ZONE_L_LEG diff --git a/monkestation/code/modules/donator/code/item/misc.dm b/monkestation/code/modules/donator/code/item/misc.dm index 79b96fa13291..def034a8333d 100644 --- a/monkestation/code/modules/donator/code/item/misc.dm +++ b/monkestation/code/modules/donator/code/item/misc.dm @@ -3,27 +3,37 @@ desc = span_bold("What in the god-dam?...") icon = 'monkestation/code/modules/donator/icons/obj/misc.dmi' icon_state = "wumpa" - var/datum/looping_sound/wumpa/sounds - var/shutup = FALSE pickup_sound = 'monkestation/code/modules/donator/sounds/woah_3.ogg' drop_sound = 'monkestation/code/modules/donator/sounds/woah_1.ogg' - var/squeak_override = list('monkestation/code/modules/donator/sounds/woah_1.ogg' = 33, - 'monkestation/code/modules/donator/sounds/woah_2.ogg'=33, - 'monkestation/code/modules/donator/sounds/woah_3.ogg'=33, - 'monkestation/code/modules/donator/sounds/woahwoah.ogg' = 1) + pickup_mixer_channel = CHANNEL_SQUEAK + drop_mixer_channel = CHANNEL_SQUEAK + var/datum/looping_sound/wumpa/sound_loop + var/shutup = FALSE + var/static/list/squeak_override = list( + 'monkestation/code/modules/donator/sounds/woah_1.ogg' = 33, + 'monkestation/code/modules/donator/sounds/woah_2.ogg' = 33, + 'monkestation/code/modules/donator/sounds/woah_3.ogg' = 33, + 'monkestation/code/modules/donator/sounds/woahwoah.ogg' = 1, + ) + /obj/item/donator/wumpa/Initialize(mapload) . = ..() - sounds = new /datum/looping_sound/wumpa(src,TRUE,FALSE,FALSE,CHANNEL_JUKEBOX) - AddComponent(/datum/component/squeak,squeak_override) + sound_loop = new /datum/looping_sound/wumpa(src, TRUE, FALSE, FALSE, CHANNEL_JUKEBOX) + AddComponent(/datum/component/squeak, squeak_override) + +/obj/item/donator/wumpa/Destroy(force) + QDEL_NULL(sound_loop) + return ..() + /obj/item/donator/wumpa/attack_self(mob/user, modifiers) . = ..() - shutup=!shutup + shutup = !shutup if(shutup) - user.visible_message("[src] shuts up.") - sounds.stop() + user.visible_message(span_notice("[src] shuts up.")) + sound_loop.stop() else - user.visible_message("[src] continues its jolly melody.") - sounds.start(src) + user.visible_message(span_notice("[src] continues its jolly melody.")) + sound_loop.start(src) /datum/looping_sound/wumpa diff --git a/monkestation/code/modules/jobs/job_types/barber.dm b/monkestation/code/modules/jobs/job_types/barber.dm new file mode 100644 index 000000000000..b10e1e17248e --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/barber.dm @@ -0,0 +1,56 @@ +/datum/job/barber + title = JOB_LATEJOIN_BARBER + description = "Cut hair, spread gossip, judge folks poor fashion taste." + department_head = list(JOB_HEAD_OF_PERSONNEL) + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 1 + supervisors = SUPERVISOR_HOP + config_tag = "BARBER" + exp_granted_type = EXP_TYPE_SERVICE + + outfit = /datum/outfit/job/barber + plasmaman_outfit = /datum/outfit/plasmaman/bar + + paycheck = PAYCHECK_CREW + paycheck_department = ACCOUNT_SRV + + display_order = JOB_DISPLAY_ORDER_ASSISTANT + departments_list = list( + /datum/job_department/late, + ) + + mail_goodies = list( + /obj/item/reagent_containers/spray/barbers_aid = 100, + /obj/item/clothing/head/hair_tie = 50, + /obj/item/reagent_containers/spray/baldium = 10, //good way to get valid'd + /obj/item/dyespray = 20, + /obj/item/lipstick/quantum = 1, + /obj/item/reagent_containers/spray/super_barbers_aid = 1, + ) + + family_heirlooms = list(/obj/item/hairbrush/comb) + rpg_title = "Scissorhands" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + +/datum/outfit/job/barber + name = "Barber" + jobtype = /datum/job/barber + + id = /obj/item/card/id/advanced + id_trim = /datum/id_trim/job/barber + uniform = /obj/item/clothing/under/rank/civilian/lawyer/purpsuit + suit = /obj/item/clothing/suit/toggle/lawyer/purple + backpack_contents = list( + /obj/item/razor = 1, + /obj/item/reagent_containers/spray/quantum_hair_dye = 1, + /obj/item/reagent_containers/cup/rag = 1, + ) + belt = /obj/item/modular_computer/pda/barber + ears = /obj/item/radio/headset/headset_srv + shoes = /obj/item/clothing/shoes/laceup + l_pocket =/obj/item/scissors + + box = /obj/item/storage/box/survival + + diff --git a/monkestation/code/modules/jobs/job_types/departments/departments.dm b/monkestation/code/modules/jobs/job_types/departments/departments.dm new file mode 100644 index 000000000000..6b2e4b6a896f --- /dev/null +++ b/monkestation/code/modules/jobs/job_types/departments/departments.dm @@ -0,0 +1,6 @@ +/datum/job_department/late + department_name = DEPARTMENT_LATE + department_bitflags = DEPARTMENT_BITFLAG_LATE + display_order = 10 + label_class = "latejoin" + ui_color = "#0b6b2b" diff --git a/monkestation/code/modules/jobs/job_types/signal_technician.dm b/monkestation/code/modules/jobs/job_types/signal_technician.dm index e1deca8e5eeb..93d054ee0333 100644 --- a/monkestation/code/modules/jobs/job_types/signal_technician.dm +++ b/monkestation/code/modules/jobs/job_types/signal_technician.dm @@ -58,6 +58,7 @@ id_trim = /datum/id_trim/job/signal_technician uniform = /obj/item/clothing/under/rank/engineering/signal_tech + suit = /obj/item/clothing/suit/hooded/wintercoat/engineering/signal_tech belt = /obj/item/storage/belt/utility/full/engi ears = /obj/item/radio/headset/headset_eng gloves = /obj/item/clothing/gloves/color/black diff --git a/monkestation/code/modules/mapping/access_helpers.dm b/monkestation/code/modules/mapping/access_helpers.dm index d7ca77d18035..0d4c7d15c545 100644 --- a/monkestation/code/modules/mapping/access_helpers.dm +++ b/monkestation/code/modules/mapping/access_helpers.dm @@ -35,3 +35,18 @@ /obj/effect/mapping_helpers/airlock/access/any/away/bounty_hunter/get_access() . = ..() . += list(ACCESS_BOUNTY_HUNTER) + +/obj/effect/mapping_helpers/airlock/access/any/security/brig_physician/get_access() + var/list/access_list = ..() + access_list += ACCESS_BRIG_PHYSICIAN + return access_list + +/obj/effect/mapping_helpers/airlock/access/any/command/blueshield/get_access() + var/list/access_list = ..() + access_list += ACCESS_BLUESHIELD + return access_list + +/obj/effect/mapping_helpers/airlock/access/any/command/nt_rep/get_access() + var/list/access_list = ..() + access_list += ACCESS_NT_REPRESENTATVE + return access_list diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/tails.dm deleted file mode 100644 index 55ec414d53cb..000000000000 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ /dev/null @@ -1,11 +0,0 @@ -/datum/sprite_accessory/tails/monkey - icon = 'monkestation/icons/mob/species/simian/tails.dmi' - color_src = SKIN_COLOR - -/datum/sprite_accessory/tails/monkey/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/tails/monkey/chimp - name = "Chimp" - icon_state = "chimp" diff --git a/monkestation/code/modules/mob/living/carbon/carbon_update_icons.dm b/monkestation/code/modules/mob/living/carbon/carbon_update_icons.dm index a99ca5f650b2..40a0b4e813e7 100644 --- a/monkestation/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/monkestation/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -1,3 +1,4 @@ /mob/living/carbon/update_body(is_creating = FALSE) . = ..() - dna?.update_body_height() + if(is_creating) + dna?.update_body_height() diff --git a/monkestation/code/modules/mob/living/carbon/human/human.dm b/monkestation/code/modules/mob/living/carbon/human/human.dm index b04c84fb7637..61edf747deb6 100644 --- a/monkestation/code/modules/mob/living/carbon/human/human.dm +++ b/monkestation/code/modules/mob/living/carbon/human/human.dm @@ -9,3 +9,6 @@ /mob/living/carbon/human/species/ornithid race = /datum/species/ornithid + +/mob/living/carbon/human/species/moth/tundra + race = /datum/species/moth/tundra diff --git a/monkestation/code/modules/mob/living/carbon/human/simian_gags.dm b/monkestation/code/modules/mob/living/carbon/human/simian_gags.dm deleted file mode 100644 index 4e41662ab551..000000000000 --- a/monkestation/code/modules/mob/living/carbon/human/simian_gags.dm +++ /dev/null @@ -1,163 +0,0 @@ -/obj/item - /// Icon file for mob worn overlays, if the user is a teshari. - var/icon/worn_icon_simian - /// The config type to use for greyscaled worn sprites for Simian characters. Both this and greyscale_colors must be assigned to work. - var/greyscale_config_worn_simian - - var/datum/greyscale_config/greyscale_config_worn_simian_fallback - var/datum/greyscale_config/greyscale_config_worn_simian_fallback_skirt - -/obj/item/storage/backpack - species_clothing_color_coords = list(list(BACK_COLORPIXEL_X_1, BACK_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/backpack - -/obj/item/clothing/glasses - species_clothing_color_coords = list(list(GLASSES_COLORPIXEL_X_1, GLASSES_COLORPIXEL_Y_1), list(GLASSES_COLORPIXEL_X_2, GLASSES_COLORPIXEL_Y_2)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/glasses - -/obj/item/clothing/gloves - species_clothing_color_coords = list(list(GLOVES_COLORPIXEL_X_1, GLOVES_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/gloves - -/obj/item/clothing/neck - species_clothing_color_coords = list(list(SCARF_COLORPIXEL_X_1, SCARF_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/scarf - -/obj/item/clothing/neck/cloak - species_clothing_color_coords = list(list(CLOAK_COLORPIXEL_X_1, CLOAK_COLORPIXEL_Y_1), list(CLOAK_COLORPIXEL_X_2, CLOAK_COLORPIXEL_Y_2)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/cloak - -/obj/item/clothing/neck/tie - species_clothing_color_coords = list(list(TIE_COLORPIXEL_X_1, TIE_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/tie - -/obj/item/clothing/shoes - species_clothing_color_coords = list(list(SHOES_COLORPIXEL_X_1, SHOES_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/shoes - -/obj/item/clothing/suit - species_clothing_color_coords = list(list(COAT_COLORPIXEL_X_1, COAT_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/coat - -/obj/item/clothing/suit/armor - species_clothing_color_coords = list(list(ARMOR_COLORPIXEL_X_1, ARMOR_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/armor - -/obj/item/clothing/suit/space - species_clothing_color_coords = list(list(SPACESUIT_COLORPIXEL_X_1, SPACESUIT_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/spacesuit - -/obj/item/clothing/suit/mod - species_clothing_color_coords = list(list(MODSUIT_COLORPIXEL_X_1, MODSUIT_COLORPIXEL_Y_1), list(MODSUIT_COLORPIXEL_X_2, MODSUIT_COLORPIXEL_Y_2), list(MODSUIT_COLORPIXEL_X_3, MODSUIT_COLORPIXEL_Y_3)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/hardsuit - -/obj/item/clothing/under - species_clothing_color_coords = list(list(UNDER_COLORPIXEL_X_1, UNDER_COLORPIXEL_Y_1), list(UNDER_COLORPIXEL_X_2, UNDER_COLORPIXEL_Y_2), list(UNDER_COLORPIXEL_X_3, UNDER_COLORPIXEL_Y_3)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/under - greyscale_config_worn_simian_fallback_skirt = /datum/greyscale_config/simian/under_skirt - -/obj/item/mod/control - species_clothing_color_coords = list(list(MODCONTROL_COLORPIXEL_X_1, MODCONTROL_COLORPIXEL_Y_1)) - greyscale_config_worn_simian_fallback = /datum/greyscale_config/simian/modcontrol - -///GAGS below here -/* -/obj/item/clothing/under/color - greyscale_config_worn_simian = /datum/greyscale_config/jumpsuit_worn/simian - -/obj/item/clothing/under/color/jumpskirt - greyscale_config_worn_simian = /datum/greyscale_config/jumpsuit_worn/simian - -/obj/item/clothing/shoes/sneakers - greyscale_config_worn_simian = /datum/greyscale_config/sneakers_worn/simian - -/obj/item/clothing/shoes/sneakers/orange - greyscale_config_worn_simian = /datum/greyscale_config/sneakers_orange_worn/simian - -/obj/item/clothing/head/collectable/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/collectable/flatcap - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/frenchberet - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/flatcap - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/caphat/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/beret/badge - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/hats/hos/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/sec - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/science/fancy - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/science/rd - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/durathread - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/centcom_formal - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/sec/navywarden - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge_fancy/worn/simian - -/obj/item/clothing/head/beret/medical - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/engi - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/atmos - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/cargo/qm - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/hopcap/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/blueshield - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/flatcap - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/frenchberet - greyscale_config_worn_simian = /datum/greyscale_config/beret/worn/simian - -/obj/item/clothing/head/beret/sec/navywarden/syndicate - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/nanotrasen_consultant/beret - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/head/beret/sec/peacekeeper/armadyne - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge_fancy/worn/simian - -/obj/item/clothing/head/beret/sec/peacekeeper - greyscale_config_worn_simian = /datum/greyscale_config/beret_badge/worn/simian - -/obj/item/clothing/neck/ranger_poncho - greyscale_config_worn_simian = /datum/greyscale_config/ranger_poncho/worn/simian - -/obj/item/clothing/under/dress/skirt/plaid - greyscale_config_worn_simian = /datum/greyscale_config/plaidskirt_worn/simian - -/obj/item/clothing/under/dress/sundress - greyscale_config_worn_simian = /datum/greyscale_config/sundress_worn/simian -*/ diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm index 32539976f775..1b1a3f114075 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/simian.dm @@ -1,61 +1,38 @@ -/datum/species/simian - // Highly intelligent, genetically modified chimps +/datum/species/monkey/simian name = "Simian" id = SPECIES_SIMIAN - - bodytype = BODYTYPE_CUSTOM - inherent_traits = list( - TRAIT_FUR_COLORS, - TRAIT_MUTANT_COLORS, TRAIT_NO_UNDERWEAR, + TRAIT_NO_AUGMENTS, //Their bodytype doesn't allow augments, this prevents the futile effort. + TRAIT_MUTANT_COLORS, + TRAIT_FUR_COLORS, + //Simian unique traits TRAIT_VAULTING, - TRAIT_KLEPTOMANIAC, - TRAIT_MONKEYFRIEND - ) - - inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID + TRAIT_MONKEYFRIEND, + /*Monkey traits that Simians don't have, and why. + TRAIT_NO_BLOOD_OVERLAY, //let's them have a blood overlay, why not? + TRAIT_NO_TRANSFORMATION_STING, //Simians are a roundstart species and can equip all, unlike monkeys. + TRAIT_GUN_NATURAL, //Simians are Advanced tool users, this lets monkeys use guns without being smart. + TRAIT_VENTCRAWLER_NUDE, //We don't want a roundstart species that can ventcrawl. + TRAIT_WEAK_SOUL, //Crew innately giving less to Revenants for no real reason sucks for the rev. + */ + ) - mutanttongue = /obj/item/organ/internal/tongue/monkey - changesource_flags = MIRROR_BADMIN | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN - meat = /obj/item/food/meat/slab/monkey - skinned_type = /obj/item/stack/sheet/animalhide/monkey - //deathsound = 'monkestation/sound/voice/simian/deathsound.ogg' - species_language_holder = /datum/language_holder/monkey + //they get a normal brain instead of a monkey one, + //which removes the tripping stuff and gives them literacy/advancedtooluser and removes primitive (unable to use mechs) + mutantbrain = /obj/item/organ/internal/brain + no_equip_flags = NONE + changesource_flags = parent_type::changesource_flags & ~(WABBAJACK | SLIME_EXTRACT) maxhealthmod = 0.85 //small = weak stunmod = 1.3 + payday_modifier = 1 - custom_worn_icons = list( - LOADOUT_ITEM_SUIT = SIMIAN_SUIT_ICON, - LOADOUT_ITEM_UNIFORM = SIMIAN_UNIFORM_ICON, - LOADOUT_ITEM_GLASSES = SIMIAN_GLASSES_ICON, - LOADOUT_ITEM_GLOVES = SIMIAN_GLOVES_ICON, - LOADOUT_ITEM_NECK = SIMIAN_NECK_ICON, - LOADOUT_ITEM_SHOES = SIMIAN_SHOES_ICON, - LOADOUT_ITEM_BELT = SIMIAN_BELT_ICON, - LOADOUT_ITEM_MISC = SIMIAN_BACK_ICON, - ) - offset_features = list( - OFFSET_HANDS = list(0,3), - ) - - bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/simian, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/simian, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/simian, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/simian, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/simian, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/simian, - ) + give_monkey_species_effects = FALSE - external_organs = list( - /obj/item/organ/external/tail/simian = "Chimp" - ) - -/datum/species/simian/get_species_description() +/datum/species/monkey/simian/get_species_description() return "Monke." -/datum/species/simian/create_pref_unique_perks() +/datum/species/monkey/simian/create_pref_unique_perks() var/list/to_add = list() to_add += list( @@ -99,98 +76,19 @@ return to_add -/datum/species/simian/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) +/datum/species/monkey/simian/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load) . = ..() - C.gain_trauma(/datum/brain_trauma/mild/kleptomania, TRAUMA_RESILIENCE_ABSOLUTE) + human_who_gained_species.gain_trauma(/datum/brain_trauma/mild/kleptomania, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/species/simian/random_name(gender,unique,lastname) +/datum/species/monkey/simian/random_name(gender,unique,lastname) if(unique) return random_unique_simian_name(gender) var/randname = simian_name(gender) - if(lastname) randname += " [lastname]" - return randname -/datum/species/simian/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source = null) - qdel(H.wear_neck) - var/obj/item/clothing/mask/translator/T = new /obj/item/clothing/mask/translator - H.equip_to_slot(T, ITEM_SLOT_NECK) - -/obj/item/clothing/mask/translator - name = "MonkeTech AutoTranslator" - desc = "A small device that will translate speech." - icon = 'monkestation/icons/obj/clothing/masks.dmi' - icon_state = "translator" - worn_icon = 'monkestation/icons/mob/clothing/mask.dmi' - worn_icon_state = "translator" - slot_flags = ITEM_SLOT_MASK | ITEM_SLOT_NECK - modifies_speech = TRUE - var/current_language = /datum/language/common - -/obj/item/clothing/mask/translator/proc/generate_language_names(mob/user) - var/static/list/language_name_list - if(!language_name_list) - language_name_list = list() - for(var/language in user.mind.language_holder.understood_languages) - if(language in user.mind.language_holder.blocked_languages) - continue - var/atom/A = language - language_name_list[initial(A.name)] = A - return language_name_list - -/obj/item/clothing/mask/translator/attack_self(mob/user) - . = ..() - if(ishuman(user)) - var/list/display_names = generate_language_names(user) - if(!display_names.len > 1) - return - var/choice = input(user,"Please select a language","Select a language:") as null|anything in sort_list(display_names) - if(!choice) - return - current_language = display_names[choice] - -/obj/item/clothing/mask/translator/equipped(mob/M, slot) - . = ..() - if ((slot == ITEM_SLOT_MASK || slot == ITEM_SLOT_NECK) && modifies_speech) - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - else - UnregisterSignal(M, COMSIG_MOB_SAY) - -/obj/item/clothing/mask/translator/handle_speech(datum/source, list/speech_args) - . = ..() - if(!(clothing_flags * (VOICEBOX_DISABLED))) - if(obj_flags & EMAGGED) - speech_args[SPEECH_LANGUAGE] = pick(GLOB.all_languages) - else - speech_args[SPEECH_LANGUAGE] = current_language - -/obj/item/clothing/mask/translator/examine(mob/user) - . = ..() - . += "Click while in hand to select output language." - -/obj/item/clothing/mask/translator/emag_act() - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - icon_state = "translator_emag" - playsound(src, "sparks", 100, 1) - -/datum/species/simian/get_custom_worn_config_fallback(item_slot, obj/item/item) - // skirt support - if(istype(item, /obj/item/clothing/under) && !(item.body_parts_covered & LEGS)) - return item.greyscale_config_worn_simian_fallback_skirt - - return item.greyscale_config_worn_simian_fallback - -/datum/species/simian/generate_custom_worn_icon(item_slot, obj/item/item) - . = ..() - if(.) - return - - // Use the fancy fallback sprites. - . = generate_custom_worn_icon_fallback(item_slot, item) - if(.) - return +/datum/species/monkey/simian/pre_equip_species_outfit(datum/job/job, mob/living/carbon/human/equipping, visuals_only = FALSE) + var/obj/item/clothing/mask/translator/simian_translator = new /obj/item/clothing/mask/translator(equipping.loc) + equipping.equip_to_slot(simian_translator, ITEM_SLOT_NECK) diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm index ea3b7679f50d..7e743578f130 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm @@ -1,7 +1,7 @@ /datum/species/teratoma name = "Teratoma" id = SPECIES_TERATOMA - bodytype = BODYTYPE_ORGANIC | BODYTYPE_MONKEY + bodytype = BODYTYPE_ORGANIC | BODYTYPE_CUSTOM mutantbrain = /obj/item/organ/internal/brain/primate inherent_traits = list( @@ -14,7 +14,6 @@ TRAIT_EASILY_WOUNDED, TRAIT_GENELESS, TRAIT_ILLITERATE, - TRAIT_KLEPTOMANIAC, TRAIT_NO_DNA_COPY, TRAIT_NO_JUMPSUIT, TRAIT_NO_ZOMBIFY, @@ -49,6 +48,7 @@ /datum/species/teratoma/on_species_gain(mob/living/carbon/human/idiot, datum/species/old_species, pref_load) . = ..() + idiot.gain_trauma(/datum/brain_trauma/mild/kleptomania, TRAUMA_RESILIENCE_ABSOLUTE) misfortune = idiot.AddComponent(/datum/component/omen/teratoma) RegisterSignal(idiot, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(prevent_banned_reagent_exposure)) diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/mothaccessories.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/mothaccessories.dm new file mode 100644 index 000000000000..c56a2448d396 --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/mothaccessories.dm @@ -0,0 +1,34 @@ +// These can be accessed by all types of moths, just modular + +// Tundra +/datum/sprite_accessory/moth_wings/tundra + name = "Tundra" + icon = 'monkestation/icons/mob/species/tundramoths/moth_wings.dmi' + icon_state = "tundra" + +/datum/sprite_accessory/moth_antennae/tundra + name = "Tundra" + icon = 'monkestation/icons/mob/species/tundramoths/moth_antennae.dmi' + icon_state = "tundra" + +/datum/sprite_accessory/moth_markings/tundra + name = "Tundra" + icon = 'monkestation/icons/mob/species/tundramoths/moth_markings.dmi' + icon_state = "tundra" + +// Bluespace +/datum/sprite_accessory/moth_wings/bluespace + icon = 'monkestation/icons/mob/species/tundramoths/moth_wings.dmi' + name = "Bluespace" + icon_state = "bluespace" + +/datum/sprite_accessory/moth_antennae/bluespace + name = "Bluespace" + icon = 'monkestation/icons/mob/species/tundramoths/moth_antennae.dmi' + icon_state = "bluespace" + +// Twilight +/datum/sprite_accessory/moth_antennae/twilight + name = "Twilight" + icon = 'monkestation/icons/mob/species/tundramoths/moth_antennae.dmi' + icon_state = "twilight" diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/tundramoths.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/tundramoths.dm new file mode 100644 index 000000000000..e6612899a4eb --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/tundra_moths/tundramoths.dm @@ -0,0 +1,73 @@ +/datum/species/moth/tundra + name = "\improper Tundra Moth" + plural_form = "Tundra Moths" + id = SPECIES_TUNDRA + mutanteyes = /obj/item/organ/internal/eyes/moth/tundra + external_organs = list(/obj/item/organ/external/wings/moth = "Tundra", /obj/item/organ/external/antennae = "Tundra") + + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/tundramoth, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/tundramoth, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/tundramoth, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/tundramoth, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/tundramoth, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/tundramoth, + ) + + coldmod = 0.67 + heatmod = 1.5 + + +//Body parts +/obj/item/bodypart/head/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_head" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + is_dimorphic = FALSE + should_draw_greyscale = FALSE + head_flags = /obj/item/bodypart/head/moth::head_flags + +/obj/item/bodypart/chest/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_chest_m" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + is_dimorphic = TRUE + should_draw_greyscale = FALSE + +/obj/item/bodypart/arm/left/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_l_arm" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + should_draw_greyscale = FALSE + unarmed_attack_verb = "slash" + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slash.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + +/obj/item/bodypart/arm/right/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_r_arm" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + should_draw_greyscale = FALSE + unarmed_attack_verb = "slash" + unarmed_attack_effect = ATTACK_EFFECT_CLAW + unarmed_attack_sound = 'sound/weapons/slash.ogg' + unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + +/obj/item/bodypart/leg/left/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_l_leg" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + should_draw_greyscale = FALSE + +/obj/item/bodypart/leg/right/tundramoth + icon = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + icon_state = "tundra_moth_r_leg" + icon_static = 'monkestation/icons/mob/species/tundramoths/bodyparts.dmi' + limb_id = SPECIES_TUNDRA + should_draw_greyscale = FALSE diff --git a/monkestation/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/monkestation/code/modules/modular_computers/computers/item/role_tablet_presets.dm index fda8d82d90c6..b3910fab9d6c 100644 --- a/monkestation/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/monkestation/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -51,3 +51,8 @@ greyscale_config = /datum/greyscale_config/tablet/stripe_thick greyscale_colors = "#D99A2E#0EC220#727272" starting_programs = list() + +/obj/item/modular_computer/pda/barber + name = "barber PDA" + greyscale_colors = "#933ea8#235AB2" + starting_programs = list() diff --git a/monkestation/code/modules/research/designs/autolathe/service_designs.dm b/monkestation/code/modules/research/designs/autolathe/service_designs.dm new file mode 100644 index 000000000000..2cc116719b28 --- /dev/null +++ b/monkestation/code/modules/research/designs/autolathe/service_designs.dm @@ -0,0 +1,60 @@ + +/datum/design/scissors + name = "Barber's Scissors" + id = "scissors" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/scissors + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/hairbrush + name = "Hairbrush" + id = "hairbrush" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/hairbrush + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/hairbrush/comb + name = "Comb" + id = "comb" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/hairbrush/comb + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/dyespray + name = "Hair Dye Spray" + id = "dyespray" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.5, /datum/material/plastic = SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/dyespray + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE + +/datum/design/fur_dyer + name = "Electric Fur Dyer" + id = "fur_dyer" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*2, /datum/material/glass = SMALL_MATERIAL_AMOUNT*1, /datum/material/plastic = SMALL_MATERIAL_AMOUNT*0.5) + build_path = /obj/item/fur_dyer + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_SERVICE, + ) + departmental_flags = DEPARTMENT_BITFLAG_SERVICE diff --git a/monkestation/code/modules/research/designs/medical_designs.dm b/monkestation/code/modules/research/designs/medical_designs.dm index 533b1a0629ca..94fb3386dc9d 100644 --- a/monkestation/code/modules/research/designs/medical_designs.dm +++ b/monkestation/code/modules/research/designs/medical_designs.dm @@ -23,7 +23,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_MEDICAL - /datum/design/surgery/healing/filter_upgrade name = "Filter Blood Upgrade" desc = "Newfound knowledge allows us to remove the effect of toxins on the body whenever filtering someone's blood." @@ -53,7 +52,7 @@ surgery = /datum/surgery/robot_healing id = "surgery_heal_robot_base" research_icon_state = "surgery_chest" - + /datum/design/surgery/robot_healing/upgraded name = "Repair Robotic Limbs (Physical) Upgrade" desc = "A surgical procedure that provides highly effective repairs and maintenance to robotic limbs. Is somewhat more efficient when the patient is severely damaged." @@ -67,3 +66,16 @@ surgery = /datum/surgery/robot_healing/experimental id = "surgery_heal_robot_upgrade_femto" research_icon_state = "surgery_chest" + +/datum/design/cyberimp_sprinter + name = "Vacuole ligament system" + desc = "Mechicanical servos in ones leg that increases their natural stride. Popular amongst parkour enthusiasts. You need to implant this in both of your legs to make it work." + id = "ci-sprinter" + build_type = PROTOLATHE | AWAY_LATHE | MECHFAB + construction_time = 50 + materials = list(/datum/material/iron = 1500, /datum/material/glass = 1000, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5, /datum/material/gold =SMALL_MATERIAL_AMOUNT*5) + build_path = /obj/item/organ/internal/cyberimp/leg/sprinter + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_UTILITY + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL diff --git a/monkestation/code/modules/research/nanites/nanite_programs/sensor.dm b/monkestation/code/modules/research/nanites/nanite_programs/sensor.dm index a83cf47d76a5..1d925f85a228 100644 --- a/monkestation/code/modules/research/nanites/nanite_programs/sensor.dm +++ b/monkestation/code/modules/research/nanites/nanite_programs/sensor.dm @@ -312,7 +312,6 @@ "Oozeling" = /datum/species/oozeling, "IPC" = /datum/species/ipc, "Monkey" = /datum/species/monkey, - "Simian" = /datum/species/simian, "Zombie" = /datum/species/zombie, "Shadow" = /datum/species/shadow, ) diff --git a/monkestation/code/modules/storytellers/converted_events/_base_event.dm b/monkestation/code/modules/storytellers/converted_events/_base_event.dm index 4335c4386191..d3503aa18710 100644 --- a/monkestation/code/modules/storytellers/converted_events/_base_event.dm +++ b/monkestation/code/modules/storytellers/converted_events/_base_event.dm @@ -145,6 +145,8 @@ /// A list of extra events to force whenever this one is chosen by the storyteller. /// Can either be normal list or a weighted list. var/list/extra_spawned_events + /// Similar to extra_spawned_events however these are only used by roundstart events and will only try and run if we have the points to do so + var/list/preferred_events /datum/round_event_control/antagonist/solo/from_ghosts/get_candidates() var/round_started = SSticker.HasRoundStarted() @@ -210,13 +212,18 @@ var/prompted_picking = FALSE //TODO: Implement this /// DO NOT SET THIS MANUALLY, THIS IS INHERITED FROM THE EVENT CONTROLLER ON NEW var/list/extra_spawned_events + // Same as above + var/list/preferred_events /datum/round_event/antagonist/solo/New(my_processing, datum/round_event_control/event_controller) . = ..() if(istype(event_controller, /datum/round_event_control/antagonist/solo)) var/datum/round_event_control/antagonist/solo/antag_event_controller = event_controller - if(antag_event_controller?.extra_spawned_events) - extra_spawned_events = fill_with_ones(antag_event_controller.extra_spawned_events) + if(antag_event_controller) + if(antag_event_controller.extra_spawned_events) + extra_spawned_events = fill_with_ones(antag_event_controller.extra_spawned_events) + if(antag_event_controller.preferred_events) + preferred_events = fill_with_ones(antag_event_controller.preferred_events) /datum/round_event/antagonist/solo/setup() var/datum/round_event_control/antagonist/solo/cast_control = control diff --git a/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm index 6537de94516e..378199bb53d4 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/bloodcult.dm @@ -40,6 +40,7 @@ weight = 4 max_occurrences = 1 event_icon_state = "cult" + preferred_events = list(/datum/round_event_control/antagonist/solo/clockcult = 1) /datum/round_event/antagonist/solo/bloodcult excute_round_end_reports = TRUE diff --git a/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm index 90c8a533750d..98f2a7adbbf8 100644 --- a/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm +++ b/monkestation/code/modules/storytellers/converted_events/solo/clockwork_cult.dm @@ -39,6 +39,7 @@ weight = 0 max_occurrences = 1 event_icon_state = "clockcult" + preferred_events = list(/datum/round_event_control/antagonist/solo/bloodcult = 1) /datum/round_event/antagonist/solo/clockcult end_when = 60000 diff --git a/monkestation/code/modules/storytellers/gamemode_subsystem.dm b/monkestation/code/modules/storytellers/gamemode_subsystem.dm index b8a1179eb9b7..d7e055683043 100644 --- a/monkestation/code/modules/storytellers/gamemode_subsystem.dm +++ b/monkestation/code/modules/storytellers/gamemode_subsystem.dm @@ -3,6 +3,8 @@ #define DEFAULT_STORYTELLER_VOTE_OPTIONS 4 ///amount of players we can have before no longer running votes for storyteller #define MAX_POP_FOR_STORYTELLER_VOTE 25 +///the duration into the round for which roundstart events are still valid to run +#define ROUNDSTART_VALID_TIMEFRAME 3 MINUTES SUBSYSTEM_DEF(gamemode) name = "Gamemode" @@ -15,7 +17,7 @@ SUBSYSTEM_DEF(gamemode) /// List of our event tracks for fast access during for loops. var/list/event_tracks = EVENT_TRACKS /// Our storyteller. They progresses our trackboards and picks out events - var/datum/storyteller/storyteller + var/datum/storyteller/current_storyteller /// Result of the storyteller vote/pick. Defaults to the guide. var/selected_storyteller = /datum/storyteller/guide /// List of all the storytellers. Populated at init. Associative from type @@ -116,13 +118,10 @@ SUBSYSTEM_DEF(gamemode) var/list/control = list() //list of all datum/round_event_control. Used for selecting events based on weight and occurrences. var/list/running = list() //list of all existing /datum/round_event var/list/round_end_data = list() //list of all reports that need to add round end reports - var/list/currentrun = list() /// List of all uncategorized events, because they were wizard or holiday events var/list/uncategorized = list() - var/list/holidays //List of all holidays occuring today or null if no holidays - /// Event frequency multiplier, it exists because wizard, eugh. var/event_frequency_multiplier = 1 @@ -155,7 +154,10 @@ SUBSYSTEM_DEF(gamemode) /// What is our currently desired/selected roundstart event var/datum/round_event_control/antagonist/solo/current_roundstart_event var/list/last_round_events = list() + /// Has a roundstart event been run var/ran_roundstart = FALSE + /// Are we able to run roundstart events + var/can_run_roundstart = TRUE var/list/triggered_round_events = list() /datum/controller/subsystem/gamemode/Initialize(time, zlevel) @@ -170,12 +172,12 @@ SUBSYSTEM_DEF(gamemode) for(var/datum/round_event_control/event_type as anything in typesof(/datum/round_event_control)) if(!event_type::typepath || !event_type::name) continue + var/datum/round_event_control/event = new event_type if(!event.valid_for_map()) qdel(event) continue // event isn't good for this map no point in trying to add it to the list control += event //add it to the list of all events (controls) - getHoliday() load_config_vars() load_event_config_vars() @@ -193,10 +195,33 @@ SUBSYSTEM_DEF(gamemode) return SS_INIT_NO_NEED return SS_INIT_SUCCESS - /datum/controller/subsystem/gamemode/fire(resumed = FALSE) - if(!resumed) - src.currentrun = running.Copy() + if(SSticker.round_start_time && (world.time - SSticker.round_start_time) >= ROUNDSTART_VALID_TIMEFRAME) + can_run_roundstart = FALSE + else if(current_roundstart_event && length(current_roundstart_event.preferred_events)) //note that this implementation is made for preferred_events being other roundstart events + var/list/preferred_copy = current_roundstart_event.preferred_events.Copy() + var/datum/round_event_control/selected_event = pick_weight(preferred_copy) + var/player_count = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) + if(ispath(selected_event)) //get the instances if we dont have them + current_roundstart_event.preferred_events = list() + for(var/datum/round_event_control/e_control as anything in preferred_copy) + current_roundstart_event.preferred_events[new e_control] = preferred_copy[e_control] + preferred_copy = current_roundstart_event.preferred_events.Copy() + selected_event = null + else if(!selected_event.can_spawn_event(player_count)) + preferred_copy -= selected_event + selected_event = null + + var/sanity = 0 + while(!selected_event && length(preferred_copy) && sanity < 100) + sanity++ + selected_event = pick_weight(preferred_copy) + if(!selected_event.can_spawn_event(player_count)) + preferred_copy -= selected_event + selected_event = null + + if(selected_event) + current_storyteller.try_buy_event(GLOB.event_groups) ///Handle scheduled events for(var/datum/scheduled_event/sch_event in scheduled_events) @@ -207,24 +232,11 @@ SUBSYSTEM_DEF(gamemode) sch_event.alerted_admins = TRUE message_admins("Scheduled Event: [sch_event.event] will run in [(sch_event.start_time - world.time) / 10] seconds. (CANCEL) (REFUND)") - if(!halted_storyteller && next_storyteller_process <= world.time && storyteller) + if(!halted_storyteller && next_storyteller_process <= world.time && current_storyteller) // We update crew information here to adjust population scalling and event thresholds for the storyteller. update_crew_infos() next_storyteller_process = world.time + STORYTELLER_WAIT_TIME - storyteller.process(STORYTELLER_WAIT_TIME * 0.1) - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while(currentrun.len) - var/datum/thing = currentrun[currentrun.len] - currentrun.len-- - if(thing) - thing.process(wait * 0.1) - else - running.Remove(thing) - if (MC_TICK_CHECK) - return + current_storyteller.process(STORYTELLER_WAIT_TIME * 0.1) /// Gets the number of antagonists the antagonist injection events will stop rolling after. /datum/controller/subsystem/gamemode/proc/get_antag_cap() @@ -347,7 +359,7 @@ SUBSYSTEM_DEF(gamemode) /// We roll points to be spent for roundstart events, including antagonists. /datum/controller/subsystem/gamemode/proc/roll_pre_setup_points() - if(storyteller.disable_distribution || halted_storyteller) + if(current_storyteller.disable_distribution || halted_storyteller) return /// Distribute points for(var/track in event_track_points) @@ -371,12 +383,12 @@ SUBSYSTEM_DEF(gamemode) gain_amt = ROUNDSTART_OBJECTIVES_GAIN var/calc_value = base_amt + (gain_amt * ready_players) calc_value *= roundstart_point_multipliers[track] - calc_value *= storyteller.starting_point_multipliers[track] - calc_value *= (rand(100 - storyteller.roundstart_points_variance,100 + storyteller.roundstart_points_variance)/100) + calc_value *= current_storyteller.starting_point_multipliers[track] + calc_value *= (rand(100 - current_storyteller.roundstart_points_variance,100 + current_storyteller.roundstart_points_variance)/100) event_track_points[track] = round(calc_value) /// If the storyteller guarantees an antagonist roll, add points to make it so. - if(storyteller.guarantees_roundstart_roleset && event_track_points[EVENT_TRACK_ROLESET] < point_thresholds[EVENT_TRACK_ROLESET]) + if(current_storyteller.guarantees_roundstart_roleset && event_track_points[EVENT_TRACK_ROLESET] < point_thresholds[EVENT_TRACK_ROLESET]) event_track_points[EVENT_TRACK_ROLESET] = point_thresholds[EVENT_TRACK_ROLESET] /// If we have any forced events, ensure we get enough points for them @@ -392,13 +404,13 @@ SUBSYSTEM_DEF(gamemode) /// Because roundstart events need 2 steps of firing for purposes of antags, here is the first step handled, happening before occupation division. /datum/controller/subsystem/gamemode/proc/handle_pre_setup_roundstart_events() - if(storyteller.disable_distribution) + if(current_storyteller.disable_distribution) return if(halted_storyteller) message_admins("WARNING: Didn't roll roundstart events (including antagonists) due to the storyteller being halted.") return while(TRUE) - if(!storyteller.handle_tracks()) + if(!current_storyteller.handle_tracks()) break /// Second step of handlind roundstart events, happening after people spawn. @@ -503,56 +515,6 @@ SUBSYSTEM_DEF(gamemode) /datum/admins/proc/forceGamemode(mob/user) SSgamemode.admin_panel(user) - -////////////// -// HOLIDAYS // -////////////// -//Uncommenting ALLOW_HOLIDAYS in config.txt will enable holidays - -//It's easy to add stuff. Just add a holiday datum in code/modules/holiday/holidays.dm -//You can then check if it's a special day in any code in the game by doing if(SSgamemode.holidays["Groundhog Day"]) - -//You can also make holiday random events easily thanks to Pete/Gia's system. -//simply make a random event normally, then assign it a holidayID string which matches the holiday's name. -//Anything with a holidayID, which isn't in the holidays list, will never occur. - -//Please, Don't spam stuff up with stupid stuff (key example being april-fools Pooh/ERP/etc), -//And don't forget: CHECK YOUR CODE!!!! We don't want any zero-day bugs which happen only on holidays and never get found/fixed! - -////////////////////////////////////////////////////////////////////////////////////////////////////////// -//ALSO, MOST IMPORTANTLY: Don't add stupid stuff! Discuss bonus content with Project-Heads first please!// -////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -//sets up the holidays and holidays list -/datum/controller/subsystem/gamemode/proc/getHoliday() - if(!CONFIG_GET(flag/allow_holidays)) - return // Holiday stuff was not enabled in the config! - for(var/H in subtypesof(/datum/holiday)) - var/datum/holiday/holiday = new H() - var/delete_holiday = TRUE - for(var/timezone in holiday.timezones) - var/time_in_timezone = world.realtime + timezone HOURS - - var/YYYY = text2num(time2text(time_in_timezone, "YYYY")) // get the current year - var/MM = text2num(time2text(time_in_timezone, "MM")) // get the current month - var/DD = text2num(time2text(time_in_timezone, "DD")) // get the current day - var/DDD = time2text(time_in_timezone, "DDD") // get the current weekday - - if(holiday.shouldCelebrate(DD, MM, YYYY, DDD)) - holiday.celebrate() - LAZYSET(holidays, holiday.name, holiday) - delete_holiday = FALSE - break - if(delete_holiday) - qdel(holiday) - - if(holidays) - holidays = shuffle(holidays) - // regenerate station name because holiday prefixes. - set_station_name(new_station_name()) - world.update_status() - /datum/controller/subsystem/gamemode/proc/toggleWizardmode() wizardmode = !wizardmode //TODO: decide what to do with wiz events message_admins("Summon Events has been [wizardmode ? "enabled, events will occur [SSgamemode.event_frequency_multiplier] times as fast" : "disabled"]!") @@ -582,9 +544,9 @@ SUBSYSTEM_DEF(gamemode) if(SSdbcore.Connect()) var/list/to_set = list() var/arguments = list() - if(storyteller) + if(current_storyteller) to_set += "game_mode = :game_mode" - arguments["game_mode"] = storyteller.name + arguments["game_mode"] = current_storyteller.name if(GLOB.revdata.originmastercommit) to_set += "commit_hash = :commit_hash" arguments["commit_hash"] = GLOB.revdata.originmastercommit @@ -865,21 +827,21 @@ SUBSYSTEM_DEF(gamemode) /datum/controller/subsystem/gamemode/proc/set_storyteller(passed_type) if(!storytellers[passed_type]) message_admins("Attempted to set an invalid storyteller type: [passed_type], force setting to guide instead.") - storyteller = storytellers[/datum/storyteller/guide] //if we dont have any then we brick, lets not do that + current_storyteller = storytellers[/datum/storyteller/guide] //if we dont have any then we brick, lets not do that CRASH("Attempted to set an invalid storyteller type: [passed_type].") - storyteller = storytellers[passed_type] + current_storyteller = storytellers[passed_type] if(!secret_storyteller) - send_to_playing_players(span_notice("Storyteller is [storyteller.name]!")) - send_to_playing_players(span_notice("[storyteller.welcome_text]")) + send_to_playing_players(span_notice("Storyteller is [current_storyteller.name]!")) + send_to_playing_players(span_notice("[current_storyteller.welcome_text]")) else - send_to_observers(span_boldbig("Storyteller is [storyteller.name]!")) //observers still get to know + send_to_observers(span_boldbig("Storyteller is [current_storyteller.name]!")) //observers still get to know /// Panel containing information, variables and controls about the gamemode and scheduled event /datum/controller/subsystem/gamemode/proc/admin_panel(mob/user) update_crew_infos() var/round_started = SSticker.HasRoundStarted() var/list/dat = list() - dat += "Storyteller: [storyteller ? "[storyteller.name]" : "None"] " + dat += "Storyteller: [current_storyteller ? "[current_storyteller.name]" : "None"] " dat += " HALT Storyteller Event Panel Set Storyteller Refresh" dat += "
Storyteller determines points gained, event chances, and is the entity responsible for rolling events." dat += "
Active Players: [active_players] (Head: [head_crew], Sec: [sec_crew], Eng: [eng_crew], Med: [med_crew])" @@ -995,15 +957,15 @@ SUBSYSTEM_DEF(gamemode) /// Panel containing information and actions regarding events /datum/controller/subsystem/gamemode/proc/event_panel(mob/user) var/list/dat = list() - if(storyteller) - dat += "Storyteller: [storyteller.name]" - dat += "
Repetition penalty multiplier: [storyteller.event_repetition_multiplier]" - dat += "
Cost variance: [storyteller.cost_variance]" - if(storyteller.tag_multipliers) + if(current_storyteller) + dat += "Storyteller: [current_storyteller.name]" + dat += "
Repetition penalty multiplier: [current_storyteller.event_repetition_multiplier]" + dat += "
Cost variance: [current_storyteller.cost_variance]" + if(current_storyteller.tag_multipliers) dat += "
Tag multipliers:" - for(var/tag in storyteller.tag_multipliers) - dat += "[tag]:[storyteller.tag_multipliers[tag]] | " - storyteller.calculate_weights(statistics_track_page) + for(var/tag in current_storyteller.tag_multipliers) + dat += "[tag]:[current_storyteller.tag_multipliers[tag]] | " + current_storyteller.calculate_weights(statistics_track_page) else dat += "Storyteller: None
Weight and chance statistics will be inaccurate due to the present lack of a storyteller." dat += "
Roundstart Events Forced Roundstart events will use rolled points, and are guaranteed to trigger (even if the used points are not enough)" @@ -1163,8 +1125,8 @@ SUBSYSTEM_DEF(gamemode) message_admins("[key_name_admin(usr)] invoked next event for [track] track.") log_admin_private("[key_name(usr)] invoked next event for [track] track.") event_track_points[track] = point_thresholds[track] - if(storyteller) - storyteller.handle_tracks() + if(current_storyteller) + current_storyteller.handle_tracks() admin_panel(user) if("stats") switch(href_list["action"]) @@ -1211,3 +1173,4 @@ SUBSYSTEM_DEF(gamemode) #undef DEFAULT_STORYTELLER_VOTE_OPTIONS #undef MAX_POP_FOR_STORYTELLER_VOTE +#undef ROUNDSTART_VALID_TIMEFRAME diff --git a/monkestation/code/modules/storytellers/storytellers/_storyteller.dm b/monkestation/code/modules/storytellers/storytellers/_storyteller.dm index bd6486890c67..cbb8955f593f 100644 --- a/monkestation/code/modules/storytellers/storytellers/_storyteller.dm +++ b/monkestation/code/modules/storytellers/storytellers/_storyteller.dm @@ -59,7 +59,7 @@ ///weight this has of being picked for random storyteller/showing up in the vote if not always_votable var/weight = 0 -/datum/storyteller/process(delta_time) +/datum/storyteller/process(seconds_per_tick) if(!round_started || disable_distribution) // we are differing roundstarted ones until base roundstart so we can get cooler stuff return @@ -73,17 +73,15 @@ SSgamemode.forced_next_events -= EVENT_TRACK_ROLESET log_storyteller("Running SSgamemode.current_roundstart_event\[[SSgamemode.current_roundstart_event]\]") - SSgamemode.current_roundstart_event = null - if(!ignores_roundstart) - SSgamemode.ran_roundstart = TRUE + SSgamemode.ran_roundstart = TRUE - add_points(delta_time) + add_points(seconds_per_tick) handle_tracks() /// Add points to all tracks while respecting the multipliers. -/datum/storyteller/proc/add_points(delta_time) +/datum/storyteller/proc/add_points(seconds_per_tick) var/datum/controller/subsystem/gamemode/mode = SSgamemode - var/base_point = EVENT_POINT_GAINED_PER_SECOND * delta_time * mode.event_frequency_multiplier + var/base_point = EVENT_POINT_GAINED_PER_SECOND * seconds_per_tick * mode.event_frequency_multiplier for(var/track in mode.event_track_points) var/point_gain = base_point * point_gains_multipliers[track] * mode.point_gain_multipliers[track] if(mode.allow_pop_scaling) @@ -150,8 +148,26 @@ buy_event(picked_event, track, are_forced) . = TRUE +///Attempt to buy a specific event if we can afford it, otherwise returns FALSE, note this does NOT take cost variance into account +/datum/storyteller/proc/try_buy_event(datum/round_event_control/bought_event) + if(ispath(bought_event)) + bought_event = locate(bought_event) in SSevents.control //might be able to make this slightly cheaper by searching in the track sorted list + var/track = bought_event.track + if(!track || (bought_event in SSgamemode.uncategorized)) + return FALSE //trackless events cant be bought + + var/datum/controller/subsystem/gamemode/mode = SSgamemode + if(mode.event_track_points[track] - (bought_event.cost * mode.point_thresholds[track]) < 0) + return FALSE + + buy_event(bought_event, track) + return TRUE + /// Find and buy a valid event from a track. /datum/storyteller/proc/buy_event(datum/round_event_control/bought_event, track, forced = FALSE) + if(!track) + track = bought_event.track + var/datum/controller/subsystem/gamemode/mode = SSgamemode // Perhaps use some bell curve instead of a flat variance? var/total_cost = bought_event.cost * mode.point_thresholds[track] @@ -160,8 +176,7 @@ mode.event_track_points[track] = max(mode.event_track_points[track] - total_cost, 0) message_admins("Storyteller purchased and triggered [bought_event] event, on [track] track, for [total_cost] cost.") if(bought_event.roundstart) - if(!ignores_roundstart) - SSgamemode.ran_roundstart = TRUE + SSgamemode.ran_roundstart = TRUE mode.TriggerEvent(bought_event, forced) else mode.schedule_event(bought_event, 3 MINUTES, total_cost, _forced = forced) diff --git a/monkestation/code/modules/storytellers/storytellers/brute.dm b/monkestation/code/modules/storytellers/storytellers/brute.dm new file mode 100644 index 000000000000..838e2ea0f7ff --- /dev/null +++ b/monkestation/code/modules/storytellers/storytellers/brute.dm @@ -0,0 +1,18 @@ +/datum/storyteller/brute + name = "The Brute" + desc = "While the brute will hit hard, it tires quickly." + starting_point_multipliers = list( + EVENT_TRACK_MUNDANE = 1, + EVENT_TRACK_MODERATE = 1, + EVENT_TRACK_MAJOR = 1, + EVENT_TRACK_ROLESET = 1.2, + EVENT_TRACK_OBJECTIVES = 1, + ) + point_gains_multipliers = list( + EVENT_TRACK_MUNDANE = 0.8, + EVENT_TRACK_MODERATE = 0.8, + EVENT_TRACK_MAJOR = 0.8, + EVENT_TRACK_ROLESET = 0.3, + EVENT_TRACK_OBJECTIVES = 1, + ) + weight = 0 diff --git a/monkestation/code/modules/surgery/bodyparts/monkey_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/monkey_bodyparts.dm new file mode 100644 index 000000000000..a36a5aba0a69 --- /dev/null +++ b/monkestation/code/modules/surgery/bodyparts/monkey_bodyparts.dm @@ -0,0 +1,114 @@ +/obj/item/bodypart/head/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_head" + limb_id = SPECIES_MONKEY + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + dmg_overlay_type = SPECIES_MONKEY + is_dimorphic = FALSE + should_draw_greyscale = TRUE + head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" + +/obj/item/bodypart/chest/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_chest" + limb_id = SPECIES_MONKEY + should_draw_greyscale = TRUE + is_dimorphic = FALSE + wound_resistance = -10 + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + acceptable_bodytype = BODYTYPE_MONKEY + dmg_overlay_type = SPECIES_MONKEY + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" + +/obj/item/bodypart/arm/left/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_l_arm" + limb_id = SPECIES_MONKEY + should_draw_greyscale = TRUE + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + wound_resistance = -10 + px_x = -5 + px_y = -3 + dmg_overlay_type = SPECIES_MONKEY + unarmed_damage_low = 2 // monkey punches must be really weak, considering they bite people instead and their bites are weak as hell. + unarmed_damage_high = 2 + unarmed_stun_threshold = 3 + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" + +/obj/item/bodypart/arm/right/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_r_arm" + limb_id = SPECIES_MONKEY + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + should_draw_greyscale = TRUE + wound_resistance = -10 + px_x = 5 + px_y = -3 + dmg_overlay_type = SPECIES_MONKEY + unarmed_damage_low = 2 + unarmed_damage_high = 2 + unarmed_stun_threshold = 3 + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" + +/obj/item/bodypart/leg/left/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_l_leg" + limb_id = SPECIES_MONKEY + should_draw_greyscale = TRUE + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + wound_resistance = -10 + px_y = 4 + dmg_overlay_type = SPECIES_MONKEY + unarmed_damage_low = 3 + unarmed_damage_high = 3 + unarmed_stun_threshold = 4 + footprint_sprite = FOOTPRINT_SPRITE_PAWS + speed_modifier = -0.05 + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" + +/obj/item/bodypart/leg/right/monkey + icon = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_greyscale = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + icon_static = 'icons/mob/species/monkey/bodyparts.dmi' + icon_husk = 'monkestation/icons/mob/species/monkey/bodyparts.dmi' + husk_type = "monkey" + icon_state = "default_monkey_r_leg" + limb_id = SPECIES_MONKEY + should_draw_greyscale = TRUE + bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC + wound_resistance = -10 + px_y = 4 + dmg_overlay_type = SPECIES_MONKEY + unarmed_damage_low = 3 + unarmed_damage_high = 3 + unarmed_stun_threshold = 4 + footprint_sprite = FOOTPRINT_SPRITE_PAWS + speed_modifier = -0.05 + palette = /datum/color_palette/generic_colors + palette_key = "fur_color" diff --git a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm deleted file mode 100644 index 23da5d9671bb..000000000000 --- a/monkestation/code/modules/surgery/bodyparts/simian_bodyparts.dm +++ /dev/null @@ -1,65 +0,0 @@ -/obj/item/bodypart/head/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - is_dimorphic = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - head_flags = HEAD_EYESPRITES | HEAD_EYEHOLES | HEAD_DEBRAIN | HEAD_EYECOLOR - dmg_overlay_type = "monkey" - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" - -/obj/item/bodypart/chest/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - is_dimorphic = FALSE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - dmg_overlay_type = "monkey" - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" - -/obj/item/bodypart/arm/left/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - dmg_overlay_type = "monkey" - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" - -/obj/item/bodypart/arm/right/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - dmg_overlay_type = "monkey" - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" - -/obj/item/bodypart/leg/left/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - footprint_sprite = FOOTPRINT_SPRITE_PAWS - speed_modifier = -0.05 - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" - -/obj/item/bodypart/leg/right/simian - icon_greyscale = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - icon_husk = 'monkestation/icons/mob/species/simian/bodyparts.dmi' - husk_type = "simian" - limb_id = SPECIES_SIMIAN - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM - footprint_sprite = FOOTPRINT_SPRITE_PAWS - dmg_overlay_type = "monkey" - speed_modifier = -0.05 - palette = /datum/color_palette/generic_colors - palette_key = "fur_color" diff --git a/monkestation/code/modules/surgery/bodyparts/teratoma_bodyparts.dm b/monkestation/code/modules/surgery/bodyparts/teratoma_bodyparts.dm index 96e67800e663..cd45074e1f51 100644 --- a/monkestation/code/modules/surgery/bodyparts/teratoma_bodyparts.dm +++ b/monkestation/code/modules/surgery/bodyparts/teratoma_bodyparts.dm @@ -18,6 +18,7 @@ limb_id = SPECIES_TERATOMA is_dimorphic = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_CUSTOM + acceptable_bodytype = BODYTYPE_CUSTOM should_draw_greyscale = FALSE composition_effects = list(TRAIT_PASSTABLE = 0.5, TRAIT_VENTCRAWLER_ALWAYS = 0.8) diff --git a/monkestation/code/modules/surgery/organs/external/simian.dm b/monkestation/code/modules/surgery/organs/external/simian.dm deleted file mode 100644 index 504bc604d037..000000000000 --- a/monkestation/code/modules/surgery/organs/external/simian.dm +++ /dev/null @@ -1,16 +0,0 @@ -/obj/item/organ/external/tail/simian - name = "monkey tail" - desc = "A severed monkey tail. Somewhere, no doubt, a simian hater is very pleased with themselves." - preference = "feature_tail_monkey" - - bodypart_overlay = /datum/bodypart_overlay/mutant/tail/simian - -/datum/bodypart_overlay/mutant/tail/simian - layers = EXTERNAL_FRONT | EXTERNAL_BEHIND - feature_key = "tail_monkey" - -/datum/bodypart_overlay/mutant/tail/simian/get_global_feature_list() - return GLOB.tails_list_monkey - -/datum/bodypart_overlay/mutant/tail/simian/get_base_icon_state() - return sprite_datum.icon_state diff --git a/monkestation/code/modules/surgery/organs/internal/eyes.dm b/monkestation/code/modules/surgery/organs/internal/eyes.dm index 076ebd4e1457..a70dba2e3f8f 100644 --- a/monkestation/code/modules/surgery/organs/internal/eyes.dm +++ b/monkestation/code/modules/surgery/organs/internal/eyes.dm @@ -45,3 +45,8 @@ /obj/item/organ/internal/eyes/ethereal eye_icon_state = "etherealeyes" + +/obj/item/organ/internal/eyes/moth/tundra + name = "tundra moth eyes" + eye_icon_state = "tundramotheyes" + icon_state = "eyeballs-tundramoth" diff --git a/monkestation/code/modules/the_fabled_dna_changes/species_color_pallettes/generic_palette.dm b/monkestation/code/modules/the_fabled_dna_changes/species_color_pallettes/generic_palette.dm index eb948ad9fbc4..b7464c622c78 100644 --- a/monkestation/code/modules/the_fabled_dna_changes/species_color_pallettes/generic_palette.dm +++ b/monkestation/code/modules/the_fabled_dna_changes/species_color_pallettes/generic_palette.dm @@ -2,7 +2,8 @@ var/hair_color var/mutant_color var/mutant_color_secondary - var/fur_color + ///Color of Monkey and Simian's fur, defaulted to Monkey-Brown. + var/fur_color = COLOR_MONKEY_BROWN var/ethereal_color /datum/color_palette/generic_colors/apply_prefs(datum/preferences/incoming) diff --git a/monkestation/code/modules/uplink/uplink_items/species.dm b/monkestation/code/modules/uplink/uplink_items/species.dm index 5c11850bfd05..3655c256a556 100644 --- a/monkestation/code/modules/uplink/uplink_items/species.dm +++ b/monkestation/code/modules/uplink/uplink_items/species.dm @@ -14,14 +14,14 @@ desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective" cost = 7 item = /obj/item/grenade/monkey_barrel - restricted_species = list(SPECIES_SIMIAN) + restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN) /datum/uplink_item/species_restricted/monkey_ball name = "Monkey Ball" desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels." cost = 12 item = /obj/vehicle/ridden/monkey_ball - restricted_species = list(SPECIES_SIMIAN) + restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN) /datum/uplink_item/species_restricted/tribal_claw_scroll name = "Silver-Scale Scroll" diff --git a/monkestation/code/modules/virology/disease/symtoms/deadly/asphyxiation.dm b/monkestation/code/modules/virology/disease/symtoms/deadly/asphyxiation.dm index 447249364c99..b6acd459c542 100644 --- a/monkestation/code/modules/virology/disease/symtoms/deadly/asphyxiation.dm +++ b/monkestation/code/modules/virology/disease/symtoms/deadly/asphyxiation.dm @@ -7,6 +7,8 @@ stage = 3 /datum/symptom/asphyxiation/activate(mob/living/carbon/mob) + if(HAS_TRAIT(mob, TRAIT_NOBREATH)) + return mob.emote("gasp") if(prob(20) && multiplier >= 4 && iscarbon(mob)) mob.reagents.add_reagent_list(list(/datum/reagent/toxin/pancuronium = 3, /datum/reagent/toxin/sodium_thiopental = 3)) diff --git a/monkestation/icons/effects/mouse_pointers/feast.dmi b/monkestation/icons/effects/mouse_pointers/feast.dmi new file mode 100644 index 000000000000..10d3dc2cba0b Binary files /dev/null and b/monkestation/icons/effects/mouse_pointers/feast.dmi differ diff --git a/monkestation/icons/mob/actions/actions_zombie.dmi b/monkestation/icons/mob/actions/actions_zombie.dmi new file mode 100644 index 000000000000..77a63c3fd71d Binary files /dev/null and b/monkestation/icons/mob/actions/actions_zombie.dmi differ diff --git a/monkestation/icons/mob/clothing/head.dmi b/monkestation/icons/mob/clothing/head.dmi index a677b3cb2e8a..df141a951c03 100644 Binary files a/monkestation/icons/mob/clothing/head.dmi and b/monkestation/icons/mob/clothing/head.dmi differ diff --git a/monkestation/icons/mob/clothing/species/simian/back.dmi b/monkestation/icons/mob/clothing/species/simian/back.dmi deleted file mode 100644 index 8a4522cd235f..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/back.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/belts.dmi b/monkestation/icons/mob/clothing/species/simian/belts.dmi deleted file mode 100644 index 4fcc9f8f4b16..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/belts.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/glasses.dmi b/monkestation/icons/mob/clothing/species/simian/glasses.dmi deleted file mode 100644 index d5e2964d6300..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/glasses.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/gloves.dmi b/monkestation/icons/mob/clothing/species/simian/gloves.dmi deleted file mode 100644 index 19d15d42f57f..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/gloves.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/neck.dmi b/monkestation/icons/mob/clothing/species/simian/neck.dmi deleted file mode 100644 index 677c46c9832f..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/neck.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/shoes.dmi b/monkestation/icons/mob/clothing/species/simian/shoes.dmi deleted file mode 100644 index 90066cc8d52c..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/shoes.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/suit.dmi b/monkestation/icons/mob/clothing/species/simian/suit.dmi deleted file mode 100644 index 92d02218f37f..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/suit.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/species/simian/uniform.dmi b/monkestation/icons/mob/clothing/species/simian/uniform.dmi deleted file mode 100644 index 398bc9d3dfb8..000000000000 Binary files a/monkestation/icons/mob/clothing/species/simian/uniform.dmi and /dev/null differ diff --git a/monkestation/icons/mob/clothing/suit.dmi b/monkestation/icons/mob/clothing/suit.dmi index 87eecacac872..15f60259f65c 100644 Binary files a/monkestation/icons/mob/clothing/suit.dmi and b/monkestation/icons/mob/clothing/suit.dmi differ diff --git a/monkestation/icons/mob/gags/clothing/simian_fallbacks.dmi b/monkestation/icons/mob/gags/clothing/simian_fallbacks.dmi deleted file mode 100644 index 77fcbb396d06..000000000000 Binary files a/monkestation/icons/mob/gags/clothing/simian_fallbacks.dmi and /dev/null differ diff --git a/monkestation/icons/mob/species/monkey/bodyparts.dmi b/monkestation/icons/mob/species/monkey/bodyparts.dmi new file mode 100644 index 000000000000..345e527599d1 Binary files /dev/null and b/monkestation/icons/mob/species/monkey/bodyparts.dmi differ diff --git a/monkestation/icons/mob/species/monkey/monkey_tail.dmi b/monkestation/icons/mob/species/monkey/monkey_tail.dmi new file mode 100644 index 000000000000..06fffefcaf03 Binary files /dev/null and b/monkestation/icons/mob/species/monkey/monkey_tail.dmi differ diff --git a/monkestation/icons/mob/species/simian/bodyparts.dmi b/monkestation/icons/mob/species/simian/bodyparts.dmi deleted file mode 100644 index 205f9ed83d3e..000000000000 Binary files a/monkestation/icons/mob/species/simian/bodyparts.dmi and /dev/null differ diff --git a/monkestation/icons/mob/species/simian/tails.dmi b/monkestation/icons/mob/species/simian/tails.dmi deleted file mode 100644 index 67fa393fd1a7..000000000000 Binary files a/monkestation/icons/mob/species/simian/tails.dmi and /dev/null differ diff --git a/monkestation/icons/mob/species/tundramoths/bodyparts.dmi b/monkestation/icons/mob/species/tundramoths/bodyparts.dmi new file mode 100644 index 000000000000..d97a4b3b1021 Binary files /dev/null and b/monkestation/icons/mob/species/tundramoths/bodyparts.dmi differ diff --git a/monkestation/icons/mob/species/tundramoths/moth_antennae.dmi b/monkestation/icons/mob/species/tundramoths/moth_antennae.dmi new file mode 100644 index 000000000000..401b5055f6a1 Binary files /dev/null and b/monkestation/icons/mob/species/tundramoths/moth_antennae.dmi differ diff --git a/monkestation/icons/mob/species/tundramoths/moth_markings.dmi b/monkestation/icons/mob/species/tundramoths/moth_markings.dmi new file mode 100644 index 000000000000..b10a44ebe04c Binary files /dev/null and b/monkestation/icons/mob/species/tundramoths/moth_markings.dmi differ diff --git a/monkestation/icons/mob/species/tundramoths/moth_wings.dmi b/monkestation/icons/mob/species/tundramoths/moth_wings.dmi new file mode 100644 index 000000000000..146856328449 Binary files /dev/null and b/monkestation/icons/mob/species/tundramoths/moth_wings.dmi differ diff --git a/monkestation/icons/mob/species/zombie/special_zombie_overlays.dmi b/monkestation/icons/mob/species/zombie/special_zombie_overlays.dmi new file mode 100644 index 000000000000..502eec04f4ea Binary files /dev/null and b/monkestation/icons/mob/species/zombie/special_zombie_overlays.dmi differ diff --git a/monkestation/icons/obj/clothing/hats.dmi b/monkestation/icons/obj/clothing/hats.dmi index e6506e7f72c0..c1b065ef864c 100644 Binary files a/monkestation/icons/obj/clothing/hats.dmi and b/monkestation/icons/obj/clothing/hats.dmi differ diff --git a/monkestation/icons/obj/clothing/suits.dmi b/monkestation/icons/obj/clothing/suits.dmi index 1df346b4f296..d1612e0097a7 100644 Binary files a/monkestation/icons/obj/clothing/suits.dmi and b/monkestation/icons/obj/clothing/suits.dmi differ diff --git a/tgstation.dme b/tgstation.dme index eb96115c9f45..1abd93246669 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -289,7 +289,7 @@ #include "code\__DEFINES\atmospherics\atmos_mapping_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\atmospherics\atmos_piping.dm" -#include "code\__DEFINES\color_matrix\simian_matrix.dm" +#include "code\__DEFINES\color_matrix\lizard_matrix.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals\mapping.dm" @@ -482,6 +482,7 @@ #include "code\__DEFINES\~monkestation\dcs\signals\signals_traitor.dm" #include "code\__DEFINES\~monkestation\dcs\signals\signals_mob\signals_mob_main.dm" #include "code\__HELPERS\_auxtools_api.dm" +#include "code\__HELPERS\_dreamluau.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_planes.dm" #include "code\__HELPERS\_string_lists.dm" @@ -2702,7 +2703,6 @@ #include "code\modules\admin\verbs\server.dm" #include "code\modules\admin\verbs\shuttlepanel.dm" #include "code\modules\admin\verbs\spawnobjasmob.dm" -#include "code\modules\admin\verbs\lua\_hooks.dm" #include "code\modules\admin\verbs\lua\_wrappers.dm" #include "code\modules\admin\verbs\lua\helpers.dm" #include "code\modules\admin\verbs\lua\lua_editor.dm" @@ -4661,7 +4661,6 @@ #include "code\modules\mob\living\carbon\human\suicides.dm" #include "code\modules\mob\living\carbon\human\monkey\monkey.dm" #include "code\modules\mob\living\carbon\human\species_types\abductors.dm" -#include "code\modules\mob\living\carbon\human\species_types\abominations.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" #include "code\modules\mob\living\carbon\human\species_types\ethereal.dm" @@ -5951,6 +5950,7 @@ #include "monkestation\code\game\objects\items\spraycan_gun.dm" #include "monkestation\code\game\objects\items\stickers.dm" #include "monkestation\code\game\objects\items\superglue.dm" +#include "monkestation\code\game\objects\items\translation_hat.dm" #include "monkestation\code\game\objects\items\trash.dm" #include "monkestation\code\game\objects\items\turf_demolisher.dm" #include "monkestation\code\game\objects\items\venom_knife.dm" @@ -6272,6 +6272,14 @@ #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\offensive.dm" #include "monkestation\code\modules\antagonists\wizard\equipment\spellbook_entries\summons.dm" #include "monkestation\code\modules\antagonists\wizard\grand_ritual\grand_rune.dm" +#include "monkestation\code\modules\antagonists\zombies\items.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_meteor_storm.dm" +#include "monkestation\code\modules\antagonists\zombies\zombification_component.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_types\base_zombie.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_types\bloater.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_types\runner.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_types\spitter.dm" +#include "monkestation\code\modules\antagonists\zombies\zombie_types\tank.dm" #include "monkestation\code\modules\antimatter\code\containment_jar.dm" #include "monkestation\code\modules\antimatter\code\control.dm" #include "monkestation\code\modules\antimatter\code\shielding.dm" @@ -6765,6 +6773,7 @@ #include "monkestation\code\modules\botany\species\apid\hive\hive_object.dm" #include "monkestation\code\modules\botany\species\apid\hive\hive_turfs.dm" #include "monkestation\code\modules\brewin_and_chewin\cargo_exports.dm" +#include "monkestation\code\modules\brewin_and_chewin\condiment_reagents.dm" #include "monkestation\code\modules\brewin_and_chewin\uniqueness.dm" #include "monkestation\code\modules\brewin_and_chewin\brewing\bottler.dm" #include "monkestation\code\modules\brewin_and_chewin\brewing\bottles.dm" @@ -6803,17 +6812,25 @@ #include "monkestation\code\modules\brewin_and_chewin\chewing\recipe_steps\use_oven.dm" #include "monkestation\code\modules\brewin_and_chewin\chewing\recipe_steps\use_stove.dm" #include "monkestation\code\modules\brewin_and_chewin\chewing\recipe_steps\use_tool.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\black_eggs.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\crafting_component_additions.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\edible_component_additions.dm" #include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\example_recipe.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\french_fries.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\fried_blood_sausage.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\fried_rice.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\katsu_curry.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\kimchi.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\lizard_dumplings.dm" -#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\oven_bread.dm" #include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\recipe_crafting_helper_generator.dm" #include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\sandwhich_test.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\generic\french_fries.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\generic\oven_bread.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\lizard\black_eggs.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\lizard\fried_blood_sausage.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\lizard\lizard_dumplings.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\epok_epok.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\fried_rice.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\katsu_curry.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\kimchi.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\noodles.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\sambal.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\setagaya_curry.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\surimi.dm" +#include "monkestation\code\modules\brewin_and_chewin\chewing\recipes\martian\ti_hoeh_hoe.dm" #include "monkestation\code\modules\buckshotroulette\projectiles\ammunition\ballistic\shotgun.dm" #include "monkestation\code\modules\buckshotroulette\projectiles\boxes_magazines\internal\shotgun.dm" #include "monkestation\code\modules\buckshotroulette\projectiles\guns\ballistic\shotgun.dm" @@ -6919,8 +6936,8 @@ #include "monkestation\code\modules\client\preferences\species_features\goblin.dm" #include "monkestation\code\modules\client\preferences\species_features\ipc.dm" #include "monkestation\code\modules\client\preferences\species_features\lizard.dm" +#include "monkestation\code\modules\client\preferences\species_features\monkey.dm" #include "monkestation\code\modules\client\preferences\species_features\secondary_mut_color.dm" -#include "monkestation\code\modules\client\preferences\species_features\simians.dm" #include "monkestation\code\modules\client\verbs\deadchat.dm" #include "monkestation\code\modules\client\verbs\looc.dm" #include "monkestation\code\modules\clothing\durathread_weave.dm" @@ -7156,6 +7173,7 @@ #include "monkestation\code\modules\job_xp\preferences\base_preferences.dm" #include "monkestation\code\modules\job_xp\preferences\xp_handlers.dm" #include "monkestation\code\modules\jobs\job_types\_job.dm" +#include "monkestation\code\modules\jobs\job_types\barber.dm" #include "monkestation\code\modules\jobs\job_types\brig_physician.dm" #include "monkestation\code\modules\jobs\job_types\candysalesman.dm" #include "monkestation\code\modules\jobs\job_types\chaplain.dm" @@ -7172,6 +7190,7 @@ #include "monkestation\code\modules\jobs\job_types\signal_technician.dm" #include "monkestation\code\modules\jobs\job_types\skeleton.dm" #include "monkestation\code\modules\jobs\job_types\yellowclown.dm" +#include "monkestation\code\modules\jobs\job_types\departments\departments.dm" #include "monkestation\code\modules\library\bookcase.dm" #include "monkestation\code\modules\library\skill_learning\job_skillchips\shaft_miner.dm" #include "monkestation\code\modules\liquids\drains.dm" @@ -7354,7 +7373,6 @@ #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\ipc_screens.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\multi_part.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\sock_color.dm" -#include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\tails.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" #include "monkestation\code\modules\mob\living\init_signals.dm" #include "monkestation\code\modules\mob\living\living_defines.dm" @@ -7394,7 +7412,6 @@ #include "monkestation\code\modules\mob\living\carbon\human\human_defines.dm" #include "monkestation\code\modules\mob\living\carbon\human\init_signals.dm" #include "monkestation\code\modules\mob\living\carbon\human\lizard_gags.dm" -#include "monkestation\code\modules\mob\living\carbon\human\simian_gags.dm" #include "monkestation\code\modules\mob\living\carbon\human\worn_overlays.dm" #include "monkestation\code\modules\mob\living\carbon\human\monkey\dukeman.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\abductors.dm" @@ -7409,6 +7426,8 @@ #include "monkestation\code\modules\mob\living\carbon\human\species_type\simian.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\skeletons.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\teratoma.dm" +#include "monkestation\code\modules\mob\living\carbon\human\species_type\tundra_moths\mothaccessories.dm" +#include "monkestation\code\modules\mob\living\carbon\human\species_type\tundra_moths\tundramoths.dm" #include "monkestation\code\modules\mob\living\silicon\death.dm" #include "monkestation\code\modules\mob\living\simple_animal\megafauna\wendigo.dm" #include "monkestation\code\modules\mob\living\simple_animal\pets\bees.dm" @@ -7728,6 +7747,7 @@ #include "monkestation\code\modules\research\designs\multi-department_designs.dm" #include "monkestation\code\modules\research\designs\nanite_designs.dm" #include "monkestation\code\modules\research\designs\security_designs.dm" +#include "monkestation\code\modules\research\designs\autolathe\service_designs.dm" #include "monkestation\code\modules\research\nanites\nanite_chamber.dm" #include "monkestation\code\modules\research\nanites\nanite_chamber_computer.dm" #include "monkestation\code\modules\research\nanites\nanite_cloud_controller.dm" @@ -7974,6 +7994,7 @@ #include "monkestation\code\modules\storytellers\event_groups\_event_group.dm" #include "monkestation\code\modules\storytellers\event_groups\groups.dm" #include "monkestation\code\modules\storytellers\storytellers\_storyteller.dm" +#include "monkestation\code\modules\storytellers\storytellers\brute.dm" #include "monkestation\code\modules\storytellers\storytellers\clown.dm" #include "monkestation\code\modules\storytellers\storytellers\ghost.dm" #include "monkestation\code\modules\storytellers\storytellers\hermit.dm" @@ -7998,7 +8019,7 @@ #include "monkestation\code\modules\surgery\bodyparts\clockwork_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\ethereal_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\floran_bodyparts.dm" -#include "monkestation\code\modules\surgery\bodyparts\simian_bodyparts.dm" +#include "monkestation\code\modules\surgery\bodyparts\monkey_bodyparts.dm" #include "monkestation\code\modules\surgery\bodyparts\teratoma_bodyparts.dm" #include "monkestation\code\modules\surgery\organs\augments.dm" #include "monkestation\code\modules\surgery\organs\autosurgeon.dm" @@ -8007,7 +8028,6 @@ #include "monkestation\code\modules\surgery\organs\external\floran_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\goblin_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\ipc.dm" -#include "monkestation\code\modules\surgery\organs\external\simian.dm" #include "monkestation\code\modules\surgery\organs\external\appendages\appendages.dm" #include "monkestation\code\modules\surgery\organs\external\chelicerae\chelicerae.dm" #include "monkestation\code\modules\surgery\organs\external\tail\clockworktail.dm" diff --git a/tgui/package.json b/tgui/package.json index 109c8b208ea4..0bc409157214 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -46,6 +46,7 @@ "eslint-plugin-unused-imports": "^1.1.4", "file-loader": "^6.2.0", "inferno": "^8.2.1", + "inferno-compat": "^8.2.1", "jest": "^27.0.6", "jest-circus": "^27.0.6", "jsdom": "^16.7.0", diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts index 4ff6bd494617..6c1fdd335e4d 100644 --- a/tgui/packages/tgui/backend.ts +++ b/tgui/packages/tgui/backend.ts @@ -313,7 +313,6 @@ type StateWithSetter = [T, (nextState: T) => void]; * * It is a lot more performant than `setSharedState`. * - * @param context React context. * @param key Key which uniquely identifies this state in Redux store. * @param initialState Initializes your global variable with this value. */ diff --git a/tgui/packages/tgui/interfaces/LuaEditor/CallModal.jsx b/tgui/packages/tgui/interfaces/LuaEditor/CallModal.jsx deleted file mode 100644 index 73c505fba1c7..000000000000 --- a/tgui/packages/tgui/interfaces/LuaEditor/CallModal.jsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useBackend, useLocalState } from '../../backend'; -import { Button, Modal, Section } from '../../components'; -import { ListMapper } from './ListMapper'; - -export const CallModal = (props) => { - const { act, data } = useBackend(); - const { callArguments } = data; - const [, setModal] = useLocalState('modal'); - const [toCall, setToCall] = useLocalState('toCallTaskInfo'); - const { type, params } = toCall; - return ( - -
{ - setModal(null); - setToCall(null); - act('clearArgs'); - }} - > - Cancel - - } - > - - -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/LuaEditor/CallModal.tsx b/tgui/packages/tgui/interfaces/LuaEditor/CallModal.tsx new file mode 100644 index 000000000000..d9809b682a80 --- /dev/null +++ b/tgui/packages/tgui/interfaces/LuaEditor/CallModal.tsx @@ -0,0 +1,109 @@ +import { useBackend } from '../../backend'; +import { Button, Modal, Section } from '../../components'; +import { ListMapper } from './ListMapper'; +import { CallInfo, LuaEditorData, LuaEditorModal } from './types'; + +type CallModalProps = { + setModal: (modal: LuaEditorModal) => void; + toCall: CallInfo; + setToCall: (toCall: CallInfo | undefined) => void; +}; + +export const CallModal = (props: CallModalProps) => { + const { act, data } = useBackend(); + const { callArguments } = data; + const { setModal, toCall, setToCall } = props; + const { type, params } = toCall || {}; + + return ( + +
{ + setModal(undefined); + setToCall(undefined); + act('clearArgs'); + }} + > + Cancel + + } + > + + +
+
+ ); +}; + +/* +export class CallModal extends Component { + static defaultProps = { + toCall: undefined, + setToCall: () => {}, + }; + + render() { + const { act, data } = useBackend(); + const { callArguments } = data; + const { setModal, toCall, setToCall } = this.props; + const { type, params } = toCall || {}; + + return ( + +
{ + setModal(undefined); + setToCall(undefined); + act('clearArgs'); + }} + > + Cancel + + } + > + + +
+
+ ); + } +} +*/ diff --git a/tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.jsx b/tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.tsx similarity index 54% rename from tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.jsx rename to tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.tsx index d452e272d8f8..33d5fa47a35b 100644 --- a/tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.jsx +++ b/tgui/packages/tgui/interfaces/LuaEditor/ChunkViewModal.tsx @@ -1,16 +1,19 @@ -import { useLocalState } from '../../backend'; -import { Button, Modal, Section, Box } from '../../components'; -import { sanitizeText } from '../../sanitize'; import hljs from 'highlight.js/lib/core'; +import { Box, Button, Modal, Section } from '../../components'; +import { sanitizeText } from '../../sanitize'; +import { LuaEditorModal } from './types'; + +type ChunkViewModalProps = { + setModal: (modal: LuaEditorModal) => void; + viewedChunk: string; + setViewedChunk: (chunk: string | undefined) => void; +}; + +export const ChunkViewModal = (props: ChunkViewModalProps) => { + const { setModal, viewedChunk, setViewedChunk } = props; -export const ChunkViewModal = (props) => { - const [, setModal] = useLocalState('modal'); - const [viewedChunk, setViewedChunk] = useLocalState('viewedChunk'); return ( - +
{ color="red" icon="window-close" onClick={() => { - setModal(null); - setViewedChunk(null); + setModal(undefined); + setViewedChunk(undefined); }} > Close diff --git a/tgui/packages/tgui/interfaces/LuaEditor/ListMapper.jsx b/tgui/packages/tgui/interfaces/LuaEditor/ListMapper.jsx deleted file mode 100644 index 13dde7022feb..000000000000 --- a/tgui/packages/tgui/interfaces/LuaEditor/ListMapper.jsx +++ /dev/null @@ -1,171 +0,0 @@ -import { useBackend, useLocalState } from '../../backend'; -import { - Box, - Button, - Collapsible, - LabeledList, - Section, -} from '../../components'; - -const RefRegex = RegExp('^.+ \\[0x[0-9a-fA-F]+]$'); -const FunctionRegex = RegExp('^function: 0x[0-9a-fA-F]+$'); -const UnconvertibleLuaValueRegex = RegExp( - '^(table|function|thread): 0x[0-9a-fA-F]+$', -); - -export const ListMapper = (props) => { - const { act } = useBackend(); - - const { - list, - path, - editable, - name, - callType, - vvAct, - skipNulls, - collapsible, - ...rest - } = props; - - const [, setToCall] = useLocalState('toCallTaskInfo'); - const [, setModal] = useLocalState('modal'); - - const ThingNode = (thing, path, overrideProps) => { - if (Array.isArray(thing)) { - return ( - - ); - } else if (typeof thing === 'string') { - if (FunctionRegex.test(thing) && callType) { - return ( - - ); - } else if (UnconvertibleLuaValueRegex.test(thing)) { - return {thing.charAt(0).toUpperCase() + thing.substring(1)}; - } else if (RefRegex.test(thing)) { - return ( - - ); - } else if (thing === null) { - return Nil; - } else { - return thing; - } - } else { - return {thing}; - } - }; - - const ListMapperInner = (element, i) => { - const { key, value } = element; - const basePath = path ? path : []; - let keyPath = [...basePath, { index: i + 1, type: 'key' }]; - let valuePath = [...basePath, { index: i + 1, type: 'value' }]; - let entryPath = [...basePath, { index: i + 1, type: 'entry' }]; - - if (key === null && skipNulls) { - return; - } - - /* - * Finding a function only accessible as a table's key is too awkward to - * deal with for now - */ - let keyNode = ThingNode(key, keyPath, { callType: null }); - - /* - * Likewise, since table, thread, and userdata equality is tested by - * reference rather than value, we can't find functions whose keys - * within the table are tables, threads, or userdata - */ - const uniquelyIndexable = - (typeof key === 'string' && - !(UnconvertibleLuaValueRegex.test(key) || RefRegex.test(key))) || - typeof key === 'number'; - let valueNode = ThingNode(value, valuePath, { - callType: uniquelyIndexable && callType, - }); - return ( - - - - ); - } - return ( - <> - {i > 0 && } - - {message} - - {repeats && ( - - x{repeats + 1} - - )} - - ); - }); -}; diff --git a/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx b/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx new file mode 100644 index 000000000000..63faedbc49b7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/LuaEditor/Log.tsx @@ -0,0 +1,222 @@ +import { useBackend } from '../../backend'; +import { + Box, + Button, + Collapsible, + Divider, + LabeledList, + Stack, +} from '../../components'; +import { logger } from '../../logging'; +import { ListMapper } from './ListMapper'; +import { LuaEditorData, LuaEditorModal } from './types'; + +const parsePanic = (name, panic_json) => { + const panic_info = JSON.parse(panic_json); + const { + message, + location: { file, line }, + backtrace, + } = panic_info; + return ( + <> + + {name} panicked at {file}:{line}: {message} + + + + {backtrace + ?.filter( + (frame) => frame.file !== undefined && frame.line !== undefined, + ) + ?.map(({ name, file, line }, i) => ( + <> + {i > 0 && } + + + {name} + + {file}:{line} + + + + + ))} + + + + ); +}; + +type LogProps = { + setViewedChunk: (newValue: string | undefined) => void; + setModal: (newValue: LuaEditorModal) => void; +}; + +export const Log = (props: LogProps) => { + const { act, data } = useBackend(); + const { stateLog } = data; + const { setViewedChunk, setModal } = props; + return stateLog.map((element, i) => { + const { status, repeats } = element; + let output; + let messageColor; + switch (status) { + case 'sleep': { + const { chunk, name } = element; + if (chunk) { + messageColor = 'blue'; + output = ( + <> + {name} slept. + + ); + } + break; + } + case 'yield': { + const { name, return_values, variants } = element; + output = ( + <> + {name} yielded + {return_values.length + ? ` ${return_values.length} value${ + return_values.length > 1 ? 's' : '' + }` + : ''} + . + {return_values.length ? ( + + act('vvReturnValue', { + entryIndex: i + 1, + indices: path, + }) + } + /> + ) : ( +
+ )} + + ); + messageColor = 'yellow'; + break; + } + case 'finished': { + const { name, return_values, variants } = element; + output = ( + <> + {name} returned + {return_values.length + ? ` ${return_values.length} value${ + return_values.length > 1 ? 's' : '' + }` + : ''} + . + {return_values.length ? ( + + + act('vvReturnValue', { + entryIndex: i + 1, + tableIndices: path, + }) + } + /> + + ) : ( +
+ )} + + ); + messageColor = 'green'; + break; + } + case 'error': { + const { message } = element; + output = message; + messageColor = 'red'; + break; + } + case 'panic': { + const { name, message } = element; + output = parsePanic(name, message); + break; + } + case 'runtime': { + const { file, line, message, stack } = element; + output = ( + <> + Runtime at {file}:{line}: {message} + { + return { key: null, value: frame }; + })} + name="Stack Trace" + collapsible + /> + + ); + messageColor = 'red'; + break; + } + case 'print': { + const { message } = element; + output = message; + break; + } + default: + logger.warn(`unknown log status ${status}`); + } + if (output === undefined) { + return; + } + const { chunk } = element; + if (chunk) { + output = ( + <> + {output} + + + ); + } + return ( + <> + {i > 0 && } + + {output} + + {repeats && ( + + x{repeats + 1} + + )} + + ); + }); +}; diff --git a/tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.jsx b/tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.tsx similarity index 63% rename from tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.jsx rename to tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.tsx index 3be610e019d1..d1b72c61f949 100644 --- a/tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.jsx +++ b/tgui/packages/tgui/interfaces/LuaEditor/StateSelectModal.tsx @@ -1,16 +1,18 @@ import { useBackend, useLocalState } from '../../backend'; -import { Button, Modal, Input, Section, Stack } from '../../components'; +import { Button, Input, Modal, Section, Stack } from '../../components'; +import { LuaEditorData, LuaEditorModal } from './types'; -export const StateSelectModal = (props) => { - const { act, data } = useBackend(); - const [, setModal] = useLocalState('modal', 'states'); - const [input, setInput] = useLocalState('newStateName', ''); +type StateSelectModalProps = { + setModal: (modal: LuaEditorModal) => void; +}; + +export const StateSelectModal = (props: StateSelectModalProps) => { + const { act, data } = useBackend(); + const { setModal } = props; + const [input, setInput] = useLocalState('input', ''); const { states } = data; return ( - +
{ color="red" icon="window-close" onClick={() => { - setModal(null); + setModal(undefined); }} > Cancel @@ -30,7 +32,7 @@ export const StateSelectModal = (props) => { ))} - + { @@ -36,16 +33,16 @@ export const TaskManager = (props) => {
- +
- {yields.map((info, i) => ( - + {yields.map(({ index, name }, i) => ( + - {noStateYet ? ( - -

Please select or create a lua state to get started.

-
- ) : ( - - -
- - - - } - > -